diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 864981494ac..5a880549b8a 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -2017,7 +2017,7 @@ /obj/machinery/vending/sustenance{ desc = "A vending machine normally reserved for work camps."; name = "\improper sustenance vendor"; - product_slogans = "Enjoy your meal.;Enough calories to support any worker." + slogan_list = list("Enjoy your meal.","Enough calories to support any worker.") }, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm index 62a22425926..43aa3cd98c7 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -832,6 +832,10 @@ /obj/item/shard, /turf/space, /area/space/nearstation) +"Hv" = ( +/obj/item/gps/ruin, +/turf/simulated/wall/r_wall, +/area/ruin/unpowered) (1,1,1) = {" aa @@ -973,7 +977,7 @@ aa at at aF -at +Hv aU ay ay diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index 22d4c0798aa..17d49d666bc 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -269,6 +269,10 @@ icon_state = "freezerfloor" }, /area/ruin/powered) +"Y" = ( +/obj/item/gps/ruin, +/turf/simulated/wall/r_wall, +/area/ruin/powered) (1,1,1) = {" a @@ -960,7 +964,7 @@ b f f p -f +Y f f j diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index 2a5c0eae533..b4e36942d6a 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm @@ -240,6 +240,13 @@ /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, /area/ruin/powered) +"U" = ( +/obj/item/gps/ruin, +/turf/simulated/shuttle/wall{ + tag = "icon-swall12"; + icon_state = "swall12" + }, +/area/ruin/powered) (1,1,1) = {" a @@ -313,7 +320,7 @@ a c g l -q +U r u t diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 3e98b178dab..a4baee09320 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -5011,6 +5011,20 @@ name = "grass" }, /area/centcom/control) +"nc" = ( +/obj/machinery/door/airlock/centcom{ + name = "Gamma Armory"; + opacity = 1; + req_access_txt = "114" + }, +/obj/machinery/door/poddoor/impassable{ + id_tag = "CCGAMMA"; + name = "Gamma Security" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/centcom/gamma) "nd" = ( /obj/structure/flora/ausbushes/lavendergrass, /turf/unsimulated/floor{ @@ -5386,7 +5400,7 @@ }, /area/syndicate_mothership) "nQ" = ( -/obj/machinery/door/poddoor{ +/obj/machinery/door/poddoor/impassable{ id_tag = "GRAVPULTS"; name = "Gravity Catapults" }, @@ -5396,7 +5410,7 @@ }, /area/centcom/specops) "nR" = ( -/obj/machinery/door/poddoor{ +/obj/machinery/door/poddoor/impassable{ id_tag = "GRAVPULTS"; name = "Gravity Catapults" }, @@ -5413,7 +5427,7 @@ }, /area/syndicate_mothership) "nT" = ( -/obj/machinery/door/poddoor{ +/obj/machinery/door/poddoor/impassable{ id_tag = "ASSAULT"; name = "Assault Armor" }, @@ -5859,7 +5873,7 @@ }, /area/centcom/gamma) "oR" = ( -/obj/machinery/door/poddoor{ +/obj/machinery/door/poddoor/impassable{ id_tag = "SPECOPS"; name = "Ready Room" }, @@ -5984,7 +5998,7 @@ opacity = 1; req_access_txt = "114" }, -/obj/machinery/door/poddoor{ +/obj/machinery/door/poddoor/impassable{ id_tag = "specopsoffice"; name = "Super Privacy Shutters" }, @@ -6123,7 +6137,7 @@ /turf/simulated/floor/mech_bay_recharge_floor, /area/shuttle/gamma/space) "pv" = ( -/obj/machinery/door/poddoor{ +/obj/machinery/door/poddoor/impassable{ id_tag = "CCTELE"; name = "Specops Teleporter" }, @@ -6370,7 +6384,7 @@ /area/centcom/specops) "pX" = ( /obj/machinery/door_control{ - desc = "A remote control switch to block view of the singularity."; + desc = "A remote control switch to connect the ready room to the rest of Centcom."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; @@ -29647,7 +29661,7 @@ fm fm md md -oO +nc fm pv sX diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 09453cfe542..6cbb87b6f80 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -761,7 +761,7 @@ /area/derelict/bridge) "bK" = ( /obj/machinery/vending/cigarette/free{ - product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism." + slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.") }, /turf/simulated/floor/plasteel{ dir = 9; @@ -1441,7 +1441,7 @@ pixel_y = 32 }, /obj/machinery/vending/cigarette/free{ - product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism." + slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.") }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -4163,7 +4163,7 @@ name = "suspicious button" }, /obj/machinery/vending/cigarette/free{ - product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism." + slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.") }, /turf/simulated/floor/wood{ broken = 1; @@ -5186,7 +5186,7 @@ "kW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/cigarette/free{ - product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism." + slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.") }, /turf/simulated/floor/plasteel{ dir = 5; @@ -6363,7 +6363,7 @@ icon_state = "sink"; pixel_x = 12 }, -/turf/simulated/floor/mineral/plasma, +/turf/simulated/floor/mineral/silver, /area/syndicate_depot/core) "of" = ( /obj/structure/closet/secure_closet/syndicate/depot, @@ -6448,26 +6448,9 @@ icon_state = "wood" }, /area/derelict/crew_quarters) -"oo" = ( -/obj/effect/spawner/random_spawners/syndicate/layout/door/secret, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/syndicate_depot/core) "op" = ( /turf/simulated/floor/mineral/silver, /area/syndicate_depot/core) -"oq" = ( -/obj/machinery/door/airlock/plasma{ - welded = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/syndicate_depot/core) -"or" = ( -/turf/simulated/floor/mineral/plasma, -/area/syndicate_depot/core) "os" = ( /obj/structure/table, /obj/effect/spawner/random_spawners/syndicate/loot/stetchkin, @@ -6543,7 +6526,7 @@ /area/syndicate_depot/core) "oB" = ( /obj/effect/spawner/random_spawners/syndicate/mob, -/turf/simulated/floor/mineral/plasma, +/turf/simulated/floor/mineral/silver, /area/syndicate_depot/core) "oC" = ( /obj/effect/landmark{ @@ -6706,27 +6689,14 @@ icon_state = "dark" }, /area/syndicate_depot/core) -"oZ" = ( -/obj/structure/mirror{ - pixel_x = -32 - }, -/turf/simulated/floor/mineral/plasma, -/area/syndicate_depot/core) "pa" = ( /obj/structure/toilet{ dir = 8 }, /turf/simulated/floor/mineral/silver, /area/syndicate_depot/core) -"pb" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/syndicate_depot/core) "pc" = ( /obj/machinery/light, -/obj/effect/spawner/random_spawners/syndicate/loot/level3, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -9114,7 +9084,7 @@ }) "tY" = ( /obj/machinery/vending/cigarette/free{ - product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism." + slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.") }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -10678,7 +10648,7 @@ /area/derelict/arrival) "xe" = ( /obj/machinery/vending/cigarette/free{ - product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism." + slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.") }, /turf/simulated/floor/plasteel{ dir = 2; @@ -11582,10 +11552,10 @@ }, /area/space/nearstation) "zR" = ( -/obj/machinery/portable_atmospherics/canister/toxins, /obj/machinery/light/small{ dir = 1 }, +/obj/effect/decal/cleanable/blood, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -57707,7 +57677,7 @@ of ot mA mA -pb +nX pi mA py @@ -59251,7 +59221,7 @@ oE oR oE oz -pb +mA mA mA mm @@ -61558,7 +61528,7 @@ mm mB mm mm -oo +mm mm lV mA @@ -61816,7 +61786,7 @@ mA zP mm zR -oo +mm oL ns mA @@ -62072,7 +62042,7 @@ mA mA mt mm -oq +mm mm mm mm @@ -62332,7 +62302,7 @@ mm op oB oM -oZ +oM ob mA pu @@ -62586,7 +62556,7 @@ zP mA mA ob -or +op nJ oe pa diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 2b9e2c56b4d..8021fa4452d 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -48,7 +48,7 @@ //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role -var/global/list/special_roles = list( +GLOBAL_LIST_INIT(special_roles, list( ROLE_ABDUCTOR = /datum/game_mode/abduction, // Abductor ROLE_BLOB = /datum/game_mode/blob, // Blob ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling @@ -72,10 +72,10 @@ var/global/list/special_roles = list( ROLE_VAMPIRE = /datum/game_mode/vampire, // Vampire ROLE_RAIDER = /datum/game_mode/heist, // Vox raider ROLE_ALIEN, // Xenomorph - ROLE_WIZARD = /datum/game_mode/wizard, // Wizard + ROLE_WIZARD = /datum/game_mode/wizard // Wizard // UNUSED/BROKEN ANTAGS // ROLE_HOG_GOD = /datum/game_mode/hand_of_god, // ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, // ROLE_MONKEY = /datum/game_mode/monkey, Sooner or later these are going to get ported -// ROLE_GANG = /datum/game_mode/gang, -) +// ROLE_GANG = /datum/game_mode/gang +)) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index d702c073b86..29e0f9b52b9 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -19,10 +19,10 @@ GLOBAL_VAR(command_name) /proc/command_name() return GLOB.using_map.dock_name -var/religion_name = null +GLOBAL_VAR(religion_name) /proc/religion_name() - if(religion_name) - return religion_name + if(GLOB.religion_name) + return GLOB.religion_name var/name = "" diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 20620d60800..abd878ff936 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -64,3 +64,5 @@ GLOBAL_LIST_INIT(safe_chem_list, list("antihol", "charcoal", "epinephrine", "ins "omnizine", "stimulants", "synaptizine", "potass_iodide", "oculine", "mannitol", "styptic_powder", "spaceacillin", "salglu_solution", "sal_acid", "cryoxadone", "blood", "synthflesh", "hydrocodone", "mitocholide", "rezadone")) + +GLOBAL_LIST_INIT(safe_chem_applicator_list, list("silver_sulfadiazine", "styptic_powder", "synthflesh")) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 6bfd72413de..20e50bb3054 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -261,12 +261,12 @@ if(incapacitated()) return var/face_dir = get_cardinal_dir(src, A) - if(forced_look == face_dir) + if(!face_dir || forced_look == face_dir || A == src) forced_look = null - to_chat(src, "You are no longer facing any direction.") + to_chat(src, "Cancelled direction lock.") return forced_look = face_dir - to_chat(src, "You are now facing [dir2text(forced_look)].") + to_chat(src, "You are now facing [dir2text(forced_look)]. To cancel this, shift-middleclick yourself.") /* Middle shift-control-click @@ -274,12 +274,12 @@ */ /mob/proc/MiddleShiftControlClickOn(atom/A) var/face_uid = A.UID() - if(forced_look == face_uid) + if(forced_look == face_uid || A == src) forced_look = null - to_chat(src, "You are no longer facing [A].") + to_chat(src, "Cancelled direction lock.") return forced_look = face_uid - to_chat(src, "You are now facing [A].") + to_chat(src, "You are now facing [A]. To cancel this, shift-middleclick yourself.") // In case of use break glass /* diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d2a91da4020..e27002cf118 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -58,7 +58,7 @@ else return 1 var/obj/item/organ/external/O = M.get_organ(user.zone_selected) - if((is_sharp(src) || (isscrewdriver(src) && O.is_robotic())) && user.a_intent == INTENT_HELP) + if((is_sharp(src) || (isscrewdriver(src) && O?.is_robotic())) && user.a_intent == INTENT_HELP) if(!attempt_initiate_surgery(src, M, user)) return FALSE else diff --git a/code/controllers/master.dm b/code/controllers/master.dm index f64e566e097..a6026823ec9 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -146,7 +146,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again." FireHim = TRUE if(3) - msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined." + msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined. The following implications are now in effect: [BadBoy.offline_implications]" BadBoy.flags |= SS_NO_FIRE if(msg) to_chat(GLOB.admins, "[msg]") diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index f257f2b4895..4a125003389 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -35,6 +35,8 @@ var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out! + var/offline_implications = "None" // What are the implications of this SS being offlined? + //Do not override ///datum/controller/subsystem/New() diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm index 40063b00a87..119d82113d7 100644 --- a/code/controllers/subsystem/acid.dm +++ b/code/controllers/subsystem/acid.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(acid) priority = FIRE_PRIORITY_ACID flags = SS_NO_INIT|SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Objects will no longer react to acid. No immediate action is needed." var/list/currentrun = list() var/list/processing = list() diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm index 6ab1d67a816..9122e6a16c6 100644 --- a/code/controllers/subsystem/afk.dm +++ b/code/controllers/subsystem/afk.dm @@ -5,6 +5,7 @@ SUBSYSTEM_DEF(afk) name = "AFK Watcher" wait = 300 flags = SS_BACKGROUND + offline_implications = "Players will no longer be marked as AFK. No immediate action is needed." var/list/afk_players = list() // Associative list. ckey as key and AFK state as value @@ -17,27 +18,27 @@ SUBSYSTEM_DEF(afk) for(var/mob/living/carbon/human/H in GLOB.living_mob_list) if(!H.ckey) // Useless non ckey creatures continue - - var/turf/T + + var/turf/T // Only players and players with the AFK watch enabled // No dead, unconcious, restrained, people without jobs, people on other Z levels than the station or antags if(!H.client || !H.client.prefs.afk_watch || !H.mind || \ H.stat || H.restrained() || !H.job || H.mind.special_role || \ !is_station_level((T = get_turf(H)).z)) // Assign the turf as last. Small optimization - if(afk_players[H.ckey]) + if(afk_players[H.ckey]) toRemove += H.ckey continue - + var/mins_afk = round(H.client.inactivity / 600) if(mins_afk < config.warn_afk_minimum) if(afk_players[H.ckey]) toRemove += H.ckey continue - + if(!afk_players[H.ckey]) afk_players[H.ckey] = AFK_WARNED warn(H, "You are AFK for [mins_afk] minutes. You will be cryod after [config.auto_cryo_afk] total minutes and fully despawned after [config.auto_despawn_afk] total minutes. Please move or click in game if you want to avoid being despawned.") - else + else var/area/A = T.loc // Turfs loc is the area if(afk_players[H.ckey] == AFK_WARNED) if(mins_afk >= config.auto_cryo_afk && A.can_get_auto_cryod) @@ -50,14 +51,14 @@ SUBSYSTEM_DEF(afk) afk_players[H.ckey] = AFK_CRYOD msg_admins(H, mins_afk, T, "put into cryostorage") warn(H, "You are AFK for [mins_afk] minutes and have been moved to cryostorage. After being AFK for [config.auto_despawn_afk] total minutes you will be fully despawned. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.") - + else if(mins_afk >= config.auto_despawn_afk) var/obj/machinery/cryopod/P = H.loc msg_admins(H, mins_afk, T, "forcefully despawned") warn(H, "You are have been despawned after being AFK for [mins_afk] minutes.") toRemove += H.ckey P.despawn_occupant() - + removeFromWatchList(toRemove) /datum/controller/subsystem/afk/proc/warn(mob/living/carbon/human/H, text) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 6f2a451ef76..80ce66d13ec 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -14,6 +14,7 @@ SUBSYSTEM_DEF(air) wait = 5 flags = SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Turfs will no longer process atmos, and all atmospheric machines (including cryotubes) will no longer function. Shuttle call recommended." var/cost_turfs = 0 var/cost_groups = 0 var/cost_highpressure = 0 diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm index bac32a449de..289adf6de40 100644 --- a/code/controllers/subsystem/alarm.dm +++ b/code/controllers/subsystem/alarm.dm @@ -1,6 +1,7 @@ SUBSYSTEM_DEF(alarms) name = "Alarms" init_order = INIT_ORDER_ALARMS // 2 + offline_implications = "Alarms (Power, camera, fire, etc) will no longer be checked. No immediate action is needed." var/datum/alarm_handler/atmosphere/atmosphere_alarm = new() var/datum/alarm_handler/burglar/burglar_alarm = new() var/datum/alarm_handler/camera/camera_alarm = new() diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index dbe38634e6a..4eb468a0952 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(chat) wait = 1 priority = FIRE_PRIORITY_CHAT init_order = INIT_ORDER_CHAT + offline_implications = "Chat messages will no longer be cleanly queued. No immediate action is needed." var/list/payload = list() diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 3612faa4a7e..ad77904bac7 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -2,6 +2,7 @@ SUBSYSTEM_DEF(events) name = "Events" init_order = INIT_ORDER_EVENTS runlevels = RUNLEVEL_GAME + offline_implications = "Random events will no longer happen. No immediate action is needed." // Report events at the end of the rouund var/report_at_round_end = 0 diff --git a/code/controllers/subsystem/fires.dm b/code/controllers/subsystem/fires.dm index aafc5ed48d5..dc419fffeb5 100644 --- a/code/controllers/subsystem/fires.dm +++ b/code/controllers/subsystem/fires.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(fires) priority = FIRE_PRIOTITY_BURNING flags = SS_NO_INIT|SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Objects will no longer react to fires. No immediate action is needed." var/list/currentrun = list() var/list/processing = list() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 4bc3965e6cf..cbf17d05fbf 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -5,6 +5,7 @@ SUBSYSTEM_DEF(garbage) flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = INIT_ORDER_GARBAGE + offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended." var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 531b6af2e78..289505a153c 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(icon_smooth) wait = 1 priority = FIRE_PRIOTITY_SMOOTHING flags = SS_TICKER + offline_implications = "Objects will no longer smooth together properly. No immediate action is needed." var/list/smooth_queue = list() diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index 42df941e10f..d61b90f1239 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(idlenpcpool) priority = FIRE_PRIORITY_IDLE_NPC wait = 60 runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Idle simple animals will no longer process. Shuttle call recommended." var/list/currentrun = list() var/static/list/idle_mobs_by_zlevel[][] @@ -39,4 +40,4 @@ SUBSYSTEM_DEF(idlenpcpool) if(SA.stat != DEAD) SA.consider_wakeup() if(MC_TICK_CHECK) - return + return diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index f379deec72b..9dd6fce1554 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -5,6 +5,7 @@ SUBSYSTEM_DEF(input) flags = SS_TICKER priority = FIRE_PRIORITY_INPUT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + offline_implications = "Player input will no longer be recognised. Immediate server restart recommended." var/list/macro_sets var/list/movement_keys @@ -24,7 +25,7 @@ SUBSYSTEM_DEF(input) // This is for when macro sets are eventualy datumized /datum/controller/subsystem/input/proc/setup_default_macro_sets() var/list/static/default_macro_sets - + if(default_macro_sets) macro_sets = default_macro_sets return diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 6f7894ca428..1d6fd410f9b 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(jobs) init_order = INIT_ORDER_JOBS // 12 wait = 3000 // 5 minutes (Deciseconds) runlevels = RUNLEVEL_GAME + offline_implications = "Job playtime hours will no longer be logged. No immediate action is needed." //List of all jobs var/list/occupations = list() diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 7441d855f22..3fc92a3346a 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(lighting) wait = 2 init_order = INIT_ORDER_LIGHTING flags = SS_TICKER + offline_implications = "Lighting will no longer update. Shuttle call recommended." /datum/controller/subsystem/lighting/stat_entry() ..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]") diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index 9a73c1dbabb..7e78e2b9df1 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(machines) name = "Machines" init_order = INIT_ORDER_MACHINES flags = SS_KEEP_TIMING + offline_implications = "Machinery will no longer process. Shuttle call recommended." var/list/processing = list() var/list/currentrun = list() diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index c21b8f0760a..8345822ca80 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(mobs) priority = FIRE_PRIORITY_MOBS flags = SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Mobs will no longer process. Immediate server restart recommended." var/list/currentrun = list() var/static/list/clients_by_zlevel[][] diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm index a634f091013..9094bf9fe2b 100644 --- a/code/controllers/subsystem/nano_mob_hunter.dm +++ b/code/controllers/subsystem/nano_mob_hunter.dm @@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mob_hunt) name = "Nano-Mob Hunter GO Server" init_order = INIT_ORDER_NANOMOB priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact. + offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed." var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this var/list/normal_spawns = list() var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm index c8cbbc62013..ef1b6ee03fe 100644 --- a/code/controllers/subsystem/nanoui.dm +++ b/code/controllers/subsystem/nanoui.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(nanoui) flags = SS_NO_INIT priority = FIRE_PRIORITY_NANOUI runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + offline_implications = "All NanoUIs will no longer process. Shuttle call recommended." var/list/currentrun = list() var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key. diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index e13f49fd1c2..deffcb6bddf 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(nightshift) priority = FIRE_PRIORITY_NIGHTSHIFT wait = 600 flags = SS_NO_TICK_CHECK + offline_implications = "The game will no longer shift between day and night lighting. No immediate action is needed." var/nightshift_active = FALSE var/nightshift_start_time = 702000 //7:30 PM, station time diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 5eaca5d19c4..79541c199a4 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(npcpool) flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND priority = FIRE_PRIORITY_NPC runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Simple animals will no longer process. Shuttle call recommended." var/list/currentrun = list() diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index c35f1adee65..95b9e925b5d 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(overlays) wait = 1 priority = FIRE_PRIORITY_OVERLAYS init_order = INIT_ORDER_OVERLAY + offline_implications = "Overlays may look strange. No immediate action is needed." var/list/queue var/list/stats diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 039b6d2b008..9135f62b03f 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(parallax) flags = SS_POST_FIRE_TIMING | SS_BACKGROUND priority = FIRE_PRIORITY_PARALLAX runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + offline_implications = "Space parallax will no longer move around. No immediate action is needed." var/list/currentrun var/planet_x_offset = 128 var/planet_y_offset = 128 diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 14a9b507977..247d71d05b8 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(shuttle) init_order = INIT_ORDER_SHUTTLE flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME + offline_implications = "Shuttles will no longer function and cargo will not generate points. Immediate server restart recommended." var/list/mobile = list() var/list/stationary = list() var/list/transit = list() diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm index fcc62a2fa50..d9c46f9c9d7 100644 --- a/code/controllers/subsystem/spacedrift.dm +++ b/code/controllers/subsystem/spacedrift.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(spacedrift) wait = 5 flags = SS_NO_INIT|SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Mobs will no longer respect a lack of gravity. No immediate action is needed." var/list/currentrun = list() var/list/processing = list() diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm index b9843c57b68..3f8e15df05a 100644 --- a/code/controllers/subsystem/sun.dm +++ b/code/controllers/subsystem/sun.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(sun) wait = 600 flags = SS_NO_TICK_CHECK init_order = INIT_ORDER_SUN + offline_implications = "Solar panels will no longer rotate. No immediate action is needed." var/angle var/dx var/dy diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 74dbf4c4d93..04ddf40f442 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(throwing) wait = 1 flags = SS_NO_INIT|SS_KEEP_TIMING|SS_TICKER runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + offline_implications = "Thrown objects may not react properly. Shuttle call recommended." var/list/currentrun var/list/processing = list() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index b092271fc96..825eab93a31 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -5,6 +5,7 @@ SUBSYSTEM_DEF(ticker) priority = FIRE_PRIORITY_TICKER flags = SS_KEEP_TIMING runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME + offline_implications = "The game is no longer aware of when the round ends. Immediate server restart recommended." var/round_start_time = 0 var/const/restart_timeout = 600 @@ -513,6 +514,11 @@ SUBSYSTEM_DEF(ticker) //Ask the event manager to print round end information SSevents.RoundEnd() + //make big obvious note in game logs that round ended + log_game("///////////////////////////////////////////////////////") + log_game("///////////////////// ROUND ENDED /////////////////////") + log_game("///////////////////////////////////////////////////////") + // Add AntagHUD to everyone, see who was really evil the whole time! for(var/datum/atom_hud/antag/H in GLOB.huds) for(var/m in GLOB.player_list) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 1caa3d7819a..7bb6a496274 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(timer) init_order = INIT_ORDER_TIMER flags = SS_TICKER|SS_NO_INIT + offline_implications = "The game will no longer process timers. Immediate server restart recommended." var/list/second_queue = list() //awe, yes, you've had first queue, but what about second queue? var/list/hashes = list() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 28456c9b5c5..b0110258da7 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -3,6 +3,7 @@ SUBSYSTEM_DEF(vote) wait = 10 flags = SS_KEEP_TIMING|SS_NO_INIT runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + offline_implications = "Votes (Endround shuttle) will no longer function. Shuttle call recommended." var/initiator = null var/started_time = null diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index ac2f0c59313..7b08bd3ca48 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(weather) flags = SS_BACKGROUND wait = 10 runlevels = RUNLEVEL_GAME + offline_implications = "Ash storms will no longer trigger. No immediate action is needed." var/list/processing = list() var/list/eligible_zlevels = list() var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index cf39d91a866..5759ab32de6 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -62,4 +62,4 @@ Bonus M.reagents.add_reagent("oculine", 20) else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]") + to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]") diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 35cc970aa67..63b70b512ee 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -645,7 +645,7 @@ What are the archived variables for? ((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen))) return 0 if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \ - ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide))) + ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (carbon_dioxide > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide))) return 0 if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \ ((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins))) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 896f4f999a9..74abf104465 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -41,6 +41,9 @@ LAZYREMOVE(owner.status_effects, src) on_remove() owner = null + if(linked_alert) + linked_alert.attached_effect = null + linked_alert = null return ..() /datum/status_effect/process() @@ -85,6 +88,13 @@ desc = "You don't feel any different..." var/datum/status_effect/attached_effect +/obj/screen/alert/status_effect/Destroy() + if(attached_effect) + attached_effect.linked_alert = null + attached_effect = null + return ..() + + ////////////////// // HELPER PROCS // ////////////////// diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6b49962bbac..ac77d3d4553 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,6 +1,7 @@ /atom/movable layer = 3 appearance_flags = TILE_BOUND + glide_size = 8 // Default, adjusted when mobs move based on their movement delays var/last_move = null var/anchored = 0 var/move_resist = MOVE_RESIST_DEFAULT @@ -131,13 +132,14 @@ /atom/movable/proc/setLoc(var/T, var/teleported=0) loc = T -/atom/movable/Move(atom/newloc, direct = 0) +/atom/movable/Move(atom/newloc, direct = 0, movetime) if(!loc || !newloc) return 0 var/atom/oldloc = loc if(loc != newloc) + glide_for(movetime) if(!(direct & (direct - 1))) //Cardinal move - . = ..() + . = ..(newloc, direct) // don't pass up movetime else //Diagonal move, split it into cardinal moves moving_diagonally = FIRST_DIAG_STEP var/first_step_dir @@ -203,7 +205,7 @@ src.move_speed = world.time - src.l_move_time src.l_move_time = world.time - if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob + if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, movetime)) //movement failed due to buckled mob . = 0 // Called after a successful Move(). By this point, we've already moved @@ -216,6 +218,15 @@ update_parallax_contents() return TRUE +// Change glide size for the duration of one movement +/atom/movable/proc/glide_for(movetime) + if(movetime) + glide_size = world.icon_size/max(DS2TICKS(movetime), 1) + spawn(movetime) + glide_size = initial(glide_size) + else + glide_size = initial(glide_size) + // Previously known as HasEntered() // This is automatically called when something enters your square /atom/movable/Crossed(atom/movable/AM, oldloc) @@ -428,10 +439,10 @@ /atom/movable/proc/water_act(volume, temperature, source, method = REAGENT_TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins) return TRUE -/atom/movable/proc/handle_buckled_mob_movement(newloc,direct) +/atom/movable/proc/handle_buckled_mob_movement(newloc,direct,movetime) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - if(!buckled_mob.Move(newloc, direct)) + if(!buckled_mob.Move(newloc, direct, movetime)) forceMove(buckled_mob.loc) last_move = buckled_mob.last_move inertia_dir = last_move diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index af375cad368..98336608da4 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -23,7 +23,7 @@ return // HIVE MIND UPLOAD/DOWNLOAD DNA -var/list/datum/dna/hivemind_bank = list() +GLOBAL_LIST_EMPTY(hivemind_bank) /datum/action/changeling/hivemind_upload name = "Hive Channel DNA" @@ -36,7 +36,7 @@ var/list/datum/dna/hivemind_bank = list() var/datum/changeling/changeling = user.mind.changeling var/list/names = list() for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna)) - if(!(DNA in hivemind_bank)) + if(!(DNA in GLOB.hivemind_bank)) names += DNA.real_name if(names.len <= 0) @@ -51,7 +51,7 @@ var/list/datum/dna/hivemind_bank = list() if(!chosen_dna) return - hivemind_bank += chosen_dna + GLOB.hivemind_bank += chosen_dna to_chat(user, "We channel the DNA of [chosen_name] to the air.") feedback_add_details("changeling_powers","HU") return 1 @@ -75,7 +75,7 @@ var/list/datum/dna/hivemind_bank = list() /datum/action/changeling/hivemind_download/sting_action(var/mob/user) var/datum/changeling/changeling = user.mind.changeling var/list/names = list() - for(var/datum/dna/DNA in hivemind_bank) + for(var/datum/dna/DNA in GLOB.hivemind_bank) if(!(DNA in changeling.absorbed_dna)) names[DNA.real_name] = DNA diff --git a/code/game/gamemodes/devil/devil.dm b/code/game/gamemodes/devil/devil.dm index ab5f5796d2e..06933891ba6 100644 --- a/code/game/gamemodes/devil/devil.dm +++ b/code/game/gamemodes/devil/devil.dm @@ -1,4 +1,4 @@ -var/global/list/whiteness = list ( +GLOBAL_LIST_INIT(whiteness, list( /obj/item/clothing/under/color/white = 2, /obj/item/clothing/under/rank/bartender = 1, /obj/item/clothing/under/rank/chef = 1, @@ -21,7 +21,7 @@ var/global/list/whiteness = list ( /obj/item/clothing/under/noble_clothes = 1, /obj/item/clothing/under/sl_suit = 1, /obj/item/clothing/under/burial = 1 -) +)) @@ -32,9 +32,9 @@ var/global/list/whiteness = list ( var/mob/living/carbon/human/H = attacker if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform - if(whiteness[U.type]) + if(GLOB.whiteness[U.type]) src.visible_message("[src] seems to have been harmed by the purity of [attacker]'s clothes.", "Unsullied white clothing is disrupting your form.") - return whiteness[U.type] + 1 + return GLOB.whiteness[U.type] + 1 if(BANE_TOOLBOX) if(istype(weapon,/obj/item/storage/toolbox)) src.visible_message("The [weapon] seems unusually robust this time.", "The [weapon] is your unmaking!") diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 65424bf9008..f425a34654d 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -421,13 +421,13 @@ return FALSE /obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - . = ..() var/turf/here = get_turf(src) for(var/A in here.contents) var/obj/structure/cable/C = A if(istype(C)) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") return FALSE + return ..() /obj/item/deactivated_swarmer/IntegrateAmount() return 50 diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm index d0be68819ae..fbceda6bd94 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm @@ -13,9 +13,9 @@ /datum/event/spawn_swarmer/start() if(find_swarmer()) return 0 - if(!the_gateway) + if(!GLOB.the_gateway) return 0 - new /obj/effect/mob_spawn/swarmer(get_turf(the_gateway)) + new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway)) /datum/event/spawn_swarmer/proc/find_swarmer() diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 259afa12c9e..2d1b091a10d 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -30,7 +30,7 @@ l_ear = /obj/item/radio/headset/heads/cmo id = /obj/item/card/id/cmo suit_store = /obj/item/flashlight/pen - l_hand = /obj/item/storage/firstaid/adv + l_hand = /obj/item/storage/firstaid/doctor pda = /obj/item/pda/heads/cmo backpack_contents = list( /obj/item/melee/classic_baton/telescopic = 1 @@ -68,7 +68,7 @@ l_ear = /obj/item/radio/headset/headset_med id = /obj/item/card/id/medical suit_store = /obj/item/flashlight/pen - l_hand = /obj/item/storage/firstaid/adv + l_hand = /obj/item/storage/firstaid/doctor pda = /obj/item/pda/medical backpack = /obj/item/storage/backpack/medic @@ -315,4 +315,3 @@ satchel = /obj/item/storage/backpack/satchel_med dufflebag = /obj/item/storage/backpack/duffel/medical box = /obj/item/storage/box/engineer - diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 64e69e89765..a32656598df 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -217,7 +217,7 @@ glasses = /obj/item/clothing/glasses/hud/health/sunglasses id = /obj/item/card/id/security suit_store = /obj/item/flashlight/pen - l_hand = /obj/item/storage/firstaid/adv + l_hand = /obj/item/storage/firstaid/doctor pda = /obj/item/pda/medical implants = list(/obj/item/implant/mindshield) backpack = /obj/item/storage/backpack/medic diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index c95735507a5..1649397a68f 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -302,7 +302,7 @@ T = get_step(T, direct) console.jump_on_click(src, T) return - return ..(n,direct) + return ..() // Other computer monitors. /obj/machinery/computer/security/telescreen diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index d669b340436..9ee32716e53 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -15,6 +15,9 @@ var/obj/item/defibrillator/defib //this mount's defibrillator var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps +/obj/machinery/defibrillator_mount/attack_ai() + return + /obj/machinery/defibrillator_mount/get_cell() if(defib) return defib.get_cell() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 1d97056912f..94a3219c159 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -30,6 +30,8 @@ new stacktype(get_turf(src), drop_amount) /obj/structure/barricade/welder_act(mob/user, obj/item/I) + if(bar_material != METAL) + return if(obj_integrity >= max_integrity) to_chat(user, "[src] does not need repairs.") return @@ -71,6 +73,7 @@ bar_material = WOOD stacktype = /obj/item/stack/sheet/wood + /obj/structure/barricade/wooden/attackby(obj/item/I, mob/user) if(istype(I,/obj/item/stack/sheet/wood)) var/obj/item/stack/sheet/wood/W = I diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 191d5e81079..f69094715b0 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -289,8 +289,8 @@ About the new airlock wires panel: // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise // The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/shock(mob/user, prb) - if(!arePowerSystemsOn()) +/obj/machinery/door/airlock/shock(mob/living/user, prb) + if(!istype(user) || !arePowerSystemsOn()) return FALSE if(shockCooldown > world.time) return FALSE //Already shocked someone recently? diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index fbbe0201d31..2d6fac3bb81 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -204,7 +204,7 @@ . = TRUE if(operating) return - if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + if(!I.use_tool(src, user, 0, volume = 0)) return try_to_crowbar(user, I) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 6f4a84a7535..c0dce817189 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -59,9 +59,18 @@ /obj/machinery/door/poddoor/try_to_activate_door(mob/user) return -/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) +/obj/machinery/door/poddoor/try_to_crowbar(mob/user, obj/item/I) + if(!density) + return if(!hasPower()) - open() + to_chat(user, "You start forcing [src] open...") + if(do_after(user, 50 * I.toolspeed, target = src)) + if(!hasPower()) + open() + else + to_chat(user, "[src] resists your efforts to force it!") + else + to_chat(user, "[src] resists your efforts to force it!") // Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell. - Unknown // Wise words. - Bxil diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 8d8cabed341..0a55acfcb81 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -558,8 +558,8 @@ Class Procs: return threatcount -/obj/machinery/proc/shock(mob/user, prb) - if(inoperable()) +/obj/machinery/proc/shock(mob/living/user, prb) + if(!istype(user) || inoperable()) return FALSE if(!prob(prb)) return FALSE diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 201c6891187..1487256c712 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -52,14 +52,11 @@ var/list/hidden_records = list() var/list/coin_records = list() - // // Variables used to initialize advertising - var/product_slogans = "" //String of slogans separated by semicolons, optional - var/product_ads = "" //String of small ad messages in the vending screen - random chance - var/list/ads_list = list() + var/list/ads_list = list() //Small ad messages in the vending screen - random chance, TODO: implementation // Stuff relating vocalizations - var/list/slogan_list = list() + var/list/slogan_list = list() //List of slogans the vendor will say, optional var/vend_reply //Thank you for shopping! var/shut_up = 0 //Stop spouting those godawful pitches! ///can we access the hidden inventory? @@ -95,17 +92,12 @@ build_inventory(products, product_records) build_inventory(contraband, hidden_records) build_inventory(premium, coin_records) - if(product_slogans) - slogan_list += splittext(product_slogans, ";") - + if(LAZYLEN(slogan_list)) // So not all machines speak at the exact same time. // The first time this machine says something will be at slogantime + this random value, - // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. + // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is created. last_slogan = world.time + rand(0, slogan_delay) - if(product_ads) - ads_list += splittext(product_ads, ";") - power_change() /obj/machinery/vending/Destroy() @@ -720,7 +712,7 @@ src.seconds_electrified-- //Pitch to the people! Really sell it! - if(((last_slogan + src.slogan_delay) <= world.time) && (slogan_list.len > 0) && (!shut_up) && prob(5)) + if(((last_slogan + src.slogan_delay) <= world.time) && (LAZYLEN(slogan_list)) && (!shut_up) && prob(5)) var/slogan = pick(src.slogan_list) speak(slogan) last_slogan = world.time @@ -833,7 +825,7 @@ products = list( /obj/item/assembly/prox_sensor = 5,/obj/item/assembly/igniter = 3,/obj/item/assembly/signaler = 4, /obj/item/wirecutters = 1, /obj/item/cartridge/signal = 4) contraband = list(/obj/item/flashlight = 5,/obj/item/assembly/timer = 2, /obj/item/assembly/voice = 2, /obj/item/assembly/health = 2) - product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" + ads_list = list("Only the finest!","Have some tools.","The most robust equipment.","The finest gear in space!") refill_canister = /obj/item/vending_refill/assist /obj/machinery/vending/assist/Initialize(mapload) @@ -875,8 +867,8 @@ /obj/item/reagent_containers/food/drinks/ice = 9) contraband = list(/obj/item/reagent_containers/food/drinks/tea = 10) vend_delay = 15 - product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" - product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" + slogan_list = list("I hope nobody asks me for a bloody cup o' tea...","Alcohol is humanity's friend. Would you abandon a friend?","Quite delighted to serve you!","Is nobody thirsty on this station?") + ads_list = list("Drink up!","Booze is good for you!","Alcohol is humanity's best friend.","Quite delighted to serve you!","Care for a nice, cold beer?","Nothing cures you like booze!","Have a sip!","Have a drink!","Have a beer!","Beer is good for you!","Only the finest alcohol!","Best quality booze since 2053!","Award-winning wine!","Maximum alcohol!","Man loves beer.","A toast for progress!") refill_canister = /obj/item/vending_refill/boozeomat /obj/machinery/vending/boozeomat/syndicate_access @@ -895,7 +887,7 @@ /obj/machinery/vending/coffee name = "\improper Hot Drinks machine" desc = "A vending machine which dispenses hot drinks." - product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" + ads_list = list("Have a drink!","Drink up!","It's good for you!","Would you like a hot joe?","I'd kill for some coffee!","The best beans in the galaxy.","Only the finest brew for you.","Mmmm. Nothing like a coffee.","I like coffee, don't you?","Coffee helps you work!","Try some tea.","We hope you like the best!","Try our new chocolate!","Admin conspiracies") icon_state = "coffee" icon_vend = "coffee-vend" item_slot = TRUE @@ -962,8 +954,8 @@ /obj/machinery/vending/snack name = "\improper Getmore Chocolate Corp" desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars." - product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" - product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" + slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!") + ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!") icon_state = "snack" products = list(/obj/item/reagent_containers/food/snacks/candy/candybar = 6,/obj/item/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/reagent_containers/food/snacks/chips =6, /obj/item/reagent_containers/food/snacks/sosjerky = 6,/obj/item/reagent_containers/food/snacks/no_raisin = 6,/obj/item/reagent_containers/food/snacks/pistachios =6, @@ -989,7 +981,7 @@ /obj/machinery/vending/chinese name = "\improper Mr. Chang" desc = "A self-serving Chinese food machine, for all your Chinese food needs." - product_slogans = "Taste 5000 years of culture!;Mr. Chang, approved for safe consumption in over 10 sectors!;Chinese food is great for a date night, or a lonely night!;You can't go wrong with Mr. Chang's authentic Chinese food!" + slogan_list = list("Taste 5000 years of culture!","Mr. Chang, approved for safe consumption in over 10 sectors!","Chinese food is great for a date night, or a lonely night!","You can't go wrong with Mr. Chang's authentic Chinese food!") icon_state = "chang" products = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/reagent_containers/food/snacks/chinese/newdles = 6, /obj/item/reagent_containers/food/snacks/chinese/rice = 6) @@ -1013,8 +1005,8 @@ name = "\improper Robust Softdrinks" desc = "A soft drink vendor provided by Robust Industries, LLC." icon_state = "Cola_Machine" - product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" - product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." + slogan_list = list("Robust Softdrinks: More robust than a toolbox to the head!") + ads_list = list("Refreshing!","Hope you're thirsty!","Over 1 million drinks sold!","Thirsty? Why not cola?","Please, have a drink!","Drink up!","The best drinks in space.") products = list(/obj/item/reagent_containers/food/drinks/cans/cola = 10,/obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 10, /obj/item/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/reagent_containers/food/drinks/cans/starkist = 10, /obj/item/reagent_containers/food/drinks/cans/space_up = 10,/obj/item/reagent_containers/food/drinks/cans/grape_juice = 10) @@ -1040,7 +1032,7 @@ /obj/machinery/vending/cart name = "\improper PTech" desc = "Cartridges for PDA's." - product_slogans = "Carts to go!" + slogan_list = list("Carts to go!") icon_state = "cart" icon_deny = "cart-deny" products = list(/obj/item/pda =10,/obj/item/cartridge/mob_hunt_game = 25,/obj/item/cartridge/medical = 10,/obj/item/cartridge/chemistry = 10, @@ -1069,8 +1061,8 @@ desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine." icon_state = "liberationstation" req_access_txt = "1" - product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!" - product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?" + slogan_list = list("Liberation Station: Your one-stop shop for all things second amendment!","Be a patriot today, pick up a gun!","Quality weapons for cheap prices!","Better dead than red!") + ads_list = list("Float like an astronaut, sting like a bullet!","Express your second amendment today!","Guns don't kill people, but you can!","Who needs responsibilities when you have guns?") vend_reply = "Remember the name: Liberation Station!" products = list(/obj/item/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/gun/projectile/automatic/pistol/deagle/camo = 2, /obj/item/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/gun/projectile/automatic/proto = 2, @@ -1086,8 +1078,8 @@ name = "\improper Syndicate Donksoft Toy Vendor" desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" icon_state = "syndi" - product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!" - product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" + slogan_list = list("Get your cool toys today!","Trigger a valid hunter today!","Quality toy weapons for cheap prices!","Give them to HoPs for all access!","Give them to HoS to get permabrigged!") + ads_list = list("Feel robust with your toys!","Express your inner child today!","Toy weapons don't kill people, but valid hunters do!","Who needs responsibilities when you have toy weapons?","Make your next murder FUN!") vend_reply = "Come back for more!" products = list(/obj/item/gun/projectile/automatic/toy = 10, /obj/item/gun/projectile/automatic/toy/pistol= 10, @@ -1112,8 +1104,8 @@ /obj/machinery/vending/cigarette name = "cigarette machine" desc = "If you want to get cancer, might as well do it in style." - product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!" - product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." + slogan_list = list("Space cigs taste good like a cigarette should.","I'd rather toolbox than switch.","Smoke!","Don't believe the reports - smoke today!") + ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.") vend_delay = 34 icon_state = "cigs" products = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 12, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 6, /obj/item/storage/fancy/cigarettes/cigpack_random = 6, /obj/item/reagent_containers/food/pill/patch/nicotine = 10, /obj/item/storage/box/matches = 10,/obj/item/lighter/random = 4,/obj/item/storage/fancy/rollingpapers = 5) @@ -1141,8 +1133,8 @@ /obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin name = "\improper ShadyCigs Ultra" desc = "Now with extra premium products!" - product_ads = "Probably not bad for you!;Dope will get you through times of no money better than money will get you through times of no dope!;It's good for you!" - product_slogans = "Turn on, tune in, drop out!;Better living through chemistry!;Toke!;Don't forget to keep a smile on your lips and a song in your heart!" + ads_list = list("Probably not bad for you!","Dope will get you through times of no money better than money will get you through times of no dope!","It's good for you!") + slogan_list = list("Turn on, tune in, drop out!","Better living through chemistry!","Toke!","Don't forget to keep a smile on your lips and a song in your heart!") products = list(/obj/item/storage/fancy/cigarettes = 5, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/storage/fancy/cigarettes/cigpack_robust = 3, @@ -1170,9 +1162,9 @@ desc = "Medical drug dispenser." icon_state = "med" icon_deny = "med-deny" - product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" + ads_list = list("Go save some lives!","The best stuff for your medbay.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?","Ping!") req_access_txt = "5" - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 10, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 10, + products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 4, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 4, /obj/item/reagent_containers/applicator/brute = 3, /obj/item/reagent_containers/applicator/burn = 3, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4, /obj/item/reagent_containers/glass/bottle/salicylic = 4, /obj/item/reagent_containers/glass/bottle/potassium_iodide =3, /obj/item/reagent_containers/glass/bottle/saline = 5, /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/ether = 4, /obj/item/reagent_containers/glass/bottle/atropine = 3, @@ -1209,7 +1201,7 @@ /obj/machinery/vending/wallmed name = "\improper NanoMed" desc = "Wall-mounted Medical Equipment dispenser." - product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" + ads_list = list("Go save some lives!","The best stuff for your medbay.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?") icon_state = "wallmed" icon_deny = "wallmed-deny" density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude @@ -1233,7 +1225,7 @@ desc = "EVIL wall-mounted Medical Equipment dispenser." icon_state = "syndimed" icon_deny = "syndimed-deny" - product_ads = "Go end some lives!;The best stuff for your ship.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" + ads_list = list("Go end some lives!","The best stuff for your ship.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?","Ping!") req_access_txt = "150" products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/reagent_containers/hypospray/autoinjector = 4,/obj/item/healthanalyzer = 1) contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1) @@ -1241,7 +1233,7 @@ /obj/machinery/vending/security name = "\improper SecTech" desc = "A security equipment vendor." - product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" + ads_list = list("Crack capitalist skulls!","Beat some heads in!","Don't forget - harm is good!","Your weapons are right here.","Handcuffs!","Freeze, scumbag!","Don't tase me bro!","Tase them, bro.","Why not have a donut?") icon_state = "sec" icon_deny = "sec-deny" req_access_txt = "1" @@ -1263,8 +1255,8 @@ /obj/machinery/vending/hydronutrients name = "\improper NutriMax" desc = "A plant nutrients vendor" - product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" - product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." + slogan_list = list("Aren't you glad you don't have to fertilize the natural way?","Now with 50% less stink!","Plants are people too!") + ads_list = list("We like plants!","Don't you want some?","The greenest thumbs ever.","We like big plants.","Soft soil...") icon_state = "nutri" icon_deny = "nutri-deny" products = list(/obj/item/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/reagent_containers/spray/pestspray = 20, @@ -1284,8 +1276,8 @@ /obj/machinery/vending/hydroseeds name = "\improper MegaSeed Servitor" desc = "When you need seeds fast!" - product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" - product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" + slogan_list = list("THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!","Hands down the best seed selection on the station!","Also certain mushroom varieties available, more for experts! Get certified today!") + ads_list = list("We like plants!","Grow some crops!","Grow, baby, growww!","Aw h'yeah son!") icon_state = "seeds" products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3, @@ -1354,10 +1346,10 @@ name = "\improper MagiVend" desc = "A magic vending machine." icon_state = "MagiVend" - product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" + slogan_list = list("Sling spells the proper way with MagiVend!","Be your own Houdini! Use MagiVend!") vend_delay = 15 vend_reply = "Have an enchanted evening!" - product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" + ads_list = list("FJKLFJSD","AJKFLBJAKL","1234 LOONIES LOL!",">MFW","Kill them fuckers!","GET DAT FUKKEN DISK","HONK!","EI NATH","Destroy the station!","Admin conspiracies since forever!","Space-time bending hardware!") products = list(/obj/item/clothing/head/wizard = 1, /obj/item/clothing/suit/wizrobe = 1, /obj/item/clothing/head/wizard/red = 1, @@ -1381,7 +1373,7 @@ desc = "A vending machine for costumes." icon_state = "theater" icon_deny = "theater-deny" - product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!" + slogan_list = list("Dress for success!","Suited and booted!","It's show time!","Why leave style up to fate? Use AutoDrobe!") vend_delay = 15 vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, @@ -1523,7 +1515,7 @@ /obj/machinery/vending/dinnerware name = "\improper Plasteel Chef's Dinnerware Vendor" desc = "A kitchen and restaurant equipment vendor." - product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." + ads_list = list("Mm, food stuffs!","Food and food accessories.","Get your plates!","You like forks?","I like forks.","Woo, utensils.","You don't really need these...") icon_state = "dinnerware" products = list(/obj/item/storage/bag/tray = 8,/obj/item/kitchen/utensil/fork = 6, /obj/item/kitchen/knife = 3,/obj/item/kitchen/rollingpin = 2, @@ -1555,7 +1547,7 @@ name = "\improper BODA" desc = "Old sweet water vending machine." icon_state = "sovietsoda" - product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." + ads_list = list("For Tsar and Country.","Have you fulfilled your nutrition quota today?","Very nice!","We are simple people, for this is all we eat.","If there is a person, there is a problem. If there is no person, then there is no problem.") products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/soda = 30) contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/cola = 20) resistance_flags = FIRE_PROOF @@ -1650,8 +1642,8 @@ /obj/machinery/vending/sustenance name = "\improper Sustenance Vendor" desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement." - product_slogans = "Enjoy your meal.;Enough calories to support strenuous labor." - product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" + slogan_list = list("Enjoy your meal.","Enough calories to support strenuous labor.") + ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!") icon_state = "sustenance" products = list(/obj/item/reagent_containers/food/snacks/tofu = 24, /obj/item/reagent_containers/food/drinks/ice = 12, @@ -1675,7 +1667,7 @@ name = "\improper Hatlord 9000" desc = "It doesn't seem the slightest bit unusual. This frustrates you immensely." icon_state = "hats" - product_ads = "Warning, not all hats are dog/monkey compatible. Apply forcefully with care.;Apply directly to the forehead.;Who doesn't love spending cash on hats?!;From the people that brought you collectable hat crates, Hatlord!" + ads_list = list("Warning, not all hats are dog/monkey compatible. Apply forcefully with care.","Apply directly to the forehead.","Who doesn't love spending cash on hats?!","From the people that brought you collectable hat crates, Hatlord!") products = list(/obj/item/clothing/head/bowlerhat = 10, /obj/item/clothing/head/beaverhat = 10, /obj/item/clothing/head/boaterhat = 10, @@ -1699,7 +1691,7 @@ name = "\improper Suitlord 9000" desc = "You wonder for a moment why all of your shirts and pants come conjoined. This hurts your head and you stop thinking about it." icon_state = "suits" - product_ads = "Pre-Ironed, Pre-Washed, Pre-Wor-*BZZT*;Blood of your enemies washes right out!;Who are YOU wearing?;Look dapper! Look like an idiot!;Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*" + ads_list = list("Pre-Ironed, Pre-Washed, Pre-Wor-*BZZT*","Blood of your enemies washes right out!","Who are YOU wearing?","Look dapper! Look like an idiot!","Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*") products = list(/obj/item/clothing/under/color/black = 10,/obj/item/clothing/under/color/blue = 10,/obj/item/clothing/under/color/green = 10,/obj/item/clothing/under/color/grey = 10,/obj/item/clothing/under/color/pink = 10,/obj/item/clothing/under/color/red = 10, /obj/item/clothing/under/color/white = 10, /obj/item/clothing/under/color/yellow = 10,/obj/item/clothing/under/color/lightblue = 10,/obj/item/clothing/under/color/aqua = 10,/obj/item/clothing/under/color/purple = 10,/obj/item/clothing/under/color/lightgreen = 10, /obj/item/clothing/under/color/lightblue = 10,/obj/item/clothing/under/color/lightbrown = 10,/obj/item/clothing/under/color/brown = 10,/obj/item/clothing/under/color/yellowgreen = 10,/obj/item/clothing/under/color/darkblue = 10,/obj/item/clothing/under/color/lightred = 10, /obj/item/clothing/under/color/darkred = 10) @@ -1720,7 +1712,7 @@ name = "\improper Shoelord 9000" desc = "Wow, hatlord looked fancy, suitlord looked streamlined, and this is just normal. The guy who designed these must be an idiot." icon_state = "shoes" - product_ads = "Put your foot down!;One size fits all!;IM WALKING ON SUNSHINE!;No hobbits allowed.;NO PLEASE WILLY, DONT HURT ME- *BZZT*" + ads_list = list("Put your foot down!","One size fits all!","IM WALKING ON SUNSHINE!","No hobbits allowed.","NO PLEASE WILLY, DONT HURT ME- *BZZT*") products = list(/obj/item/clothing/shoes/black = 10,/obj/item/clothing/shoes/brown = 10,/obj/item/clothing/shoes/blue = 10,/obj/item/clothing/shoes/green = 10,/obj/item/clothing/shoes/yellow = 10,/obj/item/clothing/shoes/purple = 10,/obj/item/clothing/shoes/red = 10,/obj/item/clothing/shoes/white = 10,/obj/item/clothing/shoes/sandal=10) contraband = list(/obj/item/clothing/shoes/orange = 5) premium = list(/obj/item/clothing/shoes/rainbow = 1) @@ -1738,8 +1730,8 @@ /obj/machinery/vending/syndicigs name = "\improper Suspicious Cigarette Machine" desc = "Smoke 'em if you've got 'em." - product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!" - product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." + slogan_list = list("Space cigs taste good like a cigarette should.","I'd rather toolbox than switch.","Smoke!","Don't believe the reports - smoke today!") + ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.") vend_delay = 34 icon_state = "cigs" products = list(/obj/item/storage/fancy/cigarettes/syndicate = 10,/obj/item/lighter/random = 5) @@ -1747,8 +1739,8 @@ /obj/machinery/vending/syndisnack name = "\improper Getmore Chocolate Corp" desc = "A modified snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars" - product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" - product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" + slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!") + ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!") icon_state = "snack" products = list(/obj/item/reagent_containers/food/snacks/chips =6,/obj/item/reagent_containers/food/snacks/sosjerky = 6, /obj/item/reagent_containers/food/snacks/syndicake = 6, /obj/item/reagent_containers/food/snacks/cheesiehonkers = 6) @@ -1758,7 +1750,7 @@ name = "\improper ClothesMate" //renamed to make the slogan rhyme desc = "A vending machine for clothing." icon_state = "clothes" - product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this free swag!;Why leave style up to fate? Use the ClothesMate!" + slogan_list = list("Dress for success!","Prepare to look swagalicious!","Look at all this free swag!","Why leave style up to fate? Use the ClothesMate!") vend_delay = 15 vend_reply = "Thank you for using the ClothesMate!" products = list(/obj/item/clothing/head/that = 2, @@ -1859,8 +1851,8 @@ /obj/machinery/vending/artvend name = "\improper ArtVend" desc = "A vending machine for art supplies." - product_slogans = "Stop by for all your artistic needs!;Color the floors with crayons, not blood!;Don't be a starving artist, use ArtVend. ;Don't fart, do art!" - product_ads = "Just like Kindergarten!;Now with 1000% more vibrant colors!;Screwing with the janitor was never so easy!;Creativity is at the heart of every spessman." + slogan_list = list("Stop by for all your artistic needs!","Color the floors with crayons, not blood!","Don't be a starving artist, use ArtVend. ","Don't fart, do art!") + ads_list = list("Just like Kindergarten!","Now with 1000% more vibrant colors!","Screwing with the janitor was never so easy!","Creativity is at the heart of every spessman.") vend_delay = 15 icon_state = "artvend" products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/camera = 4,/obj/item/camera_film = 6, @@ -1874,8 +1866,8 @@ /obj/machinery/vending/crittercare name = "\improper CritterCare" desc = "A vending machine for pet supplies." - product_slogans = "Stop by for all your animal's needs!;Cuddly pets deserve a stylish collar!;Pets in space, what could be more adorable?;Freshest fish eggs in the system!;Rocks are the perfect pet, buy one today!" - product_ads = "House-training costs extra!;Now with 1000% more cat hair!;Allergies are a sign of weakness!;Dogs are man's best friend. Remember that Vulpkanin!; Heat lamps for Unathi!; Vox-y want a cracker?" + slogan_list = list("Stop by for all your animal's needs!","Cuddly pets deserve a stylish collar!","Pets in space, what could be more adorable?","Freshest fish eggs in the system!","Rocks are the perfect pet, buy one today!") + ads_list = list("House-training costs extra!","Now with 1000% more cat hair!","Allergies are a sign of weakness!","Dogs are man's best friend. Remember that Vulpkanin!"," Heat lamps for Unathi!"," Vox-y want a cracker?") vend_delay = 15 icon_state = "crittercare" products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/storage/firstaid/aquatic_kit/full =5, /obj/item/fish_eggs/goldfish = 5, @@ -1909,7 +1901,7 @@ desc = "All the parts you need to build your own custom pc." icon_state = "modularpc" icon_deny = "modularpc-deny" - product_ads = "Get your gamer gear!;The best GPUs for all of your space-crypto needs!;The most robust cooling!;The finest RGB in space!" + ads_list = list("Get your gamer gear!","The best GPUs for all of your space-crypto needs!","The most robust cooling!","The finest RGB in space!") vend_reply = "Game on!" products = list(/obj/item/modular_computer/laptop = 4, /obj/item/modular_computer/tablet = 4, diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 7e626584780..1e7ad8397ee 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -112,7 +112,8 @@ GLOBAL_LIST_EMPTY(splatter_cache) /obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose name = "blood" - icon_state = "ltrails_1" + icon = 'icons/effects/effects.dmi' + icon_state = "nothing" desc = "Your instincts say you shouldn't be following these." gender = PLURAL density = FALSE diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index b32688dbb83..9eb8e9de1a2 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -289,7 +289,6 @@ /obj/item/clothing/glasses/thermal = 1, /obj/item/chameleon = 1, /obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1, - /obj/item/storage/box/syndie_kit/atmosn2ogrenades = 1, /obj/item/grenade/plastic/x4 = 1) @@ -304,11 +303,6 @@ /turf/simulated/wall/mineral/plastitanium/nodiagonal = 2, /obj/structure/falsewall/plastitanium = 2) -/obj/effect/spawner/random_spawners/syndicate/layout/door/secret - name = "50pc falsewall 50pc wall" - result = list(/turf/simulated/wall/mineral/plastitanium/nodiagonal = 1, - /obj/structure/falsewall/plastitanium = 1) - /obj/effect/spawner/random_spawners/syndicate/layout/door/vault name = "80pc vaultdoor 20pc wall" result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4, diff --git a/code/game/objects/items/devices/enginepicker.dm b/code/game/objects/items/devices/enginepicker.dm index fe6bb7e8717..a2fa30a243b 100644 --- a/code/game/objects/items/devices/enginepicker.dm +++ b/code/game/objects/items/devices/enginepicker.dm @@ -14,8 +14,12 @@ var/list/list_enginebeacons = list() var/isactive = FALSE +/obj/item/enginepicker/Destroy() + list_enginebeacons.Cut() + return ..() + /obj/item/enginepicker/attack_self(mob/living/carbon/user) - if(usr.stat || !usr.canmove || usr.restrained()) + if(user.incapacitated()) return if(!isactive) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 5cbd562a002..b8602e671c3 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -98,7 +98,7 @@ to_chat(M, "[user] blinds you with the flash!") if(M.weakeyes) M.Stun(2) - M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shields your eyes!") + M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shield your eyes!") else visible_message("[user] fails to blind [M] with the flash!") to_chat(user, "You fail to blind [M] with the flash!") diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 517f9f595c5..aa123930323 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -69,8 +69,8 @@ to_chat(user, "Locked In") new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) + user.drop_item() qdel(src) - return /obj/item/radio/beacon/syndicate/bomb name = "suspicious beacon" @@ -82,16 +82,21 @@ to_chat(user, "Locked In") new /obj/machinery/syndicatebomb( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) + user.drop_item() qdel(src) - return /obj/item/radio/beacon/engine desc = "A label on it reads: Warning: This device is used for transportation of high-density objects used for high-yield power generation. Stay away!." anchored = 1 //Let's not move these around. Some folk might get the idea to use these for assassinations var/list/enginetype = list() -/obj/item/radio/beacon/engine/Initialize() +/obj/item/radio/beacon/engine/Initialize(mapload) LAZYADD(GLOB.engine_beacon_list, src) + return ..() + +/obj/item/radio/beacon/engine/Destroy() + GLOB.engine_beacon_list -= src + return ..() /obj/item/radio/beacon/engine/tesling name = "Engine Beacon for Tesla and Singularity" diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index b8fd23e78cb..54d42176f52 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -298,13 +298,13 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) point_value = 20 -var/global/list/datum/stack_recipe/titanium_recipes = list ( +GLOBAL_LIST_INIT(titanium_recipes, list( new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), new/datum/stack_recipe("surgical tray", /obj/structure/table/tray, 2, one_per_turf = 1, on_floor = 1), - ) + )) /obj/item/stack/sheet/mineral/titanium/New(loc, amount=null) - recipes = titanium_recipes + recipes = GLOB.titanium_recipes ..() /obj/item/stack/sheet/mineral/titanium/fifty @@ -328,12 +328,12 @@ var/global/list/datum/stack_recipe/titanium_recipes = list ( materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000) point_value = 45 -var/global/list/datum/stack_recipe/plastitanium_recipes = list ( +GLOBAL_LIST_INIT(plastitanium_recipes, list( new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), - ) + )) /obj/item/stack/sheet/mineral/plastitanium/New(loc, amount=null) - recipes = plastitanium_recipes + recipes = GLOB.plastitanium_recipes ..() /obj/item/stack/sheet/mineral/enruranium diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index e188279eb8c..1f73e5c7062 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -37,6 +37,9 @@ cuff(C, user) /obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE) + if(!istype(C)) // Shouldn't be able to cuff anything but carbons. + return + if(ishuman(C)) var/mob/living/carbon/human/H = C if(!(H.has_left_hand() || H.has_right_hand())) diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm index 18b08bba283..b530fd860fa 100644 --- a/code/game/objects/items/weapons/implants/implant_storage.dm +++ b/code/game/objects/items/weapons/implants/implant_storage.dm @@ -20,6 +20,10 @@ ..() storage = new /obj/item/storage/hidden/implant(src) +/obj/item/implant/storage/emp_act(severity) + ..() + storage.emp_act(severity) + /obj/item/implant/storage/activate() storage.MouseDrop(imp_in) diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index 0732c0fdd1d..40d68cc8fc6 100644 --- a/code/game/objects/items/weapons/misc.dm +++ b/code/game/objects/items/weapons/misc.dm @@ -77,6 +77,10 @@ item_state = "gift" w_class = WEIGHT_CLASS_BULKY +/obj/item/gift/emp_act(severity) + ..() + gift.emp_act(severity) + /obj/item/kidanglobe name = "Kidan homeworld globe" icon = 'icons/obj/decorations.dmi' diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 755b0076c3c..403088e2b71 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -134,7 +134,8 @@ /obj/item/rad_laser, /obj/item/sensor_device, /obj/item/wrench/medical, - /obj/item/handheld_defibrillator + /obj/item/handheld_defibrillator, + /obj/item/reagent_containers/applicator ) /obj/item/storage/belt/medical/surgery diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index a9da4a69241..4ff769a7d3f 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -14,7 +14,7 @@ icon_state = "firstaid" throw_speed = 2 throw_range = 8 - var/empty = 0 + var/empty = FALSE req_one_access =list(ACCESS_MEDICAL, ACCESS_ROBOTICS) //Access and treatment are utilized for medbots. var/treatment_brute = "salglu_solution" var/treatment_oxy = "salbutamol" @@ -33,39 +33,51 @@ item_state = "firstaid-ointment" med_bot_skin = "ointment" - New() - ..() - if(empty) return - - icon_state = pick("ointment","firefirstaid") - - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/healthanalyzer( src ) - new /obj/item/reagent_containers/hypospray/autoinjector( src ) - new /obj/item/reagent_containers/food/pill/salicylic( src ) +/obj/item/storage/firstaid/fire/New() + ..() + if(empty) return + icon_state = pick("ointment", "firefirstaid") + new /obj/item/reagent_containers/applicator/burn(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf/small(src) + new /obj/item/healthanalyzer(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) /obj/item/storage/firstaid/fire/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/regular desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer" icon_state = "firstaid" - New() - ..() - if(empty) return - new /obj/item/reagent_containers/food/pill/patch/styptic( src ) - new /obj/item/reagent_containers/food/pill/patch/styptic( src ) - new /obj/item/reagent_containers/food/pill/salicylic( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/healthanalyzer( src ) - new /obj/item/reagent_containers/hypospray/autoinjector( src ) +/obj/item/storage/firstaid/regular/New() + ..() + if(empty) return + new /obj/item/reagent_containers/food/pill/patch/styptic(src) + new /obj/item/reagent_containers/food/pill/patch/styptic(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src) + new /obj/item/healthanalyzer(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) + +/obj/item/storage/firstaid/doctor + desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer" + icon_state = "firstaid" + +/obj/item/storage/firstaid/doctor/New() + ..() + if(empty) + return + new /obj/item/reagent_containers/applicator/brute(src) + new /obj/item/reagent_containers/applicator/burn(src) + new /obj/item/reagent_containers/food/pill/patch/styptic(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/healthanalyzer/advanced(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) /obj/item/storage/firstaid/toxin name = "toxin first aid kit" @@ -74,23 +86,21 @@ item_state = "firstaid-toxin" med_bot_skin = "tox" - New() - ..() - if(empty) return - - icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3") - - new /obj/item/reagent_containers/syringe/charcoal( src ) - new /obj/item/reagent_containers/syringe/charcoal( src ) - new /obj/item/reagent_containers/syringe/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/healthanalyzer( src ) +/obj/item/storage/firstaid/toxin/New() + ..() + if(empty) return + icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2", "antitoxfirstaid3") + new /obj/item/reagent_containers/syringe/charcoal(src) + new /obj/item/reagent_containers/syringe/charcoal(src) + new /obj/item/reagent_containers/syringe/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/healthanalyzer(src) /obj/item/storage/firstaid/toxin/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/o2 name = "oxygen deprivation first aid kit" @@ -99,18 +109,18 @@ item_state = "firstaid-o2" med_bot_skin = "o2" - New() - ..() - if(empty) return - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/healthanalyzer( src ) +/obj/item/storage/firstaid/o2/New() + ..() + if(empty) return + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/healthanalyzer(src) /obj/item/storage/firstaid/o2/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/brute name = "brute trauma treatment kit" @@ -119,23 +129,19 @@ item_state = "firstaid-brute" med_bot_skin = "brute" - New() - ..() - if(empty) return - - icon_state = pick("brute","brute2") - - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/healthanalyzer(src) - new /obj/item/reagent_containers/hypospray/autoinjector(src) - new /obj/item/stack/medical/bruise_pack(src) +/obj/item/storage/firstaid/brute/New() + ..() + if(empty) return + icon_state = pick("brute", "brute2") + new /obj/item/reagent_containers/applicator/brute(src) + new /obj/item/reagent_containers/food/pill/patch/styptic/small(src) + new /obj/item/healthanalyzer(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) + new /obj/item/stack/medical/bruise_pack(src) /obj/item/storage/firstaid/brute/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/adv name = "advanced first-aid kit" @@ -157,7 +163,7 @@ new /obj/item/healthanalyzer(src) /obj/item/storage/firstaid/adv/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/machine name = "machine repair kit" @@ -178,7 +184,7 @@ new /obj/item/robotanalyzer(src) /obj/item/storage/firstaid/machine/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/tactical @@ -196,18 +202,15 @@ /obj/item/storage/firstaid/tactical/New() ..() - if(empty) return + if(empty) + return new /obj/item/reagent_containers/hypospray/combat(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) // Because you ain't got no time to look at what damage dey taking yo - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) + new /obj/item/reagent_containers/applicator/dual(src) // Because you ain't got no time to look at what damage dey taking yo new /obj/item/defibrillator/compact/combat/loaded(src) new /obj/item/clothing/glasses/hud/health/night(src) - return /obj/item/storage/firstaid/tactical/empty - empty =1 + empty = TRUE /obj/item/storage/firstaid/surgery name = "field surgery kit" @@ -347,15 +350,15 @@ desc = "Contains pills used to counter toxins." wrapper_color = COLOR_GREEN - New() - ..() - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) +/obj/item/storage/pill_bottle/charcoal/New() + ..() + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) /obj/item/storage/pill_bottle/painkillers name = "Pill Bottle (Salicylic Acid)" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 1ff2b2f2c56..0aa7d976082 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -481,10 +481,10 @@ return ..() /obj/item/storage/emp_act(severity) - if(!istype(loc, /mob/living)) - for(var/obj/O in contents) - O.emp_act(severity) ..() + for(var/i in contents) + var/atom/A = i + A.emp_act(severity) /obj/item/storage/hear_talk(mob/living/M as mob, list/message_pieces) ..() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 57c9a5301f6..ed857c18ded 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -179,6 +179,7 @@ slot_flags = SLOT_BACK force_unwielded = 5 force_wielded = 24 + toolspeed = 0.25 attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") hitsound = 'sound/weapons/bladeslice.ogg' usesound = 'sound/items/crowbar.ogg' @@ -542,6 +543,7 @@ w_class = WEIGHT_CLASS_BULKY // can't fit in backpacks force_unwielded = 15 //still pretty robust force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body! + hitsound = null // Handled in the snowflaked attack proc wieldsound = 'sound/weapons/chainsawstart.ogg' hitsound = null armour_penetration = 35 diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index e970ac911dc..11eb03c94c5 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -79,7 +79,6 @@ var/beepsound = 'sound/items/timer.ogg' var/deliberate = FALSE var/max_cycles = 10 - var/max_fire_range = 9 var/area/syndicate_depot/core/depotarea /obj/effect/overload/New() @@ -101,10 +100,6 @@ if(!deliberate) playsound(loc, beepsound, 50, 0) cycles++ - var/fire_range = min(cycles, max_fire_range) - - for(var/turf/simulated/turf in range(fire_range, T)) - new /obj/effect/hotspot(turf) return if(!istype(depotarea)) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index e425c3458c3..2d886f44bfd 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -187,7 +187,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama if(T.turf_type == type) return var/obj/item/thing = user.get_inactive_hand() - if(!prying_tool_list.Find(thing.tool_behaviour)) + if(!thing || !prying_tool_list.Find(thing.tool_behaviour)) return var/turf/simulated/floor/plating/P = pry_tile(thing, user, TRUE) if(!istype(P)) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 1986bd8f787..fdf3d0dc8d0 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -51,7 +51,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons #ifdef TESTING var/msg = "Permission Sets Built:\n" - for(var/rank in admin_ranks) + for(var/rank in GLOB.admin_ranks) msg += "\t[rank] - [GLOB.admin_ranks[rank]]\n" testing(msg) #endif @@ -142,12 +142,12 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons #ifdef TESTING -/client/verb/changerank(newrank in admin_ranks) +/client/verb/changerank(newrank in GLOB.admin_ranks) if(holder) holder.rank = newrank - holder.rights = admin_ranks[newrank] + holder.rights = GLOB.admin_ranks[newrank] else - holder = new /datum/admins(newrank,admin_ranks[newrank],ckey) + holder = new /datum/admins(newrank,GLOB.admin_ranks[newrank],ckey) remove_admin_verbs() holder.associate(src) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index fc268c3ba35..d7e298e8c96 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -1,4 +1,4 @@ -var/obj/machinery/gateway/centerstation/the_gateway = null +GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null) /obj/machinery/gateway name = "gateway" desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations." @@ -41,8 +41,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centerstation/New() ..() - if(!the_gateway) - the_gateway = src + if(!GLOB.the_gateway) + GLOB.the_gateway = src /obj/machinery/gateway/centerstation/Initialize() ..() @@ -54,8 +54,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null return /obj/machinery/gateway/centerstation/Destroy() - if(the_gateway == src) - the_gateway = null + if(GLOB.the_gateway == src) + GLOB.the_gateway = null return ..() /obj/machinery/gateway/centerstation/update_icon() diff --git a/code/modules/awaymissions/mission_code/ruins/gps.dm b/code/modules/awaymissions/mission_code/ruins/gps.dm new file mode 100644 index 00000000000..fa26eea5d0d --- /dev/null +++ b/code/modules/awaymissions/mission_code/ruins/gps.dm @@ -0,0 +1,13 @@ +//local gps units to let the ruins be found easier. + +/obj/item/gps/ruin + name = "navigation console" + desc = "A console for navigation in local space, gives off a weak signal that can be picked up if sufficiently close." + icon = 'icons/obj/terminals.dmi' + icon_state = "gps_console" + anchored = TRUE + local = TRUE + gpstag = "Unknown Signal" + +/obj/item/gps/ruin/attack_hand(mob/user) + attack_self(user) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 85615be1ee5..a063fafd736 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -28,13 +28,6 @@ var/adminhelped = 0 - // var/gc_destroyed //Time when this object was destroyed. [Inherits from datum] - -#ifdef TESTING - var/running_find_references - var/last_find_references = 0 -#endif - /////////////// //SOUND STUFF// /////////////// diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index 50105813fd6..8c08063ad7e 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -29,7 +29,7 @@ /datum/gear/sechud display_name = "a classic security HUD" path = /obj/item/clothing/glasses/hud/security - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent","Magistrate") /datum/gear/matches display_name = "a box of matches" @@ -42,7 +42,7 @@ /datum/gear/doublecards display_name = "a double deck of standard cards" path = /obj/item/deck/doublecards - + /datum/gear/tarot display_name = "a deck of tarot cards" path = /obj/item/deck/tarot diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index b8a022c02af..2576f791e57 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -489,7 +489,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts dat += "You are banned from special roles." be_special = list() else - for(var/i in special_roles) + for(var/i in GLOB.special_roles) if(jobban_isbanned(user, i)) dat += "Be [capitalize(i)]: \[BANNED]
" else if(!player_old_enough_antag(user.client, i)) @@ -2023,7 +2023,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts if("be_special") var/r = href_list["role"] - if(r in special_roles) + if(r in GLOB.special_roles) be_special ^= r if("name") diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index a994e875372..70eaf6fbea4 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -84,7 +84,7 @@ // Might as well scrub out any malformed be_special list entries while we're here for(var/role in be_special) - if(!(role in special_roles)) + if(!(role in GLOB.special_roles)) log_runtime(EXCEPTION("[C.key] had a malformed role entry: '[role]'. Removing!"), src) be_special -= role diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 0255109620a..456372006c6 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -104,7 +104,7 @@ /obj/item/clothing/head/soft/sec name = "security cap" - desc = "It's baseball hat in tasteful red colour." + desc = "It's a baseball hat in tasteful red colour." icon_state = "secsoft" item_color = "sec" armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50) @@ -113,7 +113,7 @@ /obj/item/clothing/head/soft/sec/corp name = "corporate security cap" - desc = "It's baseball hat in corpotate colours." + desc = "It's a baseball hat in corporate colours." icon_state = "corpsoft" item_color = "corp" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index bcb71edf356..d926730942e 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -7,7 +7,7 @@ desc = "A hazard vest used in the recovery of bodies." icon_state = "paramedic-vest" item_state = "paramedic-vest" - allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ + allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe, /obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10, fire = 50, acid = 50) @@ -21,7 +21,7 @@ desc = "A vest often worn by doctors caring for inmates." icon_state = "brigphysician-vest" item_state = "brigphysician-vest" - allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ + allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe, /obj/item/healthanalyzer, /obj/item/flashlight, \ /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50) @@ -341,7 +341,7 @@ icon_state = "fr_jacket_open" item_state = "fr_jacket_open" blood_overlay_type = "armor" - allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ + allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe, /obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) ignore_suitadjust = 0 suit_adjusted = 1 @@ -381,5 +381,5 @@ desc = "A tweed mantle, worn by the Research Director. Smells like science." icon_state = "rdmantle" item_state = "rdmantle" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser) + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 03df1bd74d8..5281a32676e 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -7,7 +7,7 @@ suit_adjusted = 1 blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) + allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50) species_exception = list(/datum/species/golem) sprite_sheets = list( diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index cd137f6e12b..72f403dfbf3 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -394,7 +394,7 @@ name = "medical winter coat" icon_state = "wintercoat_med" item_state = "coatmedical" - allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) + allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical @@ -405,7 +405,7 @@ name = "science winter coat" icon_state = "wintercoat_sci" item_state = "coatscience" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science @@ -958,7 +958,8 @@ if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing return - if(!(linked_staff in range(3, get_turf(src)))) //staff won't charge at range (to prevent it from being handed off / stolen and used) + // Do not allow the staff to recharge if it's more than 3 tiles away from the robe. If get_dist returns 0, the robe and the staff in the same tile. + if(!(get_dist(H, linked_staff) <= 3)) if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent. to_chat(H, "Your staff is unable to charge at this range. Get closer!") return diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 0c77183b578..9a675742b5e 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -25,8 +25,8 @@ return pockets.attackby(W, user, params) /obj/item/clothing/suit/storage/emp_act(severity) - pockets.emp_act(severity) ..() + pockets.emp_act(severity) /obj/item/clothing/suit/storage/hear_talk(mob/M, list/message_pieces) pockets.hear_talk(M, message_pieces) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 16eb1cd476a..727aba06b37 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -37,8 +37,8 @@ return hold.attackby(W, user, params) /obj/item/clothing/accessory/storage/emp_act(severity) - hold.emp_act(severity) ..() + hold.emp_act(severity) /obj/item/clothing/accessory/storage/hear_talk(mob/M, list/message_pieces, verb) hold.hear_talk(M, message_pieces, verb) diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 1344a8c39b0..7510c3cdfb6 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -24,7 +24,7 @@ filling_color = "#FF4500" bitesize = 100 // Always eat the apple in one bite tastes = list("apple" = 1) - distill_reagent = "hcider" + distill_reagent = "cider" // Posioned Apple /obj/item/seeds/apple/poisoned diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c4cd95eeb83..3efcc7a9ce9 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -9,12 +9,18 @@ qdel(item) QDEL_LIST(internal_organs) QDEL_LIST(stomach_contents) + QDEL_LIST(processing_patches) var/mob/living/simple_animal/borer/B = has_brain_worms() if(B) B.leave_host() qdel(B) return ..() +/mob/living/carbon/handle_atom_del(atom/A) + if(A in processing_patches) + processing_patches -= A + return ..() + /mob/living/carbon/blob_act(obj/structure/blob/B) if(stat == DEAD) return @@ -920,9 +926,10 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven return initial(pixel_y) /mob/living/carbon/emp_act(severity) - for(var/obj/item/organ/internal/O in internal_organs) - O.emp_act(severity) ..() + for(var/X in internal_organs) + var/obj/item/organ/internal/O = X + O.emp_act(severity) /mob/living/carbon/Stat() ..() @@ -1073,8 +1080,9 @@ so that different stomachs can handle things in different ways VB*/ if(can_taste_container) taste(toEat.reagents) var/fraction = min(this_bite/toEat.reagents.total_volume, 1) - toEat.reagents.reaction(src, toEat.apply_type, fraction) - toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency) + if(fraction) + toEat.reagents.reaction(src, toEat.apply_type, fraction) + toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency) /mob/living/carbon/get_access() . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 884ee802518..97ecf4dd08b 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,6 +2,7 @@ gender = MALE pressure_resistance = 15 var/list/stomach_contents = list() + var/list/processing_patches = list() var/list/internal_organs = list() var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/antibodies = 0 diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 1bb1a8cf536..c1f6acdefe5 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -400,7 +400,9 @@ var/turf/newloc = G.affecting.loc if(isturf(oldloc) && isturf(newloc)) SpinAnimation(5,1) + glide_for(6) // This and the glide_for below are purely arbitrary. Pick something that looks aesthetically pleasing. forceMove(newloc) + G.glide_for(6) G.affecting.forceMove(oldloc) message = "[src] flips over [G.affecting]!" else diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ad1d249439d..d698a68c6d5 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -206,12 +206,6 @@ emp_act if(martial_art && prob(martial_art.block_chance) && martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE)) return TRUE -/mob/living/carbon/human/emp_act(severity) - for(var/obj/O in src) - if(!O) continue - O.emp_act(severity) - ..() - /mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc var/list/damaged = list() var/list/inventory_items_to_kill = list() diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index bb3d2609010..67dd9b55312 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -84,6 +84,7 @@ var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts var/base_color //Used when setting species. + var/list/inherent_factions //Used in icon caching. var/race_key = 0 @@ -285,11 +286,19 @@ H.hud_used.update_locked_slots() H.ventcrawler = ventcrawler + if(inherent_factions) + for(var/i in inherent_factions) + H.faction += i //Using +=/-= for this in case you also gain the faction from a different source. + /datum/species/proc/on_species_loss(mob/living/carbon/human/H) if(H.butcher_results) //clear it out so we don't butcher a actual human. H.butcher_results = null H.ventcrawler = initial(H.ventcrawler) + if(inherent_factions) + for(var/i in inherent_factions) + H.faction -= i + /datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors. return diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm index 22edf961270..a8639a1a948 100644 --- a/code/modules/mob/living/carbon/human/species/diona.dm +++ b/code/modules/mob/living/carbon/human/species/diona.dm @@ -108,13 +108,4 @@ /datum/species/diona/pod //Same name and everything; we want the same limitations on them; we just want their regeneration to kick in at all times and them to have special factions pod = TRUE - -/datum/species/diona/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - C.faction |= "plants" - C.faction |= "vines" - -/datum/species/diona/pod/on_species_loss(mob/living/carbon/C) - . = ..() - C.faction -= "plants" - C.faction -= "vines" + inherent_factions = list("plants", "vines") diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 7d1d4c26a61..63f062b8bc8 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -5,6 +5,7 @@ icobase = 'icons/mob/human_races/r_shadow.dmi' deform = 'icons/mob/human_races/r_shadow.dmi' dangerous_existence = TRUE + inherent_factions = list("faithless") unarmed_type = /datum/unarmed_attack/claws @@ -49,14 +50,12 @@ if(grant_vision_toggle) vision_toggle = new vision_toggle.Grant(H) - H.faction |= "faithless" /datum/species/shadow/on_species_loss(mob/living/carbon/human/H) ..() if(grant_vision_toggle && vision_toggle) H.vision_type = null vision_toggle.Remove(H) - H.faction -= "faithless" /datum/species/shadow/handle_life(mob/living/carbon/human/H) var/light_amount = 0 diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 3a3f4c3d3ac..0a708db223f 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -13,6 +13,7 @@ icobase = 'icons/mob/human_races/r_slime.dmi' deform = 'icons/mob/human_races/r_slime.dmi' remains_type = /obj/effect/decal/remains/slime + inherent_factions = list("slime") // More sensitive to the cold cold_level_1 = 280 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 832260d3090..87832154876 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -13,6 +13,7 @@ for(var/obj/item/organ/internal/O in internal_organs) O.on_life() + handle_patches() handle_changeling() handle_wetness(times_fired) @@ -438,3 +439,22 @@ overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) else clear_fullscreen("brute") + +/mob/living/carbon/proc/handle_patches() + if(LAZYLEN(processing_patches)) + var/multiple_patch_multiplier = processing_patches.len > 1 ? (processing_patches.len * 1.5) : 1 + var/applied_amount = 0.35 * multiple_patch_multiplier + + for(var/patch in processing_patches) + var/obj/item/reagent_containers/food/pill/patch/P = patch + + if(P.reagents && P.reagents.total_volume) + var/fractional_applied_amount = applied_amount / P.reagents.total_volume + P.reagents.reaction(src, REAGENT_TOUCH, fractional_applied_amount, P.needs_to_apply_reagents) + P.needs_to_apply_reagents = FALSE + P.reagents.trans_to(src, applied_amount * 0.5) + P.reagents.remove_any(applied_amount * 0.5) + else + if(!P.reagents || P.reagents.total_volume <= 0) + processing_patches -= P + qdel(P) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 22a48f9d9ee..8371cacaebe 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -406,6 +406,8 @@ QDEL_LIST(C.reagents.addiction_list) C.reagents.addiction_threshold_accumulated.Cut() + QDEL_LIST(C.processing_patches) + // rejuvenate: Called by `revive` to get the mob into a revivable state // the admin "rejuvenate" command calls `revive`, not this proc. /mob/living/proc/rejuvenate() @@ -511,7 +513,7 @@ return -/mob/living/Move(atom/newloc, direct) +/mob/living/Move(atom/newloc, direct, movetime) if(buckled && buckled.loc != newloc) //not updating position if(!buckled.anchored) return buckled.Move(newloc, direct) @@ -544,7 +546,7 @@ var/mob/living/M = pulling if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) M.makeTrail(T) - pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position + pulling.Move(T, get_dir(pulling, T), movetime) // the pullee tries to reach our previous position if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up stop_pulling() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 6e4f13d735f..604fd47de16 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -73,10 +73,9 @@ return shock_damage /mob/living/emp_act(severity) - var/list/L = src.get_contents() - for(var/obj/O in L) - O.emp_act(severity) ..() + for(var/obj/O in contents) + O.emp_act(severity) /obj/item/proc/get_volume_by_throwforce_and_or_w_class() if(throwforce && w_class) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ddc96a7948f..85c4ceac427 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -571,13 +571,13 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( return FALSE /mob/living/silicon/ai/emp_act(severity) + ..() if(prob(30)) switch(pick(1,2)) if(1) view_core() if(2) ai_call_shuttle() - ..() /mob/living/silicon/ai/ex_act(severity) ..() diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index 2b5fd9bb702..f5ac3e5532b 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -137,9 +137,9 @@ ..() /mob/living/silicon/robot/syndicate/saboteur/emp_act() + ..() if(cham_proj) cham_proj.disrupt(src) - ..() /mob/living/silicon/robot/syndicate/saboteur/bullet_act() if(cham_proj) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 65267911d7f..6457afc87d4 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -76,17 +76,17 @@ return FALSE //So borgs they don't die trying to fix wiring /mob/living/silicon/emp_act(severity) + ..() switch(severity) if(1) - src.take_organ_damage(20) + take_organ_damage(20) Stun(8) if(2) - src.take_organ_damage(10) + take_organ_damage(10) Stun(3) flash_eyes(affect_silicon = 1) to_chat(src, "*BZZZT*") to_chat(src, "Warning: Electromagnetic pulse detected.") - ..() /mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index ede055dac43..07210674303 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -495,7 +495,7 @@ Pass a positive integer as an argument to override a bot's default speed. if(!path) return 0 if(path.len > 1) - step_towards(src, path[1]) + Move(path[1], get_dir(src, path[1]), BOT_STEP_DELAY) if(get_turf(src) == path[1]) //Successful move increment_path() tries = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index ece990c7743..8d2ba52709f 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -25,23 +25,23 @@ var/list/human_overlays = list() /mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired) - if(!is_zombie && isturf(src.loc) && stat != DEAD) - for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile - if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) - Zombify(H) - break - var/cycles = 4 - if(cycles >= 4) - for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile - if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD)) - visible_message("[src] consumes [target] whole!") - if(health < maxHealth) - health += 10 - qdel(K) - break - cycles = 0 - cycles++ - ..() + if(..()) + if(!is_zombie && isturf(src.loc)) + for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) + Zombify(H) + break + var/cycles = 4 + if(cycles >= 4) + for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile + if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD)) + visible_message("[src] consumes [target] whole!") + if(health < maxHealth) + health += 10 + qdel(K) + break + cycles = 0 + cycles++ /mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A) if(check_friendly_fire) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index d03e7ada419..4e1aee2c822 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -314,7 +314,7 @@ for(var/mob/living/L in view(7,src)) - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs + if(L.stat == DEAD) // Ignore dead mobs continue if(L in Friends) // No eating friends! diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d08ef11db0f..8e97a88b4ac 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -964,8 +964,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ for(var/obj/effect/proc_holder/spell/S in mind.spell_list) add_spell_to_statpanel(S) - - if(is_admin(src)) + // Allow admins + PR reviewers to VIEW the panel. Doesnt mean they can click things. + if(is_admin(src) || check_rights(R_VIEWRUNTIMES, FALSE)) if(statpanel("MC")) //looking at that panel var/turf/T = get_turf(client.eye) stat("Location:", COORD(T)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 69996ce1729..471ddc42557 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -143,8 +143,10 @@ move_delay = world.time mob.last_movement = world.time + delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds + if(locate(/obj/item/grab, mob)) - move_delay = max(move_delay, world.time + 7) + delay += 7 var/list/L = mob.ret_grab() if(istype(L, /list)) if(L.len == 2) @@ -153,14 +155,14 @@ if(M) if((get_dist(mob, M) <= 1 || M.loc == mob.loc)) var/turf/prev_loc = mob.loc - . = ..() + . = mob.SelfMove(n, direct, delay) if(M && isturf(M.loc)) // Mob may get deleted during parent call var/diag = get_dir(mob, M) if((diag - 1) & diag) else diag = null if((get_dist(mob, M) > 1 || diag)) - step(M, get_dir(M.loc, prev_loc)) + M.Move(prev_loc, get_dir(M.loc, prev_loc), delay) else for(var/mob/M in L) M.other_mobs = 1 @@ -168,12 +170,10 @@ M.animate_movement = 3 for(var/mob/M in L) spawn(0) - step(M, direct) - return + M.Move(get_step(M,direct), direct, delay) spawn(1) M.other_mobs = null M.animate_movement = 2 - return else if(mob.confused) var/newdir = 0 @@ -186,11 +186,8 @@ if(newdir) direct = newdir n = get_step(mob, direct) - - delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds - mob.glide_size = world.icon_size/max(DS2TICKS(delay),1) //Down to whatever decimal - . = ..() + . = mob.SelfMove(n, direct, delay) mob.setDir(direct) if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully @@ -214,8 +211,8 @@ O.on_mob_move(direct, mob) - - +/mob/proc/SelfMove(turf/n, direct, movetime) + return Move(n, direct, movetime) ///Process_Grab() ///Called by client/Move() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index de894e80106..eefb4d299a4 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -7,6 +7,12 @@ pressure_resistance = 2 resistance_flags = FLAMMABLE +/obj/item/folder/emp_act(severity) + ..() + for(var/i in contents) + var/atom/A = i + A.emp_act(severity) + /obj/item/folder/blue desc = "A blue folder." icon_state = "folder_blue" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index f91d7e66734..7a013f3083c 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -41,7 +41,7 @@ to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") return else - no_den_usage = 0 + no_den_usage = FALSE zap_self(user) else ..() @@ -118,7 +118,7 @@ ammo_type = /obj/item/ammo_casing/magic/teleport icon_state = "telewand" max_charges = 10 //10, 5, 5, 4 - no_den_usage = 1 + no_den_usage = TRUE fire_sound = 'sound/magic/wand_teleport.ogg' /obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) @@ -140,6 +140,7 @@ fire_sound = 'sound/magic/staff_door.ogg' icon_state = "doorwand" max_charges = 20 //20, 10, 10, 7 + no_den_usage = TRUE /obj/item/gun/magic/wand/door/zap_self(mob/living/user) to_chat(user, "You feel vaguely more open with your feelings.") diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index ca626534320..dc03a76fb48 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -94,25 +94,29 @@ user.visible_message("[usr] draws back the string of [src]!","[src] clunks as you draw the string to its maximum tension!!") update_icon() -/obj/item/gun/throw/crossbow/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/stock_parts/cell)) - if(!cell) - user.drop_item() - W.loc = src - cell = W - to_chat(user, "You jam [cell] into [src] and wire it to the firing coil.") - process_chamber() - else - to_chat(user, "[src] already has a cell installed.") - else if(istype(W, /obj/item/screwdriver)) - if(cell) - cell.loc = get_turf(src) - to_chat(user, "You jimmy [cell] out of [src] with [W].") - cell = null - else - to_chat(user, "[src] doesn't have a cell installed.") - else - ..() +/obj/item/gun/throw/crossbow/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/stock_parts/cell)) + return ..() + + if(cell) + to_chat(user, "[src] already has a cell installed.") + return + + user.drop_item() + I.forceMove(src) + cell = I + to_chat(user, "You jam [cell] into [src] and wire it to the firing coil.") + process_chamber() + +/obj/item/gun/throw/crossbow/screwdriver_act(mob/user, obj/item/I) + . = ..() + if(!cell) + to_chat(user, "[src] doesn't have a cell installed.") + return + + cell.forceMove(get_turf(src)) + to_chat(user, "You jimmy [cell] out of [src] with [I].") + cell = null /obj/item/gun/throw/crossbow/verb/set_tension() set name = "Adjust Tension" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index ddd78b2018f..d18c9c1832b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -8,13 +8,19 @@ var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = T20C + var/temperature_min = 0 + var/temperature_max = 10000 var/list/datum/reagent/addiction_list = new/list() var/list/addiction_threshold_accumulated = new/list() var/flags var/list/reagents_generated_per_cycle = new/list() -/datum/reagents/New(maximum = 100) +/datum/reagents/New(maximum = 100, temperature_minimum, temperature_maximum) maximum_volume = maximum + if(temperature_minimum) + temperature_min = temperature_minimum + if(temperature_maximum) + temperature_max = temperature_maximum if(!(flags & REAGENT_NOREACT)) START_PROCESSING(SSobj, src) //I dislike having these here but map-objects are initialised before world/New() is called. >_> @@ -179,7 +185,7 @@ return amount /datum/reagents/proc/set_reagent_temp(new_temp = T0C, react = TRUE) - chem_temp = new_temp + chem_temp = Clamp(new_temp, temperature_min, temperature_max) if(react) temperature_react() handle_reactions() @@ -197,7 +203,7 @@ else if(exposed_temperature < chem_temp) chem_temp -= change - chem_temp = max(min(chem_temp, 10000), 0) //Cap for the moment. + chem_temp = max(min(chem_temp, temperature_max), temperature_min) //Cap for the moment. temperature_react() handle_reactions() @@ -569,7 +575,7 @@ can_process = 1 return can_process -/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1) +/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1, show_message = TRUE) var/react_type if(isliving(A)) react_type = "LIVING" @@ -614,7 +620,7 @@ var/check = reaction_check(A, R) if(!check) continue - R.reaction_mob(A, method, R.volume * volume_modifier) + R.reaction_mob(A, method, R.volume * volume_modifier, show_message) if("TURF") R.reaction_turf(A, R.volume * volume_modifier) if("OBJ") @@ -632,7 +638,7 @@ if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. if(amount <= 0) return 0 - chem_temp = (chem_temp * total_volume + reagtemp * amount) / (total_volume + amount) //equalize with new chems + chem_temp = Clamp((chem_temp * total_volume + reagtemp * amount) / (total_volume + amount), temperature_min, temperature_max) //equalize with new chems for(var/A in reagent_list) @@ -870,8 +876,8 @@ // Convenience proc to create a reagents holder for an atom // Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - reagents = new/datum/reagents(max_vol) +/atom/proc/create_reagents(max_vol, temperature_minimum, temperature_maximum) + reagents = new /datum/reagents(max_vol, temperature_minimum, temperature_maximum) reagents.my_atom = src /proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 435a253bed5..cf7ff936b6d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -347,8 +347,8 @@ if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? var/amount_per_patch = reagents.total_volume/count - if(amount_per_patch > 40) - amount_per_patch = 40 + if(amount_per_patch > 30) + amount_per_patch = 30 var/name = clean_input("Name:", "Name your patch!", "[reagents.get_master_reagent_name()] ([amount_per_patch]u)") if(!name) return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4271b26ba17..8cdb69062ff 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -43,7 +43,7 @@ /datum/reagent/proc/reaction_temperature(exposed_temperature, exposed_volume) //By default we do nothing. return -/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. +/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume, show_message = TRUE) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. if(holder) //for catching rare runtimes if(method == REAGENT_TOUCH && penetrates_skin) var/block = M.get_permeability_protection() diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index c9e7ac0c1dc..262acae5f82 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -9,7 +9,7 @@ var/total_depletion_rate = (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio // Cache it handle_addiction(M, total_depletion_rate) - + sate_addiction(M) holder.remove_reagent(id, total_depletion_rate) //medicine reagents stay longer if you have a better metabolism return STATUS_UPDATE_NONE @@ -178,7 +178,7 @@ id = "silver_sulfadiazine" description = "This antibacterial compound is used to treat burn victims." reagent_state = LIQUID - color = "#F0C814" + color = "#F0DC00" metabolization_rate = 3 harmless = FALSE //toxic if ingested, and I am NOT going to account for the difference taste_description = "burn cream" @@ -205,7 +205,7 @@ id = "styptic_powder" description = "Styptic (aluminum sulfate) powder helps control bleeding and heal physical wounds." reagent_state = LIQUID - color = "#C8A5DC" + color = "#FF9696" metabolization_rate = 3 harmless = FALSE taste_description = "wound cream" @@ -221,7 +221,7 @@ M.adjustBruteLoss(-volume) if(show_message) to_chat(M, "The styptic powder stings like hell as it closes some of your wounds!") - M.emote("scream") + M.emote("scream") if(method == REAGENT_INGEST) M.adjustToxLoss(0.5*volume) if(show_message) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index db65f761e2e..a091f65a34c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -11,6 +11,8 @@ var/spawned_disease = null var/disease_amount = 20 var/has_lid = FALSE // Used for containers where we want to put lids on and off + var/temperature_min = 0 // To limit the temperature of a reagent container can atain when exposed to heat/cold + var/temperature_max = 10000 /obj/item/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -30,7 +32,7 @@ ..() if(!possible_transfer_amounts) verbs -= /obj/item/reagent_containers/verb/set_APTFT - create_reagents(volume) + create_reagents(volume, temperature_min, temperature_max) if(spawned_disease) var/datum/disease/F = new spawned_disease(0) var/list/data = list("viruses" = list(F), "blood_color" = "#A10808") diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm new file mode 100644 index 00000000000..73c3c3759b1 --- /dev/null +++ b/code/modules/reagents/reagent_containers/applicator.dm @@ -0,0 +1,106 @@ +/obj/item/reagent_containers/applicator + name = "auto-mender" + desc = "A small electronic device designed to topically apply healing chemicals." + icon = 'icons/goonstation/objects/objects.dmi' + icon_state = "mender" + item_state = "mender" + volume = 200 + resistance_flags = ACID_PROOF + container_type = REFILLABLE | AMOUNT_VISIBLE + temperature_min = 270 + temperature_max = 350 + var/ignore_flags = FALSE + var/emagged = FALSE + var/applied_amount = 8 // How much it applies + var/applying = FALSE // So it can't be spammed. + var/measured_health = 0 // Used for measuring health; we don't want this to stop applying once the person's health isn't changing. + +/obj/item/reagent_containers/applicator/emag_act(mob/user) + if(!emagged) + emagged = TRUE + ignore_flags = TRUE + to_chat(user, "You short out the safeties on [src].") + +/obj/item/reagent_containers/applicator/on_reagent_change() + if(!emagged) + var/found_forbidden_reagent = FALSE + for(var/datum/reagent/R in reagents.reagent_list) + if(!GLOB.safe_chem_applicator_list.Find(R.id)) + reagents.del_reagent(R.id) + found_forbidden_reagent = TRUE + if(found_forbidden_reagent) + if(ismob(loc)) + to_chat(loc, "[src] identifies and removes a harmful substance.") + else + visible_message("[src] identifies and removes a harmful substance.") + update_icon() + +/obj/item/reagent_containers/applicator/update_icon() + cut_overlays() + + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/goonstation/objects/objects.dmi', "mender-fluid") + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) + +/obj/item/reagent_containers/applicator/attack(mob/living/M, mob/user) + if(!reagents.total_volume) + to_chat(user, "[src] is empty!") + return + if(applying) + to_chat(user, "You're already applying [src].") + return + if(!iscarbon(M)) + return + + if(ignore_flags || M.can_inject(user, TRUE)) + if(M == user) + M.visible_message("[user] begins mending [user.p_them()]self with [src].", "You begin mending yourself with [src].") + else + user.visible_message("[user] begins mending [M] with [src].", "You begin mending [M] with [src].") + if(M.reagents) + applying = TRUE + icon_state = "mender-active" + apply_to(M, user, 0.2) // We apply a very weak application up front, then loop. + while(do_after(user, 10, target = M)) + measured_health = M.health + apply_to(M, user, 1, FALSE) + if((measured_health == M.health) || !reagents.total_volume) + to_chat(user, "[M] is finished healing and [src] powers down automatically.") + break + applying = FALSE + icon_state = "mender" + user.changeNext_move(CLICK_CD_MELEE) + + +/obj/item/reagent_containers/applicator/proc/apply_to(mob/living/carbon/M, mob/user, multiplier = 1, show_message = TRUE) + var/total_applied_amount = applied_amount * multiplier + + if(reagents && reagents.total_volume) + var/list/injected = list() + for(var/datum/reagent/R in reagents.reagent_list) + injected += R.name + + var/contained = english_list(injected) + // allow normal logging only if reagents are not harmless and automender is emagged + add_attack_logs(user, M, "Automends with [src] containing ([contained])", (emagged && !(reagents.harmless_helper())) ? null : ATKLOG_ALMOSTALL) + + var/fractional_applied_amount = total_applied_amount / reagents.total_volume + + reagents.reaction(M, REAGENT_TOUCH, fractional_applied_amount, show_message) + reagents.trans_to(M, total_applied_amount * 0.5) + reagents.remove_any(total_applied_amount * 0.5) + + playsound(get_turf(src), pick('sound/goonstation/items/mender.ogg', 'sound/goonstation/items/mender2.ogg'), 50, 1) + +/obj/item/reagent_containers/applicator/brute + name = "brute auto-mender" + list_reagents = list("styptic_powder" = 200) + +/obj/item/reagent_containers/applicator/burn + name = "burn auto-mender" + list_reagents = list("silver_sulfadiazine" = 200) + +/obj/item/reagent_containers/applicator/dual + name = "dual auto-mender" + list_reagents = list("synthflesh" = 200) diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index b020015e929..582e157004c 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -5,10 +5,24 @@ icon_state = "bandaid" item_state = "bandaid" possible_transfer_amounts = null - volume = 40 + volume = 30 apply_type = REAGENT_TOUCH apply_method = "apply" transfer_efficiency = 0.5 //patches aren't as effective at getting chemicals into the bloodstream. + temperature_min = 270 + temperature_max = 350 + var/needs_to_apply_reagents = TRUE + +/obj/item/reagent_containers/food/pill/patch/attack(mob/living/carbon/M, mob/user, def_zone) + if(!istype(M)) + return FALSE + bitesize = 0 + if(M.eat(src, user)) + user.drop_item() + forceMove(M) + M.processing_patches += src + return TRUE + return FALSE /obj/item/reagent_containers/food/pill/patch/afterattack(obj/target, mob/user , proximity) return // thanks inheritance again @@ -18,29 +32,37 @@ desc = "Helps with brute injuries." icon_state = "bandaid_brute" instant_application = 1 - list_reagents = list("styptic_powder" = 40) + list_reagents = list("styptic_powder" = 30) + +/obj/item/reagent_containers/food/pill/patch/styptic/small + name = "healing mini-patch" + list_reagents = list("styptic_powder" = 15) /obj/item/reagent_containers/food/pill/patch/silver_sulf name = "burn patch" desc = "Helps with burn injuries." icon_state = "bandaid_burn" instant_application = 1 - list_reagents = list("silver_sulfadiazine" = 40) + list_reagents = list("silver_sulfadiazine" = 30) + +/obj/item/reagent_containers/food/pill/patch/silver_sulf/small + name = "burn mini-patch" + list_reagents = list("silver_sulfadiazine" = 15) /obj/item/reagent_containers/food/pill/patch/synthflesh name = "synthflesh patch" desc = "Helps with brute and burn injuries." icon_state = "bandaid_med" instant_application = 1 - list_reagents = list("synthflesh" = 20) + list_reagents = list("synthflesh" = 10) /obj/item/reagent_containers/food/pill/patch/nicotine name = "nicotine patch" desc = "Helps temporarily curb the cravings of nicotine dependency." - list_reagents = list("nicotine" = 20) + list_reagents = list("nicotine" = 10) /obj/item/reagent_containers/food/pill/patch/jestosterone name = "jestosterone patch" desc = "Helps with brute injuries if the affected person is a clown, otherwise inflicts various annoying effects." icon_state = "bandaid_clown" - list_reagents = list("jestosterone" = 30) + list_reagents = list("jestosterone" = 20) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 0fdca68811c..403df48be69 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -95,6 +95,12 @@ CHECK_TICK ..() +/obj/item/smallDelivery/emp_act(severity) + ..() + for(var/i in contents) + var/atom/A = i + A.emp_act(severity) + /obj/item/smallDelivery/attack_self(mob/user as mob) if(wrapped && wrapped.loc) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.loc = user.loc diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 2e7c668a83f..d907e46247e 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -607,6 +607,14 @@ build_path = /obj/item/reagent_containers/hypospray/safety category = list("initial", "Medical") +/datum/design/automender + name = "Auto-mender" + id = "automender" + build_type = AUTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 1000) + build_path = /obj/item/reagent_containers/applicator + category = list("initial", "Medical") + /datum/design/prox_sensor name = "Proximity Sensor" id = "prox_sensor" @@ -914,4 +922,3 @@ materials = list(MAT_METAL = 40000) build_path = /obj/item/golem_shell category = list("Imported") - diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm index 532e50831e5..d053e139f61 100644 --- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm @@ -17,7 +17,7 @@ /obj/item/grenade/chem_grenade/cryo = 5, /obj/item/grenade/chem_grenade/adv_release = 5, /obj/item/reagent_containers/food/drinks/bottle/holywater = 1) - product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning." + slogan_list = list("It's not pyromania if you're getting paid!","You smell that? Plasma, son. Nothing else in the world smells like that.","I love the smell of Plasma in the morning.") resistance_flags = FIRE_PROOF // Spawners diff --git a/code/modules/shuttle/ert.dm b/code/modules/shuttle/ert.dm index 1f664a69c8f..356ca9687dc 100644 --- a/code/modules/shuttle/ert.dm +++ b/code/modules/shuttle/ert.dm @@ -6,6 +6,14 @@ resistance_flags = INDESTRUCTIBLE flags = NODECONSTRUCT +/obj/machinery/computer/shuttle/ert/Topic(href, href_list) + if(href_list["move"]) + var/authorized_roles = list(SPECIAL_ROLE_ERT, SPECIAL_ROLE_DEATHSQUAD) + if(!((usr.mind.assigned_role in authorized_roles) || is_admin(usr))) + message_admins("Potential ERT shuttle hijack, ERT shuttle moved by unauthorized user: [key_name_admin(usr)]") + ..() + + /obj/machinery/computer/camera_advanced/shuttle_docker/ert name = "specops navigation computer" desc = "Used to designate a precise transit location for the specops shuttle." diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 94920587b54..9b7ba72209b 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -1,6 +1,6 @@ GLOBAL_LIST_EMPTY(GPS_list) /obj/item/gps - name = "global positioning system" + name = "default gps" desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/telescience.dmi' icon_state = "gps-c" @@ -16,7 +16,8 @@ GLOBAL_LIST_EMPTY(GPS_list) /obj/item/gps/New() ..() GLOB.GPS_list.Add(src) - name = "global positioning system ([gpstag])" + if(name == "default gps") //use default naming scheme + name = "global positioning system ([gpstag])" overlays += "working" /obj/item/gps/Destroy() diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index 450a6c88372..37c9d97e5c6 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -92,7 +92,7 @@ bed = null . = ..() if(bed && get_dist(oldloc, loc) <= 2) - bed.Move(oldloc) + bed.Move(oldloc, get_dir(bed, oldloc), (last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay)) bed.dir = Dir if(bed.has_buckled_mobs()) for(var/m in bed.buckled_mobs) diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm index 12ed9f727eb..d7ba87b818c 100644 --- a/code/modules/vehicle/janicart.dm +++ b/code/modules/vehicle/janicart.dm @@ -44,7 +44,7 @@ origin_tech = "materials=3;engineering=4" /obj/vehicle/janicart/Move(atom/OldLoc, Dir) - ..() + . = ..() if(floorbuffer) var/turf/tile = loc if(isturf(tile)) diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 79021affa25..cdbb8580da6 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -153,7 +153,8 @@ unbuckle_mob(user) return - if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay))) + var/delay = (last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay) + if(world.time < last_vehicle_move + delay) return last_vehicle_move = world.time @@ -161,7 +162,7 @@ var/turf/next = get_step(src, direction) if(!Process_Spacemove(direction) || !isturf(loc)) return - step(src, direction) + Move(get_step(src, direction), direction, delay) if((direction & (direction - 1)) && (loc == next)) //moved diagonally last_move_diagonal = TRUE @@ -185,7 +186,7 @@ to_chat(user, "You'll need the keys in one of your hands to drive [src].") -/obj/vehicle/Move(NewLoc, Dir = 0, step_x = 0, step_y = 0) +/obj/vehicle/Move(NewLoc, Dir = 0, movetime) . = ..() handle_vehicle_layer() handle_vehicle_offsets() diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index 8caccf84766..74c9d844728 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -305,7 +305,14 @@ var/to_chat_src target << output(output_message, "browseroutput:output") /proc/to_chat(target, message, flag) - if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized) + /* + If any of the following conditions are met, do NOT use SSchat. These conditions include: + - Is the MC still initializing? + - Has SSchat initialized? + - Has SSchat been offlined due to MC crashes? + If any of these are met, use the old chat system, otherwise people wont see messages + */ + if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized || SSchat?.flags & SS_NO_FIRE) to_chat_immediate(target, message, flag) return SSchat.queue(target, message, flag) diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi index 8dadb400668..2707ce8b9b8 100644 Binary files a/icons/goonstation/objects/objects.dmi and b/icons/goonstation/objects/objects.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 6d43df756c7..2f7d8f34907 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi index 45baaf3f7ba..c47cd86e6d3 100644 Binary files a/icons/obj/terminals.dmi and b/icons/obj/terminals.dmi differ diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl index 1d040d52af7..e91a43d357b 100644 --- a/nano/templates/chem_master.tmpl +++ b/nano/templates/chem_master.tmpl @@ -56,7 +56,7 @@ - {{:helper.link('Create patch (40u max)', 'arrow-right', {'createpatch': 1})}} + {{:helper.link('Create patch (30u max)', 'arrow-right', {'createpatch': 1})}} {{:helper.link('Multiple', 'arrow-right', {'createpatch_multiple': 1})}} diff --git a/paradise.dme b/paradise.dme index a45f38d31a3..4437d0593ee 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1314,6 +1314,7 @@ #include "code\modules\awaymissions\mission_code\wildwest.dm" #include "code\modules\awaymissions\mission_code\ghost_role_spawners\golems.dm" #include "code\modules\awaymissions\mission_code\ghost_role_spawners\oldstation.dm" +#include "code\modules\awaymissions\mission_code\ruins\gps.dm" #include "code\modules\awaymissions\mission_code\ruins\oldstation.dm" #include "code\modules\awaymissions\mission_code\ruins\wizardcrash.dm" #include "code\modules\buildmode\bm_mode.dm" @@ -2316,6 +2317,7 @@ #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" #include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" +#include "code\modules\reagents\reagent_containers\applicator.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" diff --git a/sound/goonstation/items/mender.ogg b/sound/goonstation/items/mender.ogg new file mode 100644 index 00000000000..93114a2c74c Binary files /dev/null and b/sound/goonstation/items/mender.ogg differ diff --git a/sound/goonstation/items/mender2.ogg b/sound/goonstation/items/mender2.ogg new file mode 100644 index 00000000000..5b994b10520 Binary files /dev/null and b/sound/goonstation/items/mender2.ogg differ diff --git a/tools/travis/check_grep.sh b/tools/travis/check_grep.sh index 22d02647bcf..5b5c232c374 100755 --- a/tools/travis/check_grep.sh +++ b/tools/travis/check_grep.sh @@ -14,12 +14,10 @@ if grep -P 'step_[xy]' _maps/**/*.dmm; then echo "ERROR: step_x/step_y variables detected in maps, please remove them." st=1 fi; -#### TODO: Uncomment after managing all globs #### -#if grep -P '^/*var/' code/**/*.dm; then - #echo "ERROR: Unmanaged global var use detected in code, please use the helpers." - #st=1 -#fi; -#### +if grep -P '^/*var/' code/**/*.dm; then + echo "ERROR: Unmanaged global var use detected in code, please use the helpers." + st=1 +fi; nl=' ' nl=$'\n' @@ -31,4 +29,4 @@ while read f; do fi; done < <(find . -type f -name '*.dm') -exit $st \ No newline at end of file +exit $st