diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e8673bc449..3b76d0c2144 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,9 +11,6 @@ Hello and welcome to /tg/station's contributing page. You are here because you a But first we want to make it clear how you can contribute, if contributing is a new experience for you, and what powers the team has over your pull request so you do not get any surprises when submitting pull requests, and it is closed for a reason you did not anticipate. ##Getting Started - -####EOF settings of main repo are forbidden territory one must avoid wandering into - At /tg/station we do not have a list of goals and features to add, we instead allow freedom for contributors to suggest and create their ideas for the game. That does not mean we aren't determined to squash bugs, which unfortunately pop up a lot due to the deep complexity of the game. Here are some useful getting started guides, if you want to contribute or if you want to know what challenges you can tackle with zero knowledge about the game's code structure. If you want to contribute the first thing you'll need to do is [set up Git](http://tgstation13.org/wiki/Setting_up_git) so you can download the source code. @@ -273,3 +270,9 @@ There is no strict process when it comes to merging pull requests, pull requests * If you are proposing multiple changes, which change many different aspects of the code, you are expected to section them off into different pull requests in order to make it easier to review them and to deny/accept the changes that are deemed acceptable. * If your pull request is accepted, the code you add no longer belongs exclusively to you but to everyone; everyone is free to work on it, but you are also free to object to any changes being made, which will be noted by a Project Lead or Project Manager. It is a shame this has to be explicitly said, but there have been cases where this would've saved some trouble. + + +##A word on git +Yes we know that the files have a tonne of mixed windows and linux line endings, attempts to fix this have been met with less than stellar success and as such we have decided to give up caring until such a time as it matters. + +Therefore EOF settings of main repo are forbidden territory one must avoid wandering into diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 0d13efc45a1..d7b57ad8021 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1,6 +1,6 @@ "a" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) "b" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"c" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"c" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "d" = (/obj/effect/light_emitter,/mob/living/simple_animal/hostile/spawner/ash_walker,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "e" = (/obj/effect/decal/cleanable/blood,/obj/effect/mob_spawn/human/ash_walker,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "f" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) @@ -33,7 +33,7 @@ "G" = (/obj/item/weapon/twohanded/spear,/obj/structure/rack,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "H" = (/obj/item/weapon/twohanded/spear,/obj/structure/rack,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "I" = (/obj/structure/mineral_door/iron,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;blocks_air = 1},/area/ruin/unpowered) -"J" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/lavaland/surface/outdoors) +"J" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/lavaland/surface/outdoors) "K" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) "L" = (/obj/item/weapon/twohanded/spear,/obj/structure/table,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "M" = (/obj/item/weapon/pickaxe,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth;initial_gas_mix = "o2=13;n2=24;TEMP=300"},/area/lavaland/surface/outdoors) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm index 6288a076004..8bb45a4dde7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) +"b" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "c" = (/obj/structure/divine/healingfountain/anyone,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "d" = (/obj/structure/divine/conduit,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) "e" = (/obj/structure/divine/sacrificealtar,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index 542e27d84dc..6f66a0086de 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -1,7 +1,7 @@ "a" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) "b" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) "c" = (/turf/open/floor/plating/lava/smooth/lava_land_surface,/area/lavaland/surface/outdoors) -"d" = (/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) +"d" = (/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) "e" = (/obj/structure/table/wood/poker,/obj/item/weapon/gun/projectile/revolver/russian/soul,/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth; icon_state = "carpetsymbol"},/area/ruin/powered) "f" = (/obj/structure/cursed_slot_machine,/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth; icon_state = "carpetsymbol"},/area/ruin/powered) "g" = (/obj/structure/table/wood/poker,/obj/item/weapon/coin/mythril,/turf/open/floor/carpet{baseturf = /turf/open/floor/plating/lava/smooth; icon_state = "carpetsymbol"},/area/ruin/powered) diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 0eac402bedb..b3e84ff5c62 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -21,7 +21,7 @@ "au" = (/obj/structure/cult/talisman,/obj/effect/decal/remains/human,/obj/item/stack/sheet/runed_metal{amount = 25},/obj/item/weapon/veilrender/honkrender,/obj/item/clothing/mask/gas/clown_hat,/obj/item/organ/internal/heart/demon,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "av" = (/obj/structure/divine/trap/stun{desc = "A rune inscribed in the floor, the air feeling electrified around it."; name = "shock rune"},/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "aw" = (/obj/effect/decal/remains/human,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) -"ax" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) +"ax" = (/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "ay" = (/obj/structure/cult/tome,/obj/item/weapon/tome,/obj/item/stack/sheet/runed_metal{amount = 25},/obj/item/weapon/coin/antagtoken,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "az" = (/obj/structure/constructshell,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "aA" = (/obj/structure/cultgirder,/obj/item/stack/sheet/runed_metal,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) @@ -53,7 +53,7 @@ "ba" = (/obj/structure/cult/talisman,/obj/item/weapon/plasma_fist_scroll,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "bb" = (/mob/living/simple_animal/hostile/poison/giant_spider/hunter,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) "bc" = (/obj/effect/spider/stickyweb,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) -"bd" = (/turf/open/floor/plating/asteroid/basalt/lava{initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) +"bd" = (/turf/open/floor/plating/asteroid/basalt/lava{initial_gas_mix = "n2=23;o2=14"},/turf/closed/wall/mineral/cult{baseturf = /turf/open/floor/plating/lava/smooth},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "be" = (/mob/living/simple_animal/hostile/spawner/mining/goliath,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) "bf" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/engine/cult{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 4"}) "bg" = (/mob/living/simple_animal/hostile/poison/giant_spider/nurse,/turf/open/floor/plating/asteroid/basalt{initial_gas_mix = "n2=23;o2=14"},/area/awaymission/BMPship{name = "\improper BMP Asteroid Level 3"}) diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index 7aa34319ef8..ca889ab1ac7 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -488,9 +488,8 @@ /turf/closed/mineral/random, /area/mine/explored) "abg" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; - dir = 4 +/obj/machinery/sleeper/syndie{ + dir = 4 }, /turf/open/floor/plasteel/shuttle{ icon_state = "shuttlefloor4" diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index 23fe48b8871..c15747c8fc1 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -56,7 +56,7 @@ "abd" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abe" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abf" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) -"abg" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) +"abg" = (/obj/machinery/sleeper/syndie{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abh" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abi" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "abj" = (/obj/structure/table,/obj/item/weapon/gun/syringe{pixel_x = 1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index ee14e02d62c..a2c597f1c0a 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -2968,8 +2968,7 @@ }, /area/shuttle/syndicate) "afH" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ @@ -13379,6 +13378,7 @@ pixel_x = 0; pixel_y = 0 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ tag = "icon-escape (NORTH)"; icon_state = "escape"; @@ -70256,6 +70256,7 @@ dir = 4; network = list("SS13","Sci") }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, @@ -70835,6 +70836,7 @@ icon_state = "tube1"; dir = 8 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm index 2879059f4fc..cfece55a966 100644 --- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm +++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm @@ -2176,8 +2176,7 @@ name = "AI Satellite Service" }) "adT" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ @@ -26520,6 +26519,7 @@ /obj/machinery/camera{ c_tag = "Atmospherics Monitoring" }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "cautioncorner"; dir = 1 @@ -61729,6 +61729,12 @@ icon_state = "diagonalWall3" }, /area/shuttle/syndicate) +"ckj" = ( +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel{ + icon_state = "floorgrime" + }, +/area/toxins/storage) (1,1,1) = {" aaa @@ -89080,7 +89086,7 @@ aze aAw aBE aCO -aFp +ckj aFn aGo aCO diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d8ad9839472..18c0c806960 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -398,8 +398,11 @@ /turf/open/floor/plating/airless, /area/solar/auxstarboard) "aaQ" = ( -/turf/open/space, -/area/security/prison) +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plasteel{ + icon_state = "bot" + }, +/area/atmos) "aaR" = ( /obj/machinery/hydroponics/constructable, /obj/item/weapon/cultivator, @@ -5423,8 +5426,11 @@ }, /area/security/range) "aiT" = ( -/turf/open/floor/plating, -/area/maintenance/fore) +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel{ + icon_state = "bot" + }, +/area/atmos) "aiU" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -50565,9 +50571,11 @@ /turf/open/floor/wood, /area/library) "bDx" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, -/area/library) +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel{ + icon_state = "bot" + }, +/area/atmos) "bDy" = ( /obj/machinery/vending/coffee, /obj/machinery/newscaster{ @@ -57065,15 +57073,17 @@ name = "Telecoms Storage" }) "bOj" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plating, +/obj/structure/closet, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, /area/maintenance/starboard) "bOk" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/maintenance/starboard) "bOl" = ( -/obj/item/weapon/storage/box/lights/mixed, +/obj/structure/closet/cardboard, /turf/open/floor/plating, /area/maintenance/starboard) "bOm" = ( @@ -78138,6 +78148,7 @@ /obj/structure/sign/nosmoking_2{ pixel_y = 32 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ dir = 5; icon_state = "warning" @@ -80573,6 +80584,7 @@ /obj/machinery/light_switch{ pixel_y = -23 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ dir = 10; icon_state = "warning" @@ -96260,10 +96272,9 @@ /turf/closed/indestructible/opshuttle, /area/shuttle/syndicate) "cXn" = ( -/obj/structure/closet/cardboard, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/item/weapon/storage/box/lights/mixed, +/turf/open/floor/plating, /area/maintenance/starboard) "cXo" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -96570,8 +96581,7 @@ }, /area/shuttle/syndicate) "cXV" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ @@ -140626,9 +140636,9 @@ bFT bHN bJw bKQ -bzf +aaQ +atw bOj -atn bRw bTc bUq @@ -140883,9 +140893,9 @@ bEn bHO bJx bKR -bzf +aiT +atw bOk -apk bRx apk aqy @@ -141140,9 +141150,9 @@ bFU bHP bJy bKS -bzf -cXn -apk +bDx +atw +bOl bRy apk bUr @@ -141397,9 +141407,9 @@ bEn bHQ bJz bKT -bzf -bOl -bQa +bDx +atw +cXn bRz bTd apk diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 94f22215cc9..22ba4c45af9 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -15166,8 +15166,7 @@ }, /area/tcommsat/computer) "Gu" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 03a6ebbfbcc..e59d566a07a 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -6378,9 +6378,12 @@ /turf/open/floor/plating, /area/maintenance/fpmaint2) "alX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/fpmaint2) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel, +/area/atmos) "alY" = ( /obj/machinery/door/airlock/shuttle{ name = "Labor Shuttle Airlock"; @@ -40914,6 +40917,7 @@ /obj/machinery/light/small{ dir = 8 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, @@ -41656,6 +41660,7 @@ dir = 4; network = list("SS13","RD") }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel{ icon_state = "floorgrime" }, @@ -45155,6 +45160,7 @@ name = "Station Intercom (General)"; pixel_x = -30 }, +/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plasteel, /area/atmos) "bNQ" = ( @@ -57170,8 +57176,7 @@ }, /area/engine/engineering) "cmM" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; +/obj/machinery/sleeper/syndie{ dir = 4 }, /turf/open/floor/plasteel/shuttle{ @@ -95070,7 +95075,7 @@ bJs bKy bLM bLM -bNQ +alX bOV bQk bRt diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index d4cf6ff501d..17b1b2dc1cd 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -1,5 +1,5 @@ "a" = (/turf/open/space,/area/space) -"b" = (/turf/closed/wall/cult,/area/shuttle/escape) +"b" = (/turf/closed/wall/mineral/cult,/area/shuttle/escape) "c" = (/obj/effect/forcefield/cult,/turf/open/floor/plating,/area/shuttle/escape) "d" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/cult,/area/shuttle/escape) @@ -16,7 +16,7 @@ "p" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "q" = (/obj/item/stack/sheet/metal,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "r" = (/obj/machinery/door/airlock/cult/unruned/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape) -"s" = (/obj/machinery/status_display,/turf/closed/wall/cult,/area/shuttle/escape) +"s" = (/obj/machinery/status_display,/turf/closed/wall/mineral/cult,/area/shuttle/escape) "t" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape) "v" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/cult,/area/shuttle/escape) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 15a8ed20949..d6ab9543d76 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -68,6 +68,7 @@ #define MUTCOLORS_PARTSONLY 15 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. #define NODISMEMBER 16 #define NOHUNGER 17 +#define NOCRITDAMAGE 18 /* These defines are used specifically with the atom/movable/languages bitmask. diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9b9bc263e6d..18e49b84ee3 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -285,6 +285,9 @@ var/list/bloody_footprints_cache = list() #define TURF_WET_ICE 3 #define TURF_WET_PERMAFROST 4 +//Maximum amount of time, (in approx. seconds.) a tile can be wet for. +#define MAXIMUM_WET_TIME 300 + //Object/Item sharpness #define IS_BLUNT 0 #define IS_SHARP 1 @@ -423,3 +426,10 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE // Shuttle return values #define SHUTTLE_ALREADY_DOCKED 7 + + +#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return + +// Evil narsie colour +#define NARSIE_WINDOW_COLOUR "#7D1919" + diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 172418498c3..afc07638e4b 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -53,10 +53,16 @@ //Checks for specific types in a list /proc/is_type_in_list(atom/A, list/L) + if (!L.len) + return 0 + if (!L[L[1]]) + generate_type_list_cache(L) + return L[A.type] + +/proc/generate_type_list_cache(L) for(var/type in L) - if(istype(A, type)) - return 1 - return 0 + for(var/T in typesof(type)) + L[T] = 1 //Empties the list by setting the length to 0. Hopefully the elements get garbage collected /proc/clearlist(list/list) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 1fb7b369327..a8fbcf17bb9 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -96,8 +96,12 @@ var/const/tk_maxrange = 15 /obj/item/tk_grab/attack_self(mob/user) - if(focus) - focus.attack_self_tk(user) + if(!focus) + return + if(qdeleted(focus)) + qdel(src) + return + focus.attack_self_tk(user) /obj/item/tk_grab/afterattack(atom/target, mob/living/carbon/user, proximity, params)//TODO: go over this if(!target || !user) diff --git a/code/game/dna.dm b/code/datums/dna.dm similarity index 100% rename from code/game/dna.dm rename to code/datums/dna.dm diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index c80217e7754..0b7793727be 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -203,7 +203,7 @@ animate(D, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) sleep (15) if (D) - animate(transform = null, time = 1, loop = 0) + animate(D, transform = null, time = 1, loop = 0) for (var/i = 0, i < 3, i++) if (A && D) diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 1d95041df3c..f700b301351 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -71,7 +71,7 @@ var/global/max_secret_rooms = 6 if("cult") theme = "cult" - walltypes = list(/turf/closed/wall/cult=3,/turf/closed/mineral/random/high_chance=1) + walltypes = list(/turf/closed/wall/mineral/cult=3,/turf/closed/mineral/random/high_chance=1) floortypes = list(/turf/open/floor/plasteel/cult) treasureitems = list(/obj/item/device/soulstone/anybody=1, /obj/item/clothing/suit/space/hardsuit/cult=1, /obj/item/weapon/bedsheet/cult=2, /obj/item/clothing/suit/cultrobes=2, /mob/living/simple_animal/hostile/creature=3) diff --git a/code/game/gamemodes/antag_hud.dm b/code/game/gamemodes/antag_hud.dm index 464698a6f34..3592fbc4e00 100644 --- a/code/game/gamemodes/antag_hud.dm +++ b/code/game/gamemodes/antag_hud.dm @@ -17,6 +17,8 @@ M.mind.antag_hud = src /datum/atom_hud/antag/proc/leave_hud(mob/M) + if(!M) + return if(!istype(M)) CRASH("leave_hud(): [M] ([M.type]) is not a mob!") remove_from_hud(M) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 037d0d246ea..e22248ff602 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -90,7 +90,7 @@ attack_sound = 'sound/weapons/genhit1.ogg' flying = 1 del_on_death = 1 - deathmessage = "The blob spore explodes into a cloud of gas!" + deathmessage = "explodes into a cloud of gas!" var/death_cloud_size = 1 //size of cloud produced from a dying spore var/list/human_overlays = list() var/is_zombie = 0 diff --git a/code/game/gamemodes/demon/demoninfo.dm b/code/game/gamemodes/demon/demoninfo.dm index b35fa604711..c9a2cd72e1a 100644 --- a/code/game/gamemodes/demon/demoninfo.dm +++ b/code/game/gamemodes/demon/demoninfo.dm @@ -182,6 +182,8 @@ var/global/list/lawlorify = list ( H.set_species(/datum/species/human, 1) H.regenerate_icons() give_base_spells() + if(istype(owner.current.loc, /obj/effect/dummy/slaughter/)) + owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted. form = BASIC_DEVIL /datum/devilinfo/proc/regress_blood_lizard() @@ -262,6 +264,8 @@ var/global/list/lawlorify = list ( world << 'sound/hallucinations/veryfar_noise.ogg' give_arch_spells() D.convert_to_archdevil() + if(istype(D.loc, /obj/effect/dummy/slaughter/)) + D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted. var/area/A = get_area(owner.current) if(A) notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, attack_not_jump = 1) @@ -371,7 +375,8 @@ var/global/list/lawlorify = list ( reviveNumber++ if(body) body.revive(1,0) - body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted. + if(istype(body.loc, /obj/effect/dummy/slaughter/)) + body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted. if(istype(body, /mob/living/carbon/true_devil)) var/mob/living/carbon/true_devil/D = body if(D.oldform) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 85508dfdaea..5f6cbe62576 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -137,6 +137,8 @@ //first bust whatever is in the turf for(var/atom/A in T) if(A != src) + if(istype(A, /mob/living)) + A.visible_message("[src] slams into [A].", "[src] slams into you!.") A.ex_act(hitpwr) //then, ram the turf if it still exists @@ -190,7 +192,7 @@ pass_flags = PASSTABLE | PASSGRILLE hits = 1 hitpwr = 3 - meteorsound = 'sound/weapons/throwtap.ogg' + meteorsound = 'sound/weapons/Gunshot_smg.ogg' meteordrop = /obj/item/weapon/ore/glass //Medium-sized @@ -314,4 +316,4 @@ ..() meteordrop = pick(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin) meteorsound = pick('sound/hallucinations/im_here1.ogg','sound/hallucinations/im_here2.ogg') -////////////////////////// \ No newline at end of file +////////////////////////// diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 0e0f23a3d0f..6a324797bfc 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -98,7 +98,7 @@ projectilesound = 'sound/weapons/taser2.ogg' loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/weapon/ore/bluespace_crystal/artificial) del_on_death = 1 - deathmessage = "The swarmer explodes with a sharp pop!" + deathmessage = "explodes with a sharp pop!" var/resources = 0 //Resource points, generated by consuming metal/glass /mob/living/simple_animal/hostile/swarmer/Login() diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 88c386b94a6..3495ad1344a 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -43,11 +43,10 @@ /obj/effect/decal/cleanable/blood/innards, \ /obj/item/organ/heart/demon) del_on_death = 1 - deathmessage = "The generic slaughter demon screams in anger because this is the default death message!" + deathmessage = "screams in anger as it collapses into a puddle of viscera!" /mob/living/simple_animal/slaughter/New() ..() - deathmessage = "[src] screams in anger as it collapses into a puddle of viscera." var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/slaughter)) @@ -77,7 +76,7 @@ name = "demon heart" desc = "Still it beats furiously, emanating an aura of utter hate." icon = 'icons/obj/surgery.dmi' - icon_state = "demon_heart" + icon_state = "demon_heart-on" origin_tech = "combat=5;biotech=8" /obj/item/organ/heart/demon/update_icon() @@ -129,7 +128,7 @@ icon_state = "bowmon" icon_living = "bowmon" - + deathmessage = "fades out, as all of its friends are released from its prison of hugs." loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) // Keep the people we hug! @@ -142,8 +141,6 @@ /mob/living/simple_animal/slaughter/laughter/New() ..() - deathmessage = "[src] fades out, as all of its friends are released from its prison of hugs." - /mob/living/simple_animal/slaughter/laughter/death() if(!consumed_mobs) return ..() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 457823e1ab4..9cc1c93fc1c 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -224,7 +224,11 @@ for(var/mob/living/player in player_list) if(player.mind && player.mind != owner) if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) //Borgs are technically dead anyways + if(issilicon(player)) //Borgs are technically dead anyways + continue + if(isanimal(player)) //animals don't count + continue + if(isbrain(player)) //also technically dead continue if(get_area(player) == A) if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/open/floor/plasteel/shuttle/red)) @@ -247,7 +251,11 @@ for(var/mob/living/player in player_list) //Make sure nobody else is onboard if(player.mind && player.mind != owner) if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) + if(issilicon(player)) //Borgs are technically dead anyways + continue + if(isanimal(player)) //animals don't count + continue + if(isbrain(player)) //also technically dead continue if(get_area(player) == A) if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/open/floor/plasteel/shuttle/red)) @@ -256,7 +264,11 @@ for(var/mob/living/player in player_list) //Make sure at least one of you is onboard if(player.mind && player.mind != owner) if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) + if(issilicon(player)) //Borgs are technically dead anyways + continue + if(isanimal(player)) //animals don't count + continue + if(isbrain(player)) //also technically dead continue if(get_area(player) == A) if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/open/floor/plasteel/shuttle/red)) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index a93a7d81f90..d652a5ae863 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -69,7 +69,7 @@ /obj/structure/constructshell name = "empty shell" icon = 'icons/obj/wizard.dmi' - icon_state = "construct" + icon_state = "construct-cult" desc = "A wicked machine used by those skilled in magical arts. It is inactive." /obj/structure/constructshell/examine(mob/user) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 360311ad9c1..d741a28896e 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -370,7 +370,10 @@ /datum/spellbook_entry/item/cursed_heart name = "Cursed Heart" - desc = "A heart that has been revived by dark magicks, the user must concentrate to ensure the heart beats, but every beat heals them. It must beat every 6 seconds." + desc = "A heart that has been revived by dark magicks, the user must \ + concentrate to ensure the heart beats, but every beat heals them. It \ + must beat every 6 seconds. The heart is fickle, and will not work for a \ + lich." item_path = /obj/item/organ/heart/cursed/wizard log_name = "CH" cost = 1 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index ec0f8298d81..c9b1909c808 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -73,6 +73,8 @@ /obj/machinery/sleeper/close_machine(mob/user) if((isnull(user) || istype(user)) && state_open && !panel_open) ..(user) + if(occupant && occupant.stat != DEAD) + occupant << "You feel cool air surround you. You go numb as your senses turn inward." /obj/machinery/sleeper/attack_animal(mob/living/simple_animal/M) if(M.environment_smash) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ba14a0d3540..dec0a8d6acc 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -254,7 +254,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (3) dat += "

Atmospheric Readings

" - var/turf/T = get_turf(user.loc) + var/turf/T = user.loc if (isnull(T)) dat += "Unable to obtain a reading.
" else @@ -269,7 +269,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (total_moles) for(var/id in env_gases) var/gas_level = env_gases[id][MOLES]/total_moles - if(id in hardcoded_gases || gas_level > 0.001) + if(gas_level > 0) dat += "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_level*100, 0.01)]%
" dat += "Temperature: [round(environment.temperature-T0C)]°C
" diff --git a/code/game/objects/items/devices/modificationkit.dm b/code/game/objects/items/devices/modificationkit.dm index f4de7b7491c..cd25b38140a 100644 --- a/code/game/objects/items/devices/modificationkit.dm +++ b/code/game/objects/items/devices/modificationkit.dm @@ -18,6 +18,12 @@ user << "This kit can only modify kinetic \ accelerators!" return ..() + // RIP the 'improved improved improved improved kinetic accelerator + if(C.holds_charge && C.unique_frequency) + user << "This kinetic accelerator already has \ + these upgrades." + return ..() + user <<"You modify the [C], adjusting the trigger \ guard and internal capacitor." C.name = "improved [C.name]" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 798a8ce3614..6102f97caee 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -300,6 +300,7 @@ MASS SPECTROMETER else user << "Plasma: [round(plasma_concentration*100, 0.01)] %" + for(var/id in env_gases) if(id in hardcoded_gases) continue diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 76cf1ff5a33..e7edcee2c10 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -238,6 +238,12 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \ return return ..() +/obj/item/stack/sheet/runed_metal/attack(atom/target, mob/living/user) + if(!iscultist(user)) + user << "Only one with forbidden knowledge could hope to work this metal..." + return + ..() + /obj/item/stack/sheet/runed_metal/fifty amount = 50 diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index a0279af71e9..139371fa3d2 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -143,13 +143,12 @@ item_state = "gold_horn" /obj/item/weapon/bikehorn/golden/attack() - ..() flip_mobs() + return ..() /obj/item/weapon/bikehorn/golden/attack_self(mob/user) - ..() flip_mobs() - + ..() /obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) if (!spam_flag) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index a81762cadf1..f56f9d01d5a 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -174,7 +174,7 @@ var/turf/T = get_turf(loc) if(istype(T, /turf/open)) var/turf/open/theturf = T - theturf.MakeSlippery(TURF_WET_WATER) + theturf.MakeSlippery(min = 10, max = 5) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.") return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 6c6e0f78446..79e8aaa1560 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -77,8 +77,8 @@ new /obj/item/weapon/shield/riot/tele(src) new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/weapon/gun/energy/gun/hos(src) - new /obj/item/weapon/door_remote/head_of_security(src) new /obj/item/device/flashlight/seclite(src) + new /obj/item/weapon/pinpointer(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" @@ -101,6 +101,7 @@ new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/device/flashlight/seclite(src) new /obj/item/clothing/gloves/color/black/krav_maga/sec(src) + new /obj/item/weapon/door_remote/head_of_security(src) /obj/structure/closet/secure_closet/security name = "security officer's locker" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index d81af121c14..8bf04d32eea 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -239,38 +239,23 @@ //a rock is flora according to where the icon file is //and now these defines + /obj/structure/flora/rock - name = "rock" - desc = "a rock" - icon_state = "rock" + icon_state = "basalt" + desc = "A volcanic rock" icon = 'icons/obj/flora/rocks.dmi' anchored = 1 burn_state = FIRE_PROOF density = 1 /obj/structure/flora/rock/New() - ..() - icon_state = "[icon_state][rand(1,5)]" - -/obj/structure/flora/rock/pile - name = "rocks" - desc = "some rocks" - icon_state = "rockpile" - density = 0 - - -/obj/structure/flora/rock/volcanic - icon_state = "basalt" - desc = "A volcanic rock" - - -/obj/structure/flora/rock/volcanic/New() ..() icon_state = "[icon_state][rand(1,3)]" -/obj/structure/flora/rock/pile/volcanic +/obj/structure/flora/rock/pile icon_state = "lavarocks" + desc = "A pile of rocks" -/obj/structure/flora/rock/pile/volcanic/New() +/obj/structure/flora/rock/pile/New() ..() icon_state = "[icon_state][rand(1,3)]" \ No newline at end of file diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a781894bfc5..6d2412589de 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -376,7 +376,7 @@ user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") R.use(1) var/turf/T = get_turf(src) - T.ChangeTurf(/turf/closed/wall/cult) + T.ChangeTurf(/turf/closed/wall/mineral/cult) qdel(src) else diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 199c3ddae49..a38f9465763 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -134,7 +134,7 @@ return 0 if(!G.confirm()) return 0 - G.affecting.loc = src.loc + G.affecting.forceMove(src.loc) if(istype(src, /obj/structure/table/optable)) var/obj/structure/table/optable/OT = src G.affecting.resting = 1 @@ -263,29 +263,54 @@ buildstack = /obj/item/stack/sheet/glass canSmoothWith = null health = 50 + var/list/debris = list() + +/obj/structure/table/glass/New() + . = ..() + debris += new frame + debris += new /obj/item/weapon/shard + +/obj/structure/table/glass/Destroy() + for(var/i in debris) + qdel(i) + . = ..() /obj/structure/table/glass/Crossed(atom/movable/AM) . = ..() if(flags & NODECONSTRUCT) return + if(!isliving(AM)) + return // Don't break if they're just flying past if(AM.throwing) - return + spawn(5) + // Check again in a bit though + if(AM.loc == get_turf(src)) + check_break(AM) + else + check_break(AM) - if(istype(AM, /mob/living)) - var/mob/living/M = AM - if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL) - table_shatter(M) +/obj/structure/table/glass/proc/check_break(mob/living/M) + if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL) + table_shatter(M) /obj/structure/table/glass/proc/table_shatter(mob/M) - visible_message("[src] breaks!") + visible_message("[src] breaks!", + "You hear breaking glass.") playsound(src.loc, "shatter", 50, 1) - new frame(src.loc) - var/obj/item/weapon/shard/S = new(src.loc) - S.throw_impact(M) + for(var/i in debris) + var/atom/movable/AM = i + AM.loc = get_turf(src) + if(istype(AM, /obj/item/weapon/shard)) + AM.throw_impact(M) M.Weaken(5) qdel(src) +/obj/structure/table/glass/narsie_act() + color = NARSIE_WINDOW_COLOUR + for(var/obj/item/weapon/shard/S in debris) + S.color = NARSIE_WINDOW_COLOUR + /* * Wooden tables */ diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 509263147b8..f86fcf945fa 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -182,7 +182,7 @@ else if(istype(loc, /turf/open)) var/turf/open/tile = loc - tile.MakeSlippery() + tile.MakeSlippery(min = 5, max = 1) /obj/machinery/shower/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9d8f2f93bbc..e81ee6965a7 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -69,10 +69,9 @@ shatter() /obj/structure/window/narsie_act() - var/evil_color = "#7D1919" - color = evil_color + color = NARSIE_WINDOW_COLOUR for(var/obj/item/weapon/shard/shard in debris) - shard.color = evil_color + shard.color = NARSIE_WINDOW_COLOUR /obj/structure/window/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 068f0b945a6..fc864ad8326 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -2,6 +2,7 @@ var/slowdown = 0 //negative for faster, positive for slower var/wet = 0 + var/wet_time = 0 // Time in seconds that this floor will be wet for. var/image/wet_overlay = null /turf/open/Initalize_Atmos(times_fired) @@ -43,6 +44,15 @@ excited = 1 SSair.active_turfs |= src +/turf/open/proc/GetHeatCapacity() + . = air.heat_capacity() + +/turf/open/proc/GetTemperature() + . = air.temperature + +/turf/open/proc/TakeTemperature(temp) + air.temperature += temp + air_update_turf() /turf/open/handle_fall(mob/faller, forced) faller.lying = pick(90, 270) @@ -63,7 +73,6 @@ return 0 if(C.m_intent=="walk" && (lube&NO_SLIP_WHEN_WALKING)) return 0 - C << "You slipped[ O ? " on the [O.name]" : ""]!" C.attack_log += "\[[time_stamp()]\] Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!" @@ -86,7 +95,10 @@ C.spin(1,1) return 1 -/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice +/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min = 0, max = 0) // 1 = Water, 2 = Lube, 3 = Ice + wet_time += max + if(wet_time < min) + wet_time = min if(wet >= wet_setting) return wet = wet_setting @@ -103,32 +115,49 @@ else wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay - - if(wet < TURF_WET_ICE) - addtimer(src, "MakeDry", rand(790, 820)) + HandleWet() /turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER) - if(!istype(src, /turf)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all. - return if(wet > wet_setting || !wet) return - if(wet == TURF_WET_PERMAFROST) - wet = TURF_WET_ICE - else - wet = TURF_DRY - if(wet_overlay) - overlays -= wet_overlay + spawn(rand(0,20)) + if(wet == TURF_WET_PERMAFROST) + wet = TURF_WET_ICE + else + wet = TURF_DRY + if(wet_overlay) + overlays -= wet_overlay /turf/open/proc/HandleWet() - if(!istype(src, /turf)) - return - if(!wet || wet > TURF_WET_ICE) - return - if(air.temperature < T0C && wet != TURF_WET_ICE) + if(!wet_time && wet < TURF_WET_ICE) MakeDry(TURF_WET_ICE) - MakeSlippery(TURF_WET_ICE) - else if (wet == TURF_WET_ICE) + if(wet_time > MAXIMUM_WET_TIME) + wet_time = MAXIMUM_WET_TIME + if(wet == TURF_WET_ICE && air.temperature > T0C) MakeDry(TURF_WET_ICE) MakeSlippery(TURF_WET_WATER) - else if (air.temperature > T0C + 40) // Warm rooms will dry up rather quickly. - addtimer(src, "MakeDry", 100, 1, TURF_WET_ICE) + switch(air.temperature) + if(-INFINITY to T0C) + if(wet != TURF_WET_ICE && wet) + MakeDry(TURF_WET_ICE) + MakeSlippery(TURF_WET_ICE) + if(T0C to T20C) + wet_time = max(0, wet_time-1) + if(T20C to T0C + 40) + wet_time = max(0, wet_time-2) + if(T0C + 40 to T0C + 60) + wet_time = max(0, wet_time-3) + if(T0C + 60 to T0C + 80) + wet_time = max(0, wet_time-5) + if(T0C + 80 to T0C + 100) + wet_time = max(0, wet_time-10) + if(T0C + 100 to INFINITY) + wet_time = 0 + + if(wet && wet < TURF_WET_ICE && !wet_time) + MakeDry(TURF_WET_ICE) + if(!wet && wet_time) + wet_time = 0 + if(wet) + addtimer(src, "HandleWet", 15, 1) + diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 625bcbf18fa..7117d9592b5 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -205,6 +205,13 @@ processing = 0 SSobj.processing.Remove(src) +/turf/open/floor/plating/lava/GetHeatCapacity() + . = 700000 + +/turf/open/floor/plating/lava/GetTemperature() + . = 5000 + +/turf/open/floor/plating/lava/TakeTemperature(temp) /turf/open/floor/plating/lava/proc/burn_stuff() . = 0 @@ -224,7 +231,7 @@ else if (istype(thing, /mob/living)) . = 1 var/mob/living/L = thing - if("mining" in L.faction) + if("lava" in L.weather_immunities) continue if(L.buckled) if(isobj(L.buckled)) @@ -232,8 +239,8 @@ if(O.burn_state == LAVA_PROOF) continue if(isliving(L.buckled)) //Goliath riding - var/mob/living/liv = L.buckled - if("mining" in liv.faction) + var/mob/living/live = L.buckled + if("lava" in live.weather_immunities) continue L.adjustFireLoss(20) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 9551bed794f..98c55e9c555 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -254,7 +254,7 @@ /turf/closed/wall/narsie_act() if(prob(20)) - ChangeTurf(/turf/closed/wall/cult) + ChangeTurf(/turf/closed/wall/mineral/cult) /turf/closed/wall/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user) return 0 diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 83e29d65bce..b2f520ac524 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -1,4 +1,4 @@ -/turf/closed/wall/cult +/turf/closed/wall/mineral/cult name = "runed metal wall" desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound." icon = 'icons/turf/walls/cult_wall.dmi' @@ -7,29 +7,29 @@ builtin_sheet = null canSmoothWith = null -/turf/closed/wall/cult/New() +/turf/closed/wall/mineral/cult/New() PoolOrNew(/obj/effect/overlay/temp/cult/turf, src) ..() -/turf/closed/wall/cult/break_wall() +/turf/closed/wall/mineral/cult/break_wall() new/obj/item/stack/sheet/runed_metal(get_turf(src), 1) return (new /obj/structure/girder/cult(src)) -/turf/closed/wall/cult/devastate_wall() +/turf/closed/wall/mineral/cult/devastate_wall() new/obj/item/stack/sheet/runed_metal(get_turf(src), 1) -/turf/closed/wall/cult/narsie_act() +/turf/closed/wall/mineral/cult/narsie_act() return -/turf/closed/wall/cult/artificer +/turf/closed/wall/mineral/cult/artificer name = "runed stone wall" desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound." -/turf/closed/wall/cult/artificer/break_wall() +/turf/closed/wall/mineral/cult/artificer/break_wall() PoolOrNew(/obj/effect/overlay/temp/cult/turf, get_turf(src)) return null //excuse me we want no runed metal here -/turf/closed/wall/cult/artificer/devastate_wall() +/turf/closed/wall/mineral/cult/artificer/devastate_wall() PoolOrNew(/obj/effect/overlay/temp/cult/turf, get_turf(src)) /turf/closed/wall/vault diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index da7f0648d5c..06581872610 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -28,6 +28,8 @@ /turf/open/space/ChangeTurf(path) . = ..() +/turf/open/space/TakeTemperature(temp) + /turf/open/space/AfterChange() ..() atmos_overlay_types.Cut() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 06b7a07c466..33971447d07 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -104,8 +104,8 @@ if(!M.slip(0, 3, null, NO_SLIP_WHEN_WALKING)) M.inertia_dir = 0 if(TURF_WET_LUBE) - M.slip(0, 4, null, (SLIDE|GALOSHES_DONT_HELP)) - M.confused += 8 + if(M.slip(0, 4, null, (SLIDE|GALOSHES_DONT_HELP))) + M.confused = max(M.confused, 8) if(TURF_WET_ICE) M.slip(0, 6, null, (SLIDE|GALOSHES_DONT_HELP)) if(TURF_WET_ICE || TURF_WET_PERMAFROST) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index fae5f96e1b9..a69cc1df9dc 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -15,8 +15,7 @@ usr << "@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" for(var/id in GM_gases) - if(id in hardcoded_gases || GM_gases[id][MOLES]) - usr << "[GM_gases[id][GAS_META][META_GAS_NAME]]: [GM_gases[id][MOLES]]" + usr << "[GM_gases[id][GAS_META][META_GAS_NAME]]: [GM_gases[id][MOLES]]" feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/fix_next_move() @@ -100,4 +99,4 @@ load_admins() feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - message_admins("[key_name_admin(usr)] manually reloaded admins") \ No newline at end of file + message_admins("[key_name_admin(usr)] manually reloaded admins") diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 05fdf032d0b..893df8ead12 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -117,8 +117,6 @@ perform_exposure() - if(location.wet) location.wet = 0 - if(bypassing) icon_state = "3" location.burn_tile() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index cbc9232520c..a0e9c90e029 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -192,7 +192,6 @@ if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) if(consider_superconductivity(starting = 1)) remove = 0 - HandleWet() // if the tile is wet, and cold, make ice. Or if it's wet, and warm, dry it off. if(!our_excited_group && remove == 1) SSair.remove_from_active(src) diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index bb79aa21bfe..5188750f085 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -68,6 +68,11 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, specific_heat = 30 name = "Volatile Fuel" +/datum/gas/bz + id = "bz" + specific_heat = 20 + name = "BZ" + /obj/effect/overlay/gas/ icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 diff --git a/code/modules/atmospherics/gasmixtures/space_mixture.dm b/code/modules/atmospherics/gasmixtures/space_mixture.dm index 15e1b44af9c..608974f0ce0 100644 --- a/code/modules/atmospherics/gasmixtures/space_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/space_mixture.dm @@ -2,7 +2,6 @@ //it can be changed, but any changes will ultimately be undone before they can have any effect /datum/gas_mixture/space - var/static/datum/gas_mixture/dummy = new /datum/gas_mixture/space/New() ..() @@ -18,6 +17,12 @@ /datum/gas_mixture/space/merge() return 0 //we're immutable. +/datum/gas_mixture/space/heat_capacity() + . = 700000 + +/datum/gas_mixture/space/heat_capacity_archived() + . = heat_capacity() + /datum/gas_mixture/space/remove() return copy() //we're immutable, so we can just return a copy. @@ -25,8 +30,9 @@ return copy() //we're immutable, so we can just return a copy. /datum/gas_mixture/space/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - . = dummy.share(sharer, atmos_adjacent_turfs) //keep all the sharing calculations, but don't actually change anything about ourselves - dummy.copy_from(src) + . = ..(sharer, 0) + temperature = TCMB + gases.Cut() /datum/gas_mixture/space/after_share() temperature = TCMB @@ -50,6 +56,6 @@ /datum/gas_mixture/space/parse_gas_string() return 0 //we're immutable. -/datum/gas_mixture/space/temperature_share() - ..() - temperature = TCMB +/datum/gas_mixture/space/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + . = ..(sharer, 1, sharer_temperature, sharer_heat_capacity) + temperature = TCMB \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 93cb87e4d1e..4b8791c3400 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -76,6 +76,7 @@ "co2" = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa "plasma" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa + "bz" = new/datum/tlv(-1, -1, 0.2, 0.5) ) /obj/machinery/airalarm/server // No checks here. @@ -87,6 +88,7 @@ "co2" = new/datum/tlv(-1, -1, -1, -1), "plasma" = new/datum/tlv(-1, -1, -1, -1), "n2o" = new/datum/tlv(-1, -1, -1, -1), + "bz" = new/datum/tlv(-1, -1, -1, -1), ) /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. @@ -98,6 +100,7 @@ "co2" = new/datum/tlv(-1, -1, 5, 10), // Partial pressure, kpa "plasma" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa + "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa ) //all air alarms in area are connected via magic diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 0735a876106..cb97092e629 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -140,27 +140,32 @@ var/pipenetwarnings = 10 /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) var/total_heat_capacity = air.heat_capacity() var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) + var/target_temperature + var/target_heat_capacity if(istype(target, /turf/open)) + var/turf/open/modeled_location = target + target_temperature = modeled_location.GetTemperature() + target_heat_capacity = modeled_location.GetHeatCapacity() if(modeled_location.blocks_air) if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.temperature - modeled_location.temperature + var/delta_temperature = air.temperature - target_temperature var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) + (partial_heat_capacity*target_heat_capacity/(partial_heat_capacity+target_heat_capacity)) air.temperature -= heat/total_heat_capacity - modeled_location.temperature += heat/modeled_location.heat_capacity + modeled_location.TakeTemperature(heat/target_heat_capacity) else var/delta_temperature = 0 var/sharer_heat_capacity = 0 - delta_temperature = (air.temperature - modeled_location.air.temperature) - sharer_heat_capacity = modeled_location.air.heat_capacity() + delta_temperature = (air.temperature - target_temperature) + sharer_heat_capacity = target_heat_capacity var/self_temperature_delta = 0 var/sharer_temperature_delta = 0 @@ -175,9 +180,7 @@ var/pipenetwarnings = 10 return 1 air.temperature += self_temperature_delta - - modeled_location.air.temperature += sharer_temperature_delta - modeled_location.air_update_turf() + modeled_location.TakeTemperature(sharer_temperature_delta) else diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 6ecb554eab7..8b3c53864e2 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -36,8 +36,8 @@ else if(T.blocks_air) environment_temperature = T.temperature else - var/datum/gas_mixture/environment = T.return_air() - environment_temperature = environment.temperature + var/turf/open/OT = T + environment_temperature = OT.GetTemperature() else environment_temperature = T.temperature diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 100b9af99b7..ca92eeb06c9 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -28,6 +28,7 @@ "co2" = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, "plasma" = /obj/machinery/portable_atmospherics/canister/toxins, "n2o" = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, + "bz" = /obj/machinery/portable_atmospherics/canister/bz, "air" = /obj/machinery/portable_atmospherics/canister/air, "caution" = /obj/machinery/portable_atmospherics/canister, ) @@ -56,6 +57,11 @@ name = "agent b canister" desc = "Oxygen Agent B. You're not quite sure what it does." gas_type = "agent_b" +/obj/machinery/portable_atmospherics/canister/bz + name = "BZ canister" + desc = "BZ, a powerful hallucinogenic nerve agent." + icon_state = "purple" + gas_type = "bz" /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "n2o canister" desc = "Nitrous oxide gas. Known to cause drowsiness." diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index c1ca56c5ae5..bba79f6b5f7 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -7,7 +7,7 @@ var/volume_rate = 1000 volume = 1000 - var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b") + var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz") /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 724dcf434e3..2134e7db4cb 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -32,4 +32,9 @@ state = 2 /obj/machinery/power/emitter/energycannon/RefreshParts() - return \ No newline at end of file + return + +/obj/machinery/power/emitter/energycannon/magical + name = "wabbajack statue" + desc = "Who am I? What is my purpose in life? What do I mean by who am I?" + projectile_type = /obj/item/projectile/magic/change diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 7b655fbdeb8..2d863a0079e 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -121,6 +121,10 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away if(!template) world << "No ruins found." return + for(var/i in template.get_affected_turfs(get_turf(src), 1)) + var/turf/T = i + for(var/mob/living/simple_animal/monster in T) + qdel(monster) template.load(get_turf(src),centered = TRUE) template.loaded++ world << "Ruins loaded." diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index bd7c588c973..59f8362a98a 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -70,8 +70,12 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they // Adds item's cost and amount to the current export cycle. // get_cost, get_amount and applies_to do not neccesary mean a successful sale. /datum/export/proc/sell_object(obj/O, contr = 0, emag = 0) - total_cost += get_cost(O) - total_amount += get_amount(O) + var/cost = get_cost(O) + var/amount = get_amount(O) + total_cost += cost + total_amount += amount + feedback_add_details("export_sold_amount","[O.type]|[amount]") + feedback_add_details("export_sold_cost","[O.type]|[cost]") // Total printout for the cargo console. // Called before the end of current export cycle. @@ -99,4 +103,4 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they // The current export cycle is over now. Reset all the export temporary vars. /datum/export/proc/export_end() total_cost = 0 - total_amount = 0 \ No newline at end of file + total_amount = 0 diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9a39b5e07aa..b021a20ba6f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -62,6 +62,7 @@ var/turf/open/t_loc = get_turf(src) if(istype(t_loc) && t_loc.wet) t_loc.MakeDry(TURF_WET_WATER) + t_loc.wet_time = 0 /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index b91ac8ab04f..53e4b59866d 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -62,21 +62,22 @@ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 10, rad = 10) /obj/item/clothing/suit/hooded/cloak/drake - name = "ash drake hide cloak" - icon_state = "golclo" - desc = "A cloak fashioned from the hide of an ash drake, offers incredible defense while still remaining lightweight. " + name = "drake armour" + icon_state = "dragon" + desc = "A suit of armour fashioned from the remains of an ash drake. " allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear) armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50) hooded = 1 hoodtype = /obj/item/clothing/head/cloakhood/drake heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT unacidable = 1 /obj/item/clothing/head/cloakhood/drake - name = "ash drake hide hood" - icon_state = "golhood" - desc = "A stiff hood made of ash drake hide." + name = "drake helm" + icon_state = "dragon" + desc = "The skull of a dragon." armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm index 0af951395f8..eba8c301972 100644 --- a/code/modules/crafting/guncrafting.dm +++ b/code/modules/crafting/guncrafting.dm @@ -1,5 +1,4 @@ -// This file is for projectile weapon crafting. All parts and construction paths will be contained here. -// The weapons themselves are children of other weapons and should be contained in their respective files. +//Gun crafting parts til they can be moved elsewhere // PARTS // @@ -14,70 +13,3 @@ desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." icon = 'icons/obj/improvised.dmi' icon_state = "riflestock" - - -// CRAFTING // - -/obj/item/weaponcrafting/reciever/attackby(obj/item/W, mob/user, params) - if(istype(W,/obj/item/pipe)) - user << "You attach the shotgun barrel to the receiver. The pins seem loose." - var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction - user.unEquip(src) - user.put_in_hands(I) - qdel(W) - qdel(src) - return - -// SHOTGUN // - -/obj/item/weaponcrafting/ishotgunconstruction - name = "slightly conspicuous metal construction" - desc = "A long pipe attached to a firearm receiver. The pins seem loose." - icon = 'icons/obj/improvised.dmi' - icon_state = "ishotgunstep1" - -/obj/item/weaponcrafting/ishotgunconstruction/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/weapon/screwdriver)) - var/obj/item/weaponcrafting/ishotgunconstruction2/C = new /obj/item/weaponcrafting/ishotgunconstruction2 - user.unEquip(src) - user.put_in_hands(C) - user << "You screw the pins into place, securing the pipe to the receiver." - qdel(src) - -/obj/item/weaponcrafting/ishotgunconstruction2 - name = "very conspicuous metal construction" - desc = "A long pipe attached to a trigger assembly." - icon = 'icons/obj/improvised.dmi' - icon_state = "ishotgunstep1" - -/obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W, mob/user, params) - if(istype(W,/obj/item/weaponcrafting/stock)) - user << "You attach the stock to the receiver-barrel assembly." - var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3 - user.unEquip(src) - user.put_in_hands(I) - qdel(W) - qdel(src) - return - -/obj/item/weaponcrafting/ishotgunconstruction3 - name = "extremely conspicuous metal construction" - desc = "A receiver-barrel shotgun assembly with a loose wooden stock. There's no way you can fire it without the stock coming loose." - icon = 'icons/obj/improvised.dmi' - icon_state = "ishotgunstep2" - -/obj/item/weaponcrafting/ishotgunconstruction3/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/stack/packageWrap)) - var/obj/item/stack/packageWrap/C = I - if (C.use(5)) - var/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/W = new /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised - user.unEquip(src) - user.put_in_hands(W) - user << "You tie the wrapping paper around the stock and the barrel to secure it." - qdel(src) - else - user << "You need at least five feet of wrapping paper to secure the stock!" - return - diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 078f7dab63b..6a9685186d9 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -5,7 +5,7 @@ max_occurrences = 1000 earliest_start = 0 alertadmins = 0 - + /datum/round_event/meteor_wave/dust startWhen = 1 endWhen = 2 diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index 852c8ed9108..7a61fd5f981 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -203,7 +203,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell desc = "A flask of holy water...it's been sitting in the Necropolis a while though." - list_reagents = list("hellwater" = 100) + list_reagents = list("hell_water" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye Vermouth" diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food&drinks/food/snacks/meat.dm index 6564bd05163..0d8cee8dff4 100644 --- a/code/modules/food&drinks/food/snacks/meat.dm +++ b/code/modules/food&drinks/food/snacks/meat.dm @@ -31,7 +31,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human - name = "-meat" + name = " meat" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human @@ -56,19 +56,19 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime icon_state = "slimemeat" - desc = "Because jello wasn't offensive enough to vegans" + desc = "Because jello wasn't offensive enough to vegans." list_reagents = list("nutriment" = 3, "slimejelly" = 3) filling_color = "#00FFFF" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem icon_state = "golemmeat" - desc = "Edible rocks, welcome to the future" + desc = "Edible rocks, welcome to the future." list_reagents = list("nutriment" = 3, "iron" = 3) filling_color = "#A9A9A9" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine icon_state = "agolemmeat" - desc = "From the slime pen to the rune to the kitchen, science" + desc = "From the slime pen to the rune to the kitchen, science." filling_color = "#66CDAA" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard @@ -78,7 +78,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant icon_state = "plantmeat" - desc = "All the joys of healthy eating with all the fun of cannibalism" + desc = "All the joys of healthy eating with all the fun of cannibalism." filling_color = "#E9967A" /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow @@ -88,18 +88,18 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly icon_state = "flymeat" - desc = "Nothing says tasty like maggot filled radioactive mutant flesh" + desc = "Nothing says tasty like maggot filled radioactive mutant flesh." list_reagents = list("nutriment" = 3, "uranium" = 3) /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton name = "-bone" icon_state = "skeletonmeat" - desc = "There's a point where this needs to stop and clearly we have passed it" + desc = "There's a point where this needs to stop, and clearly we have passed it." filling_color = "#F0F0F0" slice_path = null //can't slice a bone into cutlets /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - name = "-meat (rotten)" + name = " meat (rotten)" icon_state = "lizardmeat" //Close enough. desc = "Halfway to becoming fertilizer for your garden." filling_color = "#6B8E23" diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food&drinks/food/snacks_meat.dm index 79cc725e8a8..7564deda448 100644 --- a/code/modules/food&drinks/food/snacks_meat.dm +++ b/code/modules/food&drinks/food/snacks_meat.dm @@ -124,6 +124,21 @@ desc = "Severed lizard tail on a stick." bonus_reagents = list("nutriment" = 1, "vitamin" = 4) +/obj/item/weapon/reagent_containers/food/snacks/rawkhinkali + name = "raw khinkali" + desc = "One hundred khinkalis? Do I look like a pig?" + icon_state = "khinkali" + list_reagents = list("nutriment" = 1, "vitamin" = 1) + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/khinkali + +/obj/item/weapon/reagent_containers/food/snacks/khinkali + name = "khinkali" + desc = "One hundred khinkalis? Do I look like a pig?" + icon_state = "khinkali" + list_reagents = list("nutriment" = 4, "vitamin" = 2) + bitesize = 3 + filling_color = "#F0F0F0" + /obj/item/weapon/reagent_containers/food/snacks/monkeycube name = "monkey cube" desc = "Just add water!" diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm index 1e5362a5b54..8036dcdf3ea 100644 --- a/code/modules/food&drinks/food/snacks_pastry.dm +++ b/code/modules/food&drinks/food/snacks_pastry.dm @@ -219,6 +219,14 @@ list_reagents = list("nutriment" = 6, "vitamin" = 2) filling_color = "#8B0000" +/obj/item/weapon/reagent_containers/food/snacks/khachapuri + name = "khachapuri" + desc = "Bread with egg and cheese?" + icon_state = "khachapuri" + list_reagents = list("nutriment" = 12, "vitamin" = 2) + filling_color = "#FFFF4D" + + /obj/item/weapon/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm index 93e3d1799fd..d3df1ef47f9 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food&drinks/kitchen machinery/gibber.dm @@ -204,7 +204,7 @@ for (var/i=1 to meat_produced) var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/newmeat = new typeofmeat var/obj/item/stack/sheet/animalhide/newskin = new typeofskin - newmeat.name = sourcename + newmeat.name + newmeat.name = "[sourcename] [newmeat.name]" newmeat.subjectname = sourcename if(sourcejob) newmeat.subjectjob = sourcejob @@ -230,7 +230,7 @@ skin.throw_at_fast(pick(nearby_turfs),i,3) for (var/turfs=1 to meat_produced*3) var/turf/gibturf = pick(nearby_turfs) - if (!gibturf.density && src in viewers(gibturf)) + if (!gibturf.density && src in view(gibturf)) new gibtype(gibturf,i) pixel_x = initial(pixel_x) //return to its spot after shaking diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm index f20b5ae37d7..f0432c80282 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm @@ -152,3 +152,11 @@ result = /obj/item/weapon/reagent_containers/food/snacks/nugget category = CAT_FOOD +/datum/crafting_recipe/food/rawkhinkali + name = "Raw Khinkali" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice = 1, + /obj/item/weapon/reagent_containers/food/snacks/faggot = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/rawkhinkali + category = CAT_FOOD diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm index 850eb46b620..b0313fc0b27 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm @@ -170,6 +170,16 @@ result = /obj/item/weapon/reagent_containers/food/snacks/meatbun category = CAT_FOOD +/datum/crafting_recipe/food/khachapuri + name = "Khachapuri" + reqs = list( + /datum/reagent/consumable/eggyolk = 5, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, + /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/khachapuri + category = CAT_FOOD + /datum/crafting_recipe/food/sugarcookie time = 15 name = "Sugar cookie" diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index b90ea4e5b98..d67a169b4e5 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -18,10 +18,10 @@ Chief Medical Officer access = list(access_medical, access_morgue, access_genetics, access_heads, access_mineral_storeroom, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors) + access_keycard_auth, access_sec_doors, access_maint_tunnels) minimal_access = list(access_medical, access_morgue, access_genetics, access_heads, access_mineral_storeroom, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors) + access_keycard_auth, access_sec_doors, access_maint_tunnels) /datum/outfit/job/cmo name = "Chief Medical Officer" @@ -180,4 +180,4 @@ Virologist backpack = /obj/item/weapon/storage/backpack/virology satchel = /obj/item/weapon/storage/backpack/satchel_vir - dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med \ No newline at end of file + dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 9e63d2993f9..8c66b10cbcb 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -20,12 +20,12 @@ Research Director access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, - access_tech_storage, access_minisat) + access_tech_storage, access_minisat, access_maint_tunnels) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, - access_tech_storage, access_minisat) + access_tech_storage, access_minisat, access_maint_tunnels) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 457eed53abd..b53d7c76906 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -25,11 +25,11 @@ Head of Security access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_maint_tunnels) minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_maint_tunnels) /datum/outfit/job/hos name = "Head of Security" diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm index d0572ff0531..fed8c95c19f 100644 --- a/code/modules/mining/lavaland/weather.dm +++ b/code/modules/mining/lavaland/weather.dm @@ -25,6 +25,7 @@ var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs. var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people var/list/impacted_areas = list() + var/immunity_type = "storm" /datum/weather/proc/weather_start_up() for(var/area/N in get_areas(area_type)) @@ -73,9 +74,8 @@ /datum/weather/proc/storm_act(mob/living/L) - if(prob(30)) //Dont want it spammed very tick - L << "You're buffeted by the storm!" - L.adjustBruteLoss(1) + if(immunity_type in L.weather_immunities) + return /datum/weather/proc/update_areas() for(var/area/N in impacted_areas) diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm index 181569c8792..1f75b7daa07 100644 --- a/code/modules/mining/lavaland/weather_types.dm +++ b/code/modules/mining/lavaland/weather_types.dm @@ -18,8 +18,13 @@ duration_overlay = "lava" overlay_layer = 2 //Covers floors only + immunity_type = "lava" + /datum/weather/floor_is_lava/storm_act(mob/living/L) + if(immunity_type in L.weather_immunities) + return + var/turf/F = get_turf(L) for(var/obj/structure/O in F.contents) if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! @@ -77,6 +82,8 @@ duration_overlay = "ash_storm" overlay_layer = 10 + immunity_type = "ash" + /datum/weather/ash_storm/false_alarm //No storm, just light ember fall purely_aesthetic = TRUE @@ -85,8 +92,9 @@ wind_down_message = "The ash fall starts to trail off." /datum/weather/ash_storm/storm_act(mob/living/L) - if("mining" in L.faction) + if(immunity_type in L.weather_immunities) return + if(istype(L.loc, /obj/mecha)) return if(ishuman(L)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index d5256375e21..a7ebbeae68a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -204,6 +204,7 @@ Doesn't work on other aliens/AI.*/ A.yo = U.y - T.y A.xo = U.x - T.x A.fire() + user.newtonian_move(get_dir(U, T)) return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 54d8d66f29a..b1718b26f9a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -33,9 +33,15 @@ set_species(dna.species.type) //initialise organs - internal_organs += new /obj/item/organ/appendix - internal_organs += new /obj/item/organ/lungs - internal_organs += new /obj/item/organ/heart + if(!(NOHUNGER in dna.species.specflags)) + internal_organs += new /obj/item/organ/appendix + + if(!(NOBREATH in dna.species.specflags)) + internal_organs += new /obj/item/organ/lungs + + if(!(NOBLOOD in dna.species.specflags)) + internal_organs += new /obj/item/organ/heart + internal_organs += new /obj/item/organ/brain //Note: Additional organs are generated/replaced on the dna.species level @@ -811,6 +817,8 @@ /mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C) + CHECK_DNA_AND_SPECIES(C) + if(C.stat == DEAD) src << "[C.name] is dead!" return @@ -828,14 +836,27 @@ src << "You fail to perform CPR on [C]!" return 0 - if(C.health <= config.health_threshold_crit) - C.cpr_time = world.time + var/they_breathe = (!(NOBREATH in C.dna.species.specflags)) + var/they_lung = C.getorganslot("lungs") + + if(C.health > config.health_threshold_crit) + return + + src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") + C.cpr_time = world.time + add_logs(src, C, "CPRed") + + if(they_breathe && they_lung) var/suff = min(C.getOxyLoss(), 7) C.adjustOxyLoss(-suff) C.updatehealth() - src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") C << "You feel a breath of fresh air enter your lungs... It feels good..." - add_logs(src, C, "CPRed") + else if(they_breathe && !they_lung) + C << "You feel a breath of fresh air... \ + but you don't feel any better..." + else + C << "You feel a breath of fresh air... \ + which is a sensation you don't recognise..." /mob/living/carbon/human/generateStaticOverlay() var/image/staticOverlay = image(icon('icons/effects/effects.dmi', "static"), loc = src) @@ -985,14 +1006,32 @@ hud_used.healthdoll.icon_state = "healthdoll_DEAD" /mob/living/carbon/human/fully_heal(admin_revive = 0) + CHECK_DNA_AND_SPECIES(src) + if(admin_revive) regenerate_limbs() - if(!getorganslot("lungs")) - var/obj/item/organ/lungs/L = new() - L.Insert(src) - if(!getorganslot("tongue")) - var/obj/item/organ/tongue/T = new() - T.Insert(src) + + if(!(NOBREATH in dna.species.specflags) && !getorganslot("lungs")) + var/obj/item/organ/lungs/L = new() + L.Insert(src) + + if(!(NOBLOOD in dna.species.specflags) && !getorganslot("heart")) + var/obj/item/organ/heart/H = new() + H.Insert(src) + + if(!getorganslot("tongue")) + var/obj/item/organ/tongue/T + + for(var/tongue_type in dna.species.mutant_organs) + if(ispath(tongue_type, /obj/item/organ/tongue)) + T = new tongue_type() + T.Insert(src) + + // if they have no mutant tongues, give them a regular one + if(!T) + T = new() + T.Insert(src) + restore_blood() remove_all_embedded_objects() drunkenness = 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 99d99f6b6d6..ad5a44c60b1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -305,13 +305,25 @@ clear_alert("embeddedobject") /mob/living/carbon/human/proc/handle_heart() - if(!heart_attack) - return - else - if(losebreath < 3) - losebreath += 2 - adjustOxyLoss(5) - adjustBruteLoss(1) + CHECK_DNA_AND_SPECIES(src) + var/needs_heart = (!(NOBLOOD in dna.species.specflags)) + var/we_breath = (!(NOBREATH in dna.species.specflags)) + + if(heart_attack) + if(!needs_heart) + heart_attack = FALSE + else if(we_breath) + if(losebreath < 3) + losebreath += 2 + adjustOxyLoss(5) + adjustBruteLoss(1) + else + // even though we don't require oxygen, our blood still needs + // circulation, and without it, our tissues die and start + // gaining toxins + adjustBruteLoss(3) + if(src.reagents) + src.reagents.add_reagent("toxin", 2) /* Alcohol Poisoning Chart diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 047f46481c0..32a5b9c694f 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -48,7 +48,10 @@ return real_name /mob/living/carbon/human/IsVocal() - if(!getorganslot("lungs")) + CHECK_DNA_AND_SPECIES(src) + + // how do species that don't breathe talk? magic, that's what. + if(!(NOBREATH in dna.species.specflags) && !getorganslot("lungs")) return 0 if(mind) return !mind.miming diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 83f46d70577..ce9096b4c34 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -73,6 +73,7 @@ var/safe_toxins_max = 0.05 var/SA_para_min = 1 //Sleeping agent var/SA_sleep_min = 5 //Sleeping agent + var/BZ_trip_balls_min = 1 //BZ gas. //Breath damage var/oxy_breath_dam_min = 1 @@ -128,6 +129,32 @@ C.regenerate_limbs() //if we don't handle dismemberment, we grow our missing limbs back if(exotic_blood) C.reagents.add_reagent(exotic_blood, 80) + + var/obj/item/organ/heart/heart = C.getorganslot("heart") + var/obj/item/organ/lungs/lungs = C.getorganslot("lungs") + var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") + + if((NOBLOOD in specflags) && heart) + heart.Remove(C) + qdel(heart) + else if((!(NOBLOOD in specflags)) && (!heart)) + heart = new() + heart.Insert(C) + + if((NOBREATH in specflags) && lungs) + lungs.Remove(C) + qdel(lungs) + else if((!(NOBREATH in specflags)) && (!lungs)) + lungs = new() + lungs.Insert(C) + + if((NOHUNGER in specflags) && appendix) + appendix.Remove(C) + qdel(appendix) + else if((!(NOHUNGER in specflags)) && (!appendix)) + appendix = new() + appendix.Insert(C) + for(var/path in mutant_organs) var/obj/item/organ/I = new path() I.Insert(C) @@ -471,7 +498,13 @@ H.apply_overlay(BODY_FRONT_LAYER) /datum/species/proc/spec_life(mob/living/carbon/human/H) - return + if(NOBREATH in specflags) + H.setOxyLoss(0) + H.losebreath = 0 + + var/takes_crit_damage = (!(NOCRITDAMAGE in specflags)) + if((H.health < config.health_threshold_crit) && takes_crit_damage) + H.adjustBruteLoss(1) /datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H) return @@ -884,6 +917,10 @@ ////////////////// /datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H) + + CHECK_DNA_AND_SPECIES(M) + CHECK_DNA_AND_SPECIES(H) + if(!istype(M)) //sanity check for drones. return if((M != H) && M.a_intent != "help" && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK)) @@ -901,7 +938,17 @@ add_logs(M, H, "shaked") return 1 else - M.do_cpr(H) + var/we_breathe = (!(NOBREATH in M.dna.species.specflags)) + var/we_lung = M.getorganslot("lungs") + + if(we_breathe && we_lung) + M.do_cpr(H) + else if(we_breathe && !we_lung) + M << "You have no lungs to breathe \ + with, so cannot peform CPR." + else + M << "You do not breathe, so \ + cannot perform CPR." if("grab") if(attacker_style && attacker_style.grab_act(M,H)) @@ -1154,7 +1201,8 @@ ///////////// /datum/species/proc/breathe(mob/living/carbon/human/H) - return + if(NOBREATH in specflags) + return TRUE /datum/species/proc/check_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) if((H.status_flags & GODMODE)) @@ -1166,16 +1214,13 @@ if(H.reagents.has_reagent("epinephrine") && lungs) return if(H.health >= config.health_threshold_crit) - if(NOBREATH in specflags) - return 1 H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) if(!lungs) H.adjustOxyLoss(1) - H.failed_last_breath = 1 - else + else if(!(NOCRITDAMAGE in specflags)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - H.failed_last_breath = 1 + H.failed_last_breath = 1 H.throw_alert("oxy", /obj/screen/alert/oxy) return 0 @@ -1184,7 +1229,7 @@ var/list/breath_gases = breath.gases - breath.assert_gases("o2", "plasma", "co2", "n2o") + breath.assert_gases("o2", "plasma", "co2", "n2o", "bz") //Partial pressures in our breath var/O2_pp = breath.get_breath_partial_pressure(breath_gases["o2"][MOLES]) @@ -1291,6 +1336,9 @@ //-- TRACES --// if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here. + + // N2O + var/SA_pp = breath.get_breath_partial_pressure(breath_gases["n2o"][MOLES]) if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! @@ -1299,6 +1347,16 @@ else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) H.emote(pick("giggle", "laugh")) + + // BZ + + var/bz_pp = breath.get_breath_partial_pressure(breath_gases["bz"][MOLES]) + if(bz_pp > BZ_trip_balls_min) + H.hallucination += 20 + if(prob(33)) + H.adjustBrainLoss(3) + else if(bz_pp > 0.01) + H.hallucination += 5//Removed at 2 per tick so this will slowly build up handle_breath_temperature(breath, H) breath.garbage_collect() diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 98ce33f8a64..e0672de9cee 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -79,6 +79,14 @@ /datum/species/lizard/spec_death(gibbed, mob/living/carbon/human/H) if(H) H.endTailWag() + +/* + Lizard subspecies: ASHWALKERS +*/ +/datum/species/lizard/ashwalker + name = "Ash Walker" + id = "lizard" + specflags = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS) /* PODPEOPLE */ diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 4084b11b26e..067d3cc0d06 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -123,7 +123,7 @@ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME var/list/breath_gases = breath.gases - breath.assert_gases("o2","plasma","co2","n2o") + breath.assert_gases("o2","plasma","co2","n2o", "bz") var/O2_partialpressure = (breath_gases["o2"][MOLES]/breath.total_moles())*breath_pressure var/Toxins_partialpressure = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure @@ -188,6 +188,15 @@ else if(SA_partialpressure > 0.01) if(prob(20)) emote(pick("giggle","laugh")) + + //BZ (Facepunch port of their Agent B) + if(breath_gases["bz"]) + var/bz_partialpressure = (breath_gases["bz"][MOLES]/breath.total_moles())*breath_pressure + if(bz_partialpressure > 1) + hallucination += 20 + else if(bz_partialpressure > 0.01) + hallucination += 5//Removed at 2 per tick so this will slowly build up + breath.garbage_collect() //BREATH TEMPERATURE diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index c7a996f54f4..21e770b8e64 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -536,7 +536,7 @@ if (total_moles) for(var/id in env_gases) var/gas_level = env_gases[id][MOLES]/total_moles - if(id in hardcoded_gases || gas_level > 0.01) + if(gas_level > 0.01) dat += "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_level*100)]%
" dat += "Temperature: [round(environment.temperature-T0C)]°C
" dat += "Refresh Reading
" diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 00892f702b7..7e566ed9b96 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -104,8 +104,8 @@ victim.acid_act(5, 2, 100) if(prob(10)) //Wets floors randomly - var/turf/open/T = loc - T.MakeSlippery() + var/turf/open/OT = get_turf(loc) + OT.MakeSlippery(min = 5, max = 1) if(prob(5)) //Spawns foam! visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!") diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index f1d0ececa64..dc7013eb84b 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -26,6 +26,7 @@ AIStatus = AI_OFF //normal constructs don't have AI loot = list(/obj/item/weapon/ectoplasm) del_on_death = 1 + deathmessage = "collapses in a shattered heap." var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." @@ -35,10 +36,6 @@ for(var/spell in construct_spells) AddSpell(new spell(null)) -/mob/living/simple_animal/hostile/construct/death() - deathmessage = "[src] collapses in a shattered heap." - ..() - /mob/living/simple_animal/hostile/construct/examine(mob/user) var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" if (src.health < src.maxHealth) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 0aef48fdc9f..cdedc564910 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -114,13 +114,14 @@ /mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead) var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") family = list() - for(var/mob/living/simple_animal/pet/cat/C in mob_list) - if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats - continue - if(C.type in family) - family[C.type] += 1 - else - family[C.type] = 1 + if(!dead) + for(var/mob/living/simple_animal/pet/cat/C in mob_list) + if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats + continue + if(C.type in family) + family[C.type] += 1 + else + family[C.type] = 1 S["family"] << family memory_saved = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e373e0f4873..94dd02f7501 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -126,17 +126,27 @@ /mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M) if(!stat && M.a_intent == "disarm" && icon_state != icon_dead) - M.visible_message("[M] tips over [src].","You tip over [src].") + M.visible_message("[M] tips over [src].", + "You tip over [src].") + src << "You are tipped over by [M]!" Weaken(30) icon_state = icon_dead spawn(rand(20,50)) if(!stat && M) icon_state = icon_living - var/list/responses = list( "[src] looks at you imploringly.", - "[src] looks at you pleadingly", - "[src] looks at you with a resigned expression.", - "[src] seems resigned to its fate.") - M << pick(responses) + var/external + var/internal + switch(pick(1,2,3,4)) + if(1,2,3) + var/text = pick("imploringly.", "pleadingly.", + "with a resigned expression.") + external = "[src] looks at [M] [text]" + internal = "You look at [M] [text]" + if(4) + external = "[src] seems resigned to its fate." + internal = "You resign yourself to your fate." + visible_message("[external]", + "[internal]") else ..() @@ -304,4 +314,4 @@ var/global/chicken_count = 0 /obj/item/udder/Destroy() qdel(reagents) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 2d7ee8dd11a..1114228f1ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -12,7 +12,7 @@ /mob/living/simple_animal/hostile/poison/bees name = "bee" - desc = "buzzy buzzy bee, stingy sti- Ouch!" + desc = "Buzzy buzzy bee, stingy sti- Ouch!" icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' @@ -208,7 +208,7 @@ /mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ!" icon_base = "queen" isqueen = TRUE @@ -242,7 +242,7 @@ /obj/item/queen_bee name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ!" icon_state = "queen_item" item_state = "" icon = 'icons/mob/bees.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 72352830426..c2ef4c9f42b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -63,8 +63,10 @@ AIStatus = AI_IDLE // otherwise we go idle return 1 - - +/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P) + if(!target && AIStatus != AI_OFF && !client) + Goto(P.starting, move_to_delay, 3) + ..() //////////////HOSTILE MOB TARGETTING AND AGGRESSION//////////// @@ -354,4 +356,4 @@ . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) - return !FindTarget(possible_targets, 1) \ No newline at end of file + return !FindTarget(possible_targets, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index c0474b51e44..3bc8f6593e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -17,6 +17,7 @@ var/mob/living/parent_mob var/multiply_chance = 0 //if we multiply on hit del_on_death = 1 + deathmessage = "vanishes into thin air! It was a fake!" /mob/living/simple_animal/hostile/illusion/Life() @@ -38,11 +39,6 @@ pixel_y = initial(pixel_y) pixel_x = initial(pixel_x) - -/mob/living/simple_animal/hostile/illusion/New() - ..() - deathmessage = "[src] vanishes into thin air! It was a fake!" - /mob/living/simple_animal/hostile/illusion/examine(mob/user) if(parent_mob) parent_mob.examine(user) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 1fd2754ae85..1b84f433d99 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -11,6 +11,7 @@ friendly = "stares down" icon = 'icons/mob/lavaland/dragon.dmi' faction = list("mining") + weather_immunities = list("lava","ash") speak_emote = list("roars") luminosity = 3 armour_penetration = 40 @@ -30,7 +31,7 @@ var/obj/item/device/gps/internal var/swooping = 0 var/swoop_cooldown = 0 - deathmessage = "collapes into a pile of bones, it's flesh sloughing away." + deathmessage = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -38,6 +39,10 @@ ..() internal = new/obj/item/device/gps/internal/dragon(src) +/mob/living/simple_animal/hostile/megafauna/dragon/Destroy() + qdel(internal) + . = ..() + /mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget() if(swooping) return @@ -46,10 +51,12 @@ if(isliving(target)) var/mob/living/L = target if(L.stat == DEAD) - L.gib() - visible_message("[src] devours [L]!") - src << "You feast on [L], restoring your health!" + usr.visible_message( + "[src] devours [L]!", + "You feast on [L], restoring \ + your health!") adjustBruteLoss(-L.maxHealth) + L.gib() /mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0) return 1 @@ -228,6 +235,14 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") var/summon_cooldown = 0 +/obj/item/weapon/melee/ghost_sword/New() + ..() + SSobj.processing += src + +/obj/item/weapon/melee/ghost_sword/Destroy() + SSobj.processing -= src + . = ..() + /obj/item/weapon/melee/ghost_sword/attack_self(mob/user) if(summon_cooldown > world.time) user << "You just recently called out for aid. You don't want to annoy the spirits." @@ -236,6 +251,9 @@ notify_ghosts("[user] is raising their [src], calling for your help!", source = user) summon_cooldown = world.time + 600 +/obj/item/weapon/melee/ghost_sword/process() + ghost_check() + /obj/item/weapon/melee/ghost_sword/proc/ghost_check(mob/user) var/ghost_counter = 0 for(var/mob/dead/observer/G in dead_mob_list) @@ -243,7 +261,8 @@ ghost_counter++ G.invisibility = 0 spawn(30) - G.invisibility = initial(G.invisibility) + if(G.orbiting != user) + G.invisibility = initial(G.invisibility) return ghost_counter /obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 8a846d02623..96f29de3696 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -6,6 +6,7 @@ a_intent = "harm" sentience_type = SENTIENCE_BOSS environment_smash = 4 + weather_immunities = list("lava","ash") robust_searching = 1 stat_attack = 1 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 1c02ede80f9..2cbaff85393 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -2,6 +2,7 @@ vision_range = 2 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) faction = list("mining") + weather_immunities = list("lava","ash") environment_smash = 2 minbodytemp = 0 maxbodytemp = INFINITY @@ -126,6 +127,7 @@ a_intent = "help" speak_emote = list("screeches") throw_message = "sinks in slowly, before being pushed out of " + deathmessage = "spits up the contents of its stomach before dying!" status_flags = CANPUSH search_objects = 1 wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, @@ -136,7 +138,6 @@ /mob/living/simple_animal/hostile/asteroid/goldgrub/New() ..() - deathmessage = "[src] spits up the contents of its stomach before dying!" var/i = rand(1,3) while(i) loot += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond) @@ -248,10 +249,15 @@ ..() spawn(2400) if(!owner && !preserved) - inert = 1 - desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." + go_inert() else - preserved = 1 + preserved = TRUE + feedback_add_details("hivelord_core", "[src.type]|implanted") + +/obj/item/organ/hivelord_core/proc/go_inert() + inert = TRUE + desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." + feedback_add_details("hivelord_core", "[src.type]|inert") /obj/item/organ/hivelord_core/ui_action_click() var/spawn_amount = 1 @@ -278,7 +284,11 @@ owner.adjustOxyLoss(-2) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - var/datum/reagent/blood/B = locate() in H.vessel.reagent_list //Grab some blood + CHECK_DNA_AND_SPECIES(H) + if(NOBLOOD in H.dna.species.specflags) + return + + var/datum/reagent/blood/B = locate() in H.vessel.reagent_list var/blood_volume = round(H.vessel.get_reagent_amount("blood")) if(B && blood_volume < 560 && blood_volume) B.volume += 2 // Fast blood regen @@ -287,7 +297,7 @@ if(proximity_flag && ishuman(target)) var/mob/living/carbon/human/H = target if(inert) - user << "[src] have become inert, its healing properties are no more." + user << "[src] has become inert, its healing properties are no more." return else if(H.stat == DEAD) @@ -295,8 +305,10 @@ return if(H != user) H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!") + feedback_add_details("hivelord_core","[src.type]|used|other") else user << "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments." + feedback_add_details("hivelord_core","[src.type]|used|self") H.revive(full_heal = 1) qdel(src) ..() @@ -829,10 +841,27 @@ ..() /obj/item/organ/hivelord_core/legion - name = "legion's heart" - desc = "A demonic, still beating heart... its healing properties will soon become inert if not used quickly." + name = "legion's soul" + desc = "A strange rock that still crackles with power... its \ + healing properties will soon become inert if not used quickly." icon = 'icons/obj/surgery.dmi' - icon_state = "demon_heart" + icon_state = "legion_soul" + +/obj/item/organ/hivelord_core/legion/New() + ..() + update_icon() + +/obj/item/organ/hivelord_core/update_icon() + icon_state = inert ? "legion_soul_inert" : "legion_soul" + overlays.Cut() + if(!inert) + overlays += image(icon, "legion_soul_crackle") + +/obj/item/organ/hivelord_core/legion/go_inert() + . = ..() + desc = "[src] has become inert, it crackles no more and is useless for \ + healing injuries." + update_icon() /obj/item/weapon/legion_skull name = "legion's head" @@ -853,6 +882,7 @@ speak_emote = list("warbles", "quavers") emote_hear = list("trills.") emote_see = list("sniffs.", "burps.") + weather_immunities = list("lava","ash") faction = list("mining", "ashwalker") density = 0 speak_chance = 1 @@ -875,6 +905,7 @@ search_objects = TRUE del_on_death = TRUE loot = list(/obj/effect/decal/cleanable/blood/gibs) + deathmessage = "is pulped into bugmash." animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) @@ -882,10 +913,8 @@ wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/) var/obj/item/udder/gutlunch/udder = null - /mob/living/simple_animal/hostile/asteroid/gutlunch/New() udder = new() - deathmessage = "[src] is pulped into bugmash." ..() /mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() @@ -966,6 +995,7 @@ icon_living = "tendril" icon_dead = "tendril" faction = list("mining") + weather_immunities = list("lava","ash") health = 250 maxHealth = 250 max_mobs = 3 @@ -984,6 +1014,9 @@ ..() gps = new /obj/item/device/gps/internal(src) +/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() + qdel(gps) + . = ..() /obj/effect/collapse name = "collapsing necropolis tendril" diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 258b60e91a4..373e7b12a61 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -27,6 +27,7 @@ robust_searching = 1 unique_name = 1 speak_emote = list("squeaks") + deathmessage = "fainted." var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight @@ -58,7 +59,6 @@ cap_dead.color = cap_color UpdateMushroomCap() health = maxHealth - deathmessage = "[src] fainted." ..() /mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting diff --git a/code/modules/mob/living/simple_animal/hostile/reenactors.dm b/code/modules/mob/living/simple_animal/hostile/reenactors.dm index b6382dc4302..c49f0869c9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/reenactors.dm +++ b/code/modules/mob/living/simple_animal/hostile/reenactors.dm @@ -57,7 +57,7 @@ melee_damage_upper = 30 environment_smash = 2 attacktext = "slams" - deathmessage = "The Reenactor's body collapses in on itself from the strain!" + deathmessage = "body collapses in on itself from the strain!" loot = list(/obj/effect/gibspawner/human) /mob/living/simple_animal/hostile/wwii/melee/AttackingTarget() @@ -84,7 +84,7 @@ melee_damage_lower = 5 melee_damage_upper = 7 attacktext = "heils" - deathmessage = "The Mini-Führer explodes!" + deathmessage = "explodes!" loot = list(/obj/effect/gibspawner/robot) /mob/living/simple_animal/hostile/wwii/bomber/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 79fa9969b17..e550017407c 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -30,7 +30,7 @@ see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 layer = MOB_LAYER - 0.1 - deathmessage = "The skeleton collaspes into a pile of bones!" + deathmessage = "collapses into a pile of bones!" del_on_death = 1 loot = list(/obj/effect/decal/remains/human) @@ -46,7 +46,7 @@ gold_core_spawnable = 0 melee_damage_lower = 17 melee_damage_upper = 20 - deathmessage = "The skeleton collaspes into a pile of bones, its gear falling to the floor!" + deathmessage = "collapses into a pile of bones, its gear falling to the floor!" loot = list(/obj/effect/decal/remains/human, /obj/item/weapon/twohanded/spear, /obj/item/clothing/shoes/winterboots, @@ -69,7 +69,7 @@ force_threshold = 10 //trying to simulate actually having armor melee_damage_lower = 25 melee_damage_upper = 30 - deathmessage = "The templar knight collaspes into a pile of bones, its gear clanging as it hits the ground!" + deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!" loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/suit/armor/riot/knight/templar, /obj/item/clothing/head/helmet/knight/templar, diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index a71f5fe68e9..bb6135079d1 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -165,7 +165,4 @@ bubble_icon = "syndibot" gold_core_spawnable = 1 del_on_death = 1 - -/mob/living/simple_animal/hostile/viscerator/New() - ..() - deathmessage = "[src] is smashed into pieces!" + deathmessage = "is smashed into pieces!" diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 15e56b4813c..7295e272e8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -33,6 +33,7 @@ maxbodytemp = 1200 faction = list("hostile") + deathmessage = "is hacked into pieces!" loot = list(/obj/item/stack/sheet/mineral/wood) gold_core_spawnable = 1 del_on_death = 1 @@ -58,10 +59,6 @@ C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") -/mob/living/simple_animal/hostile/tree/New() - ..() - deathmessage = "[src] is hacked into pieces!" - /mob/living/simple_animal/hostile/tree/festivus name = "festivus pole" desc = "serenity now... SERENITY NOW!" diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index cd600cd1367..cf71e21028e 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -153,6 +153,7 @@ mob/living/simple_animal/hostile/zombie/gymboss spawn_text = "emerges from" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) faction = list("zombie") + deathmessage = "collapses, stopping the flow of zombies!" del_on_death = 1 /mob/living/simple_animal/hostile/spawner/zombie/lesser @@ -163,11 +164,6 @@ mob/living/simple_animal/hostile/zombie/gymboss health = 200 maxHealth = 200 -/mob/living/simple_animal/hostile/spawner/zombie/New() - ..() - deathmessage = "[src] collapes, stopping the flow of zombies!" - - /obj/item/weapon/shovel/cursed name = "cursed shovel" desc = "You probably shouldn't use this particular shovel." diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index f2164eec7b9..4ab44fbbec0 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -28,11 +28,7 @@ flying = 1 loot = list(/obj/item/weapon/ectoplasm) del_on_death = 1 - - -/mob/living/simple_animal/shade/death() - deathmessage = "[src] lets out a contented sigh as their form unwinds." - ..() + deathmessage = "lets out a contented sigh as their form unwinds." /mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0) return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 40457e167aa..597a1660f70 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -398,9 +398,9 @@ if(death_sound) playsound(get_turf(src),death_sound, 200, 1) if(deathmessage) - visible_message("[deathmessage]") + visible_message("\The [src] [deathmessage]") else if(!del_on_death) - visible_message("\the [src] stops moving...") + visible_message("\The [src] stops moving...") if(del_on_death) ghostize() qdel(src) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 448a7514a11..8c62ddcfa83 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -133,13 +133,13 @@ Tempstun = 0 if(stat != DEAD) - var/co2_percentage =0 - if("co2" in environment.gases) - co2_percentage = environment.gases["co2"][MOLES] / environment.total_moles() - var/stasis = (co2_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis + var/bz_percentage =0 + if("bz" in environment.gases) + bz_percentage = environment.gases["bz"][MOLES] / environment.total_moles() + var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis if(stat == CONSCIOUS && stasis) - src << "High levels of CO2 put you in stasis!" + src << "Nerve gas in the air has put you in stasis!" stat = UNCONSCIOUS powerlevel = 0 rabid = 0 diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 2c2eb731b63..204d2b400f7 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -19,6 +19,7 @@ minbodytemp = 0 maxbodytemp = 350 layer = MOB_LAYER-0.1 + sentience_type = SENTIENCE_BOSS /mob/living/simple_animal/hostile/spawner/Destroy() diff --git a/code/modules/ninja/admin_ninja_verbs.dm b/code/modules/ninja/admin_ninja_verbs.dm index d87939b1eec..3f33c41e264 100644 --- a/code/modules/ninja/admin_ninja_verbs.dm +++ b/code/modules/ninja/admin_ninja_verbs.dm @@ -30,6 +30,7 @@ Contents: H.wear_suit:randomize_param() spawn(0) H.wear_suit:ninitialize(10,H) + ticker.mode.update_ninja_icons_added(H) //ADMIN CREATE NINJA (From Ghost) diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 72771142409..574257b7190 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -155,7 +155,7 @@ Contents: return Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one - ticker.mode.update_ninja_icons_added(Mind) + ticker.mode.update_ninja_icons_added(Ninja) spawned_mobs += Ninja message_admins("[key] has been made into a ninja by an event.") log_game("[key] was spawned as a ninja by an event.") diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 91808293948..3a7194a1d81 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -99,6 +99,8 @@ var/holds_charge = FALSE var/unique_frequency = FALSE // modified by KA modkits + var/overheat = FALSE + /obj/item/weapon/gun/energy/kinetic_accelerator/super name = "super-kinetic accelerator" desc = "An upgraded, superior version of the proto-kinetic accelerator." @@ -130,14 +132,15 @@ /obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user) . = ..() - attempt_reload() + if(!can_shoot()) + attempt_reload() /obj/item/weapon/gun/energy/kinetic_accelerator/dropped() . = ..() if(!holds_charge) // Put it on a delay because moving item from slot to hand // calls dropped(). - spawn(overheat_time) + spawn(1) if(!ismob(loc)) empty() @@ -146,6 +149,10 @@ update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload() + if(overheat) + return + overheat = TRUE + var/carried = 0 if(!unique_frequency) for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \ @@ -158,10 +165,8 @@ carried = 1 spawn(overheat_time * carried) - if(can_shoot()) - return - else - reload() + reload() + overheat = FALSE /obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) return @@ -175,8 +180,7 @@ update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/update_icon() - var/obj/item/ammo_casing/energy/shot = ammo_type[select] - if(power_supply.charge < shot.e_cost) + if(!can_shoot()) icon_state = "[initial(icon_state)]_empty" else icon_state = initial(icon_state) diff --git a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm index dc7a6b82994..8f7778c497b 100644 --- a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm +++ b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm @@ -65,11 +65,22 @@ w_class = 5 var/obj/item/weapon/gun/projectile/minigun/gun = null var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded. + var/overheat = 0 + var/overheat_max = 40 + var/heat_diffusion = 1 /obj/item/weapon/minigunpack/New() gun = new(src) + SSobj.processing += src ..() +/obj/item/weapon/minigunpack/Destroy() + SSobj.processing -= src + ..() + +/obj/item/weapon/minigunpack/process() + overheat = max(0, overheat - heat_diffusion) + /obj/item/weapon/minigunpack/attack_hand(var/mob/living/carbon/user) if(src.loc == user) if(!armed) @@ -167,6 +178,14 @@ else qdel(src) +/obj/item/weapon/gun/projectile/minigun/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) + if(ammo_pack) + if(ammo_pack.overheat < ammo_pack.overheat_max) + . = ..() + ammo_pack.overheat++ + else + user << "The gun's heat sensor locked the trigger to prevent lens damage." + /obj/item/weapon/gun/projectile/minigun/afterattack(atom/target, mob/living/user, flag, params) if(!ammo_pack || ammo_pack.loc != user) user << "You need the backpack power source to fire the gun!" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 3cdc0b2100a..f0cb246b56f 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -309,7 +309,7 @@ desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." icon_state = "cshotgun" origin_tech = "combat=5;materials=2" - mag_type = /obj/item/ammo_box/magazine/internal/shot/tube + mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = 5 //Dual Feed Shotgun @@ -355,4 +355,4 @@ /obj/item/ammo_box/magazine/internal/shot/tube name = "dual feed shotgun internal tube" ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - max_ammo = 4 \ No newline at end of file + max_ammo = 4 diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 4e35fb36319..73943891b08 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -565,7 +565,7 @@ reac_volume = ..() var/turf/open/T = get_turf(M) if(istype(T) && prob(reac_volume)) - T.MakeSlippery(TURF_WET_WATER) + T.MakeSlippery(min = 5, max = 1) M.adjust_fire_stacks(-(reac_volume / 10)) M.ExtinguishMob() M.apply_damage(0.1*reac_volume, BRUTE) @@ -586,7 +586,7 @@ /datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/effect/blob/B, probchance) for(var/turf/open/T in range(1, B)) if(prob(probchance)) - T.MakeSlippery(TURF_WET_WATER) + T.MakeSlippery(min = 5, max = 1) for(var/obj/O in T) O.extinguish() for(var/mob/living/L in T) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 4952b70f4b2..27ac8a195ae 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -155,7 +155,7 @@ if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades! if(istype(T, /turf/open)) var/turf/open/OT = T - OT.MakeSlippery(TURF_WET_WATER) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. + OT.MakeSlippery(TURF_WET_ICE, 5, reac_volume*0.5) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit. /datum/reagent/consumable/condensedcapsaicin @@ -324,8 +324,7 @@ /datum/reagent/consumable/cornoil/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return - if(reac_volume >= 3) - T.MakeSlippery() + T.MakeSlippery(min = 5, max = reac_volume*2) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index d3b604ae120..008a0bb4785 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -121,8 +121,9 @@ /datum/reagent/water/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return var/CT = cooling_temperature - if(reac_volume >= 10) - T.MakeSlippery() + + if(reac_volume >= 5) + T.MakeSlippery(min = 5, max = reac_volume*0.2) for(var/mob/living/simple_animal/slime/M in T) M.apply_water() @@ -272,7 +273,7 @@ /datum/reagent/lube/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(TURF_WET_LUBE) + T.MakeSlippery(TURF_WET_LUBE, 5, reac_volume) /datum/reagent/spraytan name = "Spray Tan" @@ -1159,7 +1160,8 @@ /datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume) if(istype(T) && T.wet) - T.MakeDry(TURF_WET_WATER) + T.wet_time = max(0, T.wet_time-reac_volume*5) // removes 5 seconds of wetness for every unit. + T.HandleWet() /datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume) if(O.type == /obj/item/clothing/shoes/galoshes) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 5bfe942374d..966481e1b2d 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -89,14 +89,21 @@ toxpwr = 0 /datum/reagent/toxin/lexorin/on_mob_life(mob/living/M) - M.adjustOxyLoss(5, 0) + . = TRUE + var/mob/living/carbon/C if(iscarbon(M)) - var/mob/living/carbon/C = M - C.losebreath += 2 - if(prob(20)) - M.emote("gasp") + C = M + CHECK_DNA_AND_SPECIES(C) + if(NOBREATH in C.dna.species.specflags) + . = FALSE + + if(.) + M.adjustOxyLoss(5, 0) + if(C) + C.losebreath += 2 + if(prob(20)) + M.emote("gasp") ..() - . = 1 /datum/reagent/toxin/slimejelly name = "Slime Jelly" diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 61a17593f7b..622e3c38a31 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -223,7 +223,7 @@ name = "ash walker egg" icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "large_egg" - mob_species = /datum/species/lizard + mob_species = /datum/species/lizard/ashwalker helmet = /obj/item/clothing/head/helmet/gladiator uniform = /obj/item/clothing/under/gladiator roundstart = FALSE @@ -237,8 +237,6 @@ new_spawn << "Drag corpses to your nest to feed the young, and spawn more Ash Walkers. Bring glory to the tribe!" if(ishuman(new_spawn)) var/mob/living/carbon/human/H = new_spawn - H.dna.species.specflags |= NOBREATH - H.dna.species.specflags |= NOGUNS H.underwear = "Nude" H.update_body() diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index da204476df6..2bb0a1d1c35 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -92,6 +92,8 @@ SSshuttle.orderhistory += SO SO.generate(pick_n_take(empty_turfs)) + feedback_add_details("cargo_imports", + "[SO.pack.type]|[SO.pack.name]|[SO.pack.cost]") investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]) has shipped.", "cargo") if(SO.pack.dangerous) message_admins("\A [SO.pack.name] ordered by [key_name_admin(SO.orderer_ckey)] has shipped.") diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index d5666f99223..29d1c7cbd2f 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -36,7 +36,7 @@ action_icon_state = "lesserconstruct" action_background_icon_state = "bg_cult" - summon_type = list(/turf/closed/wall/cult/artificer) //we don't want artificer-based runed metal farms + summon_type = list(/turf/closed/wall/mineral/cult/artificer) //we don't want artificer-based runed metal farms /obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced name = "Greater Construction" diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index c7efcd76349..f6a119c428a 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -1,6 +1,11 @@ /obj/effect/proc_holder/spell/targeted/lichdom name = "Bind Soul" - desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use." + desc = "A dark necromantic pact that can forever bind your soul to an \ + item of your choosing. So long as both your body and the item remain \ + intact and on the same plane you can revive from death, though the time \ + between reincarnations grows steadily with use, along with the weakness \ + that the new skeleton body will experience upon 'birth'. Note that \ + becoming a lich destroys all internal organs except the brain." school = "necromancy" charge_max = 10 clothes_req = 0 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 266add1b1c5..e92340bee3d 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -283,6 +283,10 @@ /obj/item/bodypart/l_arm name = "left arm" + desc = "Did you know that the word 'sinister' stems originally from the \ + Latin 'sinestra' (left hand), because the left hand was supposed to \ + be possessed by the devil? This arm appears to be possessed by no \ + one though." icon_state = "l_arm" max_damage = 50 body_zone ="l_arm" @@ -292,6 +296,8 @@ /obj/item/bodypart/r_arm name = "right arm" + desc = "Over 87% of humans are right handed. That figure is much lower \ + among humans missing their right arm." icon_state = "r_arm" max_damage = 50 body_zone = "r_arm" @@ -301,6 +307,8 @@ /obj/item/bodypart/l_leg name = "left leg" + desc = "Some athletes prefer to tie their left shoelaces first for good \ + luck. In this instance, it probably would not have helped." icon_state = "l_leg" max_damage = 50 body_zone = "l_leg" @@ -310,6 +318,10 @@ /obj/item/bodypart/r_leg name = "right leg" + desc = "You put your right leg in, your right leg out. In, out, in, out, \ + shake it all about. And apparently then it detaches.\n\ + The hokey pokey has certainly changed a lot since space colonisation." + // alternative spellings of 'pokey' are availible icon_state = "r_leg" max_damage = 50 body_zone = "r_leg" @@ -322,15 +334,9 @@ /obj/item/severedtail name = "tail" - desc = "A severed tail." + desc = "A severed tail. Somewhere, no doubt, a lizard hater is very \ + pleased with themselves." icon = 'icons/obj/surgery.dmi' icon_state = "severedtail" color = "#161" var/markings = "Smooth" - - - - - - - diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 0db9fca7892..771275b0d55 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -31,7 +31,7 @@ user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!", "You stuff [tool] into [target]'s [target_zone].") user.drop_item() CH.cavity_item = tool - tool.loc = null + tool.loc = target return 1 else if(IC) diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 050b0fefbd7..2a4e4a4fbf6 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -18,6 +18,7 @@ name = "add prosthetic" implements = list(/obj/item/robot_parts = 100, /obj/item/bodypart = 100) time = 32 + var/organ_rejection_dam = 0 /datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/tool_body_zone @@ -27,8 +28,9 @@ else if(istype(tool, /obj/item/bodypart)) var/obj/item/bodypart/L = tool if(L.status != ORGAN_ROBOTIC) - user << "You need a robotic limb for this." - return -1 //fail + organ_rejection_dam = 10 + if(target.dna.species.id != L.species_id) + organ_rejection_dam = 30 tool_body_zone = L.body_zone if(target_zone == tool_body_zone) //so we can't replace a leg with an arm. user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...") @@ -43,6 +45,10 @@ qdel(tool) else L = tool + user.drop_item() L.attach_limb(target) + if(organ_rejection_dam) + target.adjustToxLoss(organ_rejection_dam) user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].") - return 1 \ No newline at end of file + return 1 + diff --git a/html/changelog.html b/html/changelog.html index 4ec3d368f3d..d632ed9323c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,65 @@ -->
+

22 May 2016

+

coiax updated:

+ + +

21 May 2016

+

Iamsaltball updated:

+ +

NicholasM10 updated:

+ +

coiax updated:

+ +

coiax, OPDingo updated:

+ +

nullbear updated:

+ + +

20 May 2016

+

KorPhaeron updated:

+ +

bgobandit updated:

+ +

coiax updated:

+ + +

19 May 2016

+

Razharas updated:

+ +

18 May 2016

Cruix updated:

- -

23 April 2016

-

Joan updated:

- -

Kor updated:

- -

Mercenaryblue updated:

- -

TechnoAlchemisto updated:

- -

coiax updated:

- - -

22 April 2016

-

Bawhoppen updated:

- -

nullbear updated:

- - -

21 April 2016

-

Kor updated:

-
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 34e57b112b2..a956033c8e0 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5078,3 +5078,53 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. held - rscadd: Kinetic accelerator modkits (made at R&D or your local Free Golem ship) overcome these flaws +2016-05-19: + Razharas: + - rscadd: HE pipes once again work in space and in lava. + - rscadd: Space cools down station air again +2016-05-20: + KorPhaeron: + - rscadd: The HoS now has a pinpointer, the Warden now has his door remote. + bgobandit: + - rscadd: Nanotrasen has begun to research BZ, a hallucinogenic gas. We trust you + will use it responsibly. + - rscadd: BZ causes hallucinations once breathed in and, at high doses, has a chance + of doing brain damage. + - rscadd: BZ is known to cause unusual stasis-like behavior in the slime species. + coiax: + - rscadd: Neurotoxin spit can be used as makeshift space propulsion +2016-05-21: + Iamsaltball: + - rscadd: Heads of Staff now have basic Maint. access. + NicholasM10: + - rscadd: The chef can now make Khinkali and Khachapuri + coiax: + - rscdel: NOBREATH species (golems, skeletons, abductors, ash walkers, zombies) + no longer have or require lungs. They no longer take suffocation/oxyloss damage, + cannot give CPR and cannot benefit from CPR. Instead of suffocation damage, + during crit they take gradual brute damage. + - rscdel: NOBLOOD (golems, skeletons, abductors, slimepeople, plasmamen) species + no longer have or require hearts. + - tweak: NOBREATH species that require hearts still take damage from heart attacks, + as their tissues die and the lack of circulation causes toxins to build up. + - rscdel: NOHUNGER (plasmamen, skeletons) species no longer have appendixes. + coiax, OPDingo: + - tweak: Renamed and reskinned legion's heart to legion's soul to avoid confusion; + it is not a substitute heart, it is a supplemental chest organ. + - rscadd: Legion's souls are now more obviously inert when becoming inert. + nullbear: + - tweak: Wetness updates less often. + - rscadd: Wetness now stacks. Spraying lube over a tile that already has lube, will + make the lube take longer to dry. Likewise, dumping 100 units of lube will take + longer to dry than if only 10 units were dumped. (lube used to last just as + long, regardless of whether it was 1u, or 100u) There is a limit, however, and + you can't stack infinite lube. + - tweak: Hotter temperatures cause water to evaporate more quickly. At 100C, water + will boil away instantly. + - rscadd: About 5 seconds of wetness are removed from a tile for each unit of drying + agent. Absorbant Galoshes remain the most effective method of drying, and dry + tiles instantly regardless of wetness. +2016-05-22: + coiax: + - rscdel: Lavaland monsters now give ruins a wide berth. + - bugfix: Glass tables now break when people are pushed onto them. diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index e1658bd5379..39cc5b018dd 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index b01ccc5f4ae..547f8a5ca94 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index dea11507769..2deeba386ab 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi index 6acd646cedf..9ca7ba0aeb2 100644 Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 94c4fb81880..1347149f11a 100644 Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 04180b4d7b2..c1c54f412a5 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index d2b4165b149..70eaedb6709 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/flora/rocks.dmi b/icons/obj/flora/rocks.dmi index 6708d199b14..f2d49ec016e 100644 Binary files a/icons/obj/flora/rocks.dmi and b/icons/obj/flora/rocks.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 956304f1fba..a41f6186a9c 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 318eb947598..78bb775406e 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index d03bd48c49a..7730f914edd 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 7b6afa870b9..937d76ff617 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -156,6 +156,7 @@ #include "code\datums\browser.dm" #include "code\datums\datacore.dm" #include "code\datums\datumvars.dm" +#include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" #include "code\datums\hud.dm" #include "code\datums\martial.dm" @@ -251,7 +252,6 @@ #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" -#include "code\game\dna.dm" #include "code\game\say.dm" #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" diff --git a/tools/mapmerge/mapmerger.py b/tools/mapmerge/mapmerger.py index af93f8f24d8..8773143de6f 100644 --- a/tools/mapmerge/mapmerger.py +++ b/tools/mapmerge/mapmerger.py @@ -2,6 +2,7 @@ import sys import os import pathlib import map_helpers +import shutil #main("../../_maps/") def main(map_folder, tgm=0): @@ -53,10 +54,12 @@ def main(map_folder, tgm=0): else: for i in valid_indices: path_str = str(list_of_files[i]) + shutil.copyfile(path_str, path_str + ".before") path_str_pretty = path_str[len(map_folder):] try: if map_helpers.merge_map(path_str, path_str + ".backup", tgm) != 1: print("ERROR MERGING: {}".format(path_str_pretty)) + os.remove(path_str + ".before") continue print("MERGED: {}".format(path_str_pretty)) except FileNotFoundError: @@ -64,6 +67,7 @@ def main(map_folder, tgm=0): print(path_str_pretty + " || " + path_str_pretty + ".backup") print("\nFinished merging.") + print("\nNOTICE: A version of the map files from before merging have been created for debug purposes.\nDo not delete these files until it is sure your map edits have no undesirable changes.") def string_to_num(s): try: