diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 8ab919f9061..cbc691e3c2a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -28,6 +28,9 @@ // Different tails __init_body_accessory(/datum/body_accessory/tail) + // Setup species:accessory relations + initialize_body_accessory_by_species() + for(var/path in (subtypesof(/datum/surgery))) GLOB.surgeries_list += new path() diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index f7c66c3378b..a38eeb99ced 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -579,7 +579,8 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list()) LogMouseMacro(".mouse", params) /proc/update_all_mob_security_hud() - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing H.sec_hud_set_security_status() /proc/getviewsize(view) diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm index 951a7fb1786..25ccda3349c 100644 --- a/code/controllers/subsystem/afk.dm +++ b/code/controllers/subsystem/afk.dm @@ -21,7 +21,8 @@ SUBSYSTEM_DEF(afk) /datum/controller/subsystem/afk/fire() var/list/toRemove = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!H?.ckey) // Useless non ckey creatures continue diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 19935bda130..3b5c9d2f5fb 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -131,6 +131,5 @@ /atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time) - spawn(0) - newbeam.Start() + INVOKE_ASYNC(newbeam, /datum/beam.proc/Start) return newbeam diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 34c41c581f2..318dd176e45 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -395,8 +395,9 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/advance/AD in GLOB.active_diseases) AD.Refresh() - for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) - if(!is_station_level(H.z)) + for(var/thing in shuffle(GLOB.human_list)) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD || !is_station_level(H.z)) continue if(!H.HasDisease(D)) H.ForceContractDisease(D) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index b81587440d4..799a12f4db9 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -175,6 +175,7 @@ description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \ hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?" cost = 2 + allow_duplicates = FALSE /datum/map_template/ruin/space/wizardcrash id = "wizardcrash" diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a18a9d74f28..c8045dfe1e4 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1767,6 +1767,16 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY cost = 20 containername = "polo supply crate" +/datum/supply_packs/misc/boxing //For non log spamming cargo brawls! + name = "Boxing Supply Crate" + // 4 boxing gloves + contains = list(/obj/item/clothing/gloves/boxing/blue, + /obj/item/clothing/gloves/boxing/green, + /obj/item/clothing/gloves/boxing/yellow, + /obj/item/clothing/gloves/boxing) + cost = 15 + containername = "boxing supply crate" + ///////////// Station Goals /datum/supply_packs/misc/station_goal diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ab5ff19462a..00009c8eeca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -567,3 +567,6 @@ /atom/movable/proc/portal_destroyed(obj/effect/portal/P) return + +/atom/movable/proc/decompile_act(obj/item/matter_decompiler/C, mob/user) // For drones to decompile mobs and objs. See drone for an example. + return FALSE diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2d71df8c979..57a77167346 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -291,7 +291,8 @@ /////////////////////////////////// /datum/game_mode/proc/get_living_heads() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing var/list/real_command_positions = GLOB.command_positions.Copy() - "Nanotrasen Representative" if(player.stat != DEAD && player.mind && (player.mind.assigned_role in real_command_positions)) . |= player.mind @@ -312,7 +313,8 @@ ////////////////////////////////////////////// /datum/game_mode/proc/get_living_sec() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind @@ -321,7 +323,8 @@ //////////////////////////////////////// /datum/game_mode/proc/get_all_sec() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index a4b8c594b89..526a2c01083 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -83,6 +83,36 @@ else add_ranged_ability(user, enable_text) +/datum/action/innate/ai/choose_modules + name = "Choose Modules" + desc = "Spend your processing time to gain a variety of different abilities." + button_icon_state = "choose_module" + auto_use_uses = FALSE // This is an infinite ability. + +/datum/action/innate/ai/choose_modules/Grant(mob/living/L) + . = ..() + owner_AI.malf_picker = new /datum/module_picker + +/datum/action/innate/ai/choose_modules/Trigger() + . = ..() + owner_AI.malf_picker.use(owner_AI) + +/datum/action/innate/ai/return_to_core + name = "Return to Main Core" + desc = "Leave the APC you are shunted to, and return to your core." + icon_icon = 'icons/obj/power.dmi' + button_icon_state = "apcemag" + auto_use_uses = FALSE // Here just to prevent the "You have X uses remaining" from popping up. + +/datum/action/innate/ai/return_to_core/Trigger() + . = ..() + var/obj/machinery/power/apc/apc = owner_AI.loc + if(!istype(apc)) // This shouldn't happen but here for safety. + to_chat(src, "You are already in your Main Core.") + return + apc.malfvacate() + qdel(src) + //The datum and interface for the malf unlock menu, which lets them choose actions to unlock. /datum/module_picker var/temp @@ -96,13 +126,7 @@ if((AM.power_type && AM.power_type != /datum/action/innate/ai) || AM.upgrade) possible_modules += AM -/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI) //Removes all malfunction-related abilities from the target AI. - for(var/datum/AI_Module/AM in possible_modules) - for(var/datum/action/A in AI.actions) - if(istype(A, initial(AM.power_type))) - qdel(A) - -/datum/module_picker/proc/use(user as mob) +/datum/module_picker/proc/use(mob/user) var/dat dat += {"Select use of processing time: (currently #[processing_time] left.)

diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index e8f4c22e377..f6e454bd737 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -357,7 +357,8 @@ var/list/name_counts = list() var/list/names = list() - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!trackable(H)) continue diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index b09bb7a851f..213814d52e8 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -385,7 +385,8 @@ if(foecount == GLOB.score_arrested) GLOB.score_allarrested = 1 - for(var/mob/living/carbon/human/player in GLOB.mob_living_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind) var/role = player.mind.assigned_role if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) @@ -415,7 +416,8 @@ for(var/datum/mind/M in SSticker.mode:revolutionaries) if(M.current && M.current.stat != DEAD) revcount++ - for(var/mob/living/carbon/human/player in GLOB.mob_living_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind) var/role = player.mind.assigned_role if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index d9e59e9ded1..2e370db5f7a 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -41,7 +41,8 @@ GLOB.score_deadaipenalty++ GLOB.score_deadcrew++ - for(var/mob/living/carbon/human/I in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/I = thing if(I.stat == DEAD && is_station_level(I.z)) GLOB.score_deadcrew++ @@ -60,7 +61,8 @@ var/dmg_score = 0 if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME) - for(var/mob/living/carbon/human/E in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/E = thing cash_score = 0 dmg_score = 0 var/turf/location = get_turf(E.loc) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 7e0f00f8721..07c61628337 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -354,10 +354,10 @@ var/datum/objective/protect/serve_objective = new serve_objective.owner = user.mind serve_objective.target = H.mind - serve_objective.explanation_text = "You have been Enthralled by [user]. Follow [user.p_their()] every command." + serve_objective.explanation_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." H.mind.objectives += serve_objective - to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") + to_chat(H, "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command.") to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.") H.Stun(2) add_attack_logs(user, H, "Vampire-thralled") diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 09b228bdd0c..a81b12ed041 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -866,8 +866,9 @@ GLOBAL_LIST_EMPTY(multiverse) possible = list() if(!link) return - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(md5(H.dna.uni_identity) in link.fingerprints) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat != DEAD && (md5(H.dna.uni_identity) in link.fingerprints)) possible |= H /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index c510518716a..fef9c2302b3 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -32,7 +32,7 @@ minimal_player_age = 21 exp_requirements = 300 exp_type = EXP_TYPE_CREW - alt_titles = list("Android", "Robot") + alt_titles = list("Robot") /datum/job/cyborg/equip(mob/living/carbon/human/H) if(!H) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 131956ca3c1..d6a1ccdd33c 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -27,7 +27,7 @@ return tgui_interact(user) -/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) crew_monitor.tgui_interact(user, ui_key, ui, force_open) /obj/machinery/computer/crew/interact(mob/user) diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm index dc933099faa..05c7552aacc 100644 --- a/code/game/machinery/tcomms/_base.dm +++ b/code/game/machinery/tcomms/_base.dm @@ -52,6 +52,19 @@ GLOBAL_LIST_EMPTY(tcomms_machines) . = ..() GLOB.tcomms_machines += src update_icon() + if((!mapload) && (usr)) + // To the person who asks "Hey affected, why are you using this massive operator when you can use AREACOORD?" Well, ill tell you + // get_area_name is fucking broken and uses a for(x in world) search + // It doesnt even work, is expensive, and returns 0 + // Im not refactoring one thing which could risk breaking all admin location logs + // Fight me + log_action(usr, "constructed a new [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE) + // Add in component parts for the sake of deconstruction + component_parts = list() + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + component_parts += new /obj/item/stack/cable_coil(null, 1) /** * Base Destructor @@ -60,6 +73,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines) */ /obj/machinery/tcomms/Destroy() GLOB.tcomms_machines -= src + if(usr) + log_action(usr, "destroyed a [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE) return ..() /** @@ -462,3 +477,20 @@ GLOBAL_LIST_EMPTY(tcomms_machines) break return ..() +/** + * Screwdriver Act Handler + * + * Handles the screwdriver action for all tcomms machines, so they can be open and closed to be deconstructed + */ +/obj/machinery/tcomms/screwdriver_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_screwdriver(user, icon_state, icon_state, I) + +/** + * Crowbar Act Handler + * + * Handles the crowbar action for all tcomms machines, so they can be deconstructed + */ +/obj/machinery/tcomms/crowbar_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_crowbar(user, I) diff --git a/code/game/machinery/tcomms/core.dm b/code/game/machinery/tcomms/core.dm index 88846a5de33..46cd0e6df71 100644 --- a/code/game/machinery/tcomms/core.dm +++ b/code/game/machinery/tcomms/core.dm @@ -34,6 +34,7 @@ . = ..() link_password = GenerateKey() reachable_zlevels |= loc.z + component_parts += new /obj/item/circuitboard/tcomms/core(null) /** * Destructor for the core. diff --git a/code/game/machinery/tcomms/relay.dm b/code/game/machinery/tcomms/relay.dm index 2cd2a44b1af..b2faf9ce0cd 100644 --- a/code/game/machinery/tcomms/relay.dm +++ b/code/game/machinery/tcomms/relay.dm @@ -25,6 +25,7 @@ */ /obj/machinery/tcomms/relay/Initialize(mapload) . = ..() + component_parts += new /obj/item/circuitboard/tcomms/relay(null) if(mapload && autolink_id) return INITIALIZE_HINT_LATELOAD diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 9a879a02da3..e750c15e761 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -28,6 +28,12 @@ icon_state = "remainsrobot" anchored = TRUE +/obj/effect/decal/remains/robot/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 2 + C.stored_comms["metal"] += 3 + qdel(src) + return TRUE + /obj/effect/decal/remains/slime name = "You shouldn't see this" desc = "Noooooooooooooooooooooo" diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 5ae6b0c6860..9ae89309eed 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -49,6 +49,8 @@ would spawn and follow the beaker, even if it is carried or thrown. holder = atom /datum/effect_system/proc/start() + if(QDELETED(src)) + return for(var/i in 1 to number) if(total_effects > 20) return @@ -68,7 +70,8 @@ would spawn and follow the beaker, even if it is carried or thrown. for(var/j in 1 to steps_amt) sleep(5) step(E,direction) - addtimer(CALLBACK(src, .proc/decrement_total_effect), 20) + if(!QDELETED(src)) + addtimer(CALLBACK(src, .proc/decrement_total_effect), 20) /datum/effect_system/proc/decrement_total_effect() total_effects-- diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index f267494496e..6ada54e75f7 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -10,7 +10,8 @@ /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" - for(var/mob/living/carbon/human/M in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/M = thing dat += text(" [] - []
", M.name, M.get_assignment()) var/obj/item/paper/P = new /obj/item/paper( src.loc ) P.info = dat diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 7af5d7a998f..9dd1c771b17 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -190,6 +190,16 @@ to_chat(S, "You are a spider who is loyal to [S.master_commander], obey [S.master_commander]'s every order and assist [S.master_commander.p_them()] in completing [S.master_commander.p_their()] goals at any cost.") qdel(src) +/obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!istype(user, /mob/living/silicon/robot/drone)) + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [user] into your decompiler. It makes a series of visceral crunching noises.") + C.stored_comms["wood"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) + return TRUE + return ..() + /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" desc = "Green squishy mess." diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index b83128cf4a5..9133bf37b9c 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -19,5 +19,5 @@ /obj/item/sensor_device/attack_self(mob/user as mob) tgui_interact(user) -/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) crew_monitor.tgui_interact(user, ui_key, ui, force_open) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 4d3e3181726..000ad2d225f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -17,9 +17,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 0), \ - new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 0, on_floor = TRUE), \ - new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 0, on_floor = TRUE) \ + new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \ + new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \ + new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ )) /obj/item/stack/sheet/glass diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 54d42176f52..9dabea08319 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -218,10 +218,22 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ /obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I) if(I.use_tool(src, user, volume = I.tool_volume)) - message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])") - investigate_log("was ignited by [key_name(user)]","atmos") - fire_act() + log_and_set_aflame(user, I) + return TRUE + +/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/I, mob/living/user, params) + if(is_hot(I)) + log_and_set_aflame(user, I) + else + return ..() + +/obj/item/stack/sheet/mineral/plasma/proc/log_and_set_aflame(mob/user, obj/item/I) + var/turf/T = get_turf(src) + message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user, "?")]) ([ADMIN_FLW(user, "FLW")]) in ([COORD(T)] - [ADMIN_JMP(T)]") + log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]") + investigate_log("was ignited by [key_name(user)]", "atmos") + user.create_log(MISC_LOG, "Plasma sheets ignited using [I]", src) + fire_act() /obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7cf48095e72..8508c741524 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -8,6 +8,13 @@ desc = "This is rubbish." resistance_flags = FLAMMABLE +/obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["metal"] += 2 + C.stored_comms["wood"] += 1 + C.stored_comms["glass"] += 1 + qdel(src) + return TRUE + /obj/item/trash/raisins name = "4no raisins" icon_state= "4no_raisins" diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 8c2c3e85917..30ad91beffa 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -311,6 +311,11 @@ LIGHTERS ARE IN LIGHTERS.DM pixel_y = rand(-10,10) transform = turn(transform,rand(0,360)) +/obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + /obj/item/cigbutt/cigarbutt name = "cigar butt" desc = "A manky old cigar butt." diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 4efb6994e8d..6423bbeb6ff 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -488,7 +488,7 @@ var/mob/living/carbon/human/holder = loc if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will for(var/mob/living/carbon/human/H in range(5, loc)) - if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) + if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2) if(prob(10)) to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!") diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 740079db8e1..1bfeeabae03 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -244,12 +244,18 @@ else ..() +/obj/item/match/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(burnt) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + return ..() + /obj/item/proc/help_light_cig(mob/living/M) var/mask_item = M.get_item_by_slot(slot_wear_mask) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item - /obj/item/match/firebrand name = "firebrand" desc = "An unlit firebrand. It makes you wonder why it's not just called a stick." diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 52c2aea5ddb..6daabffe000 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -88,6 +88,11 @@ playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE) return ..() +/obj/item/shard/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + /obj/item/shard/plasma name = "plasma shard" desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window." diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f0ab5bd5ac7..37f568fa51a 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -215,6 +215,13 @@ //if we get this far, handle the insertion checks as normal .=..() +/obj/item/storage/fancy/cigarettes/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!length(contents)) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + return ..() + /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper DromedaryCo packet" desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 1f0d4b8b473..c3f36e42f1d 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -69,9 +69,9 @@ if(isliving(G.affecting)) if(!has_buckled_mobs()) if(do_mob(user, src, 120)) - if(spike(G.affecting)) - G.affecting.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - qdel(G) + var/mob/living/affected = G.affecting + if(spike(affected)) + affected.visible_message("[user] slams [affected] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") return return ..() diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index ebad3554f18..8bf3e820d3d 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -439,7 +439,7 @@ var/area/A = get_area(bombturf) var/notify_admins = 0 - if(z != 5) + if(!is_mining_level(z)) notify_admins = 1 if(!triggered_by_explosion) message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 50fa99778e7..19bbc40ba25 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2583,14 +2583,16 @@ if("monkey") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing spawn(0) H.monkeyize() ok = 1 if("corgi") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing spawn(0) H.corgize() ok = 1 @@ -2661,7 +2663,8 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","PW") message_admins("[key_name_admin(usr)] teleported all players to the prison station.", 1) - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing var/turf/loc = find_loc(H) var/security = 0 if(!is_station_level(loc.z) || GLOB.prisonwarped.Find(H)) @@ -2994,7 +2997,8 @@ if("manifest") var/dat = "Showing Crew Manifest.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.ckey) dat += text("", H.name, H.get_assignment()) dat += "
NamePosition
[][]
" @@ -3004,7 +3008,8 @@ if("DNA") var/dat = "Showing DNA from blood.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.dna && H.ckey) dat += "" dat += "
NameDNABlood Type
[H][H.dna.unique_enzymes][H.dna.blood_type]
" @@ -3012,7 +3017,8 @@ if("fingerprints") var/dat = "Showing Fingerprints.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.ckey) if(H.dna && H.dna.uni_identity) dat += "" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 424e3c91f57..43db66cabc5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -643,7 +643,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) for(var/areatype in areas_without_camera) to_chat(world, "* [areatype]") -/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in GLOB.mob_list) +/client/proc/cmd_admin_dress(mob/living/carbon/human/M in GLOB.human_list) set category = "Event" set name = "Select equipment" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 03315243602..9b7cde2abdd 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -979,7 +979,8 @@ Traitors and the like can also be revived with the previous role mostly intact. var/role_string var/obj_count = 0 var/obj_string = "" - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!isLivingSSD(H)) continue mins_ssd = round((world.time - H.last_logout) / 600) @@ -1016,7 +1017,8 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "AFK Players:
NameFingerprints
[H][md5(H.dna.uni_identity)]
" msg += "" var/mins_afk - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.client == null || H.stat == DEAD) // No clientless or dead continue mins_afk = round(H.client.inactivity / 600) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index e13fb701317..957300326a6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -41,9 +41,8 @@ A.common_radio.channels.Remove("Syndicate") // De-traitored AIs can still state laws over the syndicate channel without this A.laws.sorted_laws = A.laws.inherent_laws.Copy() // AI's 'notify laws' button will still state a law 0 because sorted_laws contains it A.show_laws() - A.malf_picker.remove_malf_verbs(A) - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - qdel(A.malf_picker) + A.remove_malf_abilities() + QDEL_NULL(A.malf_picker) if(owner.som) var/datum/mindslaves/slaved = owner.som diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index 09cc082dc5d..8805c6dd9a9 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -154,6 +154,9 @@ display_name = "corset, blue" path = /obj/item/clothing/accessory/corset/blue +/datum/gear/accessory/armband/job + subtype_path = /datum/gear/accessory/armband/job + subtype_cost_overlap = FALSE /datum/gear/accessory/armband_red display_name = "armband" @@ -163,37 +166,37 @@ display_name = "armband, blue-yellow" path = /obj/item/clothing/accessory/armband/yb -/datum/gear/accessory/armband_sec +/datum/gear/accessory/armband/job/sec display_name = " armband, security" path = /obj/item/clothing/accessory/armband/sec allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot") -/datum/gear/accessory/armband_cargo +/datum/gear/accessory/armband/job/cargo display_name = "cargo armband" path = /obj/item/clothing/accessory/armband/cargo allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner") -/datum/gear/accessory/armband_medical +/datum/gear/accessory/armband/job/medical display_name = "armband, medical" path = /obj/item/clothing/accessory/armband/med allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician") -/datum/gear/accessory/armband_emt +/datum/gear/accessory/armband/job/emt display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen allowed_roles = list("Paramedic", "Brig Physician") -/datum/gear/accessory/armband_engineering +/datum/gear/accessory/armband/job/engineering display_name = "armband, engineering" path = /obj/item/clothing/accessory/armband/engine allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist") -/datum/gear/accessory/armband_hydro +/datum/gear/accessory/armband/job/hydro display_name = "armband, hydroponics" path = /obj/item/clothing/accessory/armband/hydro allowed_roles = list("Botanist") -/datum/gear/accessory/armband_sci +/datum/gear/accessory/armband/job/sci display_name = "armband, science" path = /obj/item/clothing/accessory/armband/science allowed_roles = list("Research Director","Scientist", "Roboticist") diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 7d6275e09e4..758e70f654f 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -42,11 +42,6 @@ display_name = "fedora, brown" path = /obj/item/clothing/head/fedora/brownfedora -/datum/gear/hat/beretsec - display_name = "security beret" - path = /obj/item/clothing/head/beret/sec - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") - /datum/gear/hat/capcsec display_name = "security corporate cap" path = /obj/item/clothing/head/soft/sec/corp @@ -113,32 +108,54 @@ display_name = "cowboy hat, pink" path = /obj/item/clothing/head/cowboyhat/pink -/datum/gear/hat/pr_beret +//Berets Refactor +//Defining all Job Berets as no-overlap +//Somehow this doesn't break the DB. +/datum/gear/hat/beret/job + subtype_path = /datum/gear/hat/beret/job + subtype_cost_overlap = FALSE + +/datum/gear/hat/beret/purple display_name = "beret, purple" path = /obj/item/clothing/head/beret/purple_normal -/datum/gear/hat/bl_beret +/datum/gear/hat/beret/black display_name = "beret, black" path = /obj/item/clothing/head/beret/black -/datum/gear/hat/blu_beret +/datum/gear/hat/beret/blue display_name = "beret, blue" path = /obj/item/clothing/head/beret/blue -/datum/gear/hat/red_beret +/datum/gear/hat/beret/red display_name = "beret, red" path = /obj/item/clothing/head/beret -/datum/gear/hat/sci_beret +/datum/gear/hat/beret/job/sec + display_name = "security beret" + path = /obj/item/clothing/head/beret/sec + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") + +/datum/gear/hat/beret/job/sci display_name = "science beret" path = /obj/item/clothing/head/beret/sci allowed_roles = list("Research Director", "Scientist") -/datum/gear/hat/med_beret +/datum/gear/hat/beret/job/med display_name = "medical beret" path = /obj/item/clothing/head/beret/med allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner") +/datum/gear/hat/beret/job/eng + display_name = "engineering beret" + path = /obj/item/clothing/head/beret/eng + allowed_roles = list("Chief Engineer", "Station Engineer") + +/datum/gear/hat/beret/job/atmos + display_name = "atmospherics beret" + path = /obj/item/clothing/head/beret/atmos + allowed_roles = list("Chief Engineer", "Life Support Specialist") + /datum/gear/hat/surgicalcap_purple display_name = "surgical cap, purple" path = /obj/item/clothing/head/surgery/purple diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index 32a9bae99e7..57e7ea63414 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -175,32 +175,36 @@ display_name = "regal shawl" path = /obj/item/clothing/suit/mantle/regal -/datum/gear/suit/captain_cloak +/datum/gear/suit/mantle/job + subtype_path = /datum/gear/suit/mantle/job + subtype_cost_overlap = FALSE + +/datum/gear/suit/mantle/job/captain display_name = "mantle, captain" path = /obj/item/clothing/suit/mantle/armor/captain allowed_roles = list("Captain") -/datum/gear/suit/ce_mantle +/datum/gear/suit/mantle/job/ce display_name = "mantle, chief engineer" path = /obj/item/clothing/suit/mantle/chief_engineer allowed_roles = list("Chief Engineer") -/datum/gear/suit/cmo_mantle +/datum/gear/suit/mantle/job/cmo display_name = "mantle, chief medical officer" path = /obj/item/clothing/suit/mantle/labcoat/chief_medical_officer allowed_roles = list("Chief Medical Officer") -/datum/gear/suit/armored_shawl +/datum/gear/suit/mantle/job/hos display_name = "mantle, head of security" path = /obj/item/clothing/suit/mantle/armor allowed_roles = list("Head of Security") -/datum/gear/suit/hop_shawl +/datum/gear/suit/mantle/job/hop display_name = "mantle, head of personnel" path = /obj/item/clothing/suit/mantle/armor/head_of_personnel allowed_roles = list("Head of Personnel") -/datum/gear/suit/rd_mantle +/datum/gear/suit/mantle/job/rd display_name = "mantle, research director" path = /obj/item/clothing/suit/mantle/labcoat allowed_roles = list("Research Director") diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index d2fe04dcc5d..c19b6cbe8b7 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -59,7 +59,17 @@ log_and_message_admins("APC Short event shorted out [affected_apc_count] APCs.") /proc/power_restore(announce=TRUE) - power_restore_quick(announce) + if(announce) + GLOB.event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') + + // recharge the APCs + for(var/thing in GLOB.apcs) + var/obj/machinery/power/apc/A = thing + if(!is_station_level(A.z)) + continue + var/obj/item/stock_parts/cell/C = A.get_cell() + if(C) + C.give(C.maxcharge) /proc/power_restore_quick(announce=TRUE) if(announce) diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 196642ce39c..b8bde0a1a67 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -2,7 +2,10 @@ announceWhen = rand(0, 20) /datum/event/mass_hallucination/start() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD) + continue var/armor = H.getarmor(type = "rad") if((RADIMMUNE in H.dna.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected continue diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 918746f4595..ab8a405785f 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -10,7 +10,7 @@ for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) var/turf/T = get_turf(L) - if (T.z != 1) + if (!is_station_level(T.z)) continue if(!(L in GLOB.player_list) && !L.mind && (L.sentience_type == sentience_type)) potential += L diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index 75b86d20cb0..79acc49fe73 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -1,3 +1,4 @@ +#define TS_HIGHPOP_TRIGGER 80 /datum/event/spider_terror announceWhen = 240 @@ -22,23 +23,32 @@ if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent var/spider_type - var/infestation_type = pick(1, 2, 3, 4, 5) + var/infestation_type + if((length(GLOB.clients)) < TS_HIGHPOP_TRIGGER) + infestation_type = pick(1, 2, 3, 4) + else + infestation_type = pick(2, 3, 4, 5) switch(infestation_type) if(1) + // Weakest, only used during lowpop. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green spawncount = 5 if(2) - spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white - spawncount = 2 - if(3) + // Fairly weak. Dangerous in single combat but has little staying power. Always gets whittled down. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince spawncount = 1 + if(3) + // Variable. Depends how many they infect. + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white + spawncount = 2 if(4) - spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen - spawncount = 1 - if(5) + // Pretty strong. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/princess spawncount = 2 + if(5) + // Strongest, only used during highpop. + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen + spawncount = 1 while(spawncount >= 1 && vents.len) var/obj/machinery/atmospherics/unary/vent_pump/vent = pick(vents) @@ -60,3 +70,6 @@ new spider_type(vent.loc) spawncount-- + +#undef TS_HIGHPOP_TRIGGER + diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 51ac13d4e13..905b629a0b9 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -460,8 +460,9 @@ Gunshots/explosions/opening doors/less rare audio (done) target = T var/image/A = null var/kind = force_kind ? force_kind : pick("clown", "corgi", "carp", "skeleton", "demon","zombie") - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H == target) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD || H == target) continue if(skip_nearby && (H in view(target))) continue @@ -539,7 +540,8 @@ Gunshots/explosions/opening doors/less rare audio (done) var/mob/living/carbon/human/clone = null var/clone_weapon = null - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.stat || H.lying) continue clone = H @@ -751,8 +753,10 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/projectile, /obj/ite target.client.images.Remove(speech_overlay) else // Radio talk var/list/humans = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - humans += H + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat != DEAD) + humans += H person = pick(humans) target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 4515a62d86b..f77d4b60ab4 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -124,6 +124,13 @@ reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() +/obj/item/reagent_containers/food/drinks/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!reagents.total_volume) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + return ..() + //Keeping this here for now, I'll ask if I should keep it here. /obj/item/broken_bottle name = "Broken Bottle" @@ -141,6 +148,11 @@ var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") sharp = 1 +/obj/item/broken_bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + /obj/item/reagent_containers/food/drinks/bottle/gin name = "Griffeater Gin" desc = "A bottle of high quality gin, produced in the New London Space Station." diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index a3b522187e2..5ad8a5f32f4 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -168,6 +168,11 @@ return return ..() +/obj/item/reagent_containers/food/snacks/grown/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["wood"] += 4 + qdel(src) + return TRUE + // For item-containing growns such as eggy or gatfruit /obj/item/reagent_containers/food/snacks/grown/shell/attack_self(mob/user) user.unEquip(src) diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm index fa7791edb9e..4ee2c76a419 100644 --- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm +++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm @@ -82,7 +82,7 @@ B.mineEffect(L) for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H == L) + if(H.stat == DEAD || H == L) continue to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") H.put_in_hands(new /obj/item/kitchen/knife/butcher(H)) diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index f54bc974f7e..0af08e40c74 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -383,7 +383,10 @@ var/mob/living/L = target if(!L.anchored) L.visible_message("[L] is snagged by [firer]'s hook!") + var/old_density = L.density + L.density = FALSE // Ensures the hook does not hit the target multiple times L.forceMove(get_turf(firer)) + L.density = old_density /obj/item/projectile/hook/Destroy() QDEL_NULL(chain) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8737fdf21b3..c01d04beba8 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -273,7 +273,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "Gibtonite active" var/turf/bombturf = get_turf(src) var/notify_admins = 0 - if(z != 5)//Only annoy the admins ingame if we're triggered off the mining zlevel + if(!is_mining_level(z))//Only annoy the admins ingame if we're triggered off the mining zlevel notify_admins = 1 if(notify_admins) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1c232f9f43c..737298e2815 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -63,6 +63,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( //MALFUNCTION var/datum/module_picker/malf_picker + var/datum/action/innate/ai/choose_modules/modules_action var/list/datum/AI_Module/current_modules = list() var/can_dominate_mechs = 0 var/shunted = 0 //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead @@ -851,13 +852,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "Switched to [network] camera network.") //End of code by Mord_Sith - -/mob/living/silicon/ai/proc/choose_modules() - set category = "Malfunction" - set name = "Choose Module" - - malf_picker.use(src) - /mob/living/silicon/ai/proc/ai_statuschange() set category = "AI Commands" set name = "AI Status" @@ -1028,15 +1022,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( return -/mob/living/silicon/ai/proc/corereturn() - set category = "Malfunction" - set name = "Return to Main Core" - - var/obj/machinery/power/apc/apc = loc - if(!istype(apc)) - to_chat(src, "You are already in your Main Core.") - return - apc.malfvacate() //Toggles the luminosity and applies it by re-entereing the camera. /mob/living/silicon/ai/proc/toggle_camera_light() @@ -1244,8 +1229,17 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.") to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.") view_core() //A BYOND bug requires you to be viewing your core before your verbs update - verbs += /mob/living/silicon/ai/proc/choose_modules malf_picker = new /datum/module_picker + modules_action = new(malf_picker) + modules_action.Grant(src) + +///Removes all malfunction-related /datum/action's from the target AI. +/mob/living/silicon/ai/proc/remove_malf_abilities() + QDEL_NULL(modules_action) + for(var/datum/AI_Module/AM in current_modules) + for(var/datum/action/A in actions) + if(istype(A, initial(AM.power_type))) + qdel(A) /mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) if(!istype(target)) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index c62bb638244..91970d030a6 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -354,3 +354,20 @@ /mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) if(affect_silicon) return ..() + +/mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!client && istype(user, /mob/living/silicon/robot/drone)) + to_chat(user, "You begin decompiling the other drone.") + if(!do_after(user, 5 SECONDS, target = loc)) + to_chat(user, "You need to remain still while decompiling such a large object.") + return + if(QDELETED(src) || QDELETED(user)) + return ..() + to_chat(user, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") + new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) + C.stored_comms["metal"] += 15 + C.stored_comms["glass"] += 15 + C.stored_comms["wood"] += 5 + qdel(src) + return TRUE + return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 8f2b9fee6ae..a0582c135e4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -151,15 +151,13 @@ var/list/stored_comms = list( "metal" = 0, "glass" = 0, - "wood" = 0, - "plastic" = 0 + "wood" = 0 ) /obj/item/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) return -/obj/item/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params) - +/obj/item/matter_decompiler/afterattack(atom/target, mob/living/user, proximity, params) if(!proximity) return //Not adjacent. //We only want to deal with using this on turfs. Specific items aren't important. @@ -168,101 +166,11 @@ return //Used to give the right message. - var/grabbed_something = 0 + var/grabbed_something = FALSE - for(var/mob/M in T) - if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse)) - src.loc.visible_message("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") - new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(M) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - return - - else if(istype(M,/mob/living/silicon/robot/drone) && !M.client) - - var/mob/living/silicon/robot/drone/D = src.loc - - if(!istype(D)) - return - - to_chat(D, "You begin decompiling the other drone.") - - if(!do_after(D, 50, target = target)) - to_chat(D, "You need to remain still while decompiling such a large object.") - return - - if(!M || !D) return - - to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - - qdel(M) - new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - - stored_comms["metal"] += 15 - stored_comms["glass"] += 15 - stored_comms["wood"] += 5 - stored_comms["plastic"] += 5 - - return - else - continue - - for(var/obj/W in T) - //Different classes of items give different commodities. - if(istype(W,/obj/item/cigbutt)) - stored_comms["plastic"]++ - else if(istype(W,/obj/structure/spider/spiderling)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/item/light)) - var/obj/item/light/L = W - if(L.status >= 2) //In before someone changes the inexplicably local defines. ~ Z - stored_comms["metal"]++ - stored_comms["glass"]++ - else - continue - else if(istype(W,/obj/effect/decal/remains/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/trash)) - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/effect/decal/cleanable/blood/gibs/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/ammo_casing)) - stored_comms["metal"]++ - else if(istype(W,/obj/item/shard)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/reagent_containers/food/snacks/grown)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - else if(istype(W,/obj/item/broken_bottle)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/light/tube) || istype(W,/obj/item/light/bulb)) - stored_comms["glass"]++ - else - continue - - qdel(W) - grabbed_something = 1 + for(var/atom/movable/A in T) + if(A.decompile_act(src, user)) // Each decompileable mob or obj needs to have this defined + grabbed_something = TRUE if(grabbed_something) to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") @@ -353,11 +261,5 @@ stack_wood = new /obj/item/stack/sheet/wood(src.module) stack_wood.amount = 1 stack = stack_wood - if("plastic") - if(!stack_plastic) - stack_plastic = new /obj/item/stack/sheet/plastic(src.module) - stack_plastic.amount = 1 - stack = stack_plastic - stack.amount++ decompiler.stored_comms[type]-- diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index cb45fd98e8b..e51dc527832 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -756,7 +756,7 @@ Pass a positive integer as an argument to override a bot's default speed. // send a radio signal with multiple data key/values /mob/living/simple_animal/bot/proc/post_signal_multiple(var/freq, var/list/keyval) - if(z != 1) //Bot control will only work on station. + if(!is_station_level(z)) //Bot control will only work on station. return var/datum/radio_frequency/frequency = SSradio.return_frequency(freq) if(!frequency) diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 96688963b73..566791786f6 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,3 +23,14 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1) can_collar = 1 gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!istype(user, /mob/living/silicon/robot/drone)) + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) + C.stored_comms["wood"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) + return TRUE + return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index a48b36cb0c7..152e2494132 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -234,3 +234,14 @@ gold_core_spawnable = NO_SPAWN can_collar = 0 butcher_results = list(/obj/item/stack/sheet/metal = 1) + +/mob/living/simple_animal/mouse/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!(istype(user, /mob/living/silicon/robot/drone))) + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) + C.stored_comms["wood"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) + return TRUE + return ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 7d31b5d523b..d4f8e7c4c3d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -615,3 +615,8 @@ if(pcollar && collar_type) add_overlay("[collar_type]collar") add_overlay("[collar_type]tag") + +/mob/living/simple_animal/Login() + ..() + walk(src, 0) // if mob is moving under ai control, then stop AI movement + diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 2ee4a9d2a9c..8e7adea666b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -82,14 +82,11 @@ O.notify_ai(1) if(O.mind && O.mind.assigned_role == "Cyborg") - if(O.mind.role_alt_title == "Android") + if(O.mind.role_alt_title == "Robot") O.mmi = new /obj/item/mmi/robotic_brain(O) - else if(O.mind.role_alt_title == "Robot") - O.mmi = null //Robots do not have removable brains. else O.mmi = new /obj/item/mmi(O) - - if(O.mmi) O.mmi.transfer_identity(src) //Does not transfer key/client. + O.mmi.transfer_identity(src) //Does not transfer key/client. O.update_pipe_vision() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 56e38d31935..409abe3d724 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1052,7 +1052,8 @@ occupier.eyeobj.name = "[occupier.name] (AI Eye)" if(malf.parent) qdel(malf) - occupier.verbs += /mob/living/silicon/ai/proc/corereturn + var/datum/action/innate/ai/return_to_core/R = new + R.Grant(occupier) occupier.cancel_camera() if((seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) && malf.nuking) for(var/obj/item/pinpointer/point in GLOB.pinpointer_list) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0a31d882488..3e8d71b3280 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -634,6 +634,12 @@ shatter() return ..() +/obj/item/light/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 1 + C.stored_comms["metal"] += 1 + qdel(src) + return TRUE + /obj/item/light/tube name = "light tube" desc = "A replacement light tube." diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 6c836988e8b..4274c3114db 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -42,6 +42,13 @@ var/image/lid = image(icon, src, "lid_bottle") overlays += lid +/obj/item/reagent_containers/glass/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!reagents.total_volume) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + return ..() + /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle containing toxic compounds." diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 13d88100042..e6dd04408c2 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -265,7 +265,7 @@ update() return -/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "DisposalBin", name, 300, 250, master_ui, state) diff --git a/code/modules/shuttle/ert.dm b/code/modules/shuttle/ert.dm index 356ca9687dc..5168ce89278 100644 --- a/code/modules/shuttle/ert.dm +++ b/code/modules/shuttle/ert.dm @@ -9,10 +9,10 @@ /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))) + 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" diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index 783498542e4..f1da4ed89ba 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -14,13 +14,13 @@ if("track") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.mob_list + var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.human_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) return TRUE -/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) // The 557 may seem random, but its the perfectsize for margins on the nanomap diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 4ea648dea13..80a5dbe5b04 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md index 08bb6f92321..590ea0f0ee7 100644 --- a/tgui/docs/tutorial-and-examples.md +++ b/tgui/docs/tutorial-and-examples.md @@ -37,7 +37,7 @@ powerful interactions for embedded objects or remote access. Let's start with a very basic hello world. ```dm -/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state) @@ -240,7 +240,7 @@ and builds a new array based on what was returned by that function. ``` If you need more examples of what you can do with React, see the -[interface conversion guide](docs/converting-old-tgui-interfaces.md). +[interface conversion guide](docs/converting-old-nano-interfaces.md). #### Splitting UIs into smaller, modular components @@ -294,7 +294,7 @@ here's what you need (note that you'll probably be forced to clean your shit up upon code review): ```dm -/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. +/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 905d2871b69..8cc9b0c818e 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -3730,9 +3730,9 @@ lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" diff --git a/tools/github-actions/README.MD b/tools/github-actions/README.MD index 342dcbf3585..74b31f5bdd6 100644 --- a/tools/github-actions/README.MD +++ b/tools/github-actions/README.MD @@ -2,5 +2,5 @@ This folder contains all the script and tools required for GitHub actions. If you add something to this directory, **PLEASE** document it in here -- `nanomap-renderer` - A linux application to render NanoMap images of the ingame maps automatically +- `nanomap-renderer` - A linux application to render NanoMap images of the ingame maps automatically. Based off of SpacemanDMM (Modified source [here](https://github.com/AffectedArc07/ParaSpacemanDMM), original source [here](https://github.com/Spacemaniac/SpacemanDMM)) - `nanomap-renderer-invoker.sh` - A script which invokes the render tool and clones the maps to the correct directory
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo