diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 32348eb0027..b1e8f101202 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -22514,7 +22514,7 @@ }, /area/crew_quarters/bar/atrium) "aRy" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/crew_quarters/bar/atrium) "aRz" = ( @@ -23422,7 +23422,7 @@ d2 = 8; icon_state = "1-8" }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/carpet, @@ -24305,7 +24305,7 @@ }, /area/crew_quarters/bar/atrium) "aUH" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/carpet, @@ -89006,7 +89006,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/wood{ broken = 1; icon_state = "wood-broken" @@ -89016,12 +89016,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plating, /area/maintenance/gambling_den) "dcT" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ icon_state = "wood" }, @@ -90537,7 +90537,7 @@ /area/maintenance/gambling_den) "dfP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/wood{ @@ -91371,7 +91371,7 @@ }, /area/maintenance/gambling_den) "dhw" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -91380,7 +91380,7 @@ /area/maintenance/gambling_den) "dhx" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/plating, @@ -92327,7 +92327,7 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "diY" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/wood{ @@ -92346,7 +92346,7 @@ /area/maintenance/gambling_den) "dja" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -93121,7 +93121,7 @@ }, /area/maintenance/gambling_den) "dkr" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plating, @@ -94305,7 +94305,7 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/construction) "dmM" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plating, /area/maintenance/gambling_den) "dmN" = ( @@ -96153,7 +96153,7 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/hor) "dpR" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/plating, @@ -96848,7 +96848,7 @@ }, /area/maintenance/gambling_den) "dra" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/plating, @@ -101412,7 +101412,7 @@ }, /area/crew_quarters/theatre) "dzq" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -102176,7 +102176,7 @@ dir = 4; level = 1 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -102619,7 +102619,7 @@ }, /area/crew_quarters/theatre) "dBq" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -108948,21 +108948,21 @@ }, /area/chapel/office) "dMT" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "chapel" }, /area/chapel/main) "dMU" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ icon_state = "chapel" }, /area/chapel/main) "dMV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "chapel" @@ -108970,14 +108970,14 @@ /area/chapel/main) "dMW" = ( /obj/structure/disposalpipe/segment, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "chapel" }, /area/chapel/main) "dMX" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/machinery/firealarm{ dir = 4; pixel_x = 28 @@ -109317,14 +109317,14 @@ }, /area/chapel/office) "dNJ" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "chapel" }, /area/chapel/main) "dNK" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "chapel" @@ -109332,7 +109332,7 @@ /area/chapel/main) "dNL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "chapel" @@ -109340,7 +109340,7 @@ /area/chapel/main) "dNM" = ( /obj/structure/disposalpipe/segment, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "chapel" @@ -109692,7 +109692,7 @@ }, /area/chapel/office) "dOq" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/machinery/light{ icon_state = "tube1"; dir = 8 @@ -109715,7 +109715,7 @@ }, /area/chapel/main) "dOt" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/machinery/light{ icon_state = "tube1"; dir = 4 @@ -111770,7 +111770,7 @@ /area/chapel/office) "dSf" = ( /obj/machinery/light/small, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /obj/machinery/newscaster{ @@ -111783,7 +111783,7 @@ /area/chapel/main) "dSg" = ( /obj/machinery/light/small, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /obj/machinery/newscaster{ diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index f0c2f14698d..a14842c2007 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -13578,7 +13578,7 @@ /turf/simulated/floor/plating, /area/maintenance/fore) "aya" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/wood, /area/crew_quarters/mrchangs) "ayb" = ( @@ -14935,7 +14935,7 @@ name = "Port Maintenance" }) "aAB" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/wood, @@ -14952,7 +14952,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/wood, @@ -15652,7 +15652,7 @@ /turf/simulated/floor/wood, /area/crew_quarters/sleep) "aBS" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/wood, @@ -21926,7 +21926,7 @@ name = "\improper Warehouse" }) "aMA" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/wood, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index 67adb3e7467..fef87df8950 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -78,7 +78,7 @@ /obj/item/shard{ icon_state = "medium" }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/wood, @@ -128,7 +128,7 @@ /turf/simulated/floor/wood, /area/ruin/unpowered) "av" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/wood, @@ -201,7 +201,7 @@ /turf/simulated/floor/wood, /area/ruin/unpowered) "aH" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/carpet, diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 2f37e69604e..87f3573eb00 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -1134,7 +1134,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/academy/classrooms) "ds" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/wood, @@ -2204,7 +2204,7 @@ }, /area/awaymission/academy/classrooms) "gb" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/wood, /area/awaymission/academy/classrooms) "gc" = ( diff --git a/_maps/map_files/RandomZLevels/example.dmm b/_maps/map_files/RandomZLevels/example.dmm index 779a0bede34..695005bada4 100644 --- a/_maps/map_files/RandomZLevels/example.dmm +++ b/_maps/map_files/RandomZLevels/example.dmm @@ -605,7 +605,7 @@ }, /area/awaymission/example) "bB" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -670,7 +670,7 @@ }, /area/awaymission/example) "bJ" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 @@ -680,7 +680,7 @@ }, /area/awaymission/example) "bK" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8 @@ -706,7 +706,7 @@ }, /area/awaymission/example) "bN" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index fe5445dc8c3..8bbc6b2fead 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -2195,7 +2195,7 @@ name = "Syndicate Outpost" }) "dh" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/machinery/alarm/monitor{ dir = 4; frequency = 1439; @@ -7981,7 +7981,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/machinery/alarm/monitor{ dir = 8; frequency = 1439; @@ -8717,7 +8717,7 @@ name = "MO19 Arrivals" }) "mB" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 143385681b3..e03bfab5397 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -224,7 +224,7 @@ }, /area/awaymission/UO71/plaza) "aH" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 @@ -873,7 +873,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 @@ -921,7 +921,7 @@ on = 1; pressure_checks = 1 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 @@ -2216,7 +2216,7 @@ on = 1; pressure_checks = 1 }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/awaymission/UO71/plaza) "eW" = ( @@ -6161,7 +6161,7 @@ pixel_y = 23; req_access = null }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /obj/item/paper/terrorspiders4, @@ -6479,7 +6479,7 @@ req_access_txt = "0"; specialfunctions = 4 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 @@ -8632,7 +8632,7 @@ }, /area/awaymission/UO71/centralhall) "qL" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/awaymission/UO71/centralhall) "qM" = ( @@ -9040,7 +9040,7 @@ /turf/simulated/floor/carpet, /area/awaymission/UO71/centralhall) "ru" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -12195,7 +12195,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -12540,7 +12540,7 @@ }, /area/awaymission/UO71/eng) "xF" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/awaymission/UO71/mining) "xG" = ( @@ -13396,7 +13396,7 @@ /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zt" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/item/clothing/shoes/chameleon/noslip, /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) @@ -13506,12 +13506,12 @@ /turf/simulated/floor/wood, /area/awaymission/UO71/queen) "zW" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/wood, /area/awaymission/UO71/queen) "zX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 @@ -13523,7 +13523,7 @@ /turf/simulated/floor/wood, /area/awaymission/UO71/queen) "zZ" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 @@ -13531,7 +13531,7 @@ /turf/simulated/floor/wood, /area/awaymission/UO71/queen) "Aa" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/wood, @@ -13544,7 +13544,7 @@ /turf/simulated/floor/wood, /area/awaymission/UO71/queen) "Ac" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 @@ -13568,7 +13568,7 @@ /turf/simulated/floor/wood, /area/awaymission/UO71/queen) "Ag" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /obj/machinery/light, diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index c5741039f2b..5d83a75af83 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -1423,7 +1423,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4 @@ -1491,7 +1491,7 @@ on = 1; pressure_checks = 1 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 @@ -3362,7 +3362,7 @@ on = 1; pressure_checks = 1 }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/awaycontent/a1{ has_gravity = 1; @@ -8156,7 +8156,7 @@ pixel_y = 23; req_access = null }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -8519,7 +8519,7 @@ req_access_txt = "0"; specialfunctions = 4 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1 @@ -11135,7 +11135,7 @@ name = "UO45 Crew Quarters" }) "qt" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/awaycontent/a2{ has_gravity = 1; @@ -11629,7 +11629,7 @@ name = "UO45 Crew Quarters" }) "ra" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -15331,7 +15331,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -15833,7 +15833,7 @@ name = "UO45 Engineering" }) "wN" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/awaycontent/a4{ has_gravity = 1; diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm index ca6d20a6eba..9d33f3a6efd 100644 --- a/_maps/map_files/RandomZLevels/wildwest.dmm +++ b/_maps/map_files/RandomZLevels/wildwest.dmm @@ -682,7 +682,7 @@ }, /area/awaymission/wwmines) "cc" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -704,7 +704,7 @@ }, /area/awaymission/wwmines) "ce" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -861,7 +861,7 @@ /turf/simulated/floor/wood, /area/awaymission/wwgov) "cA" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/wood, @@ -995,13 +995,13 @@ /turf/simulated/floor/wood, /area/awaymission/wwmines) "cV" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/wood, /area/awaymission/wwmines) "cW" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/wood, @@ -2303,7 +2303,7 @@ /turf/simulated/wall/mineral/sandstone, /area/awaymission/wwmines) "gm" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -2312,7 +2312,7 @@ }, /area/awaymission/wwmines) "gn" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -2428,7 +2428,7 @@ /turf/simulated/floor/wood, /area/awaymission/wwmines) "gD" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "barber" @@ -2479,7 +2479,7 @@ /turf/simulated/floor/wood, /area/awaymission/wwmines) "gL" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 1 }, /turf/simulated/floor/plasteel{ @@ -2528,7 +2528,7 @@ tag = "icon-gibup1"; icon_state = "gibup1" }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "barber" diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index a83823e65dc..40efa820622 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -18897,7 +18897,7 @@ /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plating, /area/maintenance/fpmaint) "aGk" = ( @@ -33468,7 +33468,7 @@ }, /area/hallway/primary/central/north) "biP" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/carpet, @@ -33483,7 +33483,7 @@ /turf/simulated/floor/carpet, /area/crew_quarters/mrchangs) "biR" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -79735,7 +79735,7 @@ /turf/simulated/floor/plasteel, /area/atmos/control) "cMb" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/wood{ @@ -79748,7 +79748,7 @@ /turf/simulated/floor/wood, /area/maintenance/asmaint) "cMd" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/carpet, @@ -83569,7 +83569,7 @@ /turf/simulated/floor/carpet, /area/crew_quarters/mrchangs) "cSX" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -84339,7 +84339,7 @@ /turf/simulated/floor/plating, /area/maintenance/aft) "cUi" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/carpet, /area/crew_quarters/mrchangs) "cUj" = ( @@ -91152,7 +91152,7 @@ name = "station intercom (General)"; pixel_y = -28 }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/wood, diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index f47b299a8d7..0ee95c18491 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -3384,7 +3384,7 @@ /turf/simulated/floor/plating/airless, /area/space/nearstation) "hx" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/wood{ tag = "icon-wood-broken7"; icon_state = "wood-broken7" @@ -3946,7 +3946,7 @@ }, /area/derelict/crew_quarters) "ix" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/wood{ @@ -4279,7 +4279,7 @@ name = "Derelict Annex" }) "je" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -4296,7 +4296,7 @@ }, /area/derelict/arrival) "jg" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /obj/structure/sign/poster/contraband/random{ @@ -4370,7 +4370,7 @@ /turf/simulated/floor/plasteel, /area/derelict/crew_quarters) "jn" = ( -/obj/structure/chair/wood/normal, +/obj/structure/chair/wood, /turf/simulated/floor/plasteel{ icon_state = "wood" }, @@ -4613,7 +4613,7 @@ }, /area/derelict/crew_quarters) "jM" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -7287,7 +7287,7 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -7301,7 +7301,7 @@ }, /area/derelict/crew_quarters) "qo" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -8210,7 +8210,7 @@ name = "Derelict Annex" }) "sd" = ( -/obj/structure/chair/wood/normal{ +/obj/structure/chair/wood{ dir = 4 }, /obj/effect/decal/cleanable/dirt, diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 2a22052c7dc..8de40b636b6 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -80,7 +80,7 @@ /obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0) ..() - + plane = FLOOR_PLANE if(!check_icon_cache()) @@ -152,7 +152,7 @@ if(pressure_delta > 0.5) if(air_contents.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) / 5 + var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) @@ -170,7 +170,7 @@ if(pressure_delta > 0.5) if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) / 5 + var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) if(isnull(removed)) //in space diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index a6f0b8c8adb..20218f7f2d0 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -98,7 +98,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) ..() - + plane = FLOOR_PLANE if(!check_icon_cache()) @@ -227,7 +227,7 @@ if(scrubbing) if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0)) - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() / 5 + var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() //Take a gas sample var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -269,7 +269,7 @@ if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE) return - var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) / 5 + var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index b7a71e68bff..94cc2751c27 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -298,63 +298,30 @@ excited_group.reset_cooldowns() /turf/proc/high_pressure_movements() - for(var/atom/movable/M in src) - M.experience_pressure_difference(pressure_difference, pressure_direction) + var/atom/movable/M + for(var/thing in src) + M = thing + if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) + M.experience_pressure_difference(pressure_difference, pressure_direction) -/atom/movable/var/pressure_resistance = 5 -/atom/movable/var/throw_pressure_limit = 15 -/atom/movable/var/last_forced_movement = 0 +/atom/movable/var/pressure_resistance = 10 +/atom/movable/var/last_high_pressure_movement_air_cycle = 0 -/atom/movable/proc/experience_pressure_difference(pressure_difference, direction) - if(last_forced_movement >= SSair.times_fired) - return 0 - if(anchored || move_resist == INFINITY) - return 0 - else if(!pulledby) - var/turf/target = get_turf(src) - var/datum/gas_mixture/target_air = target.return_air() - if(isspaceturf(target) || isunsimulatedturf(target) || pressure_resistance > target_air.return_pressure()) - return 0 - if(pressure_difference >= throw_pressure_limit) - var/general_direction = get_edge_target_turf(src, direction) - if(last_forced_movement + 10 < SSair.times_fired && is_valid_tochat_target(src)) //the first check prevents spamming throw to_chat - to_chat(src, "The pressure sends you flying!") - spawn() - var/max_distance = 14 // reduce by one each calculation to prevent infinate loops. - var/min_observed_pressure = INFINITY - var/turf/possible_target = get_turf(src) - while(!isspaceturf(target) && !isunsimulatedturf(target) && max_distance > 0) - max_distance-- - target_air = target.return_air() - min_observed_pressure = target_air.return_pressure() - possible_target = get_step_towards(target,general_direction) - if(istype(possible_target, /turf/space)) - target = possible_target - break - if(!CanAtmosPass(possible_target)) - target = possible_target - max_distance = 0 - break - var/datum/gas_mixture/possible_target_air = possible_target.return_air() - if(possible_target_air.return_pressure() > min_observed_pressure) - target = possible_target - break - target = possible_target - if(max_distance) - throw_at(target, get_dist(src, target), pressure_difference / 200, null, 0, 0, null) - else - throw_at(target, pressure_difference / 10, pressure_difference / 200, null, 0, 0, null) - last_forced_movement = SSair.times_fired - return 1 - else if(pressure_difference > pressure_resistance) - spawn() - step(src, direction) - last_forced_movement = SSair.times_fired - return 1 - return 0 +/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) + var/const/PROBABILITY_OFFSET = 25 + var/const/PROBABILITY_BASE_PRECENT = 75 + var/max_force = sqrt(pressure_difference) * (MOVE_FORCE_DEFAULT / 5) + set waitfor = 0 + var/move_prob = 100 + if(pressure_resistance > 0) + move_prob = (pressure_difference / pressure_resistance * PROBABILITY_BASE_PRECENT) - PROBABILITY_OFFSET + move_prob += pressure_resistance_prob_delta + if(move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) + step(src, direction) + last_high_pressure_movement_air_cycle = SSair.times_fired diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 3877ac213c5..65f4da2b50a 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -63,4 +63,11 @@ #define AREACOORD(src) "[src ? "[get_area_name(src, TRUE)] [COORD(src)]" : "nonexistent location" ]" #define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" #define ADMIN_VERBOSEJMP(src) "[src ? "[AREACOORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" -#define ADMIN_SHOWDETAILS(mask, content) "[mask]" \ No newline at end of file +#define ADMIN_SHOWDETAILS(mask, content) "[mask]" + +///Max length of a keypress command before it's considered to be a forged packet/bogus command +#define MAX_KEYPRESS_COMMANDLENGTH 16 +///Max amount of keypress messages per second over two seconds before client is autokicked +#define MAX_KEYPRESS_AUTOKICK 50 +///Length of held key rolling buffer +#define HELD_KEY_BUFFER_LENGTH 15 \ No newline at end of file diff --git a/code/__HELPERS/typelists.dm b/code/__HELPERS/typelists.dm new file mode 100644 index 00000000000..f271b9204de --- /dev/null +++ b/code/__HELPERS/typelists.dm @@ -0,0 +1,43 @@ +GLOBAL_LIST_EMPTY(typelists) + +#ifndef TESTING + +/datum/proc/typelist(key, list/values = list()) + var/list/mytypelist = GLOB.typelists[type] || (GLOB.typelists[type] = list()) + return mytypelist[key] || (mytypelist[key] = values.Copy()) + +#else +// mostly the same code as above, just more verbose, slower and has tallying for saved lists +/datum/proc/typelist(key, list/values) + if (!values) + values = list() + GLOB.typelistkeys |= key + if (GLOB.typelists[type]) + if (GLOB.typelists[type][key]) + GLOB.typelists[type]["[key]-saved"]++ + return GLOB.typelists[type][key] + else + GLOB.typelists[type][key] = values.Copy() + else + GLOB.typelists[type] = list() + GLOB.typelists[type][key] = values.Copy() + return GLOB.typelists[type][key] + +GLOBAL_LIST_EMPTY(typelistkeys) + +/proc/tallytypelistsavings() + var/savings = list() + var/saveditems = list() + for (var/key in GLOB.typelistkeys) + savings[key] = 0 + saveditems[key] = 0 + + for (var/type in GLOB.typelists) + for (var/saving in savings) + if (GLOB.typelists[type]["[saving]-saved"]) + savings[saving] += GLOB.typelists[type]["[saving]-saved"] + saveditems[saving] += (GLOB.typelists[type]["[saving]-saved"] * length(GLOB.typelists[type][saving])) + + for (var/saving in savings) + to_chat(world, "Savings for [saving]: [savings[saving]] lists, [saveditems[saving]] items") +#endif \ No newline at end of file diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index e9c50b0f662..53040777467 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -34,8 +34,6 @@ GLOBAL_LIST_INIT(restricted_camera_networks, list( "Hotel" )) //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them. -GLOBAL_LIST_INIT(mineral_turfs, list()) - GLOBAL_LIST_INIT(ruin_landmarks, list()) GLOBAL_LIST_INIT(round_end_sounds, list( diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index c69f53f2246..981eb63aa7e 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(base_chemicals, list("water","oxygen","nitrogen","hydrogen","po "iron","aluminum","silicon","sugar","ethanol")) // Standard chemicals GLOBAL_LIST_INIT(standard_chemicals, list("slimejelly","blood","water","lube","charcoal","toxin","cyanide", - "morphine","epinephrine","space_drugs","serotrotium","oxygen","copper", + "morphine","epinephrine","space_drugs","oxygen","copper", "nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine", "fluorine","sodium","phosphorus","lithium","sugar","sacid","facid", "glycerol","radium","mutadone","thermite","mutagen","virusfood","iron", @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(standard_chemicals, list("slimejelly","blood","water","lube","c GLOBAL_LIST_INIT(rare_chemicals, list("minttoxin","syndicate_nanites", "xenomicrobes")) // Standard medicines GLOBAL_LIST_INIT(standard_medicines, list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs", - "serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine", + "mutadone","mutagen","teporone","lexorin","silver_sulfadiazine", "salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol", "potass_iodide","pen_acid","mannitol","oculine","styptic_powder", "methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia", diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index ec53c4b4d6b..bd885b90c8f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(mapping) if (mining_type == "lavaland") // Spawn Lavaland ruins and rivers. seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates) - spawn_rivers() + spawn_rivers(list(level_name_to_num(MINING))) else // Populate mining Z-level hidden rooms for(var/i = 0, i < max_secret_rooms, i++) diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index a5623775b5e..951a96558ca 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -263,7 +263,12 @@ UI STUFF else continue - dat += "" + dat += "" + dat += "

Resolve All

" + if(ticket_system_name == "Mentor Tickets") + dat += "Resolve All Open Mentor Tickets" + else + dat += "Resolve All Open Admin Tickets" return dat @@ -402,6 +407,12 @@ UI STUFF takeTicket(indexNum) showDetailUI(usr, indexNum) + if(href_list["resolveall"]) + if(ticket_system_name == "Mentor Tickets") + usr.client.resolveAllMentorTickets() + else + usr.client.resolveAllAdminTickets() + /datum/controller/subsystem/tickets/proc/takeTicket(var/index) if(assignStaffToTicket(usr.client, index)) if(span_class == "mentorhelp") diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm new file mode 100644 index 00000000000..bdd80e7fc32 --- /dev/null +++ b/code/datums/status_effects/gas.dm @@ -0,0 +1,46 @@ +/datum/status_effect/freon + id = "frozen" + duration = 100 + status_type = STATUS_EFFECT_UNIQUE + alert_type = /obj/screen/alert/status_effect/freon + var/icon/cube + var/can_melt = TRUE + +/obj/screen/alert/status_effect/freon + name = "Frozen Solid" + desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!" + icon_state = "frozen" + +/datum/status_effect/freon/on_apply() + RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist) + if(!owner.stat) + to_chat(owner, "You become frozen in a cube!") + cube = icon('icons/effects/freeze.dmi', "ice_cube") + owner.add_overlay(cube) + owner.update_canmove() + return ..() + +/datum/status_effect/freon/tick() + owner.update_canmove() + if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL) + qdel(src) + +/datum/status_effect/freon/proc/owner_resist() + to_chat(owner, "You start breaking out of the ice cube!") + if(do_mob(owner, owner, 40)) + if(!QDELETED(src)) + to_chat(owner, "You break out of the ice cube!") + owner.remove_status_effect(/datum/status_effect/freon) + owner.update_canmove() + +/datum/status_effect/freon/on_remove() + if(!owner.stat) + to_chat(owner, "The cube melts!") + owner.cut_overlay(cube) + owner.adjust_bodytemperature(100) + owner.update_canmove() + UnregisterSignal(owner, COMSIG_LIVING_RESIST) + +/datum/status_effect/freon/watcher + duration = 8 + can_melt = FALSE \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 0b6c5fff868..75e37c3ca3d 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1108,21 +1108,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 1 surplus = 35 -/datum/uplink_item/stealthy_tools/syndigaloshes - name = "No-Slip Chameleon Shoes" - desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ - They do not work on heavily lubricated surfaces." - reference = "NSSS" - item = /obj/item/clothing/shoes/chameleon/noslip - cost = 2 - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/stealthy_tools/syndigaloshes/nuke - reference = "TNSSS" - cost = 4 //but they aren't - excludefrom = list() - gamemodes = list(/datum/game_mode/nuclear) - /datum/uplink_item/stealthy_tools/chamsechud name = "Chameleon Security HUD" desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn." @@ -1168,7 +1153,29 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp." reference = "CHAM" item = /obj/item/storage/box/syndie_kit/chameleon + cost = 4 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/stealthy_tools/chameleon/nuke + reference = "NCHAM" + cost = 6 + excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/stealthy_tools/syndigaloshes + name = "No-Slip Chameleon Shoes" + desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ + They do not work on heavily lubricated surfaces." + reference = "NSSS" + item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/stealthy_tools/syndigaloshes/nuke + reference = "NNSSS" + cost = 4 + excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon-Projector" @@ -1209,6 +1216,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 surplus = 30 +/datum/uplink_item/stealthy_tools/syndigaloshes + name = "No-Slip Chameleon Shoes" + desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. They do not work on heavily lubricated surfaces." + reference = "NOCS" + item = /obj/item/clothing/shoes/chameleon/noslip + cost = 2 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/stealthy_tools/syndigaloshes/nuke + reference = "NOCSN" + item = /obj/item/clothing/shoes/chameleon/noslip + cost = 4 + excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/stealthy_tools/cutouts name = "Adaptive Cardboard Cutouts" desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \ @@ -1373,16 +1395,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety." reference = "BRMB" item = /obj/item/clothing/shoes/magboots/syndie - cost = 3 - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/device_tools/magboots/advance - name = "Advanced Blood-Red Magboots" - desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders." - reference = "ABRMB" - item = /obj/item/clothing/shoes/magboots/syndie/advance - cost = 3 - excludefrom = list() + cost = 2 gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/powersink diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0a22c19770b..cb7bc3037b2 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -45,13 +45,7 @@ loc.handle_atom_del(src) for(var/atom/movable/AM in contents) qdel(AM) - var/turf/un_opaque - if(opacity && isturf(loc)) - un_opaque = loc - loc = null - if(un_opaque) - un_opaque.recalc_atom_opacity() if(pulledby) if(pulledby.pulling == src) pulledby.pulling = null @@ -120,7 +114,7 @@ return if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() - + /atom/movable/proc/can_be_pulled(user, grab_state, force) if(src == user || !isturf(loc)) return FALSE diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index f15f1dc742c..fac2661337e 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -45,8 +45,6 @@ var/obj/structure/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 - pressure_resistance = 100 //100 kPa difference required to push - throw_pressure_limit = 120 //120 kPa difference required to throw /mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() @@ -97,8 +95,6 @@ human_overlays = H.overlays update_icons() H.forceMove(src) - pressure_resistance = 20 //5 kPa difference required to push lowered - throw_pressure_limit = 30 //15 kPa difference required to throw lowered visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) @@ -176,8 +172,7 @@ force_threshold = 10 mob_size = MOB_SIZE_LARGE environment_smash = ENVIRONMENT_SMASH_STRUCTURES - pressure_resistance = 100 //100 kPa difference required to push - throw_pressure_limit = 120 //120 kPa difference required to throw + pressure_resistance = 50 see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 4193ad7b751..56cc3594ee2 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -456,7 +456,7 @@ /datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) . = ..() if(.) - new /obj/item/clothing/shoes/magboots/wizard(get_turf(user)) + new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them. new /obj/item/clothing/gloves/color/purple(get_turf(user)) // To complete the outfit /datum/spellbook_entry/item/mjolnir diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 52cd5bdfee8..0fc8581cd2d 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -119,8 +119,6 @@ var/report_danger_level = TRUE - var/automatic_emergency = TRUE //Does the alarm automaticly respond to an emergency condition - /obj/machinery/alarm/monitor report_danger_level = FALSE @@ -315,12 +313,6 @@ if(old_danger_level!=danger_level) apply_danger_level() - if(automatic_emergency && mode == AALARM_MODE_SCRUBBING && danger_level == ATMOS_ALARM_DANGER) - if(pressure_dangerlevel == ATMOS_ALARM_DANGER) - mode = AALARM_MODE_OFF - if(temperature_dangerlevel == ATMOS_ALARM_DANGER && cur_tlv.max2 <= environment.temperature) - mode = AALARM_MODE_PANIC - apply_mode() if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) mode = AALARM_MODE_SCRUBBING diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index e392b468557..9a6bf73de11 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -71,7 +71,7 @@ var/datum/canister_icons/canister_icon_container = new() var/can_label = 1 var/filled = 0.5 - pressure_resistance = 7*ONE_ATMOSPHERE + pressure_resistance = 7 * ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C volume = 1000 use_power = NO_POWER_USE diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index a11ccac3834..eea0d8c20d7 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -12,7 +12,7 @@ volume = 750 var/minrate = 0//probably useless, but whatever - var/maxrate = 10 * ONE_ATMOSPHERE / 4 + var/maxrate = 10 * ONE_ATMOSPHERE /obj/machinery/portable_atmospherics/scrubber/emp_act(severity) if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 741a4725c8d..c9d7f10302a 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -492,7 +492,7 @@ playsound(src.loc, 'sound/weapons/genhit.ogg', 100, 1) var/turf/space/T for(T in orange(1, src)) - T.ChangeTurf(/turf/simulated/floor/plating/) + T.ChangeTurf(/turf/simulated/floor/plating) else atom_say("Something slams into the floor around [src] - luckily, it didn't get through!") playsound(src.loc, 'sound/effects/bang.ogg', 20, 1) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index f8305e0fb7d..fad3f21c3fc 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -96,7 +96,7 @@ Class Procs: /obj/machinery name = "machinery" icon = 'icons/obj/stationobjs.dmi' - pressure_resistance = 10 + pressure_resistance = 15 layer = BELOW_OBJ_LAYER var/stat = 0 var/emagged = 0 diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 671a7d1caff..a4182198d20 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -84,7 +84,6 @@ name = "security suit storage unit" suit_type = /obj/item/clothing/suit/space/hardsuit/security mask_type = /obj/item/clothing/mask/gas/sechailer - magboots_type = /obj/item/clothing/shoes/magboots req_access = list(access_security) /obj/machinery/suit_storage_unit/security/secure @@ -130,7 +129,6 @@ /obj/machinery/suit_storage_unit/cmo/secure/sec_storage name = "medical suit storage unit" mask_type = /obj/item/clothing/mask/gas - magboots_type = /obj/item/clothing/shoes/magboots /obj/machinery/suit_storage_unit/clown name = "clown suit storage unit" @@ -154,7 +152,6 @@ name = "syndicate suit storage unit" suit_type = /obj/item/clothing/suit/space/hardsuit/syndi mask_type = /obj/item/clothing/mask/gas/syndicate - magboots_type = /obj/item/clothing/shoes/magboots/syndie storage_type = /obj/item/tank/jetpack/oxygen/harness req_access = list(access_syndicate) safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice. diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 445d881ee50..a0f6e4408d7 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -77,7 +77,7 @@ /turf/simulated/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) for(var/turf/simulated/floor/plating/asteroid/M in range(1, drill.chassis)) if((get_dir(drill.chassis, M) & drill.chassis.dir) && !M.dug) - M.gets_dug() + M.getDug() drill.log_message("Drilled through [src]") drill.move_ores() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 4cfbc5c8143..664927b1d3a 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -118,7 +118,7 @@ else atoms = orange(3, target) for(var/atom/movable/A in atoms) - if(A.anchored) continue + if(A.anchored || A.move_resist == INFINITY) continue spawn(0) var/iter = 5-get_dist(A,target) for(var/i=0 to iter) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 6b9d89a984a..fda96373825 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -15,6 +15,9 @@ /obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) return FALSE +/obj/effect/experience_pressure_difference() + return + /obj/effect/decal plane = FLOOR_PLANE var/no_scoop = FALSE //if it has this, don't let it be scooped up diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e925b3b1629..2116114a305 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -25,7 +25,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/w_class = WEIGHT_CLASS_NORMAL var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE - pressure_resistance = 3 + pressure_resistance = 4 // causeerrorheresoifixthis var/obj/item/master = null diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 6c58b4e1414..94731757895 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -41,160 +41,160 @@ /obj/item/lightreplacer name = "light replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." + desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass." icon = 'icons/obj/janitor.dmi' icon_state = "lightreplacer0" item_state = "electronic" - + w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = SLOT_BELT origin_tech = "magnets=3;engineering=4" + force = 8 + var/emagged = FALSE var/max_uses = 20 - var/uses = 0 - var/shards = 0 - var/recycle = 3 - var/emagged = 0 - var/failmsg = "" + var/uses = 10 // How much to increase per each glass? var/increment = 5 // How much to take from the glass? var/decrement = 1 var/charge = 1 -/obj/item/lightreplacer/New() - uses = max_uses / 2 - failmsg = "The [name]'s refill light blinks red." - ..() + // Eating used bulbs gives us bulb shards + var/bulb_shards = 0 + // when we get this many shards, we get a free bulb. + var/shards_required = 4 + /obj/item/lightreplacer/examine(mob/user) - if(..(user, 2)) - to_chat(user, "It has [uses] lights and [shards] shards remaining.") + ..() + to_chat(user, status_string()) -/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = W - if(G.amount - decrement >= 0 && uses < max_uses) - var/remaining = max(G.amount - decrement, 0) - if(!remaining && !(G.amount - decrement) == 0) - to_chat(user, "There isn't enough glass.") - return - G.amount = remaining - if(!G.amount) - user.drop_item() - qdel(G) - AddUses(increment) - to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] lights remaining.") +/obj/item/lightreplacer/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/G = I + if(uses >= max_uses) + to_chat(user, "[src] is full.") return + else if(G.use(decrement)) + AddUses(increment) + to_chat(user, "You insert a piece of glass into [src]. You have [uses] light\s remaining.") + return + else + to_chat(user, "You need one sheet of glass to replace lights!") + return - if(istype(W, /obj/item/light)) - var/obj/item/light/L = W + if(istype(I, /obj/item/shard)) + if(uses >= max_uses) + to_chat(user, "[src] is full.") + return + if(!user.unEquip(I)) + return + AddUses(round(increment * 0.75)) + to_chat(user, "You insert a shard of glass into [src]. You have [uses] light\s remaining.") + qdel(I) + return + + if(istype(I, /obj/item/light)) + var/obj/item/light/L = I if(L.status == 0) // LIGHT OKAY - if(!user.drop_item()) - to_chat(user, "[L] is stuck to your hand!") - return if(uses < max_uses) + if(!user.unEquip(L)) + return AddUses(1) - to_chat(user, "You insert the [L.name] into the [src.name]. You have [uses] lights remaining.") - user.drop_item() - qdel(L) - return - else if(L.status == 2 || L.status == 3) - if(!user.drop_item()) - to_chat(user, "[L] is stuck to your hand!") - return - else - AddShards(1) - to_chat(user, "You insert [L] into [src]. You have [shards] shards remaining.") - user.drop_item() qdel(L) + else + if(!user.unEquip(L)) return + to_chat(user, "You insert [L] into [src].") + AddShards(1, user) + qdel(L) + return - if(istype(W, /obj/item/storage)) - var/obj/item/storage/S = W - var/found_lightbulbs = 0 + if(istype(I, /obj/item/storage)) + var/obj/item/storage/S = I + var/found_lightbulbs = FALSE + var/replaced_something = TRUE - for(var/obj/item/I in S.contents) - if(istype(I,/obj/item/light)) - var/obj/item/light/L = I - found_lightbulbs = 1 + for(var/obj/item/IT in S.contents) + if(istype(IT, /obj/item/light)) + var/obj/item/light/L = IT + found_lightbulbs = TRUE if(uses >= max_uses) - to_chat(user, "[src] is full!") break - if(L.status == 0) + if(L.status == LIGHT_OK) + replaced_something = TRUE AddUses(1) qdel(L) - else if(L.status == 2 || L.status == 3) - AddShards(1) + + else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED) + replaced_something = TRUE + AddShards(1, user) qdel(L) - to_chat(user, "You fill [src] with lights from [S].") + if(!found_lightbulbs) to_chat(user, "[S] contains no bulbs.") return + if(!replaced_something && uses == max_uses) + to_chat(user, "[src] is full!") + return + + to_chat(user, "You fill [src] with lights from [S]. " + status_string() + "") + return + return ..() + /obj/item/lightreplacer/emag_act(user as mob) if(!emagged) Emag() /obj/item/lightreplacer/attack_self(mob/user) - /* // This would probably be a bit OP. If you want it though, uncomment the code. - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - if(R.emagged) - src.Emag() - to_chat(usr, "You shortcircuit the [src].") - return - */ - to_chat(usr, "It has [uses] lights remaining.") + for(var/obj/machinery/light/target in user.loc) + ReplaceLight(target, user) + to_chat(user, status_string()) /obj/item/lightreplacer/update_icon() icon_state = "lightreplacer[emagged]" +/obj/item/lightreplacer/proc/status_string() + return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)." -/obj/item/lightreplacer/proc/Use(var/mob/user) - - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) +/obj/item/lightreplacer/proc/Use(mob/user) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) AddUses(-1) return 1 // Negative numbers will subtract -/obj/item/lightreplacer/proc/AddUses(var/amount = 1) - uses = min(max(uses + amount, 0), max_uses) +/obj/item/lightreplacer/proc/AddUses(amount = 1) + uses = Clamp(uses + amount, 0, max_uses) -/obj/item/lightreplacer/proc/AddShards(amount = 1) - shards += amount - var/recycled_lights = round(shards / recycle) - if(recycled_lights > 0) - AddUses(recycled_lights) - shards = shards % recycle - return recycled_lights +/obj/item/lightreplacer/proc/AddShards(amount = 1, user) + bulb_shards += amount + var/new_bulbs = round(bulb_shards / shards_required) + if(new_bulbs > 0) + AddUses(new_bulbs) + bulb_shards = bulb_shards % shards_required + if(new_bulbs != 0) + to_chat(user, "[src] has fabricated a new bulb from the broken glass it has stored. It now has [uses] uses.") + playsound(loc, 'sound/machines/ding.ogg', 50, TRUE) + return new_bulbs /obj/item/lightreplacer/proc/Charge(var/mob/user) charge += 1 - if(charge > 7) + if(charge > 3) AddUses(1) charge = 1 -/obj/item/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U) - +/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U) if(target.status != LIGHT_OK) if(CanUse(U)) - if(!Use(U)) return - to_chat(U, "You replace the [target.fitting] with the [src].") + if(!Use(U)) + return + to_chat(U, "You replace [target.fitting] with [src].") if(target.status != LIGHT_EMPTY) - - var/obj/item/light/L1 = new target.light_type(target.loc) - L1.status = target.status - L1.rigged = target.rigged - L1.brightness_range = target.brightness_range - L1.brightness_power = target.brightness_power - L1.brightness_color = target.brightness_color - L1.switchcount = target.switchcount - target.switchcount = 0 - L1.update() - + AddShards(1, U) target.status = LIGHT_EMPTY target.update() @@ -215,37 +215,54 @@ return else - to_chat(U, failmsg) + to_chat(U, "[src]'s refill light blinks red.") return else - to_chat(U, "There is a working [target.fitting] already inserted.") + to_chat(U, "There is a working [target.fitting] already inserted!") return /obj/item/lightreplacer/proc/Emag() emagged = !emagged - playsound(src.loc, "sparks", 100, 1) + playsound(loc, "sparks", 100, TRUE) if(emagged) - name = "Shortcircuited [initial(name)]" + name = "shortcircuited [initial(name)]" else name = initial(name) update_icon() -//Can you use it? +/obj/item/lightreplacer/proc/CanUse(mob/living/user) + add_fingerprint(user) + if(uses > 0) + return 1 + else + return 0 + +/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity) + if(!proximity) + return + if(!isturf(T)) + return + + var/used = FALSE + for(var/atom/A in T) + if(!CanUse(U)) + break + used = TRUE + if(istype(A, /obj/machinery/light)) + ReplaceLight(A, U) + + if(!used) + to_chat(U, "[src]'s refill light blinks red.") /obj/item/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) J.put_in_cart(src, user) J.myreplacer = src J.update_icon() -/obj/item/lightreplacer/proc/CanUse(var/mob/living/user) - src.add_fingerprint(user) - //Not sure what else to check for. Maybe if clumsy? - if(uses > 0) - return 1 - else - return 0 +/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) + return #undef LIGHT_OK #undef LIGHT_EMPTY #undef LIGHT_BROKEN -#undef LIGHT_BURNED +#undef LIGHT_BURNED \ No newline at end of file diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index 8c4144f7c68..908c205939d 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -9,7 +9,7 @@ throw_range = 1 throw_speed = 1 layer = 4 - pressure_resistance = 1 + pressure_resistance = 2 /obj/item/documents/nanotrasen desc = "\"Top Secret\" Nanotrasen documents printed on special copy-protected paper. It is filled with complex diagrams and lists of names, dates and coordinates." diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c98f3355538..27061500607 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -166,7 +166,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), new /datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \ - new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1), diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 9051954ae4d..376c8cf38d2 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -7,32 +7,35 @@ lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/guns_righthand.dmi' flags = CONDUCT - force = 3.0 - throwforce = 10.0 + force = 3 + throwforce = 10 throw_speed = 1 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=500) origin_tech = "combat=1;plasmatech=2;engineering=2" - var/status = 0 - var/lit = 0 //on or off - var/operating = 0//cooldown - var/turf/previousturf = null + var/status = FALSE + var/lit = FALSE //on or off + var/operating = FALSE//cooldown var/obj/item/weldingtool/weldtool = null var/obj/item/assembly/igniter/igniter = null var/obj/item/tank/plasma/ptank = null + var/warned_admins = FALSE //for the message_admins() when lit + //variables for prebuilt flamethrowers + var/create_full = FALSE + var/create_with_tank = FALSE + var/igniter_type = /obj/item/assembly/igniter /obj/item/flamethrower/Destroy() QDEL_NULL(weldtool) QDEL_NULL(igniter) QDEL_NULL(ptank) - previousturf = null return ..() /obj/item/flamethrower/process() - if(!lit) + if(!lit || !igniter) STOP_PROCESSING(SSobj, src) return null var/turf/location = loc @@ -41,133 +44,139 @@ if(M.l_hand == src || M.r_hand == src) location = M.loc if(isturf(location)) //start a fire if possible - location.hotspot_expose(700, 2) - return + igniter.flamethrower_process(location) /obj/item/flamethrower/update_icon() - overlays.Cut() + cut_overlays() if(igniter) - overlays += "+igniter[status]" + add_overlay("+igniter[status]") if(ptank) - overlays += "+ptank" + add_overlay("+ptank") if(lit) - overlays += "+lit" + add_overlay("+lit") item_state = "flamethrower_1" else item_state = "flamethrower_0" - return + if(ismob(loc)) + var/mob/M = loc + M.update_inv_l_hand() + M.update_inv_r_hand() /obj/item/flamethrower/afterattack(atom/target, mob/user, flag) - if(flag) return // too close - // Make sure our user is still holding us - if(user && user.is_in_active_hand(src)) + . = ..() + if(flag) + return // too close + if(user && user.get_active_hand() == src) // Make sure our user is still holding us var/turf/target_turf = get_turf(target) if(target_turf) var/turflist = getline(user, target_turf) add_attack_logs(user, target, "Flamethrowered at [target.x],[target.y],[target.z]") flame_turf(turflist) -/obj/item/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params) - if(user.stat || user.restrained() || user.lying) return - if(iswrench(W) && !status)//Taking this apart +/obj/item/flamethrower/attackby(obj/item/I, mob/user, params) + if(iswrench(I) && !status)//Taking this apart var/turf/T = get_turf(src) if(weldtool) - weldtool.loc = T + weldtool.forceMove(T) weldtool = null if(igniter) - igniter.loc = T + igniter.forceMove(T) igniter = null if(ptank) - ptank.loc = T + ptank.forceMove(T) ptank = null new /obj/item/stack/rods(T) qdel(src) return - if(isscrewdriver(W) && igniter && !lit) + else if(isscrewdriver(I) && igniter && !lit) status = !status to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!") update_icon() return - if(isigniter(W)) - var/obj/item/assembly/igniter/I = W - if(I.secured) return - if(igniter) return - user.drop_item() - I.loc = src - igniter = I - update_icon() - return - - if(istype(W,/obj/item/tank/plasma)) - if(ptank) - to_chat(user, "There appears to already be a plasma tank loaded in [src]!") + else if(isigniter(I)) + var/obj/item/assembly/igniter/IG = I + if(IG.secured) return - user.drop_item() - ptank = W - W.loc = src + if(igniter) + return + if(!user.drop_item()) + return + IG.forceMove(src) + igniter = IG update_icon() return - if(istype(W, /obj/item/analyzer) && ptank) + else if(istype(I, /obj/item/tank/plasma)) + if(ptank) + if(user.drop_item()) + I.forceMove(src) + ptank.forceMove(get_turf(src)) + ptank = I + to_chat(user, "You swap the plasma tank in [src]!") + return + if(!user.drop_item()) + return + I.forceMove(src) + ptank = I + update_icon() + return + + else if(istype(I, /obj/item/analyzer) && ptank) atmosanalyzer_scan(ptank.air_contents, user) + else + return ..() + + +/obj/item/flamethrower/attack_self(mob/user) + toggle_igniter(user) + +/obj/item/flamethrower/AltClick(mob/user) + if(ptank && isliving(user) && user.Adjacent(src)) + user.put_in_hands(ptank) + ptank = null + to_chat(user, "You remove the plasma tank from [src]!") + update_icon() + +/obj/item/flamethrower/examine(mob/user) ..() - return + if(ptank) + to_chat(user, "[src] has \a [ptank] attached. Alt-click to remove it.") - -/obj/item/flamethrower/attack_self(mob/user as mob) - if(user.stat || user.restrained() || user.lying) return - user.set_machine(src) +/obj/item/flamethrower/proc/toggle_igniter(mob/user) if(!ptank) to_chat(user, "Attach a plasma tank first!") return - var/dat = text("Flamethrower ([lit ? "Lit" : "Unlit"])
\n Tank Pressure: [ptank.air_contents.return_pressure()]
\nRemove plasmatank - Close
") - user << browse(dat, "window=flamethrower;size=600x300") - onclose(user, "flamethrower") - return - - -/obj/item/flamethrower/Topic(href,href_list[]) - if(href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=flamethrower") + if(!status) + to_chat(user, "Secure the igniter first!") return - if(usr.stat || usr.restrained() || usr.lying) return - usr.set_machine(src) - if(href_list["light"]) - if(!ptank) return - if(!status) return - lit = !lit - if(lit) - START_PROCESSING(SSobj, src) - if(href_list["remove"]) - if(!ptank) return - usr.put_in_hands(ptank) - ptank = null - lit = 0 - usr.unset_machine() - usr << browse(null, "window=flamethrower") - for(var/mob/M in viewers(1, loc)) - if((M.client && M.machine == src)) - attack_self(M) + to_chat(user, "You [lit ? "extinguish" : "ignite"] [src]!") + lit = !lit + if(lit) + START_PROCESSING(SSobj, src) + if(!warned_admins) + message_admins("[ADMIN_LOOKUPFLW(user)] has lit a flamethrower.") + warned_admins = TRUE + else + STOP_PROCESSING(SSobj,src) update_icon() - return /obj/item/flamethrower/CheckParts(list/parts_list) ..() weldtool = locate(/obj/item/weldingtool) in contents igniter = locate(/obj/item/assembly/igniter) in contents - weldtool.status = 0 - igniter.secured = 0 - status = 1 + weldtool.status = FALSE + igniter.secured = FALSE + status = TRUE update_icon() //Called from turf.dm turf/dblclick /obj/item/flamethrower/proc/flame_turf(turflist) - if(!lit || operating) return - operating = 1 + if(!lit || operating) + return + operating = TRUE var/turf/previousturf = get_turf(src) for(var/turf/simulated/T in turflist) if(!T.air) @@ -176,48 +185,62 @@ continue //so we don't burn the tile we be standin on if(!T.CanAtmosPass(previousturf)) break - ignite_turf(T) + if(igniter) + igniter.ignite_turf(src, T) + else + default_ignite(T) sleep(1) previousturf = T - operating = 0 + operating = FALSE for(var/mob/M in viewers(1, loc)) if((M.client && M.machine == src)) attack_self(M) - return -/obj/item/flamethrower/proc/ignite_turf(turf/target, release_amount = 0.05) +/obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05) + //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... + //Transfer 5% of current tank air contents to turf var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount) - air_transfer.toxins = air_transfer.toxins // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE + if(air_transfer.toxins) + air_transfer.toxins = air_transfer.toxins * 5 target.assume_air(air_transfer) //Burn it based on transfered gas - target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE + target.hotspot_expose((ptank.air_contents.temperature*2) + 380, 500) //location.hotspot_expose(1000,500,1) SSair.add_to_active(target, 0) - return -/obj/item/flamethrower/full/New(var/loc) - ..() - if(!weldtool) - weldtool = new /obj/item/weldingtool(src) - weldtool.status = 0 - if(!igniter) - igniter = new /obj/item/assembly/igniter(src) - igniter.secured = 0 - status = 1 - update_icon() +/obj/item/flamethrower/Initialize(mapload) + . = ..() + if(create_full) + if(!weldtool) + weldtool = new /obj/item/weldingtool(src) + weldtool.status = FALSE + if(!igniter) + igniter = new igniter_type(src) + igniter.secured = FALSE + status = TRUE + if(create_with_tank) + ptank = new /obj/item/tank/plasma/full(src) + update_icon() -/obj/item/flamethrower/full/tank/New(var/loc) - ..() - ptank = new /obj/item/tank/plasma/full(src) - update_icon() +/obj/item/flamethrower/full + create_full = TRUE + +/obj/item/flamethrower/full/tank + create_with_tank = TRUE /obj/item/flamethrower/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(ptank && damage && attack_type == PROJECTILE_ATTACK && prob(15)) owner.visible_message("[attack_text] hits the fueltank on [owner]'s [src], rupturing it! What a shot!") var/turf/target_turf = get_turf(owner) log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]") - ignite_turf(target_turf, 100) - qdel(ptank) + igniter.ignite_turf(src,target_turf, release_amount = 100) + QDEL_NULL(ptank) return 1 //It hit the flamethrower, not them + +/obj/item/assembly/igniter/proc/flamethrower_process(turf/simulated/location) + location.hotspot_expose(700, 2) + +/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F, turf/simulated/location, release_amount = 0.05) + F.default_ignite(location, release_amount) \ No newline at end of file diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 4c8697da247..e2fc07712bf 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -1,27 +1,30 @@ // Glass shards /obj/item/shard - name = "glass shard" + name = "shard" + desc = "A nasty looking shard of glass." icon = 'icons/obj/shards.dmi' icon_state = "large" - sharp = TRUE - desc = "Could probably be used as ... a throwing weapon?" w_class = WEIGHT_CLASS_TINY force = 5 throwforce = 10 item_state = "shard-glass" - materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT) attack_verb = list("stabbed", "slashed", "sliced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0) + sharp = TRUE + var/cooldown = 0 + var/icon_prefix + var/obj/item/stack/sheet/welded_type = /obj/item/stack/sheet/glass /obj/item/shard/suicide_act(mob/user) to_chat(viewers(user), pick("[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.", "[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.")) return BRUTELOSS -/obj/item/shard/New() - ..() +/obj/item/shard/Initialize(mapload) + . = ..() icon_state = pick("large", "medium", "small") switch(icon_state) if("small") @@ -33,6 +36,8 @@ if("large") pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) + if(icon_prefix) + icon_state = "[icon_prefix][icon_state]" /obj/item/shard/afterattack(atom/movable/AM, mob/user, proximity) if(!proximity || !(src in user)) @@ -48,15 +53,17 @@ if(affecting.is_robotic()) return to_chat(H, "[src] cuts into your hand!") - if(affecting.receive_damage(force*0.5)) + if(affecting.receive_damage(force * 0.5)) H.UpdateDamageIcon() /obj/item/shard/attackby(obj/item/I, mob/user, params) if(iswelder(I)) var/obj/item/weldingtool/WT = I if(WT.remove_fuel(0, user)) - var/obj/item/stack/sheet/glass/NG = new (user.loc) - for(var/obj/item/stack/sheet/glass/G in user.loc) + var/obj/item/stack/sheet/NG = new welded_type(user.loc) + for(var/obj/item/stack/sheet/G in user.loc) + if(!istype(G, welded_type)) + continue if(G == NG) continue if(G.amount >= G.max_amount) @@ -64,64 +71,48 @@ G.attackby(NG, user) to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.") qdel(src) - else - return ..() + return + if(istype(I, /obj/item/lightreplacer)) + I.attackby(src, user) + return + return ..() -/obj/item/shard/Crossed(AM as mob|obj, oldloc) - if(isliving(AM)) - var/mob/living/M = AM - if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping! +/obj/item/shard/Crossed(mob/living/L, oldloc) + if(istype(L) && has_gravity(loc)) + if(L.incorporeal_move || L.flying) return - to_chat(M, "You step on \the [src]!") - playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds - if(ishuman(M)) - var/mob/living/carbon/human/H = M + playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) + if(!affecting) + return + if(affecting.is_robotic()) + return + var/feetCover = (H.wear_suit && H.wear_suit.body_parts_covered & FEET) || (H.w_uniform && H.w_uniform.body_parts_covered & FEET) + if(H.shoes || feetCover || H.buckled) + return + if(affecting.receive_damage(force, 0)) + H.UpdateDamageIcon() - if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) ) - var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) - if(!affecting) - return - if(affecting.is_robotic()) - return - H.Weaken(3) - if(affecting.receive_damage(5, 0)) - H.UpdateDamageIcon() - ..() + if(cooldown < world.time - 10) //cooldown to avoid message spam. + if(!H.incapacitated(ignore_restraints = TRUE)) + H.visible_message("[H] steps on [src]!", \ + "You step on [src]!") + else + H.visible_message("[H] slides on [src]!", \ + "You slide on [src]!") + + cooldown = world.time + H.Weaken(3) + return ..() /obj/item/shard/plasma name = "plasma shard" desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window." - force = 8 - throwforce = 15 + force = 6 + throwforce = 11 icon_state = "plasmalarge" - sharp = TRUE - -/obj/item/shard/plasma/New() - ..() - icon_state = pick("plasmalarge", "plasmamedium", "plasmasmall") - switch(icon_state) - if("plasmasmall") - pixel_x = rand(-12, 12) - pixel_y = rand(-12, 12) - if("plasmamedium") - pixel_x = rand(-8, 8) - pixel_y = rand(-8, 8) - if("plasmalarge") - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) - -/obj/item/shard/plasma/attackby(obj/item/W, mob/user, params) - if(iswelder(W)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - var/obj/item/stack/sheet/plasmaglass/NG = new (user.loc) - for(var/obj/item/stack/sheet/plasmaglass/G in user.loc) - if(G == NG) - continue - if(G.amount >= G.max_amount) - continue - G.attackby(NG, user, params) - to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.") - qdel(src) - else - return ..() + materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) + icon_prefix = "plasma" + welded_type = /obj/item/stack/sheet/plasmaglass \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index c44264c6529..97de014cbf8 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -8,7 +8,7 @@ slot_flags = SLOT_BACK hitsound = 'sound/weapons/smash.ogg' w_class = WEIGHT_CLASS_NORMAL - pressure_resistance = ONE_ATMOSPHERE*5 + pressure_resistance = ONE_ATMOSPHERE * 5 force = 5.0 throwforce = 10.0 throw_speed = 1 diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 96dd853be09..3d2972d4ac6 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -278,22 +278,22 @@ if(Adj) return //Safety check so you don't blast yourself trying to refill your tank var/datum/reagents/R = reagents - if(R.total_volume < 50) - to_chat(user, "You need at least 50 units of water to use the nanofrost launcher!") + if(R.total_volume < 100) + to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!") return if(nanofrost_cooldown) to_chat(user, "Nanofrost launcher is still recharging") return nanofrost_cooldown = 1 - R.remove_any(50) + R.remove_any(100) var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src)) log_game("[key_name(user)] used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).") playsound(src,'sound/items/syringeproj.ogg',40,1) for(var/a=0, a<5, a++) step_towards(A, target) - sleep(1) + sleep(2) A.Smoke() - spawn(50) + spawn(100) if(src) nanofrost_cooldown = 0 return diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index dc20b8582c6..16387c8b2cb 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -337,14 +337,23 @@ sharp = TRUE no_spin_thrown = TRUE var/obj/item/grenade/explosive = null + var/icon_prefix = "spearglass" /obj/item/twohanded/spear/update_icon() - if(explosive) - icon_state = "spearbomb[wielded]" - else - icon_state = "spearglass[wielded]" + icon_state = "[icon_prefix][wielded]" + +/obj/item/twohanded/spear/CheckParts(list/parts_list) + var/obj/item/shard/tip = locate() in parts_list + if(istype(tip, /obj/item/shard/plasma)) + force_wielded = 19 + force_unwielded = 11 + throwforce = 21 + icon_prefix = "spearplasma" + update_icon() + qdel(tip) ..() + /obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity) if(!proximity) return @@ -370,9 +379,7 @@ force_wielded = 20 //I have no idea how to balance throwforce = 22 armour_penetration = 15 //Enhanced armor piercing - -/obj/item/twohanded/spear/bonespear/update_icon() - icon_state = "bone_spear[wielded]" + icon_prefix = "bone_spear" //GREY TIDE /obj/item/twohanded/spear/grey_tide diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index c1f45a9fc9b..de06d78f9a7 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -105,7 +105,12 @@ ..() if(istype(I, /obj/item/shard)) var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear - + if(istype(I, /obj/item/shard/plasma)) + S.force_wielded = 19 + S.force_unwielded = 11 + S.throwforce = 21 + S.icon_prefix = "spearplasma" + S.update_icon() if(!remove_item_from_storage(user)) user.unEquip(src) user.unEquip(I) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 73dbc88487a..6a15d3d7e5b 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -272,7 +272,6 @@ new /obj/item/sensor_device(src) new /obj/item/key/ambulance(src) new /obj/item/pinpointer/crew(src) - new /obj/item/clothing/shoes/magboots(src) new /obj/item/handheld_defibrillator(src) /obj/structure/closet/secure_closet/reagents diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 3c3ea235b58..01a9affbe43 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -26,7 +26,6 @@ new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/clothing/suit/space/hardsuit/syndi(src) new /obj/item/tank/jetpack/oxygen/harness(src) - new /obj/item/clothing/shoes/magboots/syndie(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index c958096cc74..8192e39b85d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -133,6 +133,9 @@ // Chair types /obj/structure/chair/wood + name = "wooden chair" + desc = "Old is never too old to not be in fashion." + icon_state = "wooden_chair" burn_state = FLAMMABLE burntime = 20 buildstackamount = 3 @@ -142,15 +145,8 @@ /obj/structure/chair/wood/narsie_act() return -/obj/structure/chair/wood/normal - icon_state = "wooden_chair" - name = "wooden chair" - desc = "Old is never too old to not be in fashion." - /obj/structure/chair/wood/wings icon_state = "wooden_chair_wings" - name = "wooden chair" - desc = "Old is never too old to not be in fashion." item_chair = /obj/item/chair/wood/wings /obj/structure/chair/comfy diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index e3e6c01c2bd..74bab572b30 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -1,6 +1,8 @@ + /**********************Asteroid**************************/ /turf/simulated/floor/plating/asteroid + gender = PLURAL name = "asteroid sand" baseturf = /turf/simulated/floor/plating/asteroid icon_state = "asteroid" @@ -8,17 +10,32 @@ footstep_sounds = list() var/environment_type = "asteroid" var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal - var/dug = 0 //0 = has not yet been dug, 1 = has already been dug - var/sand_type = /obj/item/stack/ore/glass var/floor_variance = 20 //probability floor has a different icon state + var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt + var/dug -/turf/simulated/floor/plating/asteroid/New() +/turf/simulated/floor/plating/asteroid/Initialize(mapload) var/proper_name = name - ..() + . = ..() name = proper_name if(prob(floor_variance)) icon_state = "[environment_type][rand(0,12)]" +/turf/simulated/floor/plating/asteroid/proc/getDug() + new digResult(src, 5) + icon_plating = "[environment_type]_dug" + icon_state = "[environment_type]_dug" + dug = TRUE + +/turf/simulated/floor/plating/asteroid/proc/can_dig(mob/user) + if(!dug) + return TRUE + if(user) + to_chat(user, "Looks like someone has dug here already.") + +/turf/simulated/floor/plating/asteroid/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/simulated/floor/plating/asteroid/burn_tile() return @@ -31,46 +48,50 @@ /turf/simulated/floor/plating/asteroid/remove_plating() return -/turf/simulated/floor/plating/asteroid/ex_act(severity, target) +/turf/simulated/floor/plating/asteroid/ex_act(severity) + if(!can_dig()) + return switch(severity) if(3) return if(2) if(prob(20)) - gets_dug() + getDug() if(1) - gets_dug() + getDug() -/turf/simulated/floor/plating/asteroid/attackby(obj/item/W, mob/user, params) +/turf/simulated/floor/plating/asteroid/attackby(obj/item/I, mob/user, params) //note that this proc does not call ..() - if(!W || !user) - return 0 + if(!I|| !user) + return FALSE + + if((istype(I, /obj/item/shovel) || istype(I, /obj/item/pickaxe))) + if(!can_dig(user)) + return TRUE - if((istype(W, /obj/item/shovel) || istype(W, /obj/item/pickaxe))) var/turf/T = get_turf(user) if(!istype(T)) return - if(dug) - to_chat(user, "This area has already been dug!") - return - to_chat(user, "You start digging...") - playsound(src, W.usesound, 50, 1) - if(do_after(user, 20 * W.toolspeed, target = src)) - to_chat(user, "You dig a hole.") - gets_dug() - return - else if(istype(W,/obj/item/storage/bag/ore)) - var/obj/item/storage/bag/ore/S = W + playsound(src, I.usesound, 50, TRUE) + if(do_after(user, 40 * I.toolspeed, target = src)) + if(!can_dig(user)) + return TRUE + to_chat(user, "You dig a hole.") + getDug() + return TRUE + + else if(istype(I, /obj/item/storage/bag/ore)) + var/obj/item/storage/bag/ore/S = I if(S.collection_mode == 1) - for(var/obj/item/stack/ore/O in src.contents) - O.attackby(W,user) + for(var/obj/item/stack/ore/O in contents) + O.attackby(I, user) return - else if(istype(W, /obj/item/stack/tile)) - var/obj/item/stack/tile/Z = W + else if(istype(I, /obj/item/stack/tile)) + var/obj/item/stack/tile/Z = I if(!Z.use(1)) return if(istype(Z, /obj/item/stack/tile/plasteel)) // Turn asteroid floors into plating by default @@ -79,25 +100,14 @@ ChangeTurf(Z.turf_type, keep_icon = FALSE) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) -/turf/simulated/floor/plating/asteroid/proc/gets_dug() - if(dug) - return - for(var/i in 1 to 5) - new sand_type(src) - dug = 1 - icon_plating = "[environment_type]_dug" - icon_state = "[environment_type]_dug" - slowdown = 0 - return - /turf/simulated/floor/plating/asteroid/basalt name = "volcanic floor" baseturf = /turf/simulated/floor/plating/asteroid/basalt icon_state = "basalt" icon_plating = "basalt" environment_type = "basalt" - sand_type = /obj/item/stack/ore/glass/basalt floor_variance = 15 + digResult = /obj/item/stack/ore/glass/basalt /turf/simulated/floor/plating/asteroid/basalt/lava //lava underneath baseturf = /turf/simulated/floor/plating/lava/smooth @@ -107,10 +117,14 @@ oxygen = 0 nitrogen = 0 -/turf/simulated/floor/plating/asteroid/basalt/Initialize() +/turf/simulated/floor/plating/asteroid/basalt/Initialize(mapload) . = ..() set_basalt_light(src) +/turf/simulated/floor/plating/asteroid/basalt/getDug() + set_light(0) + return ..() + /proc/set_basalt_light(turf/simulated/floor/B) switch(B.icon_state) if("basalt1", "basalt2", "basalt3") @@ -118,11 +132,6 @@ if("basalt5", "basalt9") B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything! -/turf/simulated/floor/plating/asteroid/basalt/gets_dug() - if(!dug) - set_light(0) - ..() - ///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground. /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface @@ -138,9 +147,10 @@ nitrogen = 0 turf_type = /turf/simulated/floor/plating/asteroid/airless -#define SPAWN_MEGAFAUNA "MEGAFAUNA" +#define SPAWN_MEGAFAUNA "bluh bluh huge boss" +#define SPAWN_BUBBLEGUM 6 -GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6)) +GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM)) /turf/simulated/floor/plating/asteroid/airless/cave var/length = 100 @@ -169,22 +179,20 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE /turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data has_data = TRUE -/turf/simulated/floor/plating/asteroid/airless/cave/New() +/turf/simulated/floor/plating/asteroid/airless/cave/Initialize(mapload) if (!mob_spawn_list) mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3) if (!megafauna_spawn_list) megafauna_spawn_list = GLOB.megafauna_spawn_list if (!flora_spawn_list) flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) - + . = ..() if(!has_data) produce_tunnel_from_data() - ..() /turf/simulated/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1) // If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg. @@ -234,7 +242,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me if(istype(tunnel)) // Small chance to have forks in our tunnel; otherwise dig our tunnel. if(i > 3 && prob(20)) - var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type,FALSE,TRUE) + var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, FALSE, TRUE) C.going_backwards = FALSE C.produce_tunnel_from_data(rand(10, 15), dir) else @@ -260,19 +268,22 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me SpawnFlora(T) SpawnMonster(T) - T.ChangeTurf(turf_type,FALSE,FALSE,TRUE) + T.ChangeTurf(turf_type, FALSE, FALSE, TRUE) /turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) if(prob(30)) - if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) + if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored)) return var/randumb = pickweight(mob_spawn_list) while(randumb == SPAWN_MEGAFAUNA) - var/maybe_boss = pickweight(megafauna_spawn_list) - if(megafauna_spawn_list[maybe_boss]) - randumb = maybe_boss - if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it - megafauna_spawn_list.Remove(maybe_boss) + if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time. + var/maybe_boss = pickweight(megafauna_spawn_list) + if(megafauna_spawn_list[maybe_boss]) + randumb = maybe_boss + if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it + megafauna_spawn_list.Remove(maybe_boss) + else //this is not danger, don't spawn a boss, spawn something else + randumb = pickweight(mob_spawn_list) for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7) @@ -286,6 +297,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me return #undef SPAWN_MEGAFAUNA +#undef SPAWN_BUBBLEGUM /turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T) if(prob(12)) @@ -300,6 +312,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me /turf/simulated/floor/plating/asteroid/snow + gender = PLURAL name = "snow" desc = "Looks cold." icon = 'icons/turf/snow.dmi' @@ -309,7 +322,18 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me temperature = 180 slowdown = 2 environment_type = "snow" - sand_type = /obj/item/stack/sheet/mineral/snow + planetary_atmos = TRUE + burnt_states = list("snow_dug") + digResult = /obj/item/stack/sheet/mineral/snow + +/turf/simulated/floor/plating/asteroid/snow/burn_tile() + if(!burnt) + visible_message("[src] melts away!.") + slowdown = 0 + burnt = TRUE + icon_state = "snow_dug" + return TRUE + return FALSE /turf/simulated/floor/plating/asteroid/snow/airless temperature = TCMB @@ -322,4 +346,5 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me /turf/simulated/floor/plating/asteroid/snow/atmosphere oxygen = 22 nitrogen = 82 - temperature = 180 \ No newline at end of file + temperature = 180 + planetary_atmos = FALSE \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm index 159f78ddd80..3217a4c7996 100644 --- a/code/game/turfs/simulated/floor/indestructible.dm +++ b/code/game/turfs/simulated/floor/indestructible.dm @@ -48,7 +48,7 @@ temperature = 300 planetary_atmos = TRUE -/turf/simulated/floor/indestructible/necropolis/Initialize() +/turf/simulated/floor/indestructible/necropolis/Initialize(mapload) . = ..() if(prob(12)) icon_state = "necro[rand(2,3)]" diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 2109c8c62e5..964a0c3dcc5 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -6,12 +6,12 @@ icon_state = "rock" var/smooth_icon = 'icons/turf/smoothrocks.dmi' smooth = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith + canSmoothWith = null baseturf = /turf/simulated/floor/plating/asteroid/airless temperature = 2.7 opacity = 1 - density = 1 - blocks_air = 1 + density = TRUE + blocks_air = TRUE layer = EDGED_TURF_LAYER temperature = TCMB var/environment_type = "asteroid" @@ -21,21 +21,18 @@ var/spread = 0 //will the seam spread? var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles var/last_act = 0 - var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner - var/defer_change = FALSE + var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner + var/defer_change = 0 -/turf/simulated/mineral/New() - if (!canSmoothWith) +/turf/simulated/mineral/Initialize(mapload) + if(!canSmoothWith) canSmoothWith = list(/turf/simulated/mineral) var/matrix/M = new M.Translate(-4, -4) transform = M icon = smooth_icon - - ..() - GLOB.mineral_turfs += src - - if (mineralType && mineralAmt && spread && spreadChance) + . = ..() + if(mineralType && mineralAmt && spread && spreadChance) for(var/dir in cardinal) if(prob(spreadChance)) var/turf/T = get_step(src, dir) @@ -56,37 +53,34 @@ return TRUE return ..() -/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params) +/turf/simulated/mineral/attackby(obj/item/I, mob/user, params) if(!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") return - if(istype(P, /obj/item/pickaxe)) + if(istype(I, /obj/item/pickaxe)) + var/obj/item/pickaxe/P = I var/turf/T = user.loc if(!isturf(T)) return if(last_act + (40 * P.toolspeed) > world.time) // Prevents message spam return - last_act = world.time to_chat(user, "You start picking...") P.playDigSound() if(do_after(user, 40 * P.toolspeed, target = src)) - if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay + if(ismineralturf(src)) //sanity check against turf being deleted during digspeed delay to_chat(user, "You finish cutting into the rock.") - P.update_icon() gets_drilled(user) feedback_add_details("pick_used_mining","[P.name]") else return attack_hand(user) /turf/simulated/mineral/proc/gets_drilled() - if(mineralType && (mineralAmt > 0) && (mineralAmt < 11)) - var/i - for(i=0; i < mineralAmt; i++) - new mineralType(src) + if(mineralType && (mineralAmt > 0)) + new mineralType(src, mineralAmt) feedback_add_details("ore_mined","[mineralType]|[mineralAmt]") for(var/obj/effect/temp_visual/mining_overlay/M in src) qdel(M) @@ -94,26 +88,20 @@ addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction - if(rand(1, 750) == 1) - visible_message("An old dusty crate was buried within!") - new /obj/structure/closet/crate/secure/loot(src) - - return - /turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob) if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) gets_drilled() ..() -/turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M) +/turf/simulated/mineral/attack_alien(mob/living/carbon/alien/M) to_chat(M, "You start digging into the rock...") - playsound(src, 'sound/effects/break_stone.ogg', 50, 1) + playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) if(do_after(M, 40, target = src)) to_chat(M, "You tunnel into the rock.") - gets_drilled() + gets_drilled(M) -/turf/simulated/mineral/Bumped(AM as mob|obj) - . = ..() +/turf/simulated/mineral/Bumped(atom/movable/AM) + ..() if(ishuman(AM)) var/mob/living/carbon/human/H = AM if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand)) @@ -124,15 +112,15 @@ else if(isrobot(AM)) var/mob/living/silicon/robot/R = AM - if(istype(R.module_active,/obj/item/pickaxe)) - attackby(R.module_active,R) + if(istype(R.module_active, /obj/item/pickaxe)) + attackby(R.module_active, R) else if(ismecha(AM)) var/obj/mecha/M = AM - if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill)) + if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill)) M.selected.action(src) -/turf/simulated/mineral/ex_act(severity, target) +/turf/simulated/mineral/ex_act(severity) ..() switch(severity) if(3) @@ -145,22 +133,23 @@ gets_drilled(null, 1) /turf/simulated/mineral/random - var/mineralSpawnChanceList + var/mineralSpawnChanceList = list(/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10, + /turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11, + /turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1) + //Currently, Adamantine won't spawn as it has no uses. -Durandan var/mineralChance = 13 var/display_icon_state = "rock" -/turf/simulated/mineral/random/New() - if (!mineralSpawnChanceList) - mineralSpawnChanceList = list( - /turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10, - /turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11, - /turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1) - if (display_icon_state) +/turf/simulated/mineral/random/Initialize(mapload) + + mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList) + + if(display_icon_state) icon_state = display_icon_state - ..() + . = ..() if (prob(mineralChance)) var/path = pickweight(mineralSpawnChanceList) - var/turf/T = ChangeTurf(path,FALSE,TRUE) + var/turf/T = ChangeTurf(path, FALSE, TRUE) if(T && ismineralturf(T)) var/turf/simulated/mineral/M = T @@ -191,7 +180,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 mineralSpawnChanceList = list( /turf/simulated/mineral/uranium/volcanic = 35, /turf/simulated/mineral/diamond/volcanic = 30, /turf/simulated/mineral/gold/volcanic = 45, /turf/simulated/mineral/titanium/volcanic = 45, @@ -212,7 +200,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 mineralChance = 10 @@ -223,9 +210,9 @@ /turf/simulated/mineral/random/labormineral mineralSpawnChanceList = list( - /turf/simulated/mineral/uranium = 2, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 3, /turf/simulated/mineral/titanium = 4, - /turf/simulated/mineral/silver = 6, /turf/simulated/mineral/plasma = 15, /turf/simulated/mineral/iron = 80, - /turf/simulated/mineral/gibtonite = 3) + /turf/simulated/mineral/uranium = 3, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 8, /turf/simulated/mineral/titanium = 8, + /turf/simulated/mineral/silver = 20, /turf/simulated/mineral/plasma = 30, /turf/simulated/mineral/iron = 95, + /turf/simulated/mineral/gibtonite = 2) icon_state = "rock_labor" /turf/simulated/mineral/random/labormineral/volcanic @@ -235,12 +222,11 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 mineralSpawnChanceList = list( - /turf/simulated/mineral/uranium/volcanic = 2, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 3, /turf/simulated/mineral/titanium/volcanic = 4, - /turf/simulated/mineral/silver/volcanic = 6, /turf/simulated/mineral/plasma/volcanic = 15, /turf/simulated/mineral/iron/volcanic = 80, - /turf/simulated/mineral/gibtonite/volcanic = 3) + /turf/simulated/mineral/uranium/volcanic = 3, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 8, /turf/simulated/mineral/titanium/volcanic = 8, + /turf/simulated/mineral/silver/volcanic = 20, /turf/simulated/mineral/plasma/volcanic = 30, /turf/simulated/mineral/bscrystal/volcanic = 1, /turf/simulated/mineral/gibtonite/volcanic = 2, + /turf/simulated/mineral/iron/volcanic = 95) // Actual minerals /turf/simulated/mineral/iron @@ -256,7 +242,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/uranium @@ -272,7 +257,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/diamond @@ -288,7 +272,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/gold @@ -304,7 +287,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/silver @@ -320,7 +302,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/titanium @@ -336,7 +317,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/plasma @@ -352,7 +332,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/clown @@ -369,7 +348,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/mime @@ -385,7 +363,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/bscrystal @@ -402,7 +379,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE defer_change = 1 /turf/simulated/mineral/volcanic @@ -412,7 +388,6 @@ oxygen = 14 nitrogen = 23 temperature = 300 - planetary_atmos = TRUE /turf/simulated/mineral/volcanic/lava_land_surface environment_type = "basalt" @@ -420,6 +395,12 @@ baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface defer_change = 1 +//gibtonite state defines +#define GIBTONITE_UNSTRUCK 0 +#define GIBTONITE_ACTIVE 1 +#define GIBTONITE_STABLE 2 +#define GIBTONITE_DETONATE 3 + // Gibtonite /turf/simulated/mineral/gibtonite mineralAmt = 1 @@ -427,39 +408,29 @@ spread = 0 scan_state = "rock_Gibtonite" var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it - var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction + var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes var/activated_name = null - var/activated_image = null + var/mutable_appearance/activated_overlay -/turf/simulated/mineral/gibtonite/volcanic - environment_type = "basalt" - turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface - baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface - oxygen = 14 - nitrogen = 23 - temperature = 300 - planetary_atmos = TRUE - defer_change = 1 - -/turf/simulated/mineral/gibtonite/New() +/turf/simulated/mineral/gibtonite/Initialize(mapload) det_time = rand(8,10) //So you don't know exactly when the hot potato will explode - ..() + . = ..() /turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1) - user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...") + user.visible_message("[user] holds [I] to [src]...", "You use [I] to locate where to cut off the chain reaction and attempt to stop it...") defuse() - ..() + else + return ..() -/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0) - if(stage == 0) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER) - add_overlay(I) - activated_image = I +/turf/simulated/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0) + if(stage == GIBTONITE_UNSTRUCK) + activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER) + add_overlay(activated_overlay) name = "gibtonite deposit" desc = "An active gibtonite reserve. Run!" - stage = 1 + stage = GIBTONITE_ACTIVE visible_message("There was gibtonite inside! It's going to explode!") var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) @@ -481,39 +452,39 @@ /turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0) set waitfor = 0 - while(istype(src, /turf/simulated/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1) + while(istype(src, /turf/simulated/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1) det_time-- sleep(5) if(istype(src, /turf/simulated/mineral/gibtonite)) - if(stage == 1 && det_time <= 0 && mineralAmt >= 1) + if(stage == GIBTONITE_ACTIVE && det_time <= 0 && mineralAmt >= 1) var/turf/bombturf = get_turf(src) mineralAmt = 0 - stage = 3 + stage = GIBTONITE_DETONATE explosion(bombturf,1,3,5, adminlog = notify_admins) /turf/simulated/mineral/gibtonite/proc/defuse() - if(stage == 1) - overlays -= activated_image - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER) - add_overlay(I) + if(stage == GIBTONITE_ACTIVE) + cut_overlay(activated_overlay) + activated_overlay.icon_state = "rock_Gibtonite_inactive" + add_overlay(activated_overlay) desc = "An inactive gibtonite reserve. The ore can be extracted." - stage = 2 + stage = GIBTONITE_STABLE if(det_time < 0) det_time = 0 - visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!") + visible_message("The chain reaction was stopped! The gibtonite had [det_time] reactions left till the explosion!") /turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0) - if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated - playsound(src, 'sound/effects/hit_on_shattered_glass.ogg',50,1) + if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated + playsound(src,'sound/effects/hit_on_shattered_glass.ogg', 50, TRUE) explosive_reaction(user, triggered_by_explosion) return - if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom + if(stage == GIBTONITE_ACTIVE && mineralAmt >= 1) //Gibtonite deposit goes kaboom var/turf/bombturf = get_turf(src) mineralAmt = 0 - stage = 3 - explosion(bombturf, 1, 2, 5, adminlog = 0) - if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. - var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src) + stage = GIBTONITE_DETONATE + explosion(bombturf,1,2,5, adminlog = 0) + if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. + var/obj/item/twohanded/required/gibtonite/G = new(src) if(det_time <= 0) G.quality = 3 G.icon_state = "Gibtonite ore 3" @@ -523,3 +494,18 @@ ChangeTurf(turf_type, defer_change) addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) + + +/turf/simulated/mineral/gibtonite/volcanic + environment_type = "basalt" + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface + oxygen = 14 + nitrogen = 23 + temperature = 300 + defer_change = 1 + +#undef GIBTONITE_UNSTRUCK +#undef GIBTONITE_ACTIVE +#undef GIBTONITE_STABLE +#undef GIBTONITE_DETONATE \ No newline at end of file diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index ed13f127019..c7a3e742b6c 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -4,7 +4,7 @@ #define RANDOM_LOWER_X 50 #define RANDOM_LOWER_Y 50 -/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) +/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) var/list/river_nodes = list() var/num_spawned = 0 var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d32a05eb312..60210f51903 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -54,7 +54,7 @@ var/global/nologevent = 0 ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(var/mob/M in GLOB.mob_list) - set category = "Admin" + set category = null set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" @@ -937,9 +937,9 @@ var/global/nologevent = 0 message_admins("[key_name_admin(usr)] checked the AI laws") /client/proc/update_mob_sprite(mob/living/carbon/human/H as mob) - set category = "Admin" set name = "Update Mob Sprite" set desc = "Should fix any mob sprite update errors." + set category = null if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b66f83543dd..199d4cf276a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -71,13 +71,12 @@ var/list/admin_verbs_admin = list( /client/proc/alt_check, /client/proc/secrets, /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ - /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ + /client/proc/change_human_appearance_self, /* Allows the human-based mob itself to change its basic appearance */ /client/proc/debug_variables, /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ - /client/proc/list_ssds, - /client/proc/list_afks, + /client/proc/list_ssds_afks, /client/proc/cmd_admin_headset_message, /client/proc/spawn_floor_cluwne, /client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359 @@ -803,7 +802,7 @@ var/list/admin_verbs_ticket = list( /client/proc/change_human_appearance_admin(mob/living/carbon/human/H in GLOB.mob_list) set name = "C.M.A. - Admin" set desc = "Allows you to change the mob appearance" - set category = "Admin" + set category = null if(!check_rights(R_ADMIN)) return @@ -829,7 +828,7 @@ var/list/admin_verbs_ticket = list( /client/proc/change_human_appearance_self(mob/living/carbon/human/H in GLOB.mob_list) set name = "C.M.A. - Self" set desc = "Allows the mob to change its appearance" - set category = "Admin" + set category = null if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index 9ad1f722b08..406019745f8 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -12,12 +12,12 @@ /client/proc/resolveAllAdminTickets() set name = "Resolve All Open Admin Tickets" - set category = "Admin" + set category = null if(!holder || !check_rights(R_ADMIN)) return - if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes") + if(alert("Are you sure you want to resolve ALL open admin tickets?","Resolve all open admin tickets?","Yes","No") != "Yes") return SStickets.resolveAllOpenTickets() diff --git a/code/modules/admin/tickets/mentorticketsverbs.dm b/code/modules/admin/tickets/mentorticketsverbs.dm index 1122b770107..d65f4a30220 100644 --- a/code/modules/admin/tickets/mentorticketsverbs.dm +++ b/code/modules/admin/tickets/mentorticketsverbs.dm @@ -12,12 +12,12 @@ /client/proc/resolveAllMentorTickets() set name = "Resolve All Open Mentor Tickets" - set category = "Admin" + set category = null if(!holder || !check_rights(R_ADMIN)) return - if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes") + if(alert("Are you sure you want to resolve ALL open mentor tickets?","Resolve all open mentor tickets?","Yes","No") != "Yes") return SSmentor_tickets.resolveAllOpenTickets() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 21706aeabe3..1bd103d95b2 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -37,7 +37,7 @@ return var/ticketID = text2num(href_list["openmentorticket"]) SSmentor_tickets.showDetailUI(usr, ticketID) - + if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) @@ -169,14 +169,6 @@ message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob") DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid ) - if(BANTYPE_PERMA) - add_note(banckey, "Permanently Banned - [banreason]", null, usr.ckey, 0) - else if(BANTYPE_TEMP) - add_note(banckey, "Banned for [banduration] minutes - [banreason]", null, usr.ckey, 0) - else if(BANTYPE_JOB_PERMA) - add_note(banckey, "Banned from [banjob] - [banreason]", null, usr.ckey, 0) - else - add_note(banckey, "[banreason]", null, usr.ckey, 0) else if(href_list["editrights"]) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index a8053e1faed..16a1c14694f 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -30,7 +30,7 @@ /client/proc/jumptoturf(var/turf/T in world) set name = "Jump to Turf" - set category = "Admin" + set category = null if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 1069e981c37..270a6bd6179 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -191,7 +191,7 @@ else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]") - + //Check if the mob being PM'd has any open admin tickets. var/tickets = list() if(type == "Mentorhelp") @@ -205,10 +205,10 @@ if(type == "Mentorhelp") if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets tickets = SSmentor_tickets.checkForTicket(src) - else // Ahelp + else // Ahelp if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets tickets = SStickets.checkForTicket(src) - + if(tickets) for(var/datum/ticket/i in tickets) i.addResponse(src, msg) @@ -351,7 +351,7 @@ var/client/C = pms[title].client || update_client(title) if(!C) return "[title] (Disconnected)" - return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (CA)" + return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_TP(C.mob,"TP")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)])" /datum/pm_tracker/proc/update_client(title) var/client/C = GLOB.directory[ckey(title)] diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 209352993a0..bdef649468d 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -7,8 +7,8 @@ //////////////////////////////////////////////////////////////////////////////// var/global/list/frozen_mob_list = list() /client/proc/freeze(var/mob/living/M as mob in GLOB.mob_list) - set category = "Admin" set name = "Freeze" + set category = null if(!check_rights(R_ADMIN)) return @@ -87,8 +87,8 @@ var/global/list/frozen_mob_list = list() //////////////////////////Freeze Mech /client/proc/freezemecha(var/obj/mecha/O as obj in GLOB.mechas_list) - set category = "Admin" set name = "Freeze Mech" + set category = null if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index b6986f4960f..9973de89c85 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -30,7 +30,7 @@ deity = SSticker.cultdat.entity_name log_say("(PRAYER) [msg]", usr) - msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]: [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (CA) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]" + msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]: [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_TP(src,"TP")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]" for(var/client/X in GLOB.admins) if(check_rights(R_EVENT,0,X.mob)) @@ -41,7 +41,7 @@ /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "CENTCOMM: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (CA) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])): [msg]" + msg = "CENTCOMM: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])): [msg]" for(var/client/X in GLOB.admins) if(R_EVENT & X.holder.rights) to_chat(X, msg) @@ -50,7 +50,7 @@ /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "SYNDICATE: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (CA) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]): [msg]" + msg = "SYNDICATE: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]): [msg]" for(var/client/X in GLOB.admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) @@ -59,7 +59,7 @@ /proc/HONK_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "HONK: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (CA) ([ADMIN_BSA(Sender,"BSA")]) (RPLY): [msg]" + msg = "HONK: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (RPLY): [msg]" for(var/client/X in GLOB.admins) if(R_EVENT & X.holder.rights) to_chat(X, msg) @@ -68,7 +68,7 @@ /proc/ERT_Announce(var/text , var/mob/Sender, var/repeat_warning) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "ERT REQUEST: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (CA) ([ADMIN_BSA(Sender,"BSA")]) (RESPOND): [msg]" + msg = "ERT REQUEST: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (RESPOND): [msg]" if(repeat_warning) msg += "
WARNING: ERT request has gone 5 minutes with no reply!" for(var/client/X in GLOB.admins) @@ -80,7 +80,7 @@ /proc/Nuke_request(text , mob/Sender) var/nuke_code = get_nuke_code() var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "NUKE CODE REQUEST: [key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (CA) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]): [msg]" + msg = "NUKE CODE REQUEST: [key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]): [msg]" for(var/client/X in GLOB.admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2c7c6181b1d..aa22dfe944c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -776,8 +776,8 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_check_contents(mob/living/M as mob in GLOB.mob_list) - set category = "Admin" set name = "Check Contents" + set category = null if(!check_rights(R_ADMIN)) return @@ -957,21 +957,24 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] reset NTTC scripts.") feedback_add_details("admin_verb","RAT2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/list_ssds() +/client/proc/list_ssds_afks() set category = "Admin" - set name = "List SSDs" - set desc = "Lists SSD players" + set name = "List SSDs and AFKs" + set desc = "Lists SSD and AFK players" if(!check_rights(R_ADMIN)) return - var/msg = "SSD Report" + /* ======== SSD Section ========= */ + var/msg = "SSD & AFK Report" msg += "SSD Players:
" msg += "" var/mins_ssd var/job_string var/key_string var/role_string + var/obj_count = 0 + var/obj_string = "" for(var/mob/living/carbon/human/H in GLOB.living_mob_list) if(!isLivingSSD(H)) continue @@ -984,8 +987,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(job_string in command_positions) job_string = "" + job_string + "" role_string = "-" - var/obj_count = 0 - var/obj_string = "" if(H.mind) if(H.mind.special_role) role_string = "[H.mind.special_role]" @@ -1003,24 +1004,12 @@ Traitors and the like can also be revived with the previous role mostly intact. else msg += "" msg += "" - msg += "
KeyReal NameJobMins SSDSpecial RoleAreaPPNCryo
Cryo
" - src << browse(msg, "window=Player_ssd_check") + msg += "
" -/client/proc/list_afks() - set category = "Admin" - set name = "List AFKs" - set desc = "Lists AFK players" - - if(!check_rights(R_ADMIN)) - return - - var/msg = "AFK Report" + /* ======== AFK Section ========= */ msg += "AFK Players:
" msg += "" var/mins_afk - var/job_string - var/key_string - var/role_string for(var/mob/living/carbon/human/H in GLOB.living_mob_list) if(H.client == null || H.stat == DEAD) // No clientless or dead continue @@ -1035,8 +1024,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if(job_string in command_positions) job_string = "" + job_string + "" role_string = "-" - var/obj_count = 0 - var/obj_string = "" + obj_count = 0 + obj_string = "" if(H.mind) if(H.mind.special_role) role_string = "[H.mind.special_role]" @@ -1055,7 +1044,7 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "" msg += "" msg += "
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo
Cryo
" - src << browse(msg, "window=Player_afk_check") + src << browse(msg, "window=Player_ssd_afk_check;size=600x300") /client/proc/toggle_ert_calling() set category = "Event" diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 22325fed75f..0feca103c12 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -95,3 +95,8 @@ // Has the client been varedited by an admin? [Inherits from datum now] // var/var_edited = FALSE + + var/client_keysend_amount = 0 + var/next_keysend_reset = 0 + var/next_keysend_trip_reset = 0 + var/keysend_tripped = FALSE \ No newline at end of file diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index e3925aa5283..d59e3da4e8e 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -3,7 +3,46 @@ /client/verb/keyDown(_key as text) set instant = TRUE set hidden = TRUE + + client_keysend_amount += 1 + + var/cache = client_keysend_amount + + if(keysend_tripped && next_keysend_trip_reset <= world.time) + keysend_tripped = FALSE + + if(next_keysend_reset <= world.time) + client_keysend_amount = 0 + next_keysend_reset = world.time + (1 SECONDS) + + //The "tripped" system is to confirm that flooding is still happening after one spike + //not entirely sure how byond commands interact in relation to lag + //don't want to kick people if a lag spike results in a huge flood of commands being sent + if(cache >= MAX_KEYPRESS_AUTOKICK) + if(!keysend_tripped) + keysend_tripped = TRUE + next_keysend_trip_reset = world.time + (2 SECONDS) + else + log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.") + message_admins("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.") + QDEL_IN(src, 1) + return + + ///Check if the key is short enough to even be a real key + if(LAZYLEN(_key) > MAX_KEYPRESS_COMMANDLENGTH) + to_chat(src, "Invalid KeyDown detected! You have been disconnected from the server automatically.") + log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.") + message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.") + QDEL_IN(src, 1) + return + //offset by 1 because the buffer address is 0 indexed because the math was simpler + keys_held[current_key_address + 1] = _key + //the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking + keys_held[_key] = world.time + + current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH) + var/movement = SSinput.movement_keys[_key] if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) @@ -40,7 +79,11 @@ /client/verb/keyUp(_key as text) set instant = TRUE set hidden = TRUE - keys_held -= _key + //Can't just do a remove because it would alter the length of the rolling buffer, instead search for the key then null it out if it exists + for(var/i in 1 to HELD_KEY_BUFFER_LENGTH) + if(keys_held[i] == _key) + keys_held[i] = null + break var/movement = SSinput.movement_keys[_key] if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] if(!(next_move_dir_add & movement)) diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index cc76256386e..b6e80452304 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -1,9 +1,14 @@ /client - var/list/keys_held = list() // A list of any keys held currently - // These next two vars are to apply movement for keypresses and releases made while move delayed. - // Because discarding that input makes the game less responsive. - var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done - var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done + /// A rolling buffer of any keys held currently + var/list/keys_held = list() + ///used to keep track of the current rolling buffer position + var/current_key_address = 0 + /// These next two vars are to apply movement for keypresses and releases made while move delayed. + /// Because discarding that input makes the game less responsive. + /// On next move, add this dir to the move that would otherwise be done + var/next_move_dir_add + /// On next move, subtract this dir from the move that would otherwise be done + var/next_move_dir_sub // Set a client's focus to an object and override these procs on that object to let it handle keypresses @@ -31,6 +36,11 @@ /client/proc/set_macros() set waitfor = FALSE + //Reset and populate the rolling buffer + keys_held.Cut() + for(var/i in 1 to HELD_KEY_BUFFER_LENGTH) + keys_held += null + erase_all_macros() var/list/macro_sets = SSinput.macro_sets diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 24210fc2ff0..fbe1067918a 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -213,13 +213,13 @@ if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway. NewTerrainFloors = /turf/simulated/floor/snow // Needs to be updated after turf update NewTerrainWalls = /turf/simulated/wall/mineral/wood - NewTerrainChairs = /obj/structure/chair/wood/normal + NewTerrainChairs = /obj/structure/chair/wood NewTerrainTables = /obj/structure/table/glass NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both) if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows. NewTerrainFloors = /turf/simulated/floor/grass NewTerrainWalls = /turf/simulated/wall/mineral/sandstone - NewTerrainChairs = /obj/structure/chair/wood/normal + NewTerrainChairs = /obj/structure/chair/wood NewTerrainTables = /obj/structure/table/wood NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush, /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/monkey, diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index e6b45a1649a..788b8aa936d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -14,8 +14,6 @@ var/custom_pixel_x_offset = 0 //for admin fuckery. var/custom_pixel_y_offset = 0 pass_flags = PASSTABLE - pressure_resistance = 100 //100 kPa difference required to push - throw_pressure_limit = 120 //120 kPa difference required to throw //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/humanoid/New() diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 14124afef3e..e946c5a2ba8 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -8,6 +8,7 @@ heal_rate = 5 large = 1 ventcrawler = 0 + pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. /mob/living/carbon/alien/humanoid/queen/New() create_reagents(100) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 4ecd81e1338..f8e9f7e9aff 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,5 +1,6 @@ /mob/living/carbon gender = MALE + pressure_resistance = 15 var/list/stomach_contents = list() var/list/internal_organs = list() var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 70ecf8a33c2..af01634de5a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -500,11 +500,12 @@ emp_act return /mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction) - playsound(src, 'sound/effects/space_wind.ogg', 50, 1) - if(shoes) - if(istype(shoes,/obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) //TODO: Make a not-shit shoe var system to negate airflow. - return 0 - ..() + playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE) + if(shoes && istype(shoes, /obj/item/clothing)) + var/obj/item/clothing/S = shoes + if (S.flags & NOSLIP) + return FALSE + return ..() /mob/living/carbon/human/water_act(volume, temperature, source, method = TOUCH) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 987041bc7ad..1aeb1476f64 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -2,7 +2,7 @@ var/global/default_martial_art = new/datum/martial_art /mob/living/carbon/human hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,GLAND_HUD) - + pressure_resistance = 25 //Marking colour and style var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000. var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cd20656254f..df222fadf47 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -604,6 +604,34 @@ else return pick("trails_1", "trails_2") +/mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) + if(buckled) + return + if(client && client.move_delay >= world.time + world.tick_lag * 2) + pressure_resistance_prob_delta -= 30 + + var/list/turfs_to_check = list() + + if(has_limbs) + var/turf/T = get_step(src, angle2dir(dir2angle(direction) + 90)) + if (T) + turfs_to_check += T + + T = get_step(src, angle2dir(dir2angle(direction) - 90)) + if(T) + turfs_to_check += T + + for(var/t in turfs_to_check) + T = t + if(T.density) + pressure_resistance_prob_delta -= 20 + continue + for(var/atom/movable/AM in T) + if(AM.density && AM.anchored) + pressure_resistance_prob_delta -= 20 + break + + ..(pressure_difference, direction, pressure_resistance_prob_delta) /*////////////////////// START RESIST PROCS @@ -617,6 +645,8 @@ return changeNext_move(CLICK_CD_RESIST) + SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src) + if(!restrained()) if(resist_grab()) return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 837e75738a9..1e3343f90f7 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,5 +1,6 @@ /mob/living see_invisible = SEE_INVISIBLE_LIVING + pressure_resistance = 10 //Health and life related vars var/maxHealth = 100 //Maximum health that should be possible. @@ -65,7 +66,7 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD) var/list/status_effects //a list of all status effects the mob has - + var/deathgasp_on_death = FALSE var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 699376c927f..76c7f5bc1af 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -252,7 +252,7 @@ modules += new /obj/item/soap/nanotrasen(src) modules += new /obj/item/storage/bag/trash/cyborg(src) modules += new /obj/item/mop/advanced/cyborg(src) - modules += new /obj/item/lightreplacer(src) + modules += new /obj/item/lightreplacer/cyborg(src) modules += new /obj/item/holosign_creator(src) emag = new /obj/item/reagent_containers/spray(src) @@ -544,7 +544,7 @@ modules += new /obj/item/crowbar/cyborg(src) modules += new /obj/item/wirecutters/cyborg(src) modules += new /obj/item/multitool/cyborg(src) - modules += new /obj/item/lightreplacer(src) + modules += new /obj/item/lightreplacer/cyborg(src) modules += new /obj/item/gripper(src) modules += new /obj/item/matter_decompiler(src) modules += new /obj/item/reagent_containers/spray/cleaner/drone(src) @@ -562,10 +562,6 @@ /obj/item/robot_module/drone/respawn_consumable(mob/living/silicon/robot/R) var/obj/item/reagent_containers/spray/cleaner/C = locate() in modules C.reagents.add_reagent("cleaner", 3) - - var/obj/item/lightreplacer/LR = locate() in modules - LR.Charge(R) - ..() diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index cc5fe804a36..f762ba440cf 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -9,7 +9,6 @@ modtype = "Syndicate" req_access = list(access_syndicate) ionpulse = 1 - magpulse = 1 lawchannel = "State" var/playstyle_string = "You are a Syndicate assault cyborg!
\ You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ @@ -80,7 +79,7 @@ var/datum/action/thermals = new /datum/action/innate/robot_sight/thermal() thermals.Grant(src) - + /mob/living/silicon/robot/syndicate/saboteur/verb/modify_name() set name = "Modify Name" set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost." diff --git a/code/modules/mob/living/simple_animal/bot/syndicate.dm b/code/modules/mob/living/simple_animal/bot/syndicate.dm index 7ac95186c51..ae26bfee220 100644 --- a/code/modules/mob/living/simple_animal/bot/syndicate.dm +++ b/code/modules/mob/living/simple_animal/bot/syndicate.dm @@ -16,8 +16,6 @@ faction = list("syndicate") shoot_sound = 'sound/weapons/wave.ogg' anchored = 1 - pressure_resistance = 100 //100 kPa difference required to push - throw_pressure_limit = 120 window_id = "syndiebot" window_name = "Syndicate Bot Interface" var/turf/saved_turf diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 3a26265466b..ea8e80d2e3c 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -18,6 +18,7 @@ minbodytemp = 0 faction = list("cult") flying = 1 + pressure_resistance = 100 universal_speak = 1 AIStatus = AI_OFF //normal constructs don't have AI var/const_type = "shade" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 52f149f0775..35b6885f143 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -24,8 +24,6 @@ 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) unsuitable_atmos_damage = 15 heat_damage_per_tick = 20 - pressure_resistance = 100 //100 kPa difference required to push - throw_pressure_limit = 120 //120 kPa difference required to throw faction = list("alien") status_flags = CANPUSH minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 48021ad2593..ef0ddb2baf9 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -30,6 +30,7 @@ faction = list("carp") flying = 1 + pressure_resistance = 200 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE var/carp_color = "carp" //holder for icon set diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 0429a53ad11..b3a0ea5ed06 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -18,7 +18,7 @@ attack_sound = 'sound/creatures/headcrab_attack.ogg' speak_emote = list("hisses") var/is_zombie = 0 - stat_attack = UNCONSCIOUS //so they continue to attack when they are on the ground. + stat_attack = DEAD //so they continue to attack when they are on the ground. var/host_species = "" var/list/human_overlays = list() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm index 4d5009109f3..4dbd306c9e0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm @@ -132,7 +132,7 @@ . = ..() if(.) var/mob/living/L = target - if (istype(L)) + if(istype(L)) L.adjust_fire_stacks(0.1) L.IgniteMob() @@ -141,5 +141,12 @@ damage_type = BURN nodamage = FALSE +/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE) + . = ..() + if(.) + var/mob/living/L = target + if(istype(L)) + L.apply_status_effect(/datum/status_effect/freon/watcher) + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril fromtendril = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm index d80e68b7542..f4ef47b21a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm @@ -46,7 +46,7 @@ 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) minbodytemp = 0 - + pressure_resistance = 300 faction = list("undead") // did I mention ghost loot = list(/obj/item/reagent_containers/food/snacks/ectoplasm) del_on_death = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index f84ec5f90d7..23d7b30691b 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -49,10 +49,6 @@ var/global/list/ts_spiderling_list = list() // '1' (default for most simple_mobs, including terror spiders) converts to 3.5, or 2.8 tiles/sec. // '2' converts to 4.5, or 2.2 tiles/sec. - // Atmos - pressure_resistance = 50 //50 kPa difference required to push - throw_pressure_limit = 100 //100 kPa difference required to throw - // Ventcrawling ventcrawler = 1 // allows player ventcrawling var/ai_ventcrawls = TRUE diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 0794b7d9c70..ad6d00d88aa 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -556,6 +556,11 @@ genemutcheck(src, block,null, MUTCHK_FORCED) dna.UpdateSE() +///////////////////////////////// FROZEN ///////////////////////////////////// + +/mob/living/proc/IsFrozen() + return has_status_effect(/datum/status_effect/freon) + ///////////////////////////////////// STUN ABSORPTION ///////////////////////////////////// /mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index 39357533abb..bdaa0972aef 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -89,7 +89,7 @@ else if((fall_over || resting) && !lying) fall(fall_over) - canmove = !(fall_over || resting || stunned || buckled) + canmove = !(fall_over || resting || stunned || IsFrozen() || buckled) density = !lying if(lying) if(layer == initial(layer)) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 01974ad3694..704ec5b5819 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -9,7 +9,7 @@ throw_range = 2 throw_speed = 1 layer = 4 - pressure_resistance = 1 + pressure_resistance = 2 attack_verb = list("bapped") var/amount = 0 //Amount of items clipped to the paper. Note: If you have 2 paper, this should be 1 var/page = 1 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index b186e862f01..6b4b5f05e82 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -303,10 +303,7 @@ //Light replacer code if(istype(W, /obj/item/lightreplacer)) var/obj/item/lightreplacer/LR = W - if(isliving(user)) - var/mob/living/U = user - LR.ReplaceLight(src, U) - return + LR.ReplaceLight(src, user) // attempt to insert light if(istype(W, /obj/item/light)) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index b93ddefd0d5..9c1ea1a7a9f 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -79,7 +79,7 @@ holds_charge = TRUE unique_frequency = TRUE -/obj/item/gun/energy/kinetic_accelerator/New() +/obj/item/gun/energy/kinetic_accelerator/Initialize(mapload) . = ..() if(!holds_charge) empty() @@ -98,8 +98,7 @@ if(!QDELING(src) && !holds_charge) // Put it on a delay because moving item from slot to hand // calls dropped(). - spawn(2) - empty_if_not_held() + addtimer(CALLBACK(src, .proc/empty_if_not_held), 2) /obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held() if(!ismob(loc)) @@ -143,17 +142,17 @@ overheat = FALSE /obj/item/gun/energy/kinetic_accelerator/update_icon() - overlays.Cut() + cut_overlays() if(empty_state && !can_shoot()) - overlays += empty_state + add_overlay(empty_state) if(gun_light && can_flashlight) var/iconF = "flight" if(gun_light.on) iconF = "flight_on" - overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset) + add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) if(bayonet && can_bayonet) - overlays += knife_overlay + add_overlay(knife_overlay) /obj/item/gun/energy/kinetic_accelerator/experimental diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 4499fca3797..d51f9446b49 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -165,12 +165,18 @@ /obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) + if(power_supply.charge >= power_supply.maxcharge) + to_chat(user,"[src] is already fully charged.") + return var/obj/item/stack/sheet/S = A S.use(1) power_supply.give(1000) on_recharge() to_chat(user, "You insert [A] in [src], recharging it.") else if(istype(A, /obj/item/stack/ore/plasma)) + if(power_supply.charge >= power_supply.maxcharge) + to_chat(user,"[src] is already fully charged.") + return var/obj/item/stack/ore/S = A S.use(1) power_supply.give(500) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 881635d0e21..081c57ddb79 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -10,7 +10,6 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT hitsound = 'sound/weapons/pierce.ogg' var/hitsound_wall = "" - pressure_resistance = INFINITY burn_state = LAVA_PROOF var/def_zone = "" //Aiming at var/mob/firer = null//Who shot it @@ -98,7 +97,7 @@ var/turf/simulated/wall/W = target_loca if(impact_effect_type) new impact_effect_type(target_loca, hitx, hity) - + W.add_dent(WALL_DENT_SHOT, hitx, hity) return 0 if(alwayslog) @@ -334,3 +333,6 @@ obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile wi /obj/item/projectile/proc/setAngle(new_angle) //wrapper for overrides. Angle = new_angle return TRUE + +/obj/item/projectile/experience_pressure_difference() + return \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index 5b65a062ea7..d4d2bbe2d88 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -362,7 +362,6 @@ drink_icon = "cubalibreglass" drink_name = "Cuba Libre" drink_desc = "A classic mix of rum and cola." - taste_description = "fruity alcohol" taste_description = "liberation" /datum/reagent/consumable/ethanol/whiskey_cola diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm index 27fe0dacc40..331157d4acc 100644 --- a/code/modules/reagents/chemistry/reagents/disease.dm +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -5,6 +5,7 @@ reagent_state = SOLID color = "#FFFFFF" can_synth = FALSE + taste_mult = 0 /datum/reagent/spider_eggs/on_mob_life(mob/living/M) if(volume > 2.5) @@ -20,6 +21,7 @@ description = "Microscopic construction robots." color = "#535E66" // rgb: 83, 94, 102 can_synth = FALSE + taste_mult = 0 /datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M) if(volume > 1.5) @@ -33,6 +35,7 @@ description = "Microbes with an entirely alien cellular structure." color = "#535E66" // rgb: 83, 94, 102 can_synth = FALSE + taste_mult = 0 /datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M) if(volume > 1.5) @@ -45,6 +48,7 @@ description = "Active fungal spores." color = "#92D17D" // rgb: 146, 209, 125 can_synth = FALSE + taste_mult = 0 /datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M) if(volume > 2.5) @@ -58,6 +62,7 @@ reagent_state = SOLID color = "#FA0000" // rgb: 250, 0, 0 can_synth = FALSE + taste_mult = 0 /datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M) M.ForceContractDisease(new /datum/disease/berserker(0)) @@ -70,6 +75,7 @@ reagent_state = LIQUID color = "#1E4600" can_synth = FALSE + taste_mult = 0 /datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) M.ForceContractDisease(new /datum/disease/food_poisoning(0)) @@ -82,6 +88,7 @@ reagent_state = LIQUID color = "#FF0000" can_synth = FALSE + taste_mult = 0 /datum/reagent/gibbis/on_mob_life(mob/living/carbon/M) if(volume > 2.5) @@ -95,6 +102,7 @@ reagent_state = LIQUID color = "#FFFFFF" can_synth = FALSE + taste_mult = 0 /datum/reagent/prions/on_mob_life(mob/living/carbon/M) if(volume > 4.5) @@ -108,6 +116,7 @@ reagent_state = LIQUID color = "#465046" can_synth = FALSE + taste_mult = 0 /datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M) if(volume > 4.5) @@ -121,6 +130,7 @@ reagent_state = LIQUID color = "#F7E6B1" can_synth = FALSE + taste_description = "bacon" /datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M) if(volume > 4.5) @@ -134,6 +144,7 @@ reagent_state = SOLID color = "#925D6C" can_synth = FALSE + taste_mult = 0 /datum/reagent/heartworms/on_mob_life(mob/living/carbon/M) if(volume > 4.5) @@ -152,6 +163,7 @@ reagent_state = LIQUID color = "#AB1CCF" can_synth = FALSE + taste_mult = 0 /datum/reagent/concentrated_initro/on_mob_life(mob/living/M) if(volume >= 5) @@ -170,6 +182,7 @@ reagent_state = LIQUID nutriment_factor = 2 * REAGENTS_METABOLISM color = "#899613" // rgb: 137, 150, 19 + taste_description = "watery milk" /datum/reagent/mutagen/mutagenvirusfood name = "mutagenic agar" @@ -198,4 +211,4 @@ /datum/reagent/plasma_dust/plasmavirusfood/weak name = "weakened virus plasma" id = "weakplasmavirusfood" - color = "#CEC3C6" // rgb: 206,195,198 + color = "#CEC3C6" // rgb: 206,195,198 \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm index a2736cec719..1e2099a901b 100644 --- a/code/modules/reagents/chemistry/reagents/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -1,18 +1,3 @@ -/datum/reagent/serotrotium - name = "Serotrotium" - id = "serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - reagent_state = LIQUID - color = "#202040" // rgb: 20, 20, 40 - metabolization_rate = 0.25 * REAGENTS_METABOLISM - -/datum/reagent/serotrotium/on_mob_life(mob/living/M) - if(ishuman(M)) - if(prob(7)) - M.emote(pick("twitch","drool","moan","gasp")) - return ..() - - /datum/reagent/lithium name = "Lithium" id = "lithium" @@ -170,6 +155,7 @@ color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 addiction_chance = 50 + taste_description = "bitterness" /datum/reagent/crank/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -475,7 +461,7 @@ reagent_state = LIQUID color = "#644600" addiction_chance = 30 - taste_description = "puke... or worse" + taste_description = "the inside of a toilet... or worse" /datum/reagent/jenkem/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -491,6 +477,7 @@ description = "An illegal performance enhancing drug. Side effects might include chest pain, seizures, swelling, headache, fever... ... ..." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 + taste_description = "bitterness" /datum/reagent/aranesp/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -515,6 +502,7 @@ description = "A mild psychoactive chemical extracted from the cannabis plant." reagent_state = LIQUID color = "#0FBE0F" + taste_description = "man like, totally the best like, thing ever dude" /datum/reagent/thc/on_mob_life(mob/living/M) M.stuttering += rand(0,2) @@ -697,7 +685,7 @@ process_flags = SYNTHETIC overdose_threshold = 20 addiction_chance = 50 - taste_description = "silicone" + taste_description = "silicon" /datum/reagent/surge/on_mob_life(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 2479a82decf..46d2e1f4db3 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -25,6 +25,8 @@ reagent_state = SOLID nutriment_factor = 15 * REAGENTS_METABOLISM color = "#664330" // rgb: 102, 67, 48 + var/brute_heal = 1 + var/burn_heal = 0 /datum/reagent/consumable/nutriment/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -33,10 +35,8 @@ var/mob/living/carbon/human/H = M if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients if(prob(50)) - update_flags |= M.adjustBruteLoss(-1, FALSE) - if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature. - if(H.blood_volume < BLOOD_VOLUME_NORMAL) - H.blood_volume += 0.4 + update_flags |= M.adjustBruteLoss(-brute_heal, FALSE) + update_flags |= M.adjustFireLoss(-burn_heal, FALSE) return ..() | update_flags /datum/reagent/consumable/nutriment/on_new(list/supplied_data) @@ -66,36 +66,26 @@ id = "protein" description = "Various essential proteins and fats commonly found in animal flesh and blood." diet_flags = DIET_CARN | DIET_OMNI - taste_description = "meat" //TODO: Remove /datum/reagent/consumable/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores name = "Plant-matter" id = "plantmatter" description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce." diet_flags = DIET_HERB | DIET_OMNI - taste_description = "vegetables" //TODO: Remove -/datum/reagent/consumable/vitamin +/datum/reagent/consumable/nutriment/vitamin name = "Vitamin" id = "vitamin" description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." reagent_state = SOLID color = "#664330" // rgb: 102, 67, 48 - taste_description = "nutrition" + brute_heal = 1 + burn_heal = 1 -/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M) - var/update_flags = STATUS_UPDATE_NONE - if(prob(50)) - update_flags |= M.adjustBruteLoss(-1, FALSE) - update_flags |= M.adjustFireLoss(-1, FALSE) +/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/M) if(M.satiety < 600) M.satiety += 30 - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature. - if(H.blood_volume < BLOOD_VOLUME_NORMAL) - H.blood_volume += 0.5 - return ..() | update_flags + return ..() /datum/reagent/consumable/sugar name = "Sugar" diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 09ee8cb3948..01ccfa36dbb 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1,6 +1,7 @@ /datum/reagent/medicine name = "Medicine" id = "medicine" + taste_description = "bitterness" /datum/reagent/medicine/on_mob_life(mob/living/M) current_cycle++ @@ -290,11 +291,6 @@ addiction_chance = 5 taste_description = "health" -/datum/reagent/medicine/omnizine/godblood - name = "Godblood" - description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." - overdose_threshold = 150 - /datum/reagent/medicine/omnizine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE) @@ -728,7 +724,7 @@ id = "mannitol" description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling." color = "#D1D1F1" - taste_description = "neurogenisis" + taste_description = "sweetness" /datum/reagent/medicine/mannitol/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -786,6 +782,7 @@ description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." color = "#C8A5DC" can_synth = FALSE + taste_description = "an unstoppable force" /datum/reagent/medicine/stimulants/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -962,6 +959,12 @@ metabolization_rate = 0.1 taste_description = "faint hope" +/datum/reagent/medicine/omnizine_diluted/godblood + name = "Godblood" + id = "godblood" + description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." + overdose_threshold = 150 + /datum/reagent/medicine/omnizine_diluted/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE update_flags |= M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index d34e6537cb8..359af633383 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -614,6 +614,7 @@ description = "A potent alchemic ingredient." reagent_state = LIQUID color = "#092D09" + taste_description = "alchemy" /datum/reagent/woolbat name = "Wool of bat" @@ -621,6 +622,7 @@ description = "A potent alchemic ingredient." reagent_state = LIQUID color = "#080808" + taste_description = "alchemy" /datum/reagent/tonguedog name = "Tongue of dog" @@ -628,6 +630,7 @@ description = "A potent alchemic ingredient." reagent_state = LIQUID color = "#2D0909" + taste_description = "alchemy" /datum/reagent/triplepiss name = "Triplepiss" @@ -635,6 +638,7 @@ description = "Ewwwwwwwww." reagent_state = LIQUID color = "#857400" + taste_description = "alchemy" /datum/reagent/spraytan name = "Spray Tan" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index bd4079d69c6..a01c034a4ae 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -5,6 +5,7 @@ reagent_state = LIQUID color = "#FFAF00" process_flags = ORGANIC | SYNTHETIC + taste_description = "burning" var/temp_fire = 4000 var/temp_deviance = 1000 var/size_divisor = 40 @@ -49,6 +50,7 @@ reagent_state = LIQUID process_flags = ORGANIC | SYNTHETIC color = "#C86432" + taste_description = "burning" /datum/reagent/napalm/reaction_temperature(exposed_temperature, exposed_volume) if(exposed_temperature > T0C + 100) @@ -253,6 +255,7 @@ description = "Sends everything flying from the detonation point." reagent_state = LIQUID color = "#FFA500" + taste_description = "air and bitterness" /datum/reagent/sorium/reaction_turf(turf/T, volume) // oh no if(prob(75)) @@ -269,7 +272,7 @@ description = "Sucks everything into the detonation point." reagent_state = LIQUID color = "#800080" - taste_description = "the end of the world" + taste_description = "compressed bitterness" /datum/reagent/liquid_dark_matter/reaction_turf(turf/T, volume) //Oh gosh, why if(prob(75)) @@ -302,6 +305,7 @@ reagent_state = LIQUID color = "#FFFF00" penetrates_skin = TRUE + taste_description = "salt" /datum/reagent/smoke_powder name = "Smoke Powder" @@ -309,6 +313,7 @@ description = "Makes a large cloud of smoke that can carry reagents." reagent_state = LIQUID color = "#808080" + taste_description = "smoke" /datum/reagent/sonic_powder name = "Sonic Powder" @@ -317,6 +322,7 @@ reagent_state = LIQUID color = "#0000FF" penetrates_skin = TRUE + taste_description = "loud noises" /datum/reagent/cryostylane name = "Cryostylane" @@ -324,6 +330,7 @@ description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." color = "#B2B2FF" // rgb: 139, 166, 233 process_flags = ORGANIC | SYNTHETIC + taste_description = "bitterness" /datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube if(M.reagents.has_reagent("oxygen")) @@ -358,6 +365,7 @@ description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents." color = "#B20000" // rgb: 139, 166, 233 process_flags = ORGANIC | SYNTHETIC + taste_description = "bitterness" /datum/reagent/pyrosium/on_mob_life(mob/living/M) if(M.reagents.has_reagent("oxygen")) @@ -380,6 +388,7 @@ reagent_state = LIQUID color = "#A0A090" var/cooling_temperature = 3 // more effective than water + taste_description = "the inside of a fire extinguisher" /datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume) // Put out fire diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 43278d135e5..df67e3ae5da 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -5,6 +5,7 @@ reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 taste_mult = 1.2 + taste_description = "bitterness" /datum/reagent/toxin/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -17,6 +18,7 @@ description = "A toxic venom injected by spacefaring arachnids." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 + taste_description = "bitterness" /datum/reagent/spider_venom/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -81,6 +83,7 @@ reagent_state = LIQUID color = "#13BC5E" // rgb: 19, 188, 94 can_synth = FALSE + taste_description = "slime" /datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume) if(method != TOUCH) @@ -95,7 +98,6 @@ color = "#484848" // rgb: 72, 72, 72 metabolization_rate = 0.2 penetrates_skin = TRUE - taste_description = "metal" taste_mult = 0 // elemental mercury is tasteless /datum/reagent/mercury/on_mob_life(mob/living/M) @@ -127,7 +129,7 @@ color = "#6A6054" penetrates_skin = TRUE process_flags = ORGANIC | SYNTHETIC - taste_description = "spicy freshness" + taste_description = "acid" /datum/reagent/fluorine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -142,6 +144,7 @@ reagent_state = SOLID color = "#C7C7C7" // rgb: 199,199,199 penetrates_skin = TRUE + taste_description = "the colour blue and regret" /datum/reagent/radium/on_mob_life(mob/living/M) if(M.radiation < 80) @@ -160,6 +163,7 @@ color = "#04DF27" metabolization_rate = 0.3 taste_mult = 0.9 + taste_description = "slime" /datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume) if(!..()) @@ -186,6 +190,7 @@ description = "Just the regular, boring sort of mutagenic compound. Works in a completely predictable manner." reagent_state = LIQUID color = "#7DFF00" + taste_description = "slime" /datum/reagent/stable_mutagen/on_mob_life(mob/living/M) if(!ishuman(M) || !M.dna) @@ -251,6 +256,7 @@ reagent_state = SOLID color = "#B8B8C0" // rgb: 184, 184, 192 taste_mult = 0 + taste_description = "the inside of a reactor" /datum/reagent/uranium/on_mob_life(mob/living/M) M.apply_effect(2, IRRADIATE, negate_armor = 1) @@ -268,6 +274,7 @@ reagent_state = LIQUID color = "#52685D" metabolization_rate = 0.2 + taste_description = "sweetness" /datum/reagent/lexorin/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -332,6 +339,7 @@ description = "A deadly neurotoxin produced by the dreaded spess carp." reagent_state = LIQUID color = "#003333" // rgb: 0, 51, 51 + taste_description = "fish" /datum/reagent/carpotoxin/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -345,6 +353,7 @@ reagent_state = LIQUID color = "#6E2828" data = 13 + taste_description = "bitterness" /datum/reagent/staminatoxin/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -358,6 +367,7 @@ id = "spore" description = "A natural toxin produced by blob spores that inhibits vision when ingested." color = "#9ACD32" + taste_description = "bitterness" /datum/reagent/spores/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -376,6 +386,7 @@ drink_name = "Beer glass" drink_desc = "A freezing pint of beer" taste_description = "beer" + taste_description = "piss water" /datum/reagent/beer2/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -487,6 +498,7 @@ reagent_state = LIQUID color = "#DED6D0" penetrates_skin = TRUE + taste_description = "bitterness" /datum/reagent/formaldehyde/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -504,6 +516,7 @@ metabolization_rate = 0.2 overdose_threshold = 40 can_synth = FALSE + taste_mult = 0 /datum/reagent/venom/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -529,6 +542,7 @@ reagent_state = LIQUID color = "#60A584" metabolization_rate = 1 + taste_mult = 0 /datum/reagent/neurotoxin2/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -593,6 +607,7 @@ color = "#B0B0B0" metabolization_rate = 0.3 penetrates_skin = TRUE + taste_description = "prickliness" /datum/reagent/itching_powder/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_STAT @@ -806,6 +821,7 @@ reagent_state = LIQUID color = "#6BA688" metabolization_rate = 0.1 + taste_mult = 0 /datum/reagent/sulfonal/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -871,6 +887,7 @@ color = "#C2D8CD" metabolization_rate = 0.05 can_synth = FALSE + taste_mult = 0 /datum/reagent/coniine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -886,6 +903,7 @@ color = "#191919" metabolization_rate = 0.1 penetrates_skin = TRUE + taste_mult = 0 /datum/reagent/curare/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -919,6 +937,7 @@ reagent_state = LIQUID color = "#C8C8C8" //RGB: 200, 200, 200 metabolization_rate = 0.2 * REAGENTS_METABOLISM + taste_mult = 0 /datum/reagent/heparin/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -993,6 +1012,7 @@ reagent_state = LIQUID color = "#d3cf50" var/lethality = 0 //Glyphosate is non-toxic to people + taste_description = "bitterness" /datum/reagent/glyphosate/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1045,6 +1065,7 @@ id = "pestkiller" description = "A harmful toxic mixture to kill pests. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 + taste_description = "bitterness" /datum/reagent/pestkiller/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1125,6 +1146,7 @@ description = "A filthy, carcinogenic sludge produced by the Slurrypod plant." reagent_state = LIQUID color = "#00C81E" + taste_description = "slime" /datum/reagent/toxic_slurry/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1143,6 +1165,7 @@ description = "This is probably not good for you." reagent_state = LIQUID color = "#00FD00" + taste_description = "slime" /datum/reagent/glowing_slurry/reaction_mob(mob/living/M, method=TOUCH, volume) //same as mutagen if(!..()) diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 64156a7cadd..8d70ddc2430 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -246,7 +246,7 @@ description = "Filthy water scoured from a nasty toilet bowl. Absolutely disgusting." reagent_state = LIQUID color = "#757547" - taste_description = "puke" + taste_description = "the inside of a toilet... or worse" /datum/reagent/fishwater/toiletwater/reaction_mob(mob/living/M, method=TOUCH, volume) //For shennanigans return @@ -391,7 +391,7 @@ process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL. metabolization_rate = 1 can_synth = FALSE - taste_description = "admin abuse" + taste_description = "burning" /datum/reagent/hellwater/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE diff --git a/code/modules/ruins/lavalandruin_code/fountain_hall.dm b/code/modules/ruins/lavalandruin_code/fountain_hall.dm index 917ea4e4bd0..3de758ac0c9 100644 --- a/code/modules/ruins/lavalandruin_code/fountain_hall.dm +++ b/code/modules/ruins/lavalandruin_code/fountain_hall.dm @@ -38,7 +38,7 @@ return last_process = world.time to_chat(user, "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.") - user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 20) + user.reagents.add_reagent("godblood", 20) update_icon() addtimer(CALLBACK(src, .proc/update_icon), time_between_uses) diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index 4c808c4d30f..102b8895bf6 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -100,7 +100,6 @@ icon = 'icons/vehicles/CargoTrain.dmi' icon_state = "ambulance" anchored = FALSE - throw_pressure_limit = INFINITY //Throwing an ambulance trolley can kill the process scheduler. /obj/structure/bed/amb_trolley/examine(mob/user) . = ..() diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index 3359e7c6232..be752e1205d 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -155,7 +155,7 @@ var/list/chatResources = list( //Uh oh this fucker has a history of playing on a banned account!! if (found.len > 0) - //TODO: add a new evasion ban for the CURRENT client details, using the matched row details + AddBan(owner.ckey, owner.computer_id, "Ban evasion on account: [found["ckey"]]", "System", 0, 0, owner.address) message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") log_admin("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") diff --git a/html/changelogs/AutoChangeLog-pr-12240.yml b/html/changelogs/AutoChangeLog-pr-12240.yml new file mode 100644 index 00000000000..eb3240dcf3a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12240.yml @@ -0,0 +1,7 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes Megafauna spawning near the base" + - bugfix: "Fixes lava rivers not forming" + - tweak: "Upped the labor mineral spawn rate" + - rscdel: "Removed the ability to find random code-locked crates when mining" diff --git a/html/changelogs/AutoChangeLog-pr-12241.yml b/html/changelogs/AutoChangeLog-pr-12241.yml new file mode 100644 index 00000000000..ac25b462a95 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12241.yml @@ -0,0 +1,15 @@ +author: "SteelSlayer" +delete-after: True +changes: + - tweak: "The \"Show Player Panel\" verb is now right click only" + - tweak: "The \"C.M.A. - Admin\" verb is now right click only" + - tweak: "The \"C.M.A. - Self\" verb is now right click only" + - tweak: "The \"Check Contents\" verb is now right click only" + - tweak: "The \"Freeze\" verb is now right click only" + - tweak: "The \"Freeze Mech\" verb is now right click only" + - tweak: "The \"Jump to Turf\" verb is now right click only" + - tweak: "The \"Update Mob Sprite\" verb is now right click only" + - tweak: "The \"List SSDs\" and \"List AFKs\" verbs have been combined into one verb named \"List SSDs and AFKs\"" + - tweak: "The \"Resolve All Open Mentor Tickets\" verb has been moved inside the mentor ticket interface window" + - tweak: "The \"Resolve All Open Admin Tickets\" verb has been moved inside the admin ticket interface window" + - tweak: "Increases the width of the new \"List SSDs and AFKs\" window a bit" diff --git a/html/changelogs/AutoChangeLog-pr-12242.yml b/html/changelogs/AutoChangeLog-pr-12242.yml new file mode 100644 index 00000000000..0222b6b6ff8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12242.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscadd: "Watcher Icewing blasts will briefly freeze you" diff --git a/html/changelogs/AutoChangeLog-pr-12248.yml b/html/changelogs/AutoChangeLog-pr-12248.yml new file mode 100644 index 00000000000..11705330985 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12248.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Tweaks a few reagents tastes" + - bugfix: "fixes being able to taste metaphorical salt" + - tweak: "nutriment no longer restores blood" diff --git a/html/changelogs/AutoChangeLog-pr-12249.yml b/html/changelogs/AutoChangeLog-pr-12249.yml new file mode 100644 index 00000000000..664bac8af85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12249.yml @@ -0,0 +1,4 @@ +author: "SteelSlayer" +delete-after: True +changes: + - bugfix: "The gravitational catapult no longer pushes ghosts when used" diff --git a/html/changelogs/AutoChangeLog-pr-12250.yml b/html/changelogs/AutoChangeLog-pr-12250.yml new file mode 100644 index 00000000000..d3c7fd77e68 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12250.yml @@ -0,0 +1,21 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscdel: "Nuke ops can no longer advanced syndie magboots" + - bugfix: "Fixes an inconsistency with chameleon kit pricing--it was only 2 TC, making the no slip syndicate shoes worthless; price is now 4 TC" + - tweak: "operatives pay 2 TC more for the no slip syndicate shoes and the chameleon kit" + - rscdel: "Wizard hardsuits no longer come with magboots" + - tweak: "Syndie magboots are nuke ops only" + - tweak: "Can purchase no slip shoes from the uplink instead of a full chameleon kit" + - tweak: "Operatives can purchase no slip syndicate shoes" + - tweak: "No slip shoes can protect against atmos pushing" + - rscdel: "removed most round-start magboots with the exception of EVA, atmostechs, CE, and engineering hardsuit dispensers" + - bugfix: "Fixes carp not being a threat to the station due to killing themselves" + - bugfix: "Fixes being able to exploit simple mob AI so it kills itself in an atmos death blender" + - tweak: "vent and scrubbers work far more efficiently and quickly now" + - bugfix: "Fixes wideband on scrubbers constantly resetting itself" + - tweak: "Portable scrubbers far more effective" + - tweak: "Flamethrowers far more effective" + - tweak: "Nanofrost twice as expensive" + - tweak: "regular syndicate borgs don't have magpulse by default" + - tweak: "Atmos pushing completely refactored; it'll still push you frequently and push items around frequently, but it won't throw you. Depending on how many dense objects or turfs are around you to \"grab onto\" will determine how effective atmos is at pushing you around. Does not alter the speed at which LINDA runs." diff --git a/html/changelogs/AutoChangeLog-pr-12255.yml b/html/changelogs/AutoChangeLog-pr-12255.yml new file mode 100644 index 00000000000..a320bb2b102 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12255.yml @@ -0,0 +1,7 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Plasma glass shards do less damage when attacking, but slightly more when stepping on them" + - tweak: "Spears made out of plasma glass do slightly more damage" + - tweak: "Light replacer can now be used in-hand to attempt to reload empty lighting fixtures around you in addition to showing how many lights it has" + - tweak: "Light replacer needs less shards to increment bulbs" diff --git a/html/changelogs/AutoChangeLog-pr-12256.yml b/html/changelogs/AutoChangeLog-pr-12256.yml new file mode 100644 index 00000000000..162b69bd369 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12256.yml @@ -0,0 +1,4 @@ +author: "xProlithium" +delete-after: True +changes: + - tweak: "Altered CA to TP for prayers and adminpms." diff --git a/html/changelogs/AutoChangeLog-pr-12258.yml b/html/changelogs/AutoChangeLog-pr-12258.yml new file mode 100644 index 00000000000..742827e0df6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12258.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - tweak: "Minor ban evasion update" diff --git a/html/changelogs/AutoChangeLog-pr-12259.yml b/html/changelogs/AutoChangeLog-pr-12259.yml new file mode 100644 index 00000000000..3c0eded2ca9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12259.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - rscdel: "Autonote for manual bans removed" diff --git a/html/changelogs/AutoChangeLog-pr-12261.yml b/html/changelogs/AutoChangeLog-pr-12261.yml new file mode 100644 index 00000000000..3fe8b5ab303 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12261.yml @@ -0,0 +1,4 @@ +author: "Terilia" +delete-after: True +changes: + - bugfix: "stat_attack from unconscious to dead" diff --git a/html/changelogs/AutoChangeLog-pr-12262.yml b/html/changelogs/AutoChangeLog-pr-12262.yml new file mode 100644 index 00000000000..d3b197a72ea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12262.yml @@ -0,0 +1,4 @@ +author: "Shadow-Quill" +delete-after: True +changes: + - bugfix: "Plasma cutters will no longer eat plasma if you try recharging a full gun." diff --git a/html/changelogs/AutoChangeLog-pr-12263.yml b/html/changelogs/AutoChangeLog-pr-12263.yml new file mode 100644 index 00000000000..c581f3ae316 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12263.yml @@ -0,0 +1,4 @@ +author: "variableundefined" +delete-after: True +changes: + - bugfix: "Refactored wooden chair so placing them won't make you see normal metallic chair anymore." diff --git a/html/changelogs/AutoChangeLog-pr-12265.yml b/html/changelogs/AutoChangeLog-pr-12265.yml new file mode 100644 index 00000000000..1abb27cad08 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12265.yml @@ -0,0 +1,4 @@ +author: "TDSSS" +delete-after: True +changes: + - bugfix: "healing fountain lavaland ruin now correctly heals" diff --git a/html/changelogs/AutoChangeLog-pr-12276.yml b/html/changelogs/AutoChangeLog-pr-12276.yml new file mode 100644 index 00000000000..731eb403af1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12276.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "fixed an issue with keyboard input" diff --git a/icons/effects/freeze.dmi b/icons/effects/freeze.dmi new file mode 100644 index 00000000000..04616190645 Binary files /dev/null and b/icons/effects/freeze.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 10eef3b0337..7d0961fc449 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 926e04b28bf..5850e4d8d8c 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index cb6a2c6bd64..2b29cad5b0c 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 463e135d35f..35f0fb7349d 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/paradise.dme b/paradise.dme index cda0cebff3e..18012618db5 100644 --- a/paradise.dme +++ b/paradise.dme @@ -89,6 +89,7 @@ #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" +#include "code\__HELPERS\typelists.dm" #include "code\__HELPERS\unique_ids.dm" #include "code\__HELPERS\unsorted.dm" #include "code\__HELPERS\sorts\__main.dm" @@ -399,6 +400,7 @@ #include "code\datums\spells\wizard.dm" #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\debuffs.dm" +#include "code\datums\status_effects\gas.dm" #include "code\datums\status_effects\neutral.dm" #include "code\datums\status_effects\status_effect.dm" #include "code\datums\vr\level.dm"