From 8c4cf753f5b9612b0184ff919a2ca2cf136187cc Mon Sep 17 00:00:00 2001 From: Mothblocks <35135081+Mothblocks@users.noreply.github.com> Date: Mon, 29 Apr 2024 22:47:36 -0700 Subject: [PATCH 001/107] Remove data systems in favor of global datums (#82943) --- code/__DEFINES/dcs/signals/signals_reagent.dm | 4 +- code/__HELPERS/construction.dm | 2 +- code/__HELPERS/global_lists.dm | 4 +- code/__HELPERS/mobs.dm | 4 +- code/__HELPERS/priority_announce.dm | 2 +- code/controllers/subsystem/dynamic/dynamic.dm | 6 +- .../ds => controllers/subsystem}/materials.dm | 18 +- .../subsystem/movement/cliff_falling.dm | 2 +- .../subsystem/movement/movement_types.dm | 28 +-- code/controllers/subsystem/statpanel.dm | 1 - code/datums/actions/mobs/charge.dm | 6 +- code/datums/ai/_ai_controller.dm | 2 +- code/datums/ai/monkey/monkey_behaviors.dm | 4 +- code/datums/ai/movement/_ai_movement.dm | 2 +- .../movement/ai_movement_basic_avoidance.dm | 2 +- .../ai/movement/ai_movement_complete_stop.dm | 2 +- code/datums/ai/movement/ai_movement_dumb.dm | 2 +- code/datums/ai/movement/ai_movement_jps.dm | 2 +- .../datums/{systems/ds => }/communications.dm | 10 +- code/datums/components/conveyor_movement.dm | 2 +- code/datums/components/drift.dm | 2 +- code/datums/components/force_move.dm | 2 +- .../components/material/remote_materials.dm | 2 +- code/datums/components/shuttle_cling.dm | 2 +- code/datums/materials/_material.dm | 4 +- .../ds/move_handler.dm => move_manager.dm} | 11 +- .../proximity_monitor/fields/timestop.dm | 2 +- code/datums/systems/_system.dm | 16 -- code/datums/systems/ds/battle_royale.dm | 229 ----------------- code/datums/systems/manager.dm | 14 -- code/game/atom/atom_materials.dm | 2 +- code/game/machinery/autolathe.dm | 4 +- .../game/machinery/computer/communications.dm | 18 +- code/game/machinery/recycler.dm | 2 +- code/game/machinery/syndicatebomb.dm | 8 +- .../anomalies/anomalies_dimensional.dm | 2 +- .../effects/decals/cleanable/aliens.dm | 2 +- .../effects/decals/cleanable/humans.dm | 4 +- .../effects/decals/cleanable/robots.dm | 2 +- .../effects/effect_system/effect_system.dm | 2 +- .../effect_system/effects_explosion.dm | 2 +- .../effects/effect_system/effects_water.dm | 4 +- .../effects/spawners/xeno_egg_delivery.dm | 4 +- code/game/objects/effects/step_triggers.dm | 2 +- .../effects/temporary_visuals/effect_trail.dm | 2 +- .../objects/items/devices/battle_royale.dm | 232 +++++++++++++++++- code/game/objects/items/extinguisher.dm | 2 +- code/game/objects/items/machine_wand.dm | 2 +- code/game/objects/items/stacks/stack.dm | 6 +- code/game/objects/items/storage/bags.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 2 +- .../transit_tubes/transit_tube_pod.dm | 2 +- code/game/world.dm | 4 - code/modules/admin/verbs/adminevents.dm | 12 +- .../antagonists/pirate/pirate_event.dm | 2 +- .../antagonists/space_dragon/carp_rift.dm | 2 +- .../antagonists/wizard/equipment/artefact.dm | 2 +- code/modules/antagonists/xeno/xeno.dm | 6 +- .../events/immovable_rod/immovable_rod.dm | 12 +- code/modules/events/shuttle_insurance.dm | 2 +- .../ruins/lavalandruin_code/biodome_winter.dm | 2 +- code/modules/meteors/meteor_types.dm | 2 +- code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/machine_silo.dm | 2 +- code/modules/mob/living/init_signals.dm | 2 +- .../living/simple_animal/bot/SuperBeepsky.dm | 6 +- .../mob/living/simple_animal/bot/secbot.dm | 8 +- .../living/simple_animal/hostile/hostile.dm | 10 +- .../hostile/megafauna/colossus.dm | 2 +- .../hostile/mining_mobs/curse_blob.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/mod/modules/modules_general.dm | 2 +- .../boxes_magazines/_box_magazine.dm | 2 +- .../reagents/reagent_containers/spray.dm | 2 +- code/modules/recycling/conveyor.dm | 8 +- code/modules/recycling/disposal/holder.dm | 2 +- code/modules/religion/rites.dm | 2 +- .../mecha/equipment/tools/other_tools.dm | 2 +- tgstation.dme | 9 +- 80 files changed, 387 insertions(+), 423 deletions(-) rename code/{datums/systems/ds => controllers/subsystem}/materials.dm (92%) rename code/datums/{systems/ds => }/communications.dm (86%) rename code/datums/{systems/ds/move_handler.dm => move_manager.dm} (92%) delete mode 100644 code/datums/systems/_system.dm delete mode 100644 code/datums/systems/ds/battle_royale.dm delete mode 100644 code/datums/systems/manager.dm diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index 08993ad56de..5bb2c89d4ef 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -19,8 +19,8 @@ ///from base of [/datum/reagent/proc/expose_atom]: (/turf, reac_volume) #define COMSIG_REAGENT_EXPOSE_TURF "reagent_expose_turf" -///from base of [/datum/system/materials/proc/InitializeMaterial]: (/datum/material) -#define COMSIG_MATERIALS_INIT_MAT "DSmaterials_init_mat" +///from base of [/datum/materials_controller/proc/InitializeMaterial]: (/datum/material) +#define COMSIG_MATERIALS_INIT_MAT "SSmaterials_init_mat" ///from base of [/datum/component/multiple_lives/proc/respawn]: (mob/respawned_mob, gibbed, lives_left) #define COMSIG_ON_MULTIPLE_LIVES_RESPAWN "on_multiple_lives_respawn" diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index cf38f690c26..f7b0ece13f8 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -2,7 +2,7 @@ #define OPTIMAL_COST(cost)(max(1, round(cost))) /// Wrapper for fetching material references. Exists exclusively so that people don't need to wrap everything in a list every time. -#define GET_MATERIAL_REF(arguments...) DSmaterials._GetMaterialRef(list(##arguments)) +#define GET_MATERIAL_REF(arguments...) SSmaterials._GetMaterialRef(list(##arguments)) // Wrapper to convert material name into its source name #define MATERIAL_SOURCE(mat) "[mat.name]_material" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 30626bc0a55..d16b91ee4c8 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -165,8 +165,8 @@ GLOB.crafting_recipes += recipe var/list/material_stack_recipes = list( - DSmaterials.base_stack_recipes, - DSmaterials.rigid_stack_recipes, + SSmaterials.base_stack_recipes, + SSmaterials.rigid_stack_recipes, ) for(var/list/recipe_list in material_stack_recipes) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index a6b23e08b49..9a2de31ea53 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -288,7 +288,7 @@ GLOBAL_LIST_EMPTY(species_list) var/atom/target_loc = target?.loc var/drifting = FALSE - if(DSmove_manager.processing_on(user, SSspacedrift)) + if(GLOB.move_manager.processing_on(user, SSspacedrift)) drifting = TRUE var/holding = user.get_active_held_item() @@ -317,7 +317,7 @@ GLOBAL_LIST_EMPTY(species_list) if(!QDELETED(progbar)) progbar.update(world.time - starttime) - if(drifting && !DSmove_manager.processing_on(user, SSspacedrift)) + if(drifting && !GLOB.move_manager.processing_on(user, SSspacedrift)) drifting = FALSE user_loc = user.loc diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 380a8707fbe..b9964b9be93 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -107,7 +107,7 @@ message.title = title message.content = text - DScommunications.send_message(message) + GLOB.communications_controller.send_message(message) /** * Sends a minor annoucement to players. diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index 736b55d7c99..f64816db5b0 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -317,7 +317,7 @@ SUBSYSTEM_DEF(dynamic) SSticker.news_report = SSshuttle.emergency?.is_hijacked() ? SHUTTLE_HIJACK : STATION_EVACUATED /datum/controller/subsystem/dynamic/proc/send_intercept() - if(DScommunications.block_command_report) //If we don't want the report to be printed just yet, we put it off until it's ready + if(GLOB.communications_controller.block_command_report) //If we don't want the report to be printed just yet, we put it off until it's ready addtimer(CALLBACK(src, PROC_REF(send_intercept)), 10 SECONDS) return @@ -349,10 +349,10 @@ SUBSYSTEM_DEF(dynamic) if(trait_list_strings.len > 0) . += "
Identified shift divergencies:
" + trait_list_strings.Join() - if(length(DScommunications.command_report_footnotes)) + if(length(GLOB.communications_controller.command_report_footnotes)) var/footnote_pile = "" - for(var/datum/command_footnote/footnote in DScommunications.command_report_footnotes) + for(var/datum/command_footnote/footnote in GLOB.communications_controller.command_report_footnotes) footnote_pile += "[footnote.message]
" footnote_pile += "[footnote.signature]
" footnote_pile += "
" diff --git a/code/datums/systems/ds/materials.dm b/code/controllers/subsystem/materials.dm similarity index 92% rename from code/datums/systems/ds/materials.dm rename to code/controllers/subsystem/materials.dm index 527c1a3d642..b4664323eeb 100644 --- a/code/datums/systems/ds/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -1,12 +1,12 @@ /*! How material datums work -Materials are now instanced datums, with an associative list of them being kept in DSmaterials. We only instance the materials once and then re-use these instances for everything. +Materials are now instanced datums, with an associative list of them being kept in SSmaterials. We only instance the materials once and then re-use these instances for everything. These materials call on_applied() on whatever item they are applied to, common effects are adding components, changing color and changing description. This allows us to differentiate items based on the material they are made out of.area */ - -DATASYSTEM_DEF(materials) +SUBSYSTEM_DEF(materials) name = "Materials" + flags = SS_NO_FIRE | SS_NO_INIT ///Dictionary of material.id || material ref var/list/materials ///Dictionary of type || list of material refs @@ -36,7 +36,7 @@ DATASYSTEM_DEF(materials) var/list/datum/dimension_theme/dimensional_themes ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) -/datum/system/materials/proc/InitializeMaterials() +/datum/controller/subsystem/materials/proc/InitializeMaterials() materials = list() materials_by_type = list() materialids_by_type = list() @@ -57,7 +57,7 @@ DATASYSTEM_DEF(materials) * - [arguments][/list]: The arguments to use to create the material datum * - The first element is the type of material to initialize. */ -/datum/system/materials/proc/InitializeMaterial(list/arguments) +/datum/controller/subsystem/materials/proc/InitializeMaterial(list/arguments) var/datum/material/mat_type = arguments[1] if(initial(mat_type.init_flags) & MATERIAL_INIT_BESPOKE) arguments[1] = GetIdFromArguments(arguments) @@ -89,13 +89,13 @@ DATASYSTEM_DEF(materials) * - If the material type is bespoke a text ID is generated from the arguments list and used to load a material datum from the cache. * - The following elements are used to generate bespoke IDs */ -/datum/system/materials/proc/_GetMaterialRef(list/arguments) +/datum/controller/subsystem/materials/proc/_GetMaterialRef(list/arguments) if(!materials) InitializeMaterials() var/datum/material/key = arguments[1] if(istype(key)) - return key // We are assuming here that the only thing allowed to create material datums is [/datum/system/materials/proc/InitializeMaterial] + return key // We are assuming here that the only thing allowed to create material datums is [/datum/controller/subsystem/materials/proc/InitializeMaterial] if(istext(key)) // Handle text id . = materials[key] @@ -123,7 +123,7 @@ DATASYSTEM_DEF(materials) * Named arguments can appear in any order and we need them to appear after ordered arguments * We assume that no one will pass in a named argument with a value of null **/ -/datum/system/materials/proc/GetIdFromArguments(list/arguments) +/datum/controller/subsystem/materials/proc/GetIdFromArguments(list/arguments) var/datum/material/mattype = arguments[1] var/list/fullid = list("[initial(mattype.id) || mattype]") var/list/named_arguments = list() @@ -149,7 +149,7 @@ DATASYSTEM_DEF(materials) /// Returns a list to be used as an object's custom_materials. Lists will be cached and re-used based on the parameters. -/datum/system/materials/proc/FindOrCreateMaterialCombo(list/materials_declaration, multiplier) +/datum/controller/subsystem/materials/proc/FindOrCreateMaterialCombo(list/materials_declaration, multiplier) if(!LAZYLEN(materials_declaration)) return null // If we get a null we pass it right back, we don't want to generate stack traces just because something is clearing out its materials list. diff --git a/code/controllers/subsystem/movement/cliff_falling.dm b/code/controllers/subsystem/movement/cliff_falling.dm index 65089f0ea1b..b3d7f114dfb 100644 --- a/code/controllers/subsystem/movement/cliff_falling.dm +++ b/code/controllers/subsystem/movement/cliff_falling.dm @@ -10,7 +10,7 @@ MOVEMENT_SUBSYSTEM_DEF(cliff_falling) /datum/controller/subsystem/movement/cliff_falling/proc/start_falling(atom/movable/faller, turf/open/cliff/cliff) // Make them move - var/mover = DSmove_manager.move(moving = faller, direction = cliff.fall_direction, delay = cliff.fall_speed, subsystem = src, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_OUTSIDE_CONTROL | MOVEMENT_LOOP_NO_DIR_UPDATE) + var/mover = GLOB.move_manager.move(moving = faller, direction = cliff.fall_direction, delay = cliff.fall_speed, subsystem = src, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_OUTSIDE_CONTROL | MOVEMENT_LOOP_NO_DIR_UPDATE) cliff_grinders[faller] = mover diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index 3567e881b14..50864f731e2 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -162,7 +162,7 @@ status &= ~MOVELOOP_STATUS_PAUSED ///Removes the atom from some movement subsystem. Defaults to SSmovement -/datum/system/move_manager/proc/stop_looping(atom/movable/moving, datum/controller/subsystem/movement/subsystem = SSmovement) +/datum/move_manager/proc/stop_looping(atom/movable/moving, datum/controller/subsystem/movement/subsystem = SSmovement) var/datum/movement_packet/our_info = moving.move_packet if(!our_info) return FALSE @@ -183,7 +183,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/move, priority, flags, extra_info, delay, timeout, direction) ///Replacement for walk() @@ -224,7 +224,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/force_move_dir(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/force_move_dir(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/move/force, priority, flags, extra_info, delay, timeout, direction) /datum/move_loop/move/force @@ -281,7 +281,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/force_move(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/force_move(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/has_target/force_move, priority, flags, extra_info, delay, timeout, chasing) ///Used for force-move loops @@ -315,7 +315,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/jps_move(moving, +/datum/move_manager/proc/jps_move(moving, chasing, delay, timeout, @@ -493,7 +493,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_to(moving, chasing, min_dist, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_to(moving, chasing, min_dist, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/has_target/dist_bound/move_to, priority, flags, extra_info, delay, timeout, chasing, min_dist) ///Wrapper around walk_to() @@ -527,7 +527,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_away(moving, chasing, max_dist, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_away(moving, chasing, max_dist, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/has_target/dist_bound/move_away, priority, flags, extra_info, delay, timeout, chasing, max_dist) ///Wrapper around walk_away() @@ -562,7 +562,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_towards(moving, chasing, delay, home, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_towards(moving, chasing, delay, home, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/has_target/move_towards, priority, flags, extra_info, delay, timeout, chasing, home) /** @@ -581,7 +581,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/home_onto(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/home_onto(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) return move_towards(moving, chasing, delay, TRUE, timeout, subsystem, priority, flags, extra_info) ///Used as a alternative to walk_towards @@ -717,7 +717,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_towards_legacy(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_towards_legacy(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/has_target/move_towards_budget, priority, flags, extra_info, delay, timeout, chasing) ///The actual implementation of walk_towards() @@ -743,7 +743,7 @@ * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm */ -/datum/system/move_manager/proc/freeze(moving, halted_turf, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/freeze(moving, halted_turf, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/freeze, priority, flags, extra_info, delay, timeout, halted_turf) /// As close as you can get to a "do-nothing" move loop, the pure intention of this is to absolutely resist all and any automated movement until the move loop times out. @@ -767,7 +767,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_rand(moving, directions, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_rand(moving, directions, delay, timeout, subsystem, priority, flags, datum/extra_info) if(!directions) directions = GLOB.alldirs return add_to_loop(moving, subsystem, /datum/move_loop/move_rand, priority, flags, extra_info, delay, timeout, directions) @@ -819,7 +819,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_to_rand(moving, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_to_rand(moving, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/move_to_rand, priority, flags, extra_info, delay, timeout) ///Wrapper around step_rand @@ -845,7 +845,7 @@ * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm * **/ -/datum/system/move_manager/proc/move_disposals(moving, delay, timeout, subsystem, priority, flags, datum/extra_info) +/datum/move_manager/proc/move_disposals(moving, delay, timeout, subsystem, priority, flags, datum/extra_info) return add_to_loop(moving, subsystem, /datum/move_loop/disposal_holder, priority, flags, extra_info, delay, timeout) /// Disposal holders need to move through a chain of pipes diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index a35798ce627..7b1394ada16 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -190,7 +190,6 @@ SUBSYSTEM_DEF(statpanels) list("World Time:", "[world.time]"), list("Globals:", GLOB.stat_entry(), text_ref(GLOB)), list("[config]:", config.stat_entry(), text_ref(config)), - list("Datasystem Manager:", "Edit", text_ref(SysMgr)), list("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)"), list("Master Controller:", Master.stat_entry(), text_ref(Master)), list("Failsafe Controller:", Failsafe.stat_entry(), text_ref(Failsafe)), diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index 07c6330c71a..9aee4cd8345 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -44,7 +44,7 @@ if(charger in charging) // Stop any existing charging, this'll clean things up properly - DSmove_manager.stop_looping(charger) + GLOB.move_manager.stop_looping(charger) charging += charger actively_moving = FALSE @@ -60,7 +60,7 @@ var/time_to_hit = min(get_dist(charger, target), charge_distance) * charge_speed - var/datum/move_loop/new_loop = DSmove_manager.home_onto(charger, target, delay = charge_speed, timeout = time_to_hit, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/new_loop = GLOB.move_manager.home_onto(charger, target, delay = charge_speed, timeout = time_to_hit, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) if(!new_loop) return RegisterSignal(new_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move), override = TRUE) @@ -96,7 +96,7 @@ /datum/action/cooldown/mob_cooldown/charge/update_status_on_signal(mob/source, new_stat, old_stat) . = ..() if(new_stat == DEAD) - DSmove_manager.stop_looping(source) //This will cause the loop to qdel, triggering an end to our charging + GLOB.move_manager.stop_looping(source) //This will cause the loop to qdel, triggering an end to our charging /datum/action/cooldown/mob_cooldown/charge/proc/do_charge_indicator(atom/charger, atom/charge_target) var/turf/target_turf = get_turf(charge_target) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index c5717ceb044..309be508783 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -279,7 +279,7 @@ multiple modular subtrees with behaviors /datum/ai_controller/process(seconds_per_tick) if(!able_to_run()) - DSmove_manager.stop_looping(pawn) //stop moving + GLOB.move_manager.stop_looping(pawn) //stop moving return //this should remove them from processing in the future through event-based stuff. if(!LAZYLEN(current_behaviors) && idle_behavior) diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index 10a23acdabe..af9091db2dd 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -120,7 +120,7 @@ break if(target) - DSmove_manager.move_away(living_pawn, target, max_dist=MONKEY_ENEMY_VISION, delay=5) + GLOB.move_manager.move_away(living_pawn, target, max_dist=MONKEY_ENEMY_VISION, delay=5) return AI_BEHAVIOR_DELAY return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED @@ -161,7 +161,7 @@ controller.clear_blackboard_key(target_key) if(QDELETED(living_pawn)) // pawn can be null at this point return - DSmove_manager.stop_looping(living_pawn) + GLOB.move_manager.stop_looping(living_pawn) /// attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little /datum/ai_behavior/monkey_attack_mob/proc/monkey_attack(datum/ai_controller/controller, mob/living/target, seconds_per_tick, disarm) diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index 29250d16125..ca8acb49040 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -17,7 +17,7 @@ moving_controllers -= controller // We got deleted as we finished an action if(!QDELETED(controller.pawn)) - DSmove_manager.stop_looping(controller.pawn, SSai_movement) + GLOB.move_manager.stop_looping(controller.pawn, SSai_movement) /datum/ai_movement/proc/increment_pathing_failures(datum/ai_controller/controller) controller.consecutive_pathing_attempts++ diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm index bcfe6833a8d..ac231e075ed 100644 --- a/code/datums/ai/movement/ai_movement_basic_avoidance.dm +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -9,7 +9,7 @@ var/atom/movable/moving = controller.pawn var/min_dist = controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE] var/delay = controller.movement_delay - var/datum/move_loop/loop = DSmove_manager.move_to(moving, current_movement_target, min_dist, delay, flags = move_flags, subsystem = SSai_movement, extra_info = controller) + var/datum/move_loop/loop = GLOB.move_manager.move_to(moving, current_movement_target, min_dist, delay, flags = move_flags, subsystem = SSai_movement, extra_info = controller) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) diff --git a/code/datums/ai/movement/ai_movement_complete_stop.dm b/code/datums/ai/movement/ai_movement_complete_stop.dm index 31309256a67..2b39e162719 100644 --- a/code/datums/ai/movement/ai_movement_complete_stop.dm +++ b/code/datums/ai/movement/ai_movement_complete_stop.dm @@ -8,7 +8,7 @@ var/stopping_time = controller.blackboard[BB_STATIONARY_SECONDS] var/delay_time = (stopping_time * 0.5) // no real reason to fire any more often than this really // assume that the current_movement_target is our location - var/datum/move_loop/loop = DSmove_manager.freeze(moving, current_movement_target, delay = delay_time, timeout = stopping_time, subsystem = SSai_movement, extra_info = controller) + var/datum/move_loop/loop = GLOB.move_manager.freeze(moving, current_movement_target, delay = delay_time, timeout = stopping_time, subsystem = SSai_movement, extra_info = controller) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) /datum/ai_movement/complete_stop/allowed_to_move(datum/move_loop/source) diff --git a/code/datums/ai/movement/ai_movement_dumb.dm b/code/datums/ai/movement/ai_movement_dumb.dm index a64a7539eec..2de85046a94 100644 --- a/code/datums/ai/movement/ai_movement_dumb.dm +++ b/code/datums/ai/movement/ai_movement_dumb.dm @@ -7,7 +7,7 @@ . = ..() var/atom/movable/moving = controller.pawn var/delay = controller.movement_delay - var/datum/move_loop/loop = DSmove_manager.move_towards_legacy(moving, current_movement_target, delay, subsystem = SSai_movement, extra_info = controller) + var/datum/move_loop/loop = GLOB.move_manager.move_towards_legacy(moving, current_movement_target, delay, subsystem = SSai_movement, extra_info = controller) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index ac16b0aaa23..d6f37c2a956 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -12,7 +12,7 @@ var/atom/movable/moving = controller.pawn var/delay = controller.movement_delay - var/datum/move_loop/has_target/jps/loop = DSmove_manager.jps_move(moving, + var/datum/move_loop/has_target/jps/loop = GLOB.move_manager.jps_move(moving, current_movement_target, delay, repath_delay = 0.5 SECONDS, diff --git a/code/datums/systems/ds/communications.dm b/code/datums/communications.dm similarity index 86% rename from code/datums/systems/ds/communications.dm rename to code/datums/communications.dm index 7c9cee61509..79f660a4cfa 100644 --- a/code/datums/systems/ds/communications.dm +++ b/code/datums/communications.dm @@ -2,9 +2,9 @@ #define COMMUNICATION_COOLDOWN_AI (30 SECONDS) #define COMMUNICATION_COOLDOWN_MEETING (5 MINUTES) -DATASYSTEM_DEF(communications) - name = "Communications" +GLOBAL_DATUM_INIT(communications_controller, /datum/communciations_controller, new) +/datum/communciations_controller COOLDOWN_DECLARE(silicon_message_cooldown) COOLDOWN_DECLARE(nonsilicon_message_cooldown) @@ -20,7 +20,7 @@ DATASYSTEM_DEF(communications) /// The location where the special xenomorph egg was planted var/area/captivity_area -/datum/system/communications/proc/can_announce(mob/living/user, is_silicon) +/datum/communciations_controller/proc/can_announce(mob/living/user, is_silicon) if(is_silicon && COOLDOWN_FINISHED(src, silicon_message_cooldown)) return TRUE else if(!is_silicon && COOLDOWN_FINISHED(src, nonsilicon_message_cooldown)) @@ -28,7 +28,7 @@ DATASYSTEM_DEF(communications) else return FALSE -/datum/system/communications/proc/make_announcement(mob/living/user, is_silicon, input, syndicate, list/players) +/datum/communciations_controller/proc/make_announcement(mob/living/user, is_silicon, input, syndicate, list/players) if(!can_announce(user, is_silicon)) return FALSE if(is_silicon) @@ -44,7 +44,7 @@ DATASYSTEM_DEF(communications) user.log_talk(input, LOG_SAY, tag="priority announcement") message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.") -/datum/system/communications/proc/send_message(datum/comm_message/sending,print = TRUE,unique = FALSE) +/datum/communciations_controller/proc/send_message(datum/comm_message/sending,print = TRUE,unique = FALSE) for(var/obj/machinery/computer/communications/C in GLOB.shuttle_caller_list) if(!(C.machine_stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(unique) diff --git a/code/datums/components/conveyor_movement.dm b/code/datums/components/conveyor_movement.dm index 61a0066ff4a..dd16e6874ea 100644 --- a/code/datums/components/conveyor_movement.dm +++ b/code/datums/components/conveyor_movement.dm @@ -15,7 +15,7 @@ if(!start_delay) start_delay = speed var/atom/movable/moving_parent = parent - var/datum/move_loop/loop = DSmove_manager.move(moving_parent, direction, delay = start_delay, subsystem = SSconveyors, flags=MOVEMENT_LOOP_IGNORE_PRIORITY|MOVEMENT_LOOP_OUTSIDE_CONTROL) + var/datum/move_loop/loop = GLOB.move_manager.move(moving_parent, direction, delay = start_delay, subsystem = SSconveyors, flags=MOVEMENT_LOOP_IGNORE_PRIORITY|MOVEMENT_LOOP_OUTSIDE_CONTROL) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(should_move)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(loop_ended)) diff --git a/code/datums/components/drift.dm b/code/datums/components/drift.dm index f8ad46e3ec3..7fba50d3151 100644 --- a/code/datums/components/drift.dm +++ b/code/datums/components/drift.dm @@ -23,7 +23,7 @@ if(instant) flags |= MOVEMENT_LOOP_START_FAST var/atom/movable/movable_parent = parent - drifting_loop = DSmove_manager.move(moving = parent, direction = direction, delay = movable_parent.inertia_move_delay, subsystem = SSspacedrift, priority = MOVEMENT_SPACE_PRIORITY, flags = flags) + drifting_loop = GLOB.move_manager.move(moving = parent, direction = direction, delay = movable_parent.inertia_move_delay, subsystem = SSspacedrift, priority = MOVEMENT_SPACE_PRIORITY, flags = flags) if(!drifting_loop) //Really want to qdel here but can't return COMPONENT_INCOMPATIBLE diff --git a/code/datums/components/force_move.dm b/code/datums/components/force_move.dm index 6c1c1e38e5f..62fe26d71f7 100644 --- a/code/datums/components/force_move.dm +++ b/code/datums/components/force_move.dm @@ -9,7 +9,7 @@ var/mob/mob_parent = parent var/dist = get_dist(mob_parent, target) - var/datum/move_loop/loop = DSmove_manager.move_towards(mob_parent, target, delay = 1, timeout = dist) + var/datum/move_loop/loop = GLOB.move_manager.move_towards(mob_parent, target, delay = 1, timeout = dist) RegisterSignal(mob_parent, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(stop_move)) RegisterSignal(mob_parent, COMSIG_ATOM_PRE_PRESSURE_PUSH, PROC_REF(stop_pressure)) if(spin) diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 695a02bcb96..568b018e58b 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -86,7 +86,7 @@ handles linking back and forth. mat_container = parent.AddComponent( \ /datum/component/material_container, \ - DSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ local_size, \ mat_container_flags, \ container_signals = mat_container_signals, \ diff --git a/code/datums/components/shuttle_cling.dm b/code/datums/components/shuttle_cling.dm index 724060c9cbe..cef7c1f94dd 100644 --- a/code/datums/components/shuttle_cling.dm +++ b/code/datums/components/shuttle_cling.dm @@ -51,7 +51,7 @@ update_state(parent) //otherwise we'll get moved 1 tile before we can correct ourselves, which isnt super bad but just looks jank /datum/component/shuttle_cling/proc/initialize_loop() - hyperloop = DSmove_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_NO_DIR_UPDATE|MOVEMENT_LOOP_OUTSIDE_CONTROL) + hyperloop = GLOB.move_manager.move(moving = parent, direction = direction, delay = not_clinging_move_delay, subsystem = SShyperspace_drift, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_NO_DIR_UPDATE|MOVEMENT_LOOP_OUTSIDE_CONTROL) update_state() /datum/component/shuttle_cling/proc/clear_loop() diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 9d6b8674728..da5a15b8d31 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -10,7 +10,7 @@ Simple datum which is instanced once per type and is used for every object of sa var/name = "material" /// A short description of the material. Not used anywhere, yet... var/desc = "its..stuff." - /// What the material is indexed by in the DSmaterials.materials list. Defaults to the type of the material. + /// What the material is indexed by in the SSmaterials.materials list. Defaults to the type of the material. var/id ///Base color of the material, is used for greyscale. Item isn't changed in color if this is null. @@ -23,7 +23,7 @@ Simple datum which is instanced once per type and is used for every object of sa ///Starlight color of the material ///This is the color of light it'll emit if its turf is transparent and over space. Defaults to COLOR_STARLIGHT if not set var/starlight_color - ///Bitflags that influence how DSmaterials handles this material. + ///Bitflags that influence how SSmaterials handles this material. var/init_flags = MATERIAL_INIT_MAPLOAD ///Materials "Traits". its a map of key = category | Value = Bool. Used to define what it can be used for var/list/categories = list() diff --git a/code/datums/systems/ds/move_handler.dm b/code/datums/move_manager.dm similarity index 92% rename from code/datums/systems/ds/move_handler.dm rename to code/datums/move_manager.dm index dc3458627ef..23ddcbecdb7 100644 --- a/code/datums/systems/ds/move_handler.dm +++ b/code/datums/move_manager.dm @@ -17,14 +17,15 @@ * * You can find the logic for this control in this file * - * Specifics of how different loops operate can be found in the movement_types.dm file, alongside the [add to loop][/datum/system/move_manager/proc/add_to_loop] helper procs that use them + * Specifics of how different loops operate can be found in the movement_types.dm file, alongside the [add to loop][/datum/move_manager/proc/add_to_loop] helper procs that use them * **/ -DATASYSTEM_DEF(move_manager) - name = "Movement Handler" +/datum/move_manager + +GLOBAL_DATUM_INIT(move_manager, /datum/move_manager, new) ///Adds a movable thing to a movement subsystem. Returns TRUE if it all worked, FALSE if it failed somehow -/datum/system/move_manager/proc/add_to_loop(atom/movable/thing_to_add, datum/controller/subsystem/movement/subsystem = SSmovement, datum/move_loop/loop_type, priority = MOVEMENT_DEFAULT_PRIORITY, flags, datum/extra_info) +/datum/move_manager/proc/add_to_loop(atom/movable/thing_to_add, datum/controller/subsystem/movement/subsystem = SSmovement, datum/move_loop/loop_type, priority = MOVEMENT_DEFAULT_PRIORITY, flags, datum/extra_info) var/datum/movement_packet/our_data = thing_to_add.move_packet if(!our_data) our_data = new(thing_to_add) @@ -33,7 +34,7 @@ DATASYSTEM_DEF(move_manager) return our_data.add_loop(arglist(arguments)) ///Returns the subsystem's loop if we're processing on it, null otherwise -/datum/system/move_manager/proc/processing_on(atom/movable/packet_owner, datum/controller/subsystem/movement/subsystem) +/datum/move_manager/proc/processing_on(atom/movable/packet_owner, datum/controller/subsystem/movement/subsystem) var/datum/movement_packet/packet = packet_owner.move_packet if(!packet) return diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm index 91e13c79142..79996dee2dd 100644 --- a/code/datums/proximity_monitor/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -214,7 +214,7 @@ frozen_mobs += victim victim.Stun(20, ignore_canstun = TRUE) victim.add_traits(list(TRAIT_MUTE, TRAIT_EMOTEMUTE), TIMESTOP_TRAIT) - DSmove_manager.stop_looping(victim) //stops them mid pathing even if they're stunimmune //This is really dumb + GLOB.move_manager.stop_looping(victim) //stops them mid pathing even if they're stunimmune //This is really dumb if(isanimal(victim)) var/mob/living/simple_animal/animal_victim = victim animal_victim.toggle_ai(AI_OFF) diff --git a/code/datums/systems/_system.dm b/code/datums/systems/_system.dm deleted file mode 100644 index fe3271048ab..00000000000 --- a/code/datums/systems/_system.dm +++ /dev/null @@ -1,16 +0,0 @@ -#define NEW_DS_GLOBAL(varname) if(varname != src){if(istype(varname)){qdel(varname);}varname = src;} - -#define DATASYSTEM_DEF(X) GLOBAL_REAL(DS##X, /datum/system/##X);\ -/datum/system/##X/New(){\ - NEW_DS_GLOBAL(DS##X);\ -}\ -/datum/system/##X - - -/** - * Global systems which are distinct from subsystems in that they do not process by the MC. - * Data systems or "DS" are used to store round information and procs to interface with that data, if needed. - */ -/datum/system - /// Name of the system - var/name = "Datum System" diff --git a/code/datums/systems/ds/battle_royale.dm b/code/datums/systems/ds/battle_royale.dm deleted file mode 100644 index 1cdc7358a56..00000000000 --- a/code/datums/systems/ds/battle_royale.dm +++ /dev/null @@ -1,229 +0,0 @@ -/// Global list of areas which are considered to be inside the same department for our purposes -GLOBAL_LIST_INIT(battle_royale_regions, list( - "Medical Bay" = list( - /area/station/command/heads_quarters/cmo, - /area/station/medical, - /area/station/security/checkpoint/medical, - ), - "Research Division" = list( - /area/station/command/heads_quarters/rd, - /area/station/security/checkpoint/science, - /area/station/science, - ), - "Engineering Bay" = list( - /area/station/command/heads_quarters/ce, - /area/station/engineering, - /area/station/maintenance/disposal/incinerator, - /area/station/security/checkpoint/engineering, - ), - "Cargo Bay" = list( - /area/station/cargo, - /area/station/command/heads_quarters/qm, - /area/station/security/checkpoint/supply, - ), -)) - -/// Basically just exists to hold references to datums so that they don't GC -DATASYSTEM_DEF(battle_royale) - name = "Battle Royale" - /// List of battle royale datums currently running - var/list/active_battles - -/// Start a new battle royale using a passed list of implants -/datum/system/battle_royale/proc/start_battle(list/competitors) - var/datum/battle_royale_controller/controller = new() - if (!controller.start(competitors)) - return FALSE - LAZYADD(active_battles, controller) - if (LAZYLEN(active_battles) == 1) - start_broadcasting_network(BATTLE_ROYALE_CAMERA_NET) - RegisterSignal(controller, COMSIG_QDELETING, PROC_REF(battle_ended)) - return TRUE - -/// Drop reference when it kills itself -/datum/system/battle_royale/proc/battle_ended(datum/source) - SIGNAL_HANDLER - LAZYREMOVE(active_battles, source) - if (!LAZYLEN(active_battles)) - stop_broadcasting_network(BATTLE_ROYALE_CAMERA_NET) - - -/// Datum which controls the conflict -/datum/battle_royale_controller - /// Where is our battle taking place? - var/chosen_area - /// Is the battle currently in progress? - var/battle_running = TRUE - /// Should we let everyone know that someone has died? - var/announce_deaths = TRUE - /// List of implants involved - var/list/contestant_implants = list() - /// Ways to describe that someone has died - var/static/list/euphemisms = list( - "cashed their last paycheque.", - "didn't make it...", - "didn't make the cut.", - "had their head blown clean off!", - "has been killed!", - "has failed the challenge!", - "has passed away.", - "has died.", - "is in a better place now.", - "isn't going to be clocking in tomorrow!", - "just flatlined.", - "isn't today's winner.", - "seems to have exploded!", - "was just murdered on live tv!", - "won't be making it to retirement.", - "won't be getting back up after that one.", - ) - /// Ways to tell people not to salt in deadchat, surely effective - var/static/list/condolences = list( - "Better luck next time!", - "But stay tuned, there's still everything to play for!", - "Did you catch who did it?", - "It looked like that one really hurt...", - "Let's get that one on action replay!", - "Let's have a moment of silence, please.", - "Let's hope the next one does better.", - "Someone please notify their next of kin.", - "They had a good run.", - "Too bad!", - "What a shame!", - "What an upset!", - "What's going to happen next?", - "Who could have seen that coming?", - "Who will be next?", - ) - -/datum/battle_royale_controller/Destroy(force) - contestant_implants = null - return ..() - -/// Start a battle royale with the list of provided implants -/datum/battle_royale_controller/proc/start(list/implants, battle_time = 10 MINUTES) - chosen_area = pick(GLOB.battle_royale_regions) - for (var/obj/item/implant/explosive/battle_royale/contestant_implant in implants) - contestant_implant.start_battle(chosen_area, GLOB.battle_royale_regions[chosen_area]) - if (isnull(contestant_implant)) - continue // Might have exploded if it was removed from a person - RegisterSignal(contestant_implant, COMSIG_QDELETING, PROC_REF(implant_destroyed)) - contestant_implants |= contestant_implant - - if (length(contestant_implants) <= 1) - return FALSE // Well there's not much point is there - - priority_announce( - text = "Congratulations [station_name()], you have been chosen as the next site of the Rumble Royale! \n\ - Viewers across the sector will watch our [convert_integer_to_words(length(contestant_implants))] lucky contestants battle their way into your [chosen_area] and fight until only one is left standing! \n\ - If they don't make it in five minutes, they'll be disqualified. If you see one of our players struggling to get in, do lend them a hand... or don't, if you can live with the consequences! \n\ - As a gesture of gratitude, we will be providing our premium broadcast to your entertainment monitors at no cost so that you can watch the excitement. \n\ - Bystanders are advised not to intervene... but if you do, make it look good for the camera!", - title = "Rumble Royale Beginning", - sound = 'sound/machines/alarm.ogg', - has_important_message = TRUE, - sender_override = "Rumble Royale Pirate Broadcast Station", - color_override = "red", - ) - - for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) - contestant_implant.announce() - addtimer(CALLBACK(src, PROC_REF(limit_area)), battle_time / 2, TIMER_DELETE_ME) - addtimer(CALLBACK(src, PROC_REF(finish)), battle_time, TIMER_DELETE_ME) - return TRUE - -/// An implant was destroyed, hopefully because it exploded. Count how many competitors remain. -/datum/battle_royale_controller/proc/implant_destroyed(obj/item/implant/implant) - SIGNAL_HANDLER - contestant_implants -= implant - if (!battle_running) - return - - if (length(contestant_implants) <= 1) - announce_winner(implant) - else if (announce_deaths) - var/message = "" - if (isnull(implant.imp_in)) - message = "Looks like someone removed and destroyed their implant, that's cheating!" - else - message = "[implant.imp_in.real_name] [pick(euphemisms)] [pick(condolences)]" - priority_announce( - text = message, - title = "Rumble Royale Casualty Report", - sound = 'sound/misc/notice1.ogg', - has_important_message = TRUE, - sender_override = "Rumble Royale Pirate Broadcast Station", - color_override = "red", - ) - -/// There's only one person left, we have a winner! -/datum/battle_royale_controller/proc/announce_winner(obj/item/implant/losing_implant) - battle_running = FALSE - if (length(contestant_implants) > 1) - return - - var/message = "" - var/mob/living/loser = losing_implant.imp_in - var/obj/item/implant/winning_implant = pop(contestant_implants) - var/mob/living/winner = winning_implant?.imp_in - - if (isnull(winner) && isnull(loser)) - message = "Somehow, it seems like there's no winner tonight. What a disappointment!" - else - var/loser_text = isnull(loser) ? "With the disqualification of the other remaining contestant" : "With the death of [loser.real_name]" - var/winner_text = isnull(winner) ? "we must sadly announce that the would-be winner has also been disqualified. Such bad showmanship!" : "only [winner.real_name] remains. Congratulations, we have a winner!" - message = "[loser_text], [winner_text]" - - if (!isnull(winner)) - podspawn(list( - "target" = get_turf(winner), - "style" = STYLE_SYNDICATE, - "spawn" = /obj/item/food/roast_dinner, - )) - - priority_announce( - text = message, - title = "Rumble Royale Winner", - sound = 'sound/misc/notice1.ogg', - has_important_message = TRUE, - sender_override = "Rumble Royale Pirate Broadcast Station", - color_override = "red", - ) - - qdel(winning_implant) // You get to live! - winner?.mind?.remove_antag_datum(/datum/antagonist/survivalist/battle_royale) - qdel(src) - -/// Called halfway through the battle, if you've not made it to the designated battle zone we kill you -/datum/battle_royale_controller/proc/limit_area() - priority_announce( - text = "We're halfway done folks! And bad news to anyone who hasn't made it to the [chosen_area]... you're out!", - title = "Rumble Royale Update", - sound = 'sound/misc/notice1.ogg', - has_important_message = TRUE, - sender_override = "Rumble Royale Pirate Broadcast Station", - color_override = "red", - ) - - for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) - contestant_implant.limit_areas() - -/// Well you're out of time, bad luck -/datum/battle_royale_controller/proc/finish() - battle_running = FALSE - - priority_announce( - text = "Sorry remaining contestants, your time is up. \ - We're sorry to announce that this edition of Royal Rumble has no winner. \n\ - Better luck next time!", - title = "Rumble Royale Concluded", - sound = 'sound/misc/notice1.ogg', - has_important_message = TRUE, - sender_override = "Rumble Royale Pirate Broadcast Station", - color_override = "red", - ) - - for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) - contestant_implant.explode() - - qdel(src) diff --git a/code/datums/systems/manager.dm b/code/datums/systems/manager.dm deleted file mode 100644 index 0d5fdb8b839..00000000000 --- a/code/datums/systems/manager.dm +++ /dev/null @@ -1,14 +0,0 @@ -// See initialization order in /code/game/world.dm -GLOBAL_REAL(SysMgr, /datum/system_manager) - - -/** - * Initializes all data systems and keeps track of them. - */ -/datum/system_manager - /// List of managed data systems, post initialization. - var/list/datum/system/managed = list() - - -/datum/system_manager/New() - init_subtypes(/datum/system, managed) diff --git a/code/game/atom/atom_materials.dm b/code/game/atom/atom_materials.dm index deb27140257..345a8486dd6 100644 --- a/code/game/atom/atom_materials.dm +++ b/code/game/atom/atom_materials.dm @@ -23,7 +23,7 @@ var/datum/material/custom_material = GET_MATERIAL_REF(current_material) custom_material.on_applied(src, OPTIMAL_COST(materials[current_material] * multiplier * material_modifier), material_flags) - custom_materials = DSmaterials.FindOrCreateMaterialCombo(materials, multiplier) + custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier) /** * Returns the material composition of the atom. diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 02dfa624d35..296a9031ae2 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -32,7 +32,7 @@ /obj/machinery/autolathe/Initialize(mapload) materials = AddComponent( \ /datum/component/material_container, \ - DSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ + SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ 0, \ MATCONTAINER_EXAMINE, \ container_signals = list(COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/autolathe, AfterMaterialInsert)) \ @@ -252,7 +252,7 @@ var/amount_needed = design.materials[material] if(istext(material)) // category var/list/choices = list() - for(var/datum/material/valid_candidate as anything in DSmaterials.materials_by_category[material]) + for(var/datum/material/valid_candidate as anything in SSmaterials.materials_by_category[material]) if(materials.get_material_amount(valid_candidate) < amount_needed) continue choices[valid_candidate.name] = valid_candidate diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index c71d80ccfba..6117966207c 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -335,7 +335,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (!message) return - DScommunications.soft_filtering = FALSE + GLOB.communications_controller.soft_filtering = FALSE var/list/hard_filter_result = is_ic_filtered(message) if(hard_filter_result) tgui_alert(usr, "Your message contains: (\"[hard_filter_result[CHAT_FILTER_INDEX_WORD]]\"), which is not allowed on this server.") @@ -347,7 +347,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return message_admins("[ADMIN_LOOKUPFLW(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[html_encode(message)]\"") log_admin_private("[key_name(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[message]\"") - DScommunications.soft_filtering = TRUE + GLOB.communications_controller.soft_filtering = TRUE playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) @@ -358,13 +358,13 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) GLOB.admins, span_adminnotice( \ "CROSS-SECTOR MESSAGE (OUTGOING): [ADMIN_LOOKUPFLW(usr)] is about to send \ - the following message to [destination] (will autoapprove in [DScommunications.soft_filtering ? DisplayTimeText(EXTENDED_CROSS_SECTOR_CANCEL_TIME) : DisplayTimeText(CROSS_SECTOR_CANCEL_TIME)]): \ + the following message to [destination] (will autoapprove in [GLOB.communications_controller.soft_filtering ? DisplayTimeText(EXTENDED_CROSS_SECTOR_CANCEL_TIME) : DisplayTimeText(CROSS_SECTOR_CANCEL_TIME)]): \ REJECT
\ [html_encode(message)]" \ ) ) - send_cross_comms_message_timer = addtimer(CALLBACK(src, PROC_REF(send_cross_comms_message), usr, destination, message), DScommunications.soft_filtering ? EXTENDED_CROSS_SECTOR_CANCEL_TIME : CROSS_SECTOR_CANCEL_TIME, TIMER_STOPPABLE) + send_cross_comms_message_timer = addtimer(CALLBACK(src, PROC_REF(send_cross_comms_message), usr, destination, message), GLOB.communications_controller.soft_filtering ? EXTENDED_CROSS_SECTOR_CANCEL_TIME : CROSS_SECTOR_CANCEL_TIME, TIMER_STOPPABLE) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) if ("setState") @@ -552,7 +552,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) var/network_name = CONFIG_GET(string/cross_comms_network) if(network_name) payload["network"] = network_name - if(DScommunications.soft_filtering) + if(GLOB.communications_controller.soft_filtering) payload["is_filtered"] = TRUE var/name_to_send = "[CONFIG_GET(string/cross_comms_name)]([station_name()])" //SKYRAT EDIT ADDITION @@ -562,7 +562,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) usr.log_talk(message, LOG_SAY, tag = "message to the other server") message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server\[s].") deadchat_broadcast(" has sent an outgoing message to the other station(s).", "[usr.real_name]", usr, message_type = DEADCHAT_ANNOUNCEMENT) - DScommunications.soft_filtering = FALSE // set it to false at the end of the proc to ensure that everything prior reads as intended + GLOB.communications_controller.soft_filtering = FALSE // set it to false at the end of the proc to ensure that everything prior reads as intended /obj/machinery/computer/communications/ui_data(mob/user) var/list/data = list( @@ -727,7 +727,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return deltimer(send_cross_comms_message_timer) - DScommunications.soft_filtering = FALSE + GLOB.communications_controller.soft_filtering = FALSE send_cross_comms_message_timer = null log_admin("[key_name(usr)] has cancelled the outgoing cross-comms message.") @@ -800,7 +800,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) /obj/machinery/computer/communications/proc/make_announcement(mob/living/user) var/is_ai = HAS_SILICON_ACCESS(user) - if(!DScommunications.can_announce(user, is_ai)) + if(!GLOB.communications_controller.can_announce(user, is_ai)) to_chat(user, span_alert("Intercomms recharging. Please stand by.")) return var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement") @@ -821,7 +821,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) ) var/list/players = get_communication_players() - DScommunications.make_announcement(user, is_ai, input, syndicate || (obj_flags & EMAGGED), players) + GLOB.communications_controller.make_announcement(user, is_ai, input, syndicate || (obj_flags & EMAGGED), players) deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(usr, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) /obj/machinery/computer/communications/proc/get_communication_players() diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 9df7d584f42..28aae488866 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -21,7 +21,7 @@ /obj/machinery/recycler/Initialize(mapload) materials = AddComponent( /datum/component/material_container, \ - DSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_NO_INSERT \ ) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 154b03e0f98..693668e9e89 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -606,7 +606,7 @@ var/datum/radial_menu_choice/null_choice = new null_choice.name = DIMENSION_CHOICE_RANDOM choosable_dimensions[DIMENSION_CHOICE_RANDOM] = null_choice - for(var/datum/dimension_theme/theme as anything in DSmaterials.dimensional_themes) + for(var/datum/dimension_theme/theme as anything in SSmaterials.dimensional_themes) var/datum/radial_menu_choice/theme_choice = new theme_choice.image = image(initial(theme.icon), initial(theme.icon_state)) theme_choice.name = initial(theme.name) @@ -628,14 +628,14 @@ /obj/item/bombcore/dimensional/detonate() var/list/affected_turfs = circle_range_turfs(src, range_heavy) - var/theme_count = length(DSmaterials.dimensional_themes) + var/theme_count = length(SSmaterials.dimensional_themes) var/num_affected = 0 for(var/turf/affected as anything in affected_turfs) var/datum/dimension_theme/theme_to_use if(isnull(chosen_theme)) - theme_to_use = DSmaterials.dimensional_themes[DSmaterials.dimensional_themes[rand(1, theme_count)]] + theme_to_use = SSmaterials.dimensional_themes[SSmaterials.dimensional_themes[rand(1, theme_count)]] else - theme_to_use = DSmaterials.dimensional_themes[chosen_theme] + theme_to_use = SSmaterials.dimensional_themes[chosen_theme] if(!theme_to_use.can_convert(affected)) continue num_affected++ diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional.dm b/code/game/objects/effects/anomalies/anomalies_dimensional.dm index a4ebfc21f1a..026c5974d5f 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional.dm @@ -51,7 +51,7 @@ /obj/effect/anomaly/dimensional/proc/prepare_area(new_theme_path) if (!new_theme_path) new_theme_path = pick(subtypesof(/datum/dimension_theme)) - theme = DSmaterials.dimensional_themes[new_theme_path] + theme = SSmaterials.dimensional_themes[new_theme_path] apply_theme_icon() target_turfs = list() diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index fb87f788036..bf826e207db 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -47,7 +47,7 @@ break return - var/datum/move_loop/loop = DSmove_manager.move(src, direction, delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move(src, direction, delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects)) /obj/effect/decal/cleanable/xenoblood/xgibs/proc/spread_movement_effects(datum/move_loop/has_target/source) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 7812ba789b5..8c0788e2fd7 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -163,7 +163,7 @@ break return - var/datum/move_loop/loop = DSmove_manager.move_to(src, get_step(src, direction), delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move_to(src, get_step(src, direction), delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects)) /obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source) @@ -376,7 +376,7 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) /// Set the splatter up to fly through the air until it rounds out of steam or hits something /obj/effect/decal/cleanable/blood/hitsplatter/proc/fly_towards(turf/target_turf, range) var/delay = 2 - var/datum/move_loop/loop = DSmove_manager.move_towards(src, target_turf, delay, timeout = delay * range, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_START_FAST) + var/datum/move_loop/loop = GLOB.move_manager.move_towards(src, target_turf, delay, timeout = delay * range, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_START_FAST) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(loop_done)) diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 77034850a0b..808a68d6f5e 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -32,7 +32,7 @@ break return - var/datum/move_loop/loop = DSmove_manager.move(src, direction, delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move(src, direction, delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects)) /obj/effect/decal/cleanable/robot_debris/proc/spread_movement_effects(datum/move_loop/has_target/source) diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 9e5418a94f4..4fdd4ac598e 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -67,7 +67,7 @@ would spawn and follow the beaker, even if it is carried or thrown. var/step_amt = pick(1,2,3) var/step_delay = 5 - var/datum/move_loop/loop = DSmove_manager.move(effect, direction, step_delay, timeout = step_delay * step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move(effect, direction, step_delay, timeout = step_delay * step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(decrement_total_effect)) /datum/effect_system/proc/decrement_total_effect(datum/source) diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 9153d4151b3..a8a3431ef9c 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -11,7 +11,7 @@ /obj/effect/particle_effect/expl_particles/LateInitialize() var/step_amt = pick(25;1,50;2,100;3,200;4) - var/datum/move_loop/loop = DSmove_manager.move(src, pick(GLOB.alldirs), 1, timeout = step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move(src, pick(GLOB.alldirs), 1, timeout = step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(end_particle)) /obj/effect/particle_effect/expl_particles/proc/end_particle(datum/source) diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 6444cf3d0ee..f94e5d0e31c 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -38,7 +38,7 @@ /// Starts the effect moving at a target with a delay in deciseconds, and a lifetime in moves /// Returns the created loop /obj/effect/particle_effect/water/extinguisher/proc/move_at(atom/target, delay, lifetime) - var/datum/move_loop/loop = DSmove_manager.move_towards_legacy(src, target, delay, timeout = delay * lifetime, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move_towards_legacy(src, target, delay, timeout = delay * lifetime, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_forcemove)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(movement_stopped)) return loop @@ -63,7 +63,7 @@ // Stomach acid doesn't use legacy because it's not "targeted", and we instead want the circular sorta look /obj/effect/particle_effect/water/extinguisher/stomach_acid/move_at(atom/target, delay, lifetime) - var/datum/move_loop/loop = DSmove_manager.move_towards(src, target, delay, timeout = delay * lifetime, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move_towards(src, target, delay, timeout = delay * lifetime, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_forcemove)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(movement_stopped)) return loop diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index e87b27e0913..eb5bb62df5c 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -25,5 +25,5 @@ /obj/structure/alien/egg/delivery/Initialize(mapload) . = ..() - DScommunications.xenomorph_egg_delivered = TRUE - DScommunications.captivity_area = get_area(src) + GLOB.communications_controller.xenomorph_egg_delivered = TRUE + GLOB.communications_controller.captivity_area = get_area(src) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 874104c9202..1467a7854be 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -70,7 +70,7 @@ ADD_TRAIT(AM, TRAIT_IMMOBILIZED, REF(src)) affecting[AM] = AM.dir - var/datum/move_loop/loop = DSmove_manager.move(AM, direction, speed, tiles ? tiles * speed : INFINITY) + var/datum/move_loop/loop = GLOB.move_manager.move(AM, direction, speed, tiles ? tiles * speed : INFINITY) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(set_to_normal)) diff --git a/code/game/objects/effects/temporary_visuals/effect_trail.dm b/code/game/objects/effects/temporary_visuals/effect_trail.dm index 2fd7d41d22c..9b28dcf909d 100644 --- a/code/game/objects/effects/temporary_visuals/effect_trail.dm +++ b/code/game/objects/effects/temporary_visuals/effect_trail.dm @@ -29,7 +29,7 @@ AddElement(/datum/element/floor_loving) AddComponent(/datum/component/spawner, spawn_types = list(spawned_effect), max_spawned = max_spawned, spawn_time = spawn_interval) src.target = target - movement = DSmove_manager.move_towards(src, chasing = target, delay = move_speed, home = homing, timeout = duration, flags = MOVEMENT_LOOP_START_FAST) + movement = GLOB.move_manager.move_towards(src, chasing = target, delay = move_speed, home = homing, timeout = duration, flags = MOVEMENT_LOOP_START_FAST) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_invalid)) if (isliving(target)) diff --git a/code/game/objects/items/devices/battle_royale.dm b/code/game/objects/items/devices/battle_royale.dm index 4a47b164f43..ab871520465 100644 --- a/code/game/objects/items/devices/battle_royale.dm +++ b/code/game/objects/items/devices/battle_royale.dm @@ -1,3 +1,28 @@ +/// Global list of areas which are considered to be inside the same department for our purposes +GLOBAL_LIST_INIT(battle_royale_regions, list( + "Medical Bay" = list( + /area/station/command/heads_quarters/cmo, + /area/station/medical, + /area/station/security/checkpoint/medical, + ), + "Research Division" = list( + /area/station/command/heads_quarters/rd, + /area/station/security/checkpoint/science, + /area/station/science, + ), + "Engineering Bay" = list( + /area/station/command/heads_quarters/ce, + /area/station/engineering, + /area/station/maintenance/disposal/incinerator, + /area/station/security/checkpoint/engineering, + ), + "Cargo Bay" = list( + /area/station/cargo, + /area/station/command/heads_quarters/qm, + /area/station/security/checkpoint/supply, + ), +)) + /// Quietly implants people with battle royale implants /obj/item/royale_implanter name = "royale implanter" @@ -78,7 +103,7 @@ balloon_alert(user, "[required_contestants - contestant_count] contestants needed!") return - DSbattle_royale.start_battle(implanted_implants) + GLOB.battle_royale_master.start_battle(implanted_implants) for (var/obj/implanter as anything in linked_implanters) do_sparks(3, cardinal_only = FALSE, source = implanter) @@ -115,3 +140,208 @@ /obj/item/royale_remote/proc/implant_destroyed(obj/item/implant) SIGNAL_HANDLER implanted_implants -= implant + +GLOBAL_DATUM_INIT(battle_royale_master, /datum/battle_royale_master, new) + +/// Basically just exists to hold references to datums so that they don't GC +/datum/battle_royale_master + /// List of battle royale datums currently running + var/list/active_battles + +/// Start a new battle royale using a passed list of implants +/datum/battle_royale_master/proc/start_battle(list/competitors) + var/datum/battle_royale_controller/controller = new() + if (!controller.start(competitors)) + return FALSE + LAZYADD(active_battles, controller) + if (LAZYLEN(active_battles) == 1) + start_broadcasting_network(BATTLE_ROYALE_CAMERA_NET) + RegisterSignal(controller, COMSIG_QDELETING, PROC_REF(battle_ended)) + return TRUE + +/// Drop reference when it kills itself +/datum/battle_royale_master/proc/battle_ended(datum/source) + SIGNAL_HANDLER + LAZYREMOVE(active_battles, source) + if (!LAZYLEN(active_battles)) + stop_broadcasting_network(BATTLE_ROYALE_CAMERA_NET) + +/// Datum which controls the conflict +/datum/battle_royale_controller + /// Where is our battle taking place? + var/chosen_area + /// Is the battle currently in progress? + var/battle_running = TRUE + /// Should we let everyone know that someone has died? + var/announce_deaths = TRUE + /// List of implants involved + var/list/contestant_implants = list() + /// Ways to describe that someone has died + var/static/list/euphemisms = list( + "cashed their last paycheque.", + "didn't make it...", + "didn't make the cut.", + "had their head blown clean off!", + "has been killed!", + "has failed the challenge!", + "has passed away.", + "has died.", + "is in a better place now.", + "isn't going to be clocking in tomorrow!", + "just flatlined.", + "isn't today's winner.", + "seems to have exploded!", + "was just murdered on live tv!", + "won't be making it to retirement.", + "won't be getting back up after that one.", + ) + /// Ways to tell people not to salt in deadchat, surely effective + var/static/list/condolences = list( + "Better luck next time!", + "But stay tuned, there's still everything to play for!", + "Did you catch who did it?", + "It looked like that one really hurt...", + "Let's get that one on action replay!", + "Let's have a moment of silence, please.", + "Let's hope the next one does better.", + "Someone please notify their next of kin.", + "They had a good run.", + "Too bad!", + "What a shame!", + "What an upset!", + "What's going to happen next?", + "Who could have seen that coming?", + "Who will be next?", + ) + +/datum/battle_royale_controller/Destroy(force) + contestant_implants = null + return ..() + +/// Start a battle royale with the list of provided implants +/datum/battle_royale_controller/proc/start(list/implants, battle_time = 10 MINUTES) + chosen_area = pick(GLOB.battle_royale_regions) + for (var/obj/item/implant/explosive/battle_royale/contestant_implant in implants) + contestant_implant.start_battle(chosen_area, GLOB.battle_royale_regions[chosen_area]) + if (isnull(contestant_implant)) + continue // Might have exploded if it was removed from a person + RegisterSignal(contestant_implant, COMSIG_QDELETING, PROC_REF(implant_destroyed)) + contestant_implants |= contestant_implant + + if (length(contestant_implants) <= 1) + return FALSE // Well there's not much point is there + + priority_announce( + text = "Congratulations [station_name()], you have been chosen as the next site of the Rumble Royale! \n\ + Viewers across the sector will watch our [convert_integer_to_words(length(contestant_implants))] lucky contestants battle their way into your [chosen_area] and fight until only one is left standing! \n\ + If they don't make it in five minutes, they'll be disqualified. If you see one of our players struggling to get in, do lend them a hand... or don't, if you can live with the consequences! \n\ + As a gesture of gratitude, we will be providing our premium broadcast to your entertainment monitors at no cost so that you can watch the excitement. \n\ + Bystanders are advised not to intervene... but if you do, make it look good for the camera!", + title = "Rumble Royale Beginning", + sound = 'sound/machines/alarm.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) + contestant_implant.announce() + addtimer(CALLBACK(src, PROC_REF(limit_area)), battle_time / 2, TIMER_DELETE_ME) + addtimer(CALLBACK(src, PROC_REF(finish)), battle_time, TIMER_DELETE_ME) + return TRUE + +/// An implant was destroyed, hopefully because it exploded. Count how many competitors remain. +/datum/battle_royale_controller/proc/implant_destroyed(obj/item/implant/implant) + SIGNAL_HANDLER + contestant_implants -= implant + if (!battle_running) + return + + if (length(contestant_implants) <= 1) + announce_winner(implant) + else if (announce_deaths) + var/message = "" + if (isnull(implant.imp_in)) + message = "Looks like someone removed and destroyed their implant, that's cheating!" + else + message = "[implant.imp_in.real_name] [pick(euphemisms)] [pick(condolences)]" + priority_announce( + text = message, + title = "Rumble Royale Casualty Report", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + +/// There's only one person left, we have a winner! +/datum/battle_royale_controller/proc/announce_winner(obj/item/implant/losing_implant) + battle_running = FALSE + if (length(contestant_implants) > 1) + return + + var/message = "" + var/mob/living/loser = losing_implant.imp_in + var/obj/item/implant/winning_implant = pop(contestant_implants) + var/mob/living/winner = winning_implant?.imp_in + + if (isnull(winner) && isnull(loser)) + message = "Somehow, it seems like there's no winner tonight. What a disappointment!" + else + var/loser_text = isnull(loser) ? "With the disqualification of the other remaining contestant" : "With the death of [loser.real_name]" + var/winner_text = isnull(winner) ? "we must sadly announce that the would-be winner has also been disqualified. Such bad showmanship!" : "only [winner.real_name] remains. Congratulations, we have a winner!" + message = "[loser_text], [winner_text]" + + if (!isnull(winner)) + podspawn(list( + "target" = get_turf(winner), + "style" = STYLE_SYNDICATE, + "spawn" = /obj/item/food/roast_dinner, + )) + + priority_announce( + text = message, + title = "Rumble Royale Winner", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + qdel(winning_implant) // You get to live! + winner?.mind?.remove_antag_datum(/datum/antagonist/survivalist/battle_royale) + qdel(src) + +/// Called halfway through the battle, if you've not made it to the designated battle zone we kill you +/datum/battle_royale_controller/proc/limit_area() + priority_announce( + text = "We're halfway done folks! And bad news to anyone who hasn't made it to the [chosen_area]... you're out!", + title = "Rumble Royale Update", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) + contestant_implant.limit_areas() + +/// Well you're out of time, bad luck +/datum/battle_royale_controller/proc/finish() + battle_running = FALSE + + priority_announce( + text = "Sorry remaining contestants, your time is up. \ + We're sorry to announce that this edition of Royal Rumble has no winner. \n\ + Better luck next time!", + title = "Rumble Royale Concluded", + sound = 'sound/misc/notice1.ogg', + has_important_message = TRUE, + sender_override = "Rumble Royale Pirate Broadcast Station", + color_override = "red", + ) + + for (var/obj/item/implant/explosive/battle_royale/contestant_implant as anything in contestant_implants) + contestant_implant.explode() + + qdel(src) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 0132cc0f0d8..f7a177f322c 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -258,7 +258,7 @@ //Chair movement loop /obj/item/extinguisher/proc/move_chair(obj/buckled_object, movementdirection) - var/datum/move_loop/loop = DSmove_manager.move(buckled_object, movementdirection, 1, timeout = 9, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move(buckled_object, movementdirection, 1, timeout = 9, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) //This means the chair slowing down is dependant on the extinguisher existing, which is weird //Couldn't figure out a better way though RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(manage_chair_speed)) diff --git a/code/game/objects/items/machine_wand.dm b/code/game/objects/items/machine_wand.dm index 7ce94b9ad40..bc5eb8583f9 100644 --- a/code/game/objects/items/machine_wand.dm +++ b/code/game/objects/items/machine_wand.dm @@ -150,7 +150,7 @@ CRASH("a moving bug has been created but isn't moving towards anything!") src.controller = controller src.thing_moving_towards = thing_moving_towards - var/datum/move_loop/loop = DSmove_manager.home_onto(src, thing_moving_towards, delay = 5, flags = MOVEMENT_LOOP_NO_DIR_UPDATE) + var/datum/move_loop/loop = GLOB.move_manager.home_onto(src, thing_moving_towards, delay = 5, flags = MOVEMENT_LOOP_NO_DIR_UPDATE) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(reached_destination_check)) RegisterSignal(thing_moving_towards, COMSIG_QDELETING, PROC_REF(on_machine_del)) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 83235796a45..18a95cd77d3 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -110,9 +110,9 @@ for(var/category in what_are_we_made_of.categories) switch(category) if(MAT_CATEGORY_BASE_RECIPES) - recipes |= DSmaterials.base_stack_recipes.Copy() + recipes |= SSmaterials.base_stack_recipes.Copy() if(MAT_CATEGORY_RIGID) - recipes |= DSmaterials.rigid_stack_recipes.Copy() + recipes |= SSmaterials.rigid_stack_recipes.Copy() update_weight() update_appearance() @@ -131,7 +131,7 @@ * - multiplier: The amount to multiply the mats per unit by. Defaults to 1. */ /obj/item/stack/proc/set_mats_per_unit(list/mats, multiplier=1) - mats_per_unit = DSmaterials.FindOrCreateMaterialCombo(mats, multiplier) + mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(mats, multiplier) update_custom_materials() /** Updates the custom materials list of this stack. diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index dd4fb325858..e6c221793d6 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -406,7 +406,7 @@ /obj/item/storage/bag/tray/proc/do_scatter(obj/item/tray_item) var/delay = rand(2,4) - var/datum/move_loop/loop = DSmove_manager.move_rand(tray_item, list(NORTH,SOUTH,EAST,WEST), delay, timeout = rand(1, 2) * delay, flags = MOVEMENT_LOOP_START_FAST) + var/datum/move_loop/loop = GLOB.move_manager.move_rand(tray_item, list(NORTH,SOUTH,EAST,WEST), delay, timeout = rand(1, 2) * delay, flags = MOVEMENT_LOOP_START_FAST) //This does mean scattering is tied to the tray. Not sure how better to handle it RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(change_speed)) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 5cef642634a..e90dd08d938 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -309,7 +309,7 @@ user.log_message("used Resin Launcher", LOG_GAME) playsound(src,'sound/items/syringeproj.ogg',40,TRUE) var/delay = 2 - var/datum/move_loop/loop = DSmove_manager.move_towards(resin, target, delay, timeout = delay * 5, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/loop = GLOB.move_manager.move_towards(resin, target, delay, timeout = delay * 5, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(resin_stop_check)) RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(resin_landed)) return diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 48848df0fd5..f88aadc0463 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -94,7 +94,7 @@ moving = TRUE current_tube = tube - var/datum/move_loop/engine = DSmove_manager.force_move_dir(src, dir, 0, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/engine = GLOB.move_manager.force_move_dir(src, dir, 0, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(engine, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(before_pipe_transfer)) RegisterSignal(engine, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(after_pipe_transfer)) RegisterSignal(engine, COMSIG_QDELETING, PROC_REF(engine_finish)) diff --git a/code/game/world.dm b/code/game/world.dm index a7391f2ab15..53f3a0fe95d 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -17,7 +17,6 @@ GLOBAL_VAR(restart_counter) * - world.init_byond_tracy() * - (Start native profiling) * - world.init_debugger() - * - SysMgr (all data systems) * - Master => * - config *unloaded * - (all subsystems) PreInit() @@ -85,9 +84,6 @@ GLOBAL_VAR(restart_counter) // Create the logger logger = new - // Initialize all the data systems - SysMgr = new - // THAT'S IT, WE'RE DONE, THE. FUCKING. END. Master = new diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index fe62bb97d81..d6120962fd1 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -253,11 +253,11 @@ ADMIN_VERB(run_weather, R_FUN, "Run Weather", "Triggers specific weather on the ADMIN_VERB(command_report_footnote, R_ADMIN, "Command Report Footnote", "Adds a footnote to the roundstart command report.", ADMIN_CATEGORY_EVENTS) var/datum/command_footnote/command_report_footnote = new /datum/command_footnote() - DScommunications.block_command_report += 1 //Add a blocking condition to the counter until the inputs are done. + GLOB.communications_controller.block_command_report += 1 //Add a blocking condition to the counter until the inputs are done. command_report_footnote.message = tgui_input_text(user, "This message will be attached to the bottom of the roundstart threat report. Be sure to delay the roundstart report if you need extra time.", "P.S.") if(!command_report_footnote.message) - DScommunications.block_command_report -= 1 + GLOB.communications_controller.block_command_report -= 1 qdel(command_report_footnote) return @@ -266,8 +266,8 @@ ADMIN_VERB(command_report_footnote, R_ADMIN, "Command Report Footnote", "Adds a if(!command_report_footnote.signature) command_report_footnote.signature = "Classified" - DScommunications.command_report_footnotes += command_report_footnote - DScommunications.block_command_report-- + GLOB.communications_controller.command_report_footnotes += command_report_footnote + GLOB.communications_controller.block_command_report-- message_admins("[user] has added a footnote to the command report: [command_report_footnote.message], signed [command_report_footnote.signature]") @@ -276,5 +276,5 @@ ADMIN_VERB(command_report_footnote, R_ADMIN, "Command Report Footnote", "Adds a var/signature ADMIN_VERB(delay_command_report, R_FUN, "Delay Command Report", "Prevents the roundstart command report from being sent; or forces it to send it delayed.", ADMIN_CATEGORY_EVENTS) - DScommunications.block_command_report = !DScommunications.block_command_report - message_admins("[key_name_admin(user)] has [(DScommunications.block_command_report ? "delayed" : "sent")] the roundstart command report.") + GLOB.communications_controller.block_command_report = !GLOB.communications_controller.block_command_report + message_admins("[key_name_admin(user)] has [(GLOB.communications_controller.block_command_report ? "delayed" : "sent")] the roundstart command report.") diff --git a/code/modules/antagonists/pirate/pirate_event.dm b/code/modules/antagonists/pirate/pirate_event.dm index 40cf038a214..5ecefa3094d 100644 --- a/code/modules/antagonists/pirate/pirate_event.dm +++ b/code/modules/antagonists/pirate/pirate_event.dm @@ -42,7 +42,7 @@ priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", SSstation.announcer.get_rand_report_sound()) threat.answer_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pirates_answered), threat, chosen_gang, payoff, world.time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_pirates), threat, chosen_gang), RESPONSE_MAX_TIME) - DScommunications.send_message(threat, unique = TRUE) + GLOB.communications_controller.send_message(threat, unique = TRUE) /proc/pirates_answered(datum/comm_message/threat, datum/pirate_gang/chosen_gang, payoff, initial_send_time) if(world.time > initial_send_time + RESPONSE_MAX_TIME) diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm index 8a74d4b63da..4b8a20acba8 100644 --- a/code/modules/antagonists/space_dragon/carp_rift.dm +++ b/code/modules/antagonists/space_dragon/carp_rift.dm @@ -160,7 +160,7 @@ newcarp.faction = dragon.owner.current.faction.Copy() if(SPT_PROB(1.5, seconds_per_tick)) var/rand_dir = pick(GLOB.cardinals) - DSmove_manager.move_to(src, get_step(src, rand_dir), 1) + GLOB.move_manager.move_to(src, get_step(src, rand_dir), 1) return // Increase time trackers and check for any updated states. diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 222fcb39d16..40b15248413 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -362,7 +362,7 @@ qdel(src) return RegisterSignal(src, COMSIG_MOVABLE_CROSS_OVER, PROC_REF(check_teleport)) - DSmove_manager.move_towards(src, get_turf(whistle.whistler)) + GLOB.move_manager.move_towards(src, get_turf(whistle.whistler)) /// Check if anything the tornado crosses is the creator. /obj/effect/temp_visual/teleporting_tornado/proc/check_teleport(datum/source, atom/movable/crossed) diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm index d2e0bddd0dd..59c83fd52ed 100644 --- a/code/modules/antagonists/xeno/xeno.dm +++ b/code/modules/antagonists/xeno/xeno.dm @@ -87,7 +87,7 @@ explanation_text = "Escape from captivity." /datum/objective/escape_captivity/check_completion() - if(!istype(get_area(owner), DScommunications.captivity_area)) + if(!istype(get_area(owner), GLOB.communications_controller.captivity_area)) return TRUE /datum/objective/advance_hive @@ -146,7 +146,7 @@ if(!captive_alien || captive_alien.stat == DEAD) return CAPTIVE_XENO_DEAD - if(istype(get_area(captive_alien), DScommunications.captivity_area)) + if(istype(get_area(captive_alien), GLOB.communications_controller.captivity_area)) return CAPTIVE_XENO_FAIL return CAPTIVE_XENO_PASS @@ -155,7 +155,7 @@ /mob/living/carbon/alien/mind_initialize() ..() if(!mind.has_antag_datum(/datum/antagonist/xeno)) - if(DScommunications.xenomorph_egg_delivered && istype(get_area(src), DScommunications.captivity_area)) + if(GLOB.communications_controller.xenomorph_egg_delivered && istype(get_area(src), GLOB.communications_controller.captivity_area)) mind.add_antag_datum(/datum/antagonist/xeno/captive) else mind.add_antag_datum(/datum/antagonist/xeno) diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm index 658d2d07bd8..285a99cd31d 100644 --- a/code/modules/events/immovable_rod/immovable_rod.dm +++ b/code/modules/events/immovable_rod/immovable_rod.dm @@ -45,9 +45,9 @@ RegisterSignal(src, COMSIG_ATOM_ENTERING, PROC_REF(on_entering_atom)) if(special_target) - DSmove_manager.home_onto(src, special_target) + GLOB.move_manager.home_onto(src, special_target) else - DSmove_manager.move_towards(src, real_destination) + GLOB.move_manager.move_towards(src, real_destination) /obj/effect/immovablerod/Destroy(force) UnregisterSignal(src, COMSIG_ATOM_ENTERING) @@ -113,7 +113,7 @@ return visible_message(span_danger("[src] phases into reality.")) - DSmove_manager.home_onto(src, special_target) + GLOB.move_manager.home_onto(src, special_target) if(loc == target_turf) complete_trajectory() @@ -264,7 +264,7 @@ * Stops your rod's automated movement. Sit... Stay... Good rod! */ /obj/effect/immovablerod/proc/sit_stay_good_rod() - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) /** * Allows your rod to release restraint level zero and go for a walk. @@ -278,7 +278,7 @@ /obj/effect/immovablerod/proc/go_for_a_walk(walkies_location = null) if(walkies_location) special_target = walkies_location - DSmove_manager.home_onto(src, special_target) + GLOB.move_manager.home_onto(src, special_target) return complete_trajectory() @@ -294,7 +294,7 @@ */ /obj/effect/immovablerod/proc/walk_in_direction(direction) destination_turf = get_edge_target_turf(src, direction) - DSmove_manager.move_towards(src, destination_turf) + GLOB.move_manager.move_towards(src, destination_turf) /** * Rod will push the tram to a landmark if it hits the tram from the front/back diff --git a/code/modules/events/shuttle_insurance.dm b/code/modules/events/shuttle_insurance.dm index fed6ad9af9e..4442291a9ed 100644 --- a/code/modules/events/shuttle_insurance.dm +++ b/code/modules/events/shuttle_insurance.dm @@ -43,7 +43,7 @@ /datum/round_event/shuttle_insurance/start() insurance_message = new("Shuttle Insurance", "Hey, pal, this is the [ship_name]. Can't help but notice you're rocking a wild and crazy shuttle there with NO INSURANCE! Crazy. What if something happened to it, huh?! We've done a quick evaluation on your rates in this sector and we're offering [insurance_evaluation] to cover for your shuttle in case of any disaster.", list("Purchase Insurance.","Reject Offer.")) insurance_message.answer_callback = CALLBACK(src, PROC_REF(answered)) - DScommunications.send_message(insurance_message, unique = TRUE) + GLOB.communications_controller.send_message(insurance_message, unique = TRUE) /datum/round_event/shuttle_insurance/proc/answered() if(EMERGENCY_AT_LEAST_DOCKED) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 55fe9e77eac..7f1c8d781f4 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -45,5 +45,5 @@ else if(isliving(hit_atom)) var/mob/living/hit_mob = hit_atom - DSmove_manager.stop_looping(hit_mob) //stops them mid pathing even if they're stunimmune + GLOB.move_manager.stop_looping(hit_mob) //stops them mid pathing even if they're stunimmune hit_mob.apply_status_effect(/datum/status_effect/ice_block_talisman, 3 SECONDS) diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index d7a7dd14002..120352f14c5 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -76,7 +76,7 @@ /obj/effect/meteor/proc/chase_target(atom/chasing, delay, home) if(!isatom(chasing)) return - var/datum/move_loop/new_loop = DSmove_manager.move_towards(src, chasing, delay, home, lifetime) + var/datum/move_loop/new_loop = GLOB.move_manager.move_towards(src, chasing, delay, home, lifetime) if(!new_loop) return diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 2eaa1d95db9..61318f63b92 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -152,7 +152,7 @@ materials = AddComponent( \ /datum/component/material_container, \ - DSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_EXAMINE, \ allowed_items = accepted_type \ diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 5096f00a770..97c3a90b78e 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -20,7 +20,7 @@ materials = AddComponent( \ /datum/component/material_container, \ - DSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_EXAMINE, \ container_signals = list( \ diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 2c390c540ce..8415881a83a 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -98,7 +98,7 @@ SIGNAL_HANDLER mobility_flags &= ~MOBILITY_MOVE if(living_flags & MOVES_ON_ITS_OWN) - DSmove_manager.stop_looping(src) //stop mid walk //This is also really dumb + GLOB.move_manager.stop_looping(src) //stop mid walk //This is also really dumb /// Called when [TRAIT_IMMOBILIZED] is removed from the mob. /mob/living/proc/on_immobilized_trait_loss(datum/source) diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 6d85b9c1867..f09361e9bdf 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -71,7 +71,7 @@ switch(mode) if(BOT_IDLE) // idle update_appearance() - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) look_for_perp() // see if any criminals are in range if(!mode && bot_mode_flags & BOT_MODE_AUTOPATROL) // still idle, and set to patrol mode = BOT_START_PATROL // switch to patrol mode @@ -80,7 +80,7 @@ playsound(src,'sound/effects/beepskyspinsabre.ogg',100,TRUE,-1) // general beepsky doesn't give up so easily, jedi scum if(frustration >= 20) - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) back_to_idle() return if(target) // make sure target exists @@ -91,7 +91,7 @@ return else // not next to perp var/turf/olddist = get_dist(src, target) - DSmove_manager.move_to(src, target, 1, 4) + GLOB.move_manager.move_to(src, target, 1, 4) if((get_dist(src, target)) >= (olddist)) frustration++ else diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 8c933e8f83a..5f22d0ed1c8 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -164,7 +164,7 @@ target = null oldtarget_name = null set_anchored(FALSE) - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) last_found = world.time /mob/living/simple_animal/bot/secbot/proc/on_saboteur(datum/source, disrupt_duration) @@ -389,7 +389,7 @@ switch(mode) if(BOT_IDLE) // idle - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) look_for_perp() // see if any criminals are in range if((mode == BOT_IDLE) && bot_mode_flags & BOT_MODE_AUTOPATROL) // didn't start hunting during look_for_perp, and set to patrol mode = BOT_START_PATROL // switch to patrol mode @@ -397,7 +397,7 @@ if(BOT_HUNT) // hunting for perp // if can't reach perp for long enough, go idle if(frustration >= 8) - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) back_to_idle() return @@ -415,7 +415,7 @@ // not next to perp var/turf/olddist = get_dist(src, target) - DSmove_manager.move_to(src, target, 1, 4) + GLOB.move_manager.move_to(src, target, 1, 4) if((get_dist(src, target)) >= (olddist)) frustration++ else diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 86fc82d77e0..4bba53270e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -104,7 +104,7 @@ /mob/living/simple_animal/hostile/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() if(!.) //dead - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF || QDELETED(src)) @@ -339,11 +339,11 @@ if(!target.Adjacent(target_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown OpenFire(target) if(!Process_Spacemove(0)) //Drifting - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) return 1 if(retreat_distance != null) //If we have a retreat distance, check if we need to run from our target if(target_distance <= retreat_distance) //If target's closer than our retreat distance, run - DSmove_manager.move_away(src, target, retreat_distance, move_to_delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE) + GLOB.move_manager.move_away(src, target, retreat_distance, move_to_delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE) else Goto(target,move_to_delay,minimum_distance) //Otherwise, get to our minimum distance so we chase them else @@ -378,7 +378,7 @@ approaching_target = TRUE else approaching_target = FALSE - DSmove_manager.move_to(src, target, minimum_distance, delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE) + GLOB.move_manager.move_to(src, target, minimum_distance, delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE) return TRUE /mob/living/simple_animal/hostile/adjustHealth(amount, updating_health = TRUE, forced = FALSE) @@ -418,7 +418,7 @@ GiveTarget(null) approaching_target = FALSE in_melee = FALSE - DSmove_manager.stop_looping(src) + GLOB.move_manager.stop_looping(src) LoseAggro() SEND_SIGNAL(src, COMSIG_HOSTILE_MOB_LOST_TARGET) // SKYRAT EDIT ADDITION diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 414cf97eab2..a71b9f76af3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -370,7 +370,7 @@ /obj/machinery/anomalous_crystal/theme_warp/Initialize(mapload) . = ..() - terrain_theme = DSmaterials.dimensional_themes[pick(subtypesof(/datum/dimension_theme))] + terrain_theme = SSmaterials.dimensional_themes[pick(subtypesof(/datum/dimension_theme))] observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme.name]\"." /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index b2555309f8a..95744d0a2d3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -45,7 +45,7 @@ /mob/living/simple_animal/hostile/asteroid/curseblob/proc/move_loop(move_target, delay) if(our_loop) return - our_loop = DSmove_manager.force_move(src, move_target, delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + our_loop = GLOB.move_manager.force_move(src, move_target, delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) if(!our_loop) return RegisterSignal(move_target, COMSIG_MOB_STATCHANGE, PROC_REF(stat_change)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4cfe68b2b96..25d0e566b15 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -539,7 +539,7 @@ /mob/living/simple_animal/proc/Goto(target, delay, minimum_distance) if(prevent_goto_movement) return FALSE - DSmove_manager.move_to(src, target, minimum_distance, delay) + GLOB.move_manager.move_to(src, target, minimum_distance, delay) return TRUE //Makes this mob hunt the prey, be it living or an object. Will kill living creatures, and delete objects. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 35ef05ec40f..2e2f5c85b53 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -315,7 +315,7 @@ if(rebound.last_pushoff == world.time) continue if(continuous_move && !pass_allowed) - var/datum/move_loop/move/rebound_engine = DSmove_manager.processing_on(rebound, SSspacedrift) + var/datum/move_loop/move/rebound_engine = GLOB.move_manager.processing_on(rebound, SSspacedrift) // If you're moving toward it and you're both going the same direction, stop if(moving_direction == get_dir(src, pushover) && rebound_engine && moving_direction == rebound_engine.direction) continue diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index adbcc2064f8..2aec3e361c4 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -834,7 +834,7 @@ . = ..() if(!length(accepted_mats)) - accepted_mats = DSmaterials.materials_by_category[MAT_CATEGORY_SILO] + accepted_mats = SSmaterials.materials_by_category[MAT_CATEGORY_SILO] container = AddComponent( \ /datum/component/material_container, \ diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index ec2139ad5d0..15135bee1a5 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -43,7 +43,7 @@ /obj/item/ammo_box/Initialize(mapload) . = ..() - custom_materials = DSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.1) + custom_materials = SSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.1) if(!start_empty) top_off(starting=TRUE) update_icon_state() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index e35a71e5d9b..d2e44a4c4bb 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -100,7 +100,7 @@ reagent_puff.end_life() return - var/datum/move_loop/our_loop = DSmove_manager.move_towards_legacy(reagent_puff, target, wait_step, timeout = range * wait_step, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + var/datum/move_loop/our_loop = GLOB.move_manager.move_towards_legacy(reagent_puff, target, wait_step, timeout = range * wait_step, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) reagent_puff.RegisterSignal(our_loop, COMSIG_QDELETING, TYPE_PROC_REF(/obj/effect/decal/chempuff, loop_ended)) reagent_puff.RegisterSignal(our_loop, COMSIG_MOVELOOP_POSTPROCESS, TYPE_PROC_REF(/obj/effect/decal/chempuff, check_move)) diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 6d5b270cd71..8271298a0e6 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -241,7 +241,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor/proc/conveyable_enter(datum/source, atom/convayable) SIGNAL_HANDLER if(operating == CONVEYOR_OFF) - DSmove_manager.stop_looping(convayable, SSconveyors) + GLOB.move_manager.stop_looping(convayable, SSconveyors) return start_conveying(convayable) @@ -249,12 +249,12 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) SIGNAL_HANDLER var/has_conveyor = neighbors["[direction]"] if(convayable.z != z || !has_conveyor || !isturf(convayable.loc)) //If you've entered something on us, stop moving - DSmove_manager.stop_looping(convayable, SSconveyors) + GLOB.move_manager.stop_looping(convayable, SSconveyors) /obj/machinery/conveyor/proc/start_conveying(atom/movable/moving) if(QDELETED(moving)) return - var/datum/move_loop/move/moving_loop = DSmove_manager.processing_on(moving, SSconveyors) + var/datum/move_loop/move/moving_loop = GLOB.move_manager.processing_on(moving, SSconveyors) if(moving_loop) moving_loop.direction = movedir moving_loop.delay = speed * 1 SECONDS @@ -268,7 +268,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor/proc/stop_conveying(atom/movable/thing) if(!ismovable(thing)) return - DSmove_manager.stop_looping(thing, SSconveyors) + GLOB.move_manager.stop_looping(thing, SSconveyors) // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(obj/item/attacking_item, mob/living/user, params) diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index ecc33c240bf..b842a69413d 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -78,7 +78,7 @@ /// Starts the movement process, persists while the holder is moving through pipes /obj/structure/disposalholder/proc/start_moving() var/delay = world.tick_lag - var/datum/move_loop/our_loop = DSmove_manager.move_disposals(src, delay = delay, timeout = delay * count) + var/datum/move_loop/our_loop = GLOB.move_manager.move_disposals(src, delay = delay, timeout = delay * count) if(our_loop) RegisterSignal(our_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(our_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(try_expel)) diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index af02fa72117..d907191c33d 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -391,7 +391,7 @@ /datum/religion_rites/ceremonial_weapon/perform_rite(mob/living/user, atom/religious_tool) for(var/obj/item/stack/sheet/could_blade in get_turf(religious_tool)) - if(!(GET_MATERIAL_REF(could_blade.material_type) in DSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL])) + if(!(GET_MATERIAL_REF(could_blade.material_type) in SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL])) continue if(could_blade.amount < 5) continue diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 61853ef1cdc..6a70d4db9f0 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -129,7 +129,7 @@ /obj/item/mecha_parts/mecha_equipment/gravcatapult/proc/do_scatter(atom/movable/scatter, atom/movable/target) var/dist = 5 - get_dist(scatter, target) var/delay = 2 - DSmove_manager.move_away(scatter, target, delay = delay, timeout = delay * dist, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + GLOB.move_manager.move_away(scatter, target, delay = delay, timeout = delay * dist, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) /obj/item/mecha_parts/mecha_equipment/gravcatapult/get_snowflake_data() return list( diff --git a/tgstation.dme b/tgstation.dme index 574b028bc52..116faf416df 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -750,6 +750,7 @@ #include "code\controllers\subsystem\lua.dm" #include "code\controllers\subsystem\machines.dm" #include "code\controllers\subsystem\mapping.dm" +#include "code\controllers\subsystem\materials.dm" #include "code\controllers\subsystem\minor_mapping.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\modular_computers.dm" @@ -861,6 +862,7 @@ #include "code\datums\chat_payload.dm" #include "code\datums\chatmessage.dm" #include "code\datums\cogbar.dm" +#include "code\datums\communications.dm" #include "code\datums\dash_weapon.dm" #include "code\datums\datum.dm" #include "code\datums\datumvars.dm" @@ -881,6 +883,7 @@ #include "code\datums\map_config.dm" #include "code\datums\minigames_menu.dm" #include "code\datums\mood.dm" +#include "code\datums\move_manager.dm" #include "code\datums\movement_detector.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\numbered_display.dm" @@ -1944,12 +1947,6 @@ #include "code\datums\storage\subtypes\rped.dm" #include "code\datums\storage\subtypes\surgery_tray.dm" #include "code\datums\storage\subtypes\trash.dm" -#include "code\datums\systems\_system.dm" -#include "code\datums\systems\manager.dm" -#include "code\datums\systems\ds\battle_royale.dm" -#include "code\datums\systems\ds\communications.dm" -#include "code\datums\systems\ds\materials.dm" -#include "code\datums\systems\ds\move_handler.dm" #include "code\datums\votes\_vote_datum.dm" #include "code\datums\votes\custom_vote.dm" #include "code\datums\votes\map_vote.dm" From b76b560588719ae4671a5350813bf12e8ab411c5 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Wed, 1 May 2024 02:51:34 +1000 Subject: [PATCH 003/107] Catlike Grace works with Freerunning (#82823) ## About The Pull Request If you have Catlike Grace when Freerunning takes effect, you do not suffer a knockdown. fixes https://github.com/tgstation/tgstation/issues/82818 ## Why It's Good For The Game Taking a quirk to do something worse than if you didn't have it at all is probably not the best outcome. Some may argue that not taking damage from a fall is actually a good thing, but in my experience the catlike grace bonus is a much better outcome. If for whatever reason you now have both, they're no longer at odds. Obviously, Freerunning only cares about dropping from a single level. If you take a tumble down into the depths of the ice moon, you're still landing on your feet and taking a ridiculous, bone shattering amount of damage. Also I asked @ MrMelbert if the PR was okay and he said 'so long as the PR is good' so hopefully this is up to snuff. ## Changelog :cl: fix: If you are a freerunner, you don't end up faceplanting despite having catlike grace. /:cl: --- code/modules/mob/living/living.dm | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5c3c311d3da..1412ee8ed1c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -73,11 +73,19 @@ if(levels <= 1 && can_help_themselves) var/obj/item/organ/external/wings/gliders = get_organ_by_type(/obj/item/organ/external/wings) if(HAS_TRAIT(src, TRAIT_FREERUNNING) || gliders?.can_soften_fall()) // the power of parkour or wings allows falling short distances unscathed + var/graceful_landing = HAS_TRAIT(src, TRAIT_CATLIKE_GRACE) + + if(graceful_landing) + add_movespeed_modifier(/datum/movespeed_modifier/landed_on_feet) + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/landed_on_feet), levels * 3 SECONDS) + else + Knockdown(levels * 4 SECONDS) + emote("spin") + visible_message( - span_notice("[src] makes a hard landing on [impacted_turf] but remains unharmed from the fall."), - span_notice("You brace for the fall. You make a hard landing on [impacted_turf], but remain unharmed."), + span_notice("[src] makes a hard landing on [impacted_turf] but remains unharmed from the fall[graceful_landing ? " and stays on [p_their()] feet" : " by tucking in rolling into the landing"]."), + span_notice("You brace for the fall. You make a hard landing on [impacted_turf], but remain unharmed[graceful_landing ? " while landing on your feet" : " by tucking in and rolling into the landing"]."), ) - Knockdown(levels * 4 SECONDS) return . | ZIMPACT_NO_MESSAGE var/incoming_damage = (levels * 5) ** 1.5 From 2ddef00a5d56265cc69b1efbae7973f6ff01a27f Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:56:31 +0000 Subject: [PATCH 005/107] Human AI camera consoles can now be repackaged (#82629) ## About The Pull Request Human AI's advanced camera console currently uses the base console which has no circuit, meaning it's impossible to unscrew it. Instead of giving it their own circuit, I thought it would be better to rework it into something that gets packed and unpacked, similar to the bible w/ Altar of the Gods. I thought this would be the best way to handle it in case the human AI wants to move their board over, while still keeping that limit of remaining in the AI sat, and making it still make sense (if it was a board, there's no reason for it to NOT work outside of the SAT). ## Why It's Good For The Game The advanced camera console can be moved without compromise on the intended restrictions. ## Changelog :cl: qol: The Human AI's advanced security console can be repackaged with a screwdriver if you wish to move it. /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> --- code/game/machinery/computer/camera_advanced.dm | 9 +++++++++ .../jobs/job_types/station_trait/human_ai.dm | 14 +++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index f5695dd6284..45bfeb9fcef 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -339,3 +339,12 @@ to_chat(owner, span_notice("You move downwards.")) else to_chat(owner, span_notice("You couldn't move downwards!")) + +/obj/machinery/computer/camera_advanced/human_ai/screwdriver_act(mob/living/user, obj/item/tool) + balloon_alert(user, "repackaging...") + if(!do_after(user, 5 SECONDS, src)) + return ITEM_INTERACT_BLOCKING + tool.play_tool_sound(src, 40) + new /obj/item/secure_camera_console_pod(get_turf(src)) + qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm index 285479a6912..af80df69fe8 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -148,8 +148,8 @@ return ..() /obj/item/secure_camera_console_pod - name = "advanced camera control pod" - desc = "Calls down a secure camera console to use for all your AI stuff, may only be activated in the SAT." + name = "pre-packaged advanced camera control" + desc = "A pre-packaged camera console used for all your AI stuff, programmed to only active in the SAT." icon = 'icons/obj/devices/remote.dmi' icon_state = "botpad_controller" inhand_icon_state = "radio" @@ -163,9 +163,9 @@ if(!is_type_in_typecache(current_area, allowed_areas)) user.balloon_alert(user, "not in the sat!") return - podspawn(list( - "target" = get_turf(src), - "style" = STYLE_BLUESPACE, - "spawn" = /obj/machinery/computer/camera_advanced, - )) + user.balloon_alert(user, "unpacking...") + if(!do_after(user, 5 SECONDS, src)) + return + playsound(src, 'sound/items/drill_use.ogg', 40, TRUE) + new /obj/machinery/computer/camera_advanced/human_ai(get_turf(src)) qdel(src) From 68c5a126a5999a3bb85f690601ad85344957a30f Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 1 May 2024 13:04:38 +0000 Subject: [PATCH 007/107] Makes pod doors re-constructible (#82939) ## About The Pull Request Adds the ability to reconstruct pod doors once deconstruction has been started, and adds a pre-deconstructed pod door to the list of plasteel crafting recipes. Also adds context tips and some minor extra feedback during deconstruction steps. ## Why It's Good For The Game Closes https://github.com/tgstation/tgstation/issues/68800 Door construction like airlocks are all possible this slap-crafting rather than stuffing all of it in the crafting menu, I thought it would be nice to have pod doors available there as well. ## Changelog :cl: fix: You can now re-construct pod doors that had deconstruction started. qol: You can now make pod door assemblies using plasteel in-hand. /:cl: --- code/__DEFINES/construction/structures.dm | 4 +- code/game/machinery/doors/poddoor.dm | 89 +++++++++++++++---- code/game/machinery/doors/shutters.dm | 3 + .../items/stacks/sheets/sheet_types.dm | 1 + 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/construction/structures.dm b/code/__DEFINES/construction/structures.dm index 1b4ea8aa112..e48dc078ca4 100644 --- a/code/__DEFINES/construction/structures.dm +++ b/code/__DEFINES/construction/structures.dm @@ -48,9 +48,11 @@ #define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1 #define AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER 2 -//blast door (de)construction states +///The blast door is missing wires, first step of construction. #define BLASTDOOR_NEEDS_WIRES 0 +///The blast door needs electronics, second step of construction. #define BLASTDOOR_NEEDS_ELECTRONICS 1 +///The blast door is fully constructed. #define BLASTDOOR_FINISHED 2 //floodlights because apparently we use defines now diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index d2a432688c1..deb8341b0ba 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -35,6 +35,72 @@ /obj/machinery/door/poddoor/get_save_vars() return ..() + NAMEOF(src, id) +/obj/machinery/door/poddoor/examine(mob/user) + . = ..() + if(panel_open) + if(deconstruction == BLASTDOOR_FINISHED) + . += span_notice("The maintenance panel is opened and the electronics could be pried out.") + . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool.") + else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) + . += span_notice("The electronics are missing and there are some wires sticking out.") + else if(deconstruction == BLASTDOOR_NEEDS_WIRES) + . += span_notice("The wires have been removed and it's ready to be sliced apart.") + +/obj/machinery/door/poddoor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + return NONE + if(deconstruction == BLASTDOOR_NEEDS_WIRES && istype(held_item, /obj/item/stack/cable_coil)) + context[SCREENTIP_CONTEXT_LMB] = "Wire assembly" + return CONTEXTUAL_SCREENTIP_SET + if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS && istype(held_item, /obj/item/electronics/airlock)) + context[SCREENTIP_CONTEXT_LMB] = "Add electronics" + return CONTEXTUAL_SCREENTIP_SET + //we do not check for special effects like if they can actually perform the action because they will be told they can't do it when they try, + //with feedback on what they have to do in order to do so. + switch(held_item.tool_behaviour) + if(TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Open panel" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_MULTITOOL) + context[SCREENTIP_CONTEXT_LMB] = "Calibrate ID" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Remove electronics" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_WIRECUTTER) + context[SCREENTIP_CONTEXT_LMB] = "Remove wires" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_WELDER) + context[SCREENTIP_CONTEXT_LMB] = "Disassemble" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/door/poddoor/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(deconstruction == BLASTDOOR_NEEDS_WIRES && istype(tool, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = tool + var/datum/crafting_recipe/recipe = locate(recipe_type) in GLOB.crafting_recipes + var/amount_needed = recipe.reqs[/obj/item/stack/cable_coil] + if(coil.get_amount() < amount_needed) + balloon_alert(user, "not enough cable!") + return ITEM_INTERACT_SUCCESS + balloon_alert(user, "adding cables...") + if(!do_after(user, 5 SECONDS, src)) + return ITEM_INTERACT_SUCCESS + coil.use(amount_needed) + deconstruction = BLASTDOOR_NEEDS_ELECTRONICS + balloon_alert(user, "cables added") + return ITEM_INTERACT_SUCCESS + + if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS && istype(tool, /obj/item/electronics/airlock)) + balloon_alert(user, "adding electronics...") + if(!do_after(user, 10 SECONDS, src)) + return ITEM_INTERACT_SUCCESS + qdel(tool) + balloon_alert(user, "electronics added") + deconstruction = BLASTDOOR_FINISHED + return ITEM_INTERACT_SUCCESS + return NONE + /obj/machinery/door/poddoor/screwdriver_act(mob/living/user, obj/item/tool) . = ..() if (density) @@ -49,7 +115,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_FINISHED) return var/change_id = tgui_input_number(user, "Set the door controllers ID (Current: [id])", "Door Controller ID", isnum(id) ? id : null, 100) @@ -69,7 +136,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_FINISHED) return balloon_alert(user, "removing airlock electronics...") @@ -86,7 +154,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_NEEDS_ELECTRONICS) return balloon_alert(user, "removing internal cables...") @@ -104,7 +173,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_NEEDS_WIRES) return balloon_alert(user, "tearing apart...") //You're tearing me apart, Lisa! @@ -116,17 +186,6 @@ qdel(src) return ITEM_INTERACT_SUCCESS -/obj/machinery/door/poddoor/examine(mob/user) - . = ..() - if(panel_open) - if(deconstruction == BLASTDOOR_FINISHED) - . += span_notice("The maintenance panel is opened and the electronics could be pried out.") - . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool.") - else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) - . += span_notice("The electronics are missing and there are some wires sticking out.") - else if(deconstruction == BLASTDOOR_NEEDS_WIRES) - . += span_notice("The wires have been removed and it's ready to be sliced apart.") - /obj/machinery/door/poddoor/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) id = "[port.shuttle_id]_[id]" diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index eca8d88da4b..0df6024ca82 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -16,6 +16,9 @@ density = FALSE opacity = FALSE +/obj/machinery/door/poddoor/shutters/preopen/deconstructed + deconstruction = BLASTDOOR_NEEDS_WIRES + /obj/machinery/door/poddoor/shutters/indestructible name = "hardened shutters" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 280e009210c..9e3e4a502c3 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -256,6 +256,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("AI core", /obj/structure/ai_core, 4, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_ROBOT), new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 5 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), new/datum/stack_recipe("Large Gas Tank", /obj/structure/tank_frame, 4, time=1 SECONDS, one_per_turf=TRUE, check_density = FALSE, category = CAT_ATMOSPHERIC), + new/datum/stack_recipe("shutter assembly", /obj/machinery/door/poddoor/shutters/preopen/deconstructed, 5, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_DOORS), null, new /datum/stack_recipe_list("airlock assemblies", list( \ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), From 7936bf2843ed9b118b1fa98a5382421cf4301a73 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 1 May 2024 14:59:17 +0000 Subject: [PATCH 009/107] Debug uplinks shows all categories and doesnt lock (#82967) ## About The Pull Request Using debug uplinks once again shows you all categories of role/species restricted items. I also made it not show the shop as being locked since they are meant to always be able to buy things per; https://github.com/tgstation/tgstation/blob/fae4ec5aa1fdd51364b2ffdd49d54ab22c2dc38f/code/modules/antagonists/traitor/uplink_handler.dm#L90-L110 ## Why It's Good For The Game Closes https://github.com/tgstation/tgstation/issues/66743 ## Changelog :cl: admin: Debug uplinks now shows all categories and won't lock upon buying items like his grace and the syndicate balloon. /:cl: --- code/datums/components/uplink.dm | 2 +- code/modules/uplink/uplink_items.dm | 2 +- tgui/packages/tgui/interfaces/Uplink/index.tsx | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 163de4867d5..d62414a862b 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -266,7 +266,7 @@ /datum/component/uplink/ui_assets(mob/user) return list( - get_asset_datum(/datum/asset/json/uplink) + get_asset_datum(/datum/asset/json/uplink), ) /datum/component/uplink/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index f0f7b0accaf..e17488bc96a 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -71,7 +71,7 @@ /// If this uplink item is only available to certain roles. Roles are dependent on the frequency chip or stored ID. var/list/restricted_roles = list() /// The species able to purchase this uplink item. - var/restricted_species = list() + var/list/restricted_species = list() /// The minimum amount of progression needed for this item to be added to uplinks. var/progression_minimum = 0 /// Whether this purchase is visible in the purchase log. diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx index a8b2e7d477b..4949fc94ee7 100644 --- a/tgui/packages/tgui/interfaces/Uplink/index.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx @@ -137,13 +137,15 @@ export class Uplink extends Component<{}, UplinkState> { uplinkData.items = uplinkData.items.filter((value) => { if ( value.restricted_roles.length > 0 && - !value.restricted_roles.includes(uplinkRole) + !value.restricted_roles.includes(uplinkRole) && + !data.debug ) { return false; } if ( value.restricted_species.length > 0 && - !value.restricted_species.includes(uplinkSpecies) + !value.restricted_species.includes(uplinkSpecies) && + !data.debug ) { return false; } @@ -455,7 +457,7 @@ export class Uplink extends Component<{}, UplinkState> { } }} /> - {(shop_locked && ( + {(shop_locked && !data.debug && ( Date: Wed, 1 May 2024 10:01:24 -0500 Subject: [PATCH 011/107] Give more control over conveyor switch circuits (#82857) ## About The Pull Request This adds more signals to the conveyor switch circuits, specifically for going forward, stopping, or reversing. One-way conveyor switches will not get the reverse signal (as shown by the bottom right switch in the video). https://github.com/tgstation/tgstation/assets/16826524/66f287de-8413-41df-a69c-51b9ab8d7a02 ## Why It's Good For The Game This makes it far easier to make contraptions such as sorting mechanisms using circuits without the need to toggle multiple times just to get the conveyor direction into the state you need it in. ## Changelog :cl: qol: conveyor switches now have direction-specific input signals /:cl: --- code/modules/recycling/conveyor.dm | 36 +++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 6d5b270cd71..fcaf3d9a4eb 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -590,12 +590,18 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) desc = "Allows to control connected conveyor belts." circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + /// Direction input ports. + var/datum/port/input/stop + var/datum/port/input/active + var/datum/port/input/reverse /// The current direction of the conveyor attached to the component. var/datum/port/output/direction /// The switch this conveyor switch component is attached to. var/obj/machinery/conveyor_switch/attached_switch /obj/item/circuit_component/conveyor_switch/populate_ports() + active = add_input_port("Activate", PORT_TYPE_SIGNAL, trigger = PROC_REF(activate)) + stop = add_input_port("Stop", PORT_TYPE_SIGNAL, trigger = PROC_REF(stop)) direction = add_output_port("Conveyor Direction", PORT_TYPE_NUMBER) /obj/item/circuit_component/conveyor_switch/get_ui_notices() @@ -606,6 +612,8 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) . = ..() if(istype(shell, /obj/machinery/conveyor_switch)) attached_switch = shell + if(!attached_switch.oneway) + reverse = add_input_port("Reverse", PORT_TYPE_SIGNAL, trigger = PROC_REF(reverse)) /obj/item/circuit_component/conveyor_switch/unregister_usb_parent(atom/movable/shell) attached_switch = null @@ -617,16 +625,34 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) INVOKE_ASYNC(src, PROC_REF(update_conveyors), port) -/obj/item/circuit_component/conveyor_switch/proc/update_conveyors(datum/port/input/port) - if(!attached_switch) - return - - attached_switch.update_position() +/obj/item/circuit_component/conveyor_switch/proc/on_switch_changed() attached_switch.update_appearance() attached_switch.update_linked_conveyors() attached_switch.update_linked_switches() direction.set_output(attached_switch.position) +/obj/item/circuit_component/conveyor_switch/proc/activate() + SIGNAL_HANDLER + attached_switch.position = CONVEYOR_FORWARD + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + +/obj/item/circuit_component/conveyor_switch/proc/stop() + SIGNAL_HANDLER + attached_switch.position = CONVEYOR_OFF + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + +/obj/item/circuit_component/conveyor_switch/proc/reverse() + SIGNAL_HANDLER + attached_switch.position = CONVEYOR_BACKWARDS + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + +/obj/item/circuit_component/conveyor_switch/proc/update_conveyors(datum/port/input/port) + if(!attached_switch) + return + + attached_switch.update_position() + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + #undef CONVEYOR_BACKWARDS #undef CONVEYOR_OFF #undef CONVEYOR_FORWARD From abcc61836872e2f20c777a5ea91d84acc3584699 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 1 May 2024 15:39:59 +0000 Subject: [PATCH 013/107] Fixes cyborg tracking not always showing up (#82975) ## About The Pull Request Silicons moving with their builtincamera doesnt automatically update the camera net, so for some time after borgs move, they wont show up to the AI to track. It's a minor but annoying issue that this fixes. ## Why It's Good For The Game Fixes a minor issue with the new ai tracking stuff. ## Changelog :cl: fix: AIs can now track Silicon as long as their built-in camera is online. /:cl: --- code/modules/mob/living/living.dm | 4 ++-- code/modules/mob/living/silicon/silicon.dm | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5c3c311d3da..5750eb518d2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1359,9 +1359,9 @@ return FALSE if(invisibility || alpha <= 50)//cloaked return FALSE - if(!isturf(src.loc)) //The reason why we don't just use get_turf is because they could be in a closet, disposals, or a vehicle. + if(!isturf(loc)) //The reason why we don't just use get_turf is because they could be in a closet, disposals, or a vehicle. return FALSE - var/turf/T = src.loc + var/turf/T = loc if(is_centcom_level(T.z)) //dont detect mobs on centcom return FALSE if(is_away_level(T.z)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4fbd1b55234..95623e3c538 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -480,3 +480,11 @@ stack_trace("Silicon [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.") create_modularInterface() modularInterface.imprint_id(name = newname) + +/mob/living/silicon/can_track(mob/living/user) + //if their camera is online, it's safe to assume they are in cameranets + //since it takes a while for camera vis to update, this lets us bypass that so AIs can always see their borgs, + //without making cameras constantly update every time a borg moves. + if(builtInCamera && builtInCamera.can_use()) + return TRUE + return ..() From b6a1b6bee0692cec2cbff2af3424b4c254ee9fb4 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 19:47:16 +0200 Subject: [PATCH 015/107] Automatic changelog for PR #27543 [ci skip] --- html/changelogs/AutoChangeLog-pr-27543.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27543.yml diff --git a/html/changelogs/AutoChangeLog-pr-27543.yml b/html/changelogs/AutoChangeLog-pr-27543.yml new file mode 100644 index 00000000000..15114a8b2d7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27543.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "If you are a freerunner, you don't end up faceplanting despite having catlike grace." \ No newline at end of file From 8e88f7da46a5ae21b307faa7aa95ec8a9e7e89d3 Mon Sep 17 00:00:00 2001 From: FlufflesTheDog Date: Wed, 1 May 2024 10:47:07 -0700 Subject: [PATCH 016/107] Wheelchair qol (#82968) ## About The Pull Request Lets you pick up wheelchairs while resting, and lets you place wheelchairs on adjacent tiles, much like medical roller beds. ## Why It's Good For The Game Makes life just a little bit easier. Barely being able to move is already enough of a downside. I think allowing the little bit of extra independence being able to pick up your own chair (without just finding or making a basic chair first) offers is justifiable. And being able to place the chair a tile away just saves needing to pixel hunt or shuffle around to buckle yourself. ## Changelog :cl: Fluffles qol: you can pick up wheelchairs while on the ground qol: you can place wheelchairs a tile away from you, like roller beds /:cl: --- code/game/objects/items/bodybag.dm | 11 +++++------ code/game/objects/structures/beds_chairs/bed.dm | 11 +++++------ code/modules/vehicles/wheelchair.dm | 8 +++++++- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 7e67b23c3b7..19d3d273337 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -14,12 +14,11 @@ else deploy_bodybag(user, get_turf(src)) -/obj/item/bodybag/afterattack(atom/target, mob/user, proximity) - . = ..() - if(proximity) - if(isopenturf(target)) - deploy_bodybag(user, target) - +/obj/item/bodybag/interact_with_atom(atom/interacting_with, mob/living/user, flags) + if(isopenturf(interacting_with)) + deploy_bodybag(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/bodybag/attempt_pickup(mob/user) // can't pick ourselves up if we are inside of the bodybag, else very weird things may happen if(contains(user)) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 0e3845d2efa..e037043cc91 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -218,13 +218,12 @@ /obj/item/emergency_bed/attack_self(mob/user) deploy_bed(user, user.loc) -/obj/item/emergency_bed/afterattack(obj/target, mob/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/emergency_bed/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isopenturf(interacting_with)) + deploy_bed(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE - if(isopenturf(target)) - deploy_bed(user, target) /obj/item/emergency_bed/proc/deploy_bed(mob/user, atom/location) var/obj/structure/bed/medical/emergency/deployed = new /obj/structure/bed/medical/emergency(location) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 92fcb995f76..d40b57276c0 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -126,7 +126,7 @@ . = ..() if(over_object != usr || !Adjacent(usr) || !foldabletype) return FALSE - if(!ishuman(usr) || !usr.can_perform_action(src)) + if(!ishuman(usr) || !usr.can_perform_action(src, ALLOW_RESTING)) return FALSE if(has_buckled_mobs()) return FALSE @@ -138,6 +138,12 @@ /obj/item/wheelchair/attack_self(mob/user) //Deploys wheelchair on in-hand use deploy_wheelchair(user, user.loc) +/obj/item/wheelchair/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isopenturf(interacting_with)) + deploy_wheelchair(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE + /obj/item/wheelchair/proc/deploy_wheelchair(mob/user, atom/location) var/obj/vehicle/ridden/wheelchair/wheelchair_unfolded = new unfolded_type(location) wheelchair_unfolded.add_fingerprint(user) From a6887e266cb436d8df72016ee5327bf5cbc78ecc Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 1 May 2024 17:46:05 +0000 Subject: [PATCH 018/107] Fixes a way to get a very long gold number (#82976) ## About The Pull Request Fixes this ![image](https://github.com/tgstation/tgstation/assets/53777086/091991e4-6470-4ffb-a9b7-a2899adc594d) Which occurs when you spam flee, since it unrestrictedly halves your gold. ## Why It's Good For The Game another arcade issue gone. ## Changelog :cl: fix: Constantly fleeing in Battle Arcade will no longer give you a very large amount of decimals due to halving your gold every time. /:cl: --- code/game/machinery/computer/arcade/battle.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index 63d2808c773..b97dac9e15d 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -531,7 +531,8 @@ return player_turn = TRUE ui_panel = UI_PANEL_WORLD_MAP - player_gold /= 2 + if(player_gold) + player_gold = max(round(player_gold /= 2, 1), 0) return TRUE //they pressed something but it wasn't in the menu, we'll be nice and give them back their turn anyway. player_turn = TRUE From 9b51da11fe2d0cf88817a4df65a06f86aea7c061 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 19:59:08 +0200 Subject: [PATCH 020/107] Automatic changelog for PR #27544 [ci skip] --- html/changelogs/AutoChangeLog-pr-27544.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27544.yml diff --git a/html/changelogs/AutoChangeLog-pr-27544.yml b/html/changelogs/AutoChangeLog-pr-27544.yml new file mode 100644 index 00000000000..37de6179773 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27544.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - qol: "The Human AI's advanced security console can be repackaged with a screwdriver if you wish to move it." \ No newline at end of file From 877eea41978fed2908a1fa62a11edd9ace837f6b Mon Sep 17 00:00:00 2001 From: Waterpig Date: Wed, 1 May 2024 20:15:36 +0200 Subject: [PATCH 021/107] orders are back --- tgui/packages/tgui/interfaces/Cargo/index.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tgui/packages/tgui/interfaces/Cargo/index.tsx b/tgui/packages/tgui/interfaces/Cargo/index.tsx index d39435f4cd9..b3c169ec94c 100644 --- a/tgui/packages/tgui/interfaces/Cargo/index.tsx +++ b/tgui/packages/tgui/interfaces/Cargo/index.tsx @@ -11,6 +11,9 @@ import { CargoData } from './types'; enum TAB { Catalog = 'catalog', Requests = 'requests', + /* SKYRAT EDIT BELOW - ADDS company imports */ + Imports = 'company_import_window', + /* SKYRAT EDIT END */ Cart = 'cart', Help = 'help', } @@ -26,7 +29,9 @@ export function Cargo(props) { } export function CargoContent(props) { - const { data } = useBackend(); + /* SKYRAT EDIT BELOW - ADDS act */ + const { act, data } = useBackend(); + /* SKYRAT EDIT END */ const { cart = [], requests = [], requestonly } = data; @@ -51,6 +56,15 @@ export function CargoContent(props) { > Catalog + {/* SKYRAT EDIT START - Company imports */} + act(TAB.Imports)} + > + Company Imports + + {/* SKYRAT EDIT END */} 0 && 'yellow'} From ae17aa92e2c65c2f87b1ed53f35497b333511f9c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 20:49:36 +0200 Subject: [PATCH 022/107] Automatic changelog for PR #27557 [ci skip] --- html/changelogs/AutoChangeLog-pr-27557.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27557.yml diff --git a/html/changelogs/AutoChangeLog-pr-27557.yml b/html/changelogs/AutoChangeLog-pr-27557.yml new file mode 100644 index 00000000000..79dafa368a8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27557.yml @@ -0,0 +1,4 @@ +author: "Majkl-J" +delete-after: True +changes: + - bugfix: "Company imports button is brought back" \ No newline at end of file From 97a74b1dab9602cae2503e74544d12fd7593526e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 21:50:35 +0200 Subject: [PATCH 023/107] [MIRROR] Fixes monkeys falling over through windoors (#27548) * Fixes monkeys falling over through windoors (#82963) ## About The Pull Request Monkey knockover is now on a new mob-bump signal instead of being on crossed, fixing some consistency issues and getting rid of our need for snowflake "can bump into mob" check. We should try to get rid of all our instances of Crossed and remove its use to prevent this bug from occurring in the future. ## Why It's Good For The Game Closes https://github.com/tgstation/tgstation/issues/66983 ## Changelog :cl: fix: Monkeys can no longer be knocked over by walking into a windoor on combat mode while they're behind it. /:cl: * Fixes monkeys falling over through windoors --------- Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> --- .../signals/signals_mob/signals_mob_living.dm | 2 ++ .../events/immovable_rod/immovable_rod.dm | 5 ----- .../carbon/human/species_types/monkeys.dm | 17 +++++------------ code/modules/mob/living/living.dm | 1 + 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index cc9e4d2e966..5a328a62ef7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -146,6 +146,8 @@ #define COMPONENT_LIVING_BLOCK_PRE_MOB_BUMP (1<<0) ///From base of mob/living/MobBump() (mob/living) #define COMSIG_LIVING_MOB_BUMP "living_mob_bump" +///From base of mob/living/MobBump() (mob/living) +#define COMSIG_LIVING_MOB_BUMPED "living_mob_bumped" ///From base of mob/living/Bump() (turf/closed) #define COMSIG_LIVING_WALL_BUMP "living_wall_bump" ///From base of turf/closed/Exited() (turf/closed) diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm index 658d2d07bd8..5c5dd65e819 100644 --- a/code/modules/events/immovable_rod/immovable_rod.dm +++ b/code/modules/events/immovable_rod/immovable_rod.dm @@ -76,11 +76,6 @@ if(istype(ghost)) ghost.ManualFollow(src) -/obj/effect/immovablerod/proc/on_entered_over_movable(datum/source, atom/movable/atom_crossed_over) - SIGNAL_HANDLER - if((atom_crossed_over.density || isliving(atom_crossed_over)) && !QDELETED(atom_crossed_over)) - Bump(atom_crossed_over) - /obj/effect/immovablerod/proc/on_entering_atom(datum/source, atom/destination, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER if(destination.density && isturf(destination)) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index 1f371d575ac..9d8d8855c67 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -168,24 +168,17 @@ /obj/item/organ/internal/brain/primate/on_mob_insert(mob/living/carbon/primate) . = ..() - RegisterSignal(primate, COMSIG_MOVABLE_CROSS, PROC_REF(on_crossed)) + RegisterSignal(primate, COMSIG_LIVING_MOB_BUMPED, PROC_REF(on_mob_bump)) /obj/item/organ/internal/brain/primate/on_mob_remove(mob/living/carbon/primate) . = ..() - UnregisterSignal(primate, COMSIG_MOVABLE_CROSS) + UnregisterSignal(primate, COMSIG_LIVING_MOB_BUMPED) -/obj/item/organ/internal/brain/primate/proc/on_crossed(datum/source, atom/movable/crossed) +/obj/item/organ/internal/brain/primate/proc/on_mob_bump(mob/source, mob/living/crossing_mob) SIGNAL_HANDLER - if(!tripping) + if(!tripping || !crossing_mob.combat_mode) return - if(IS_DEAD_OR_INCAP(owner) || !isliving(crossed)) - return - var/mob/living/in_the_way_mob = crossed - if(iscarbon(in_the_way_mob) && !in_the_way_mob.combat_mode) - return - if(in_the_way_mob.pass_flags & PASSMOB) - return - in_the_way_mob.knockOver(owner) + crossing_mob.knockOver(owner) /obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target) if(!HAS_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1412ee8ed1c..dc84e17d188 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -161,6 +161,7 @@ return TRUE SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) + SEND_SIGNAL(M, COMSIG_LIVING_MOB_BUMPED, src) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) From 39139c8526b2355491f1565f50e8108645bc93a5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 21:51:00 +0200 Subject: [PATCH 024/107] Automatic changelog for PR #27548 [ci skip] --- html/changelogs/AutoChangeLog-pr-27548.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27548.yml diff --git a/html/changelogs/AutoChangeLog-pr-27548.yml b/html/changelogs/AutoChangeLog-pr-27548.yml new file mode 100644 index 00000000000..6522426fbbf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27548.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Monkeys can no longer be knocked over by walking into a windoor on combat mode while they're behind it." \ No newline at end of file From b2e941c24af26989e7d94b17d6c195fb960786c5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 21:51:33 +0200 Subject: [PATCH 025/107] [MIRROR] [NO GBP]Fixes hypercharged slime core cells and circuit gun cells starting with an insignificant amount of charge. (#27553) * [NO GBP]Fixes hypercharged slime core cells and circuit gun cells starting with an insignificant amount of charge. (#82977) Scales the hypercharged slime core and wiremod gun cell maximum charge and charge rate by the STANDARD_CELL_CHARGE and STANDARD_CELL_RATE defines. Fixes their scale. Closes #82907 ## Changelog :cl: fix: Fixes hypercharged slime core cells and circuit guns having 1,000 times less energy than intended. /:cl: * [NO GBP]Fixes hypercharged slime core cells and circuit gun cells starting with an insignificant amount of charge. --------- Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com> --- code/modules/research/xenobiology/crossbreeding/_misc.dm | 4 ++-- code/modules/wiremod/shell/gun.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 7b85a878ec3..0e6a37ce3d0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -93,8 +93,8 @@ Slimecrossing Items icon_state = "yellow slime extract" rating = 7 custom_materials = null - maxcharge = 50000 - chargerate = 2500 + maxcharge = 50 * STANDARD_CELL_CHARGE + chargerate = 2.5 * STANDARD_CELL_RATE charge_light_type = null connector_type = "slimecore" diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index 9f196e6c1fc..283815fb334 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -30,7 +30,7 @@ range = 7 /obj/item/stock_parts/cell/emproof/wiremod_gun - maxcharge = 100 + maxcharge = 0.1 * STANDARD_CELL_CHARGE /obj/item/gun/energy/wiremod_gun/Initialize(mapload) . = ..() From 8ce8a7a110f5dd702152862ae6ec45e97c28f8f7 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 21:51:59 +0200 Subject: [PATCH 026/107] Automatic changelog for PR #27553 [ci skip] --- html/changelogs/AutoChangeLog-pr-27553.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27553.yml diff --git a/html/changelogs/AutoChangeLog-pr-27553.yml b/html/changelogs/AutoChangeLog-pr-27553.yml new file mode 100644 index 00000000000..53b91414355 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27553.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Fixes hypercharged slime core cells and circuit guns having 1,000 times less energy than intended." \ No newline at end of file From 7b25770b35155aebd39409785fd04d0cc374dfdf Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 23:09:10 +0200 Subject: [PATCH 027/107] Automatic changelog for PR #27549 [ci skip] --- html/changelogs/AutoChangeLog-pr-27549.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27549.yml diff --git a/html/changelogs/AutoChangeLog-pr-27549.yml b/html/changelogs/AutoChangeLog-pr-27549.yml new file mode 100644 index 00000000000..88c8117b5d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27549.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "You can now re-construct pod doors that had deconstruction started." + - qol: "You can now make pod door assemblies using plasteel in-hand." \ No newline at end of file From e6b2a2ee108372c502b1f7358945644d871b37d0 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 23:09:48 +0200 Subject: [PATCH 028/107] Automatic changelog for PR #27550 [ci skip] --- html/changelogs/AutoChangeLog-pr-27550.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27550.yml diff --git a/html/changelogs/AutoChangeLog-pr-27550.yml b/html/changelogs/AutoChangeLog-pr-27550.yml new file mode 100644 index 00000000000..9e7f592e1cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27550.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - admin: "Debug uplinks now shows all categories and won't lock upon buying items like his grace and the syndicate balloon." \ No newline at end of file From fbd094669c878b05ee9d76744a96a2eb31584419 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 23:10:23 +0200 Subject: [PATCH 029/107] Automatic changelog for PR #27551 [ci skip] --- html/changelogs/AutoChangeLog-pr-27551.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27551.yml diff --git a/html/changelogs/AutoChangeLog-pr-27551.yml b/html/changelogs/AutoChangeLog-pr-27551.yml new file mode 100644 index 00000000000..d2ee71caa75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27551.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - qol: "conveyor switches now have direction-specific input signals" \ No newline at end of file From 05b1e442bad78032f7082088642d3762b1924249 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 23:11:53 +0200 Subject: [PATCH 030/107] Automatic changelog for PR #27552 [ci skip] --- html/changelogs/AutoChangeLog-pr-27552.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27552.yml diff --git a/html/changelogs/AutoChangeLog-pr-27552.yml b/html/changelogs/AutoChangeLog-pr-27552.yml new file mode 100644 index 00000000000..7be2f164853 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27552.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "AIs can now track Silicon as long as their built-in camera is online." \ No newline at end of file From b132bb7afcc1cd4d4e1941852dead82f90f2ba36 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 23:21:19 +0200 Subject: [PATCH 031/107] Automatic changelog for PR #27554 [ci skip] --- html/changelogs/AutoChangeLog-pr-27554.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27554.yml diff --git a/html/changelogs/AutoChangeLog-pr-27554.yml b/html/changelogs/AutoChangeLog-pr-27554.yml new file mode 100644 index 00000000000..986653310c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27554.yml @@ -0,0 +1,5 @@ +author: "Fluffles" +delete-after: True +changes: + - qol: "you can pick up wheelchairs while on the ground" + - qol: "you can place wheelchairs a tile away from you, like roller beds" \ No newline at end of file From 82986a36b2b91d1537eadee9f6e658fc8745ee5b Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 1 May 2024 23:22:04 +0200 Subject: [PATCH 032/107] Automatic changelog for PR #27555 [ci skip] --- html/changelogs/AutoChangeLog-pr-27555.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27555.yml diff --git a/html/changelogs/AutoChangeLog-pr-27555.yml b/html/changelogs/AutoChangeLog-pr-27555.yml new file mode 100644 index 00000000000..12a7abadaab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27555.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Constantly fleeing in Battle Arcade will no longer give you a very large amount of decimals due to halving your gold every time." \ No newline at end of file From b1cba0d0ebaa268fcfdd4dd280cabaa9f82d5ca5 Mon Sep 17 00:00:00 2001 From: nikothedude <59709059+nikothedude@users.noreply.github.com> Date: Wed, 1 May 2024 18:26:50 -0400 Subject: [PATCH 033/107] Fixes jousting bypassing pacifism + Some signal doc (#82986) ## About The Pull Request Closes https://github.com/tgstation/tgstation/issues/82983 Title. Jousting now uses a shiny new post-attack signal, only sent if the attack is actually executed. ## Why It's Good For The Game bgus bad ## Changelog :cl: nikothedude fix: Jousting no longer bypasses pacifism /:cl: --- code/__DEFINES/dcs/signals/signals_object.dm | 3 +++ code/_onclick/item_attack.dm | 2 ++ code/datums/components/jousting.dm | 6 +++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 43e3a09a028..f628df0e964 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -448,7 +448,10 @@ /// Prevents click from happening. #define COMPONENT_CANCEL_EQUIPMENT_CLICK (1<<0) +///from base of /obj/item/attack(): (mob/living, mob/living, params) #define COMSIG_ITEM_ATTACK "item_attack" +///from base of /obj/item/attack(): (mob/living, mob/living, params) +#define COMSIG_ITEM_POST_ATTACK "item_post_attack" // called only if the attack was executed ///from base of obj/item/attack_self(): (/mob) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self_secondary(): (/mob) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d5ba848fc8d..1d05ccc16c0 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -236,6 +236,8 @@ user.do_attack_animation(target_mob) target_mob.attacked_by(src, user) + SEND_SIGNAL(src, COMSIG_ITEM_POST_ATTACK, target_mob, user, params) + log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index 56b65c6f758..9c3dab3c8fb 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -44,7 +44,7 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) + RegisterSignal(parent, COMSIG_ITEM_POST_ATTACK, PROC_REF(on_successful_attack)) RegisterSignal(parent, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /datum/component/jousting/UnregisterFromParent() @@ -53,7 +53,7 @@ COMSIG_ATOM_EXAMINE, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, - COMSIG_ITEM_ATTACK, + COMSIG_ITEM_POST_ATTACK, COMSIG_TRANSFORMING_ON_TRANSFORM, )) @@ -94,7 +94,7 @@ * We deduct the minimum tile charge from the current tile charge to get what will actually be buffed * So your charge will only get benefits from each extra tile after the minimum (and before the maximum). */ -/datum/component/jousting/proc/on_attack(datum/source, mob/living/target, mob/user) +/datum/component/jousting/proc/on_successful_attack(datum/source, mob/living/target, mob/user) SIGNAL_HANDLER if(user != current_holder || !user.buckled) return From 6b988c7b47561159165d2cb8e7680afc5b97f303 Mon Sep 17 00:00:00 2001 From: kawoppi <94711066+kawoppi@users.noreply.github.com> Date: Thu, 2 May 2024 00:26:40 +0200 Subject: [PATCH 035/107] civilian bounty control terminal displays bounty description and payout of new bounty options (#82987) ## About The Pull Request The green buttons for selecting one of three bounties now also display the description and payout. https://github.com/tgstation/tgstation/assets/94711066/53d7fb02-28be-4138-b3d8-9f7a4dd6a356 Fixes #81867 Sorta brings it back to how it used to look, I think? The payout was still in the code, just not being displayed. But I looked through the file history and could find NO EVIDENCE of the bounty console displaying the description in the past so I guess I hallucinated that. ## Why It's Good For The Game It's nice to be able to see the payout before you're locked into a bounty for 5 minutes. Also more chances to read the flavortext and it makes the buttons feel less barren. With some bounties it also gives a better idea of how to even get the thing before committing to it. ## Changelog :cl: fix: the civilian bounty control terminal displays the payout of new bounty options again qol: the civilian bounty control terminal displays the description of new bounty options /:cl: --- code/game/machinery/civilian_bounties.dm | 3 + .../tgui/interfaces/CivCargoHoldTerminal.jsx | 75 ++++++++++++------- 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 1cb7ee1477e..792c1ba22eb 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -184,6 +184,9 @@ data["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name, inserted_scan_id.registered_account.bounties[2].name, inserted_scan_id.registered_account.bounties[3].name) + data["id_bounty_infos"] = list(inserted_scan_id.registered_account.bounties[1].description, + inserted_scan_id.registered_account.bounties[2].description, + inserted_scan_id.registered_account.bounties[3].description) data["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward * (CIV_BOUNTY_SPLIT/100), inserted_scan_id.registered_account.bounties[2].reward * (CIV_BOUNTY_SPLIT/100), inserted_scan_id.registered_account.bounties[3].reward * (CIV_BOUNTY_SPLIT/100)) diff --git a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx index 386f3c5721a..438030e3947 100644 --- a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx +++ b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx @@ -96,41 +96,66 @@ const BountyTextBox = (props) => { const BountyPickBox = (props) => { const { act, data } = useBackend(); - const { id_bounty_names, id_bounty_values } = data; + const { id_bounty_names, id_bounty_infos, id_bounty_values } = data; return (
- + - + - +
); }; + +const BountyPickButton = (props) => { + return ( + + ); +}; From e2e67e63846f0fa2fcbff5532dec608470f3e717 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Wed, 1 May 2024 17:55:01 -0500 Subject: [PATCH 037/107] Vote clean up and admin additions (#82981) ## About The Pull Request - Fixes `vote_delay` not being a thing. I broke this two years ago but there's no bug report associated. - Admins can now reset the vote delay (to let people vote again instantly) - Admins can now end the current vote immediately (rather than cancelling) - Custom multi and custom single combined into one vote ## Why It's Good For The Game Makes voting a bit easier to use, both for admins and for coders adding new votes. ![image](https://github.com/tgstation/tgstation/assets/51863163/40b8857c-76b7-4a58-82bc-1b82640d550a) ## Changelog :cl: Melbert admin: Custom Single and Custom Multi votes are now combined into one vote admin: Admins can now end votes instantly, rather than cancelling them admin: Admins can now reset the vote cooldown fix: Vote cooldown actually applies now /:cl: --- code/__DEFINES/subsystems.dm | 3 + .../configuration/entries/general.dm | 4 +- code/controllers/subsystem/vote.dm | 119 ++++++++++--- code/datums/votes/_vote_datum.dm | 51 +++--- code/datums/votes/custom_vote.dm | 57 +++++-- code/datums/votes/map_vote.dm | 38 ++--- code/datums/votes/restart_vote.dm | 35 ++-- code/datums/votes/rock_the_vote.dm | 42 ++--- tgui/packages/tgui/interfaces/VotePanel.tsx | 159 ++++++++++++------ 9 files changed, 308 insertions(+), 200 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4281fba00cb..402b104cabf 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -353,3 +353,6 @@ #define VOTE_WINNER_METHOD_WEIGHTED_RANDOM "Weighted Random" /// There is no winner for this vote. #define VOTE_WINNER_METHOD_NONE "None" + +/// Returned by [/datum/vote/proc/can_be_initiated] to denote the vote is valid and can be initiated. +#define VOTE_AVAILABLE "Vote Available" diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 09e4dec760c..b3ff39ef1fe 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -188,13 +188,13 @@ /// minimum time between voting sessions (deciseconds, 10 minute default) /datum/config_entry/number/vote_delay - default = 6000 + default = 10 MINUTES integer = FALSE min_val = 0 /// length of voting period (deciseconds, default 1 minute) /datum/config_entry/number/vote_period - default = 600 + default = 1 MINUTES integer = FALSE min_val = 0 diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 410db36988d..b7c26acf375 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -18,6 +18,8 @@ SUBSYSTEM_DEF(vote) var/list/voted = list() /// A list of all ckeys currently voting for the current vote. var/list/voting = list() + /// World.time we started our last vote + var/last_vote_time = -INFINITY /datum/controller/subsystem/vote/Initialize() for(var/vote_type in subtypesof(/datum/vote)) @@ -30,16 +32,20 @@ SUBSYSTEM_DEF(vote) return SS_INIT_SUCCESS - // Called by master_controller /datum/controller/subsystem/vote/fire() if(!current_vote) return current_vote.time_remaining = round((current_vote.started_time + CONFIG_GET(number/vote_period) - world.time) / 10) if(current_vote.time_remaining < 0) - process_vote_result() - SStgui.close_uis(src) - reset() + end_vote() + +/// Ends the current vote. +/datum/controller/subsystem/vote/proc/end_vote() + ASSERT(current_vote) + process_vote_result() + SStgui.close_uis(src) + reset() /// Resets all of our vars after votes conclude / are cancelled. /datum/controller/subsystem/vote/proc/reset() @@ -168,24 +174,10 @@ SUBSYSTEM_DEF(vote) * * vote_type - The type of vote to initiate. Can be a [/datum/vote] typepath, a [/datum/vote] instance, or the name of a vote datum. * * vote_initiator_name - The ckey (if player initiated) or name that initiated a vote. Ex: "UristMcAdmin", "the server" * * vote_initiator - If a person / mob initiated the vote, this is the mob that did it - * * forced - Whether we're forcing the vote to go through regardless of existing votes or other circumstances. Note: If the vote is admin created, forced becomes true regardless. + * * forced - Whether we're forcing the vote to go through regardless of existing votes or other circumstances. */ /datum/controller/subsystem/vote/proc/initiate_vote(vote_type, vote_initiator_name, mob/vote_initiator, forced = FALSE) - - // Even if it's forced we can't vote before we're set up - if(!MC_RUNNING(init_stage)) - if(vote_initiator) - to_chat(vote_initiator, span_warning("You cannot start vote now, the server is not done initializing.")) - return FALSE - - // Check if we have unlimited voting power. - // Admin started (or forced) voted will go through even if there's an ongoing vote, - // if voting is on cooldown, or regardless if a vote is config disabled (in some cases) - var/unlimited_vote_power = forced || !!GLOB.admin_datums[vote_initiator?.ckey] - - if(current_vote && !unlimited_vote_power) - if(vote_initiator) - to_chat(vote_initiator, span_warning("There is already a vote in progress! Please wait for it to finish.")) + if(!can_vote_start(vote_initiator, forced)) return FALSE // Get our actual datum @@ -212,7 +204,7 @@ SUBSYSTEM_DEF(vote) return FALSE // Vote can't be initiated in our circumstances? No vote - if(!to_vote.can_be_initiated(vote_initiator, unlimited_vote_power)) + if(to_vote.can_be_initiated(forced) != VOTE_AVAILABLE) return FALSE // Okay, we're ready to actually create a vote - @@ -223,8 +215,12 @@ SUBSYSTEM_DEF(vote) if(!to_vote.create_vote(vote_initiator)) return FALSE + if(!vote_initiator_name && vote_initiator) + vote_initiator_name = vote_initiator.key + // Okay, the vote's happening now, for real. Set it up. current_vote = to_vote + last_vote_time = world.time var/duration = CONFIG_GET(number/vote_period) var/to_display = current_vote.initiate_vote(vote_initiator_name, duration) @@ -248,6 +244,36 @@ SUBSYSTEM_DEF(vote) return TRUE +/** + * Checks if we can start a vote. + * + * * vote_initiator - The mob that initiated the vote. + * * forced - Whether we're forcing the vote to go through regardless of existing votes or other circumstances. + * + * Returns TRUE if we can start a vote, FALSE if we can't. + */ +/datum/controller/subsystem/vote/proc/can_vote_start(mob/vote_initiator, forced) + // Even if it's forced we can't vote before we're set up + if(!MC_RUNNING(init_stage)) + if(vote_initiator) + to_chat(vote_initiator, span_warning("You cannot start a vote now, the server is not done initializing.")) + return FALSE + + if(forced) + return TRUE + + var/next_allowed_time = last_vote_time + CONFIG_GET(number/vote_delay) + if(next_allowed_time > world.time) + if(vote_initiator) + to_chat(vote_initiator, span_warning("A vote was initiated recently. You must wait [DisplayTimeText(next_allowed_time - world.time)] before a new vote can be started!")) + return FALSE + + if(current_vote) + if(vote_initiator) + to_chat(vote_initiator, span_warning("There is already a vote in progress! Please wait for it to finish.")) + return FALSE + + return TRUE /datum/controller/subsystem/vote/ui_state() return GLOB.always_state @@ -282,11 +308,12 @@ SUBSYSTEM_DEF(vote) if(!istype(vote)) continue + var/can_vote = vote.can_be_initiated(is_lower_admin) var/list/vote_data = list( "name" = vote_name, - "canBeInitiated" = vote.can_be_initiated(forced = is_lower_admin), + "canBeInitiated" = can_vote == VOTE_AVAILABLE, "config" = vote.is_config_enabled(), - "message" = vote.message, + "message" = can_vote == VOTE_AVAILABLE ? vote.default_message : can_vote, ) if(vote == current_vote) @@ -310,9 +337,15 @@ SUBSYSTEM_DEF(vote) all_vote_data += list(vote_data) data["possibleVotes"] = all_vote_data + data["LastVoteTime"] = last_vote_time - world.time return data +/datum/controller/subsystem/vote/ui_static_data(mob/user) + var/list/data = list() + data["VoteCD"] = CONFIG_GET(number/vote_delay) + return data + /datum/controller/subsystem/vote/ui_act(action, params) . = ..() if(.) @@ -323,19 +356,37 @@ SUBSYSTEM_DEF(vote) switch(action) if("cancel") if(!voter.client?.holder) + message_admins("[key_name(voter)] tried to cancel the current vote while having no admin holder, \ + this is potentially a malicious exploit and worth noting.") return voter.log_message("cancelled a vote.", LOG_ADMIN) message_admins("[key_name_admin(voter)] has cancelled the current vote.") + SStgui.close_uis(src) reset() return TRUE + if("endNow") + if(!voter.client?.holder) + message_admins("[key_name(voter)] tried to end the current vote while having no admin holder, \ + this is potentially a malicious exploit and worth noting.") + return + + voter.log_message("ended the current vote early", LOG_ADMIN) + message_admins("[key_name_admin(voter)] has ended the current vote.") + end_vote() + return TRUE + if("toggleVote") var/datum/vote/selected = possible_votes[params["voteName"]] if(!istype(selected)) return + if(!check_rights_for(voter.client, R_ADMIN)) + message_admins("[key_name(voter)] tried to toggle vote availability while having improper rights, \ + this is potentially a malicious exploit and worth noting.") + return - return selected.toggle_votable(voter) + return selected.toggle_votable() if("callVote") var/datum/vote/selected = possible_votes[params["voteName"]] @@ -344,7 +395,12 @@ SUBSYSTEM_DEF(vote) // Whether the user actually can initiate this vote is checked in initiate_vote, // meaning you can't spoof initiate a vote you're not supposed to be able to - return initiate_vote(selected, voter.key, voter) + return initiate_vote( + vote_type = selected, + vote_initiator_name = voter.key, + vote_initiator = voter, + forced = !!GLOB.admin_datums[voter.ckey], + ) if("voteSingle") return submit_single_vote(voter, params["voteOption"]) @@ -352,6 +408,15 @@ SUBSYSTEM_DEF(vote) if("voteMulti") return submit_multi_vote(voter, params["voteOption"]) + if("resetCooldown") + if(!voter.client.holder) + message_admins("[key_name(voter)] tried to reset the vote cooldown while having no admin holder, \ + this is potentially a malicious exploit and worth noting.") + return + + last_vote_time = -INFINITY + return TRUE + /datum/controller/subsystem/vote/ui_close(mob/user) voting -= user.client?.ckey @@ -360,6 +425,10 @@ SUBSYSTEM_DEF(vote) set category = "OOC" set name = "Vote" + if(!SSvote.initialized) + to_chat(usr, span_notice("Voting is not set up yet!")) + return + SSvote.ui_interact(usr) /// Datum action given to mobs that allows players to vote on the current vote. diff --git a/code/datums/votes/_vote_datum.dm b/code/datums/votes/_vote_datum.dm index 3f821a7129a..76833f73ff5 100644 --- a/code/datums/votes/_vote_datum.dm +++ b/code/datums/votes/_vote_datum.dm @@ -15,19 +15,8 @@ var/list/default_choices /// Does the name of this vote contain the word "vote"? var/contains_vote_in_name = FALSE - /// What message do we want to pass to the player-side vote panel as a tooltip? - var/message = "Click to initiate a vote." - - // Internal values used when tracking ongoing votes. - // Don't mess with these, change the above values / override procs for subtypes. - /// An assoc list of [all choices] to [number of votes in the current running vote]. - var/list/choices = list() - /// A assoc list of [ckey] to [what they voted for in the current running vote]. - var/list/choices_by_ckey = list() - /// The world time this vote was started. - var/started_time - /// The time remaining in this vote's run. - var/time_remaining + /// What message do we show as the tooltip of this vote if the vote can be initiated? + var/default_message = "Click to initiate a vote." /// The counting method we use for votes. var/count_method = VOTE_COUNT_METHOD_SINGLE /// The method for selecting a winner. @@ -35,6 +24,17 @@ /// Should we show details about the number of votes submitted for each option? var/display_statistics = TRUE + // Internal values used when tracking ongoing votes. + // Don't mess with these, change the above values / override procs for subtypes. + /// An assoc list of [all choices] to [number of votes in the current running vote]. + VAR_FINAL/list/choices = list() + /// A assoc list of [ckey] to [what they voted for in the current running vote]. + VAR_FINAL/list/choices_by_ckey = list() + /// The world time this vote was started. + VAR_FINAL/started_time = -1 + /// The time remaining in this vote's run. + VAR_FINAL/time_remaining = -1 + /** * Used to determine if this vote is a possible * vote type for the vote subsystem. @@ -55,14 +55,13 @@ choices.Cut() choices_by_ckey.Cut() started_time = null - time_remaining = null + time_remaining = -1 /** * If this vote has a config associated, toggles it between enabled and disabled. - * Returns TRUE on a successful toggle, FALSE otherwise */ -/datum/vote/proc/toggle_votable(mob/toggler) - return FALSE +/datum/vote/proc/toggle_votable() + return /** * If this vote has a config associated, returns its value (True or False, usually). @@ -74,20 +73,18 @@ /** * Checks if the passed mob can initiate this vote. * - * Return TRUE if the mob can begin the vote, allowing anyone to actually vote on it. - * Return FALSE if the mob cannot initiate the vote. + * * forced - if being invoked by someone who is an admin + * + * Return VOTE_AVAILABLE if the mob can initiate the vote. + * Return a string with the reason why the mob can't initiate the vote. */ -/datum/vote/proc/can_be_initiated(mob/by_who, forced = FALSE) +/datum/vote/proc/can_be_initiated(forced = FALSE) SHOULD_CALL_PARENT(TRUE) - if(started_time) - var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay)) - if(next_allowed_time > world.time && !forced) - message = "A vote was initiated recently. You must wait [DisplayTimeText(next_allowed_time - world.time)] before a new vote can be started!" - return FALSE + if(!forced && !is_config_enabled()) + return "This vote is currently disabled by the server configuration." - message = initial(message) - return TRUE + return VOTE_AVAILABLE /** * Called prior to the vote being initiated. diff --git a/code/datums/votes/custom_vote.dm b/code/datums/votes/custom_vote.dm index d67eb0281c6..78eb6d3b876 100644 --- a/code/datums/votes/custom_vote.dm +++ b/code/datums/votes/custom_vote.dm @@ -1,14 +1,9 @@ /// The max amount of options someone can have in a custom vote. #define MAX_CUSTOM_VOTE_OPTIONS 10 -/datum/vote/custom_vote/single - name = "Custom Standard" - message = "Click here to start a custom vote (one selection per voter)" - -/datum/vote/custom_vote/multi - name = "Custom Multi" - message = "Click here to start a custom multi vote (multiple selections per voter)" - count_method = VOTE_COUNT_METHOD_MULTI +/datum/vote/custom_vote + name = "Custom" + default_message = "Click here to start a custom vote." // Custom votes ares always accessible. /datum/vote/custom_vote/is_accessible_vote() @@ -17,23 +12,45 @@ /datum/vote/custom_vote/reset() default_choices = null override_question = null + count_method = VOTE_COUNT_METHOD_SINGLE return ..() -/datum/vote/custom_vote/can_be_initiated(mob/by_who, forced = FALSE) +/datum/vote/custom_vote/can_be_initiated(forced) . = ..() - if(!.) - return FALSE + if(. != VOTE_AVAILABLE) + return . + if(forced) + return . // Custom votes can only be created if they're forced to be made. // (Either an admin makes it, or otherwise.) - return forced + return "Only admins can create custom votes." /datum/vote/custom_vote/create_vote(mob/vote_creator) + var/custom_count_method = tgui_input_list( + user = vote_creator, + message = "Single or multiple choice?", + title = "Choice Method", + items = list("Single", "Multiple"), + default = "Single", + ) + switch(custom_count_method) + if("Single") + count_method = VOTE_COUNT_METHOD_SINGLE + if("Multiple") + count_method = VOTE_COUNT_METHOD_MULTI + if(null) + return FALSE + else + stack_trace("Got '[custom_count_method]' in create_vote() for custom voting.") + to_chat(vote_creator, span_boldwarning("Unknown choice method. Contact a coder.")) + return FALSE + var/custom_win_method = tgui_input_list( - vote_creator, - "How should the vote winner be determined?", - "Winner Method", - list("Simple", "Weighted Random", "No Winner"), + user = vote_creator, + message = "How should the vote winner be determined?", + title = "Winner Method", + items = list("Simple", "Weighted Random", "No Winner"), default = "Simple", ) switch(custom_win_method) @@ -43,7 +60,10 @@ winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM if("No Winner") winner_method = VOTE_WINNER_METHOD_NONE + if(null) + return FALSE else + stack_trace("Got '[custom_win_method]' in create_vote() for custom voting.") to_chat(vote_creator, span_boldwarning("Unknown winner method. Contact a coder.")) return FALSE @@ -54,7 +74,7 @@ list("Yes", "No"), ) - if(display_stats == null) + if(isnull(display_stats)) return FALSE display_statistics = display_stats == "Yes" @@ -74,6 +94,9 @@ if(!length(default_choices)) return FALSE + // Sanity for all the tgui input stalling we are doing + if(isnull(vote_creator.client?.holder)) + return FALSE return ..() diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index 301af610096..7b1794da93e 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -1,6 +1,6 @@ /datum/vote/map_vote name = "Map" - message = "Vote for next round's map!" + default_message = "Vote for next round's map!" count_method = VOTE_COUNT_METHOD_SINGLE winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM display_statistics = FALSE @@ -30,44 +30,26 @@ SSmapping.map_voted = TRUE // voted by not voting, very sad. return FALSE -/datum/vote/map_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - +/datum/vote/map_vote/toggle_votable() CONFIG_SET(flag/allow_vote_map, !CONFIG_GET(flag/allow_vote_map)) - return TRUE /datum/vote/map_vote/is_config_enabled() return CONFIG_GET(flag/allow_vote_map) -/datum/vote/map_vote/can_be_initiated(mob/by_who, forced = FALSE) +/datum/vote/map_vote/can_be_initiated(forced) . = ..() - if(!.) - return FALSE - + if(. != VOTE_AVAILABLE) + return . if(forced) - return TRUE - + return VOTE_AVAILABLE var/number_of_choices = length(check_population()) if(number_of_choices < 2) - message = "There [number_of_choices == 1 ? "is only one map" : "are no maps"] to choose from." - return FALSE - + return "There [number_of_choices == 1 ? "is only one map" : "are no maps"] to choose from." if(SSmapping.map_vote_rocked) - return TRUE - - if(!CONFIG_GET(flag/allow_vote_map)) - message = "Map voting is disabled by server configuration settings." - return FALSE - + return VOTE_AVAILABLE if(SSmapping.map_voted) - message = "The next map has already been selected." - return FALSE - - message = initial(message) - return TRUE + return "The next map has already been selected." + return VOTE_AVAILABLE /// Before we create a vote, remove all maps from our choices that are outside of our population range. /// Note that this can result in zero remaining choices for our vote, which is not ideal (but ultimately okay). diff --git a/code/datums/votes/restart_vote.dm b/code/datums/votes/restart_vote.dm index 987d5b87eb3..3c74d7e518e 100644 --- a/code/datums/votes/restart_vote.dm +++ b/code/datums/votes/restart_vote.dm @@ -7,7 +7,8 @@ CHOICE_RESTART, CHOICE_CONTINUE, ) - message = "Vote to restart the ongoing round." + default_message = "Vote to restart the ongoing round. \ + Only works if there are no non-AFK admins online." /// This proc checks to see if any admins are online for the purposes of this vote to see if it can pass. Returns TRUE if there are valid admins online (Has +SERVER and is not AFK), FALSE otherwise. /datum/vote/restart_vote/proc/admins_present() @@ -19,36 +20,24 @@ return FALSE -/datum/vote/restart_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - +/datum/vote/restart_vote/toggle_votable() CONFIG_SET(flag/allow_vote_restart, !CONFIG_GET(flag/allow_vote_restart)) - return TRUE /datum/vote/restart_vote/is_config_enabled() return CONFIG_GET(flag/allow_vote_restart) -/datum/vote/restart_vote/can_be_initiated(mob/by_who, forced) +/datum/vote/restart_vote/create_vote(mob/vote_creator) . = ..() if(!.) - return FALSE + return + if(!admins_present()) + return + async_alert_about_admins(vote_creator) - if(!forced && !CONFIG_GET(flag/allow_vote_restart)) - message = "Restart voting is disabled by server configuration settings." - return FALSE - - // We still want players to be able to vote to restart even if valid admins are online. Let's update the message just so that the player is aware of this fact. - // We don't want to lock-out the vote though, so we'll return TRUE. - if(admins_present()) - message = "Regardless of the results of this vote, the round will not automatically restart because an admin is online." - return TRUE - - message = initial(message) - return TRUE +/datum/vote/restart_vote/proc/async_alert_about_admins(mob/vote_creator) + set waitfor = FALSE + tgui_alert(vote_creator, "Note: Regardless of the results of this vote, \ + the round will not automatically restart because an active admin is online.") /datum/vote/restart_vote/get_vote_result(list/non_voters) if(!CONFIG_GET(flag/default_no_vote)) diff --git a/code/datums/votes/rock_the_vote.dm b/code/datums/votes/rock_the_vote.dm index 6cffeb5ad67..6c7ac4ff257 100644 --- a/code/datums/votes/rock_the_vote.dm +++ b/code/datums/votes/rock_the_vote.dm @@ -10,58 +10,40 @@ CHOICE_TO_ROCK, CHOICE_NOT_TO_ROCK, ) - message = "Override the current map vote." + default_message = "Override the current map vote." /// The number of times we have rocked the vote thus far. var/rocking_votes = 0 -/datum/vote/rock_the_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - +/datum/vote/rock_the_vote/toggle_votable() CONFIG_SET(flag/allow_rock_the_vote, !CONFIG_GET(flag/allow_rock_the_vote)) - return TRUE /datum/vote/rock_the_vote/is_config_enabled() return CONFIG_GET(flag/allow_rock_the_vote) -/datum/vote/rock_the_vote/can_be_initiated(mob/by_who, forced) +/datum/vote/rock_the_vote/can_be_initiated(forced) . = ..() - - if(!.) - return FALSE - - if(!forced && !CONFIG_GET(flag/allow_rock_the_vote)) - message = "Rocking the vote is disabled by this server's configuration settings." - return FALSE + if(. != VOTE_AVAILABLE) + return . if(SSticker.current_state == GAME_STATE_FINISHED) - message = "The game is finished, no map votes can be initiated." - return FALSE + return "The game is finished, no map votes can be initiated." if(rocking_votes >= CONFIG_GET(number/max_rocking_votes)) - message = "The maximum number of times to rock the vote has been reached." - return FALSE + return "The maximum number of times to rock the vote has been reached." if(SSmapping.map_vote_rocked) - message = "The vote has already been rocked! Initiate a map vote!" - return FALSE + return "The vote has already been rocked! Initiate a map vote!" if(!SSmapping.map_voted) - message = "Rocking the vote is disabled because no map has been voted on yet!" - return FALSE + return "Rocking the vote is disabled because no map has been voted on yet!" if(SSmapping.map_force_chosen) - message = "Rocking the vote is disabled because an admin has forcibly set the map!" - return FALSE + return "Rocking the vote is disabled because an admin has forcibly set the map!" if(EMERGENCY_ESCAPED_OR_ENDGAMED && SSmapping.map_voted) - message = "The emergency shuttle has already left the station and the next map has already been chosen!" - return FALSE + return "The emergency shuttle has already left the station and the next map has already been chosen!" - message = initial(message) - return TRUE + return VOTE_AVAILABLE /datum/vote/rock_the_vote/finalize_vote(winning_option) rocking_votes++ diff --git a/tgui/packages/tgui/interfaces/VotePanel.tsx b/tgui/packages/tgui/interfaces/VotePanel.tsx index 456650569c0..0366bf773fc 100644 --- a/tgui/packages/tgui/interfaces/VotePanel.tsx +++ b/tgui/packages/tgui/interfaces/VotePanel.tsx @@ -5,6 +5,7 @@ import { Box, Button, Collapsible, + Dimmer, Icon, LabeledList, NoticeBox, @@ -59,11 +60,13 @@ type Data = { possibleVotes: Vote[]; user: UserData; voting: string[]; + LastVoteTime: number; + VoteCD: number; }; export const VotePanel = (props) => { - const { data } = useBackend(); - const { currentVote, user } = data; + const { act, data } = useBackend(); + const { currentVote, user, LastVoteTime, VoteCD } = data; /** * Adds the voting type to title if there is an ongoing vote. @@ -81,7 +84,19 @@ export const VotePanel = (props) => { -
+
act('resetCooldown')} + /> + ) + } + > {!!user.isLowerAdmin && currentVote && }
@@ -93,51 +108,86 @@ export const VotePanel = (props) => { ); }; +const VoteOptionDimmer = (props) => { + const { data } = useBackend(); + const { LastVoteTime, VoteCD } = data; + + return ( + + + + Vote Cooldown + + {Math.floor((VoteCD + LastVoteTime) / 10)}s + + + ); +}; + /** * The create vote options menu. Only upper admins can disable voting. * @returns A section visible to everyone with vote options. */ const VoteOptions = (props) => { const { act, data } = useBackend(); - const { possibleVotes, user } = data; + const { possibleVotes, user, LastVoteTime, VoteCD } = data; return ( - - {possibleVotes.map((option) => ( - - {!!user.isLowerAdmin && option.config !== VoteConfig.None && ( - - act('toggleVote', { - voteName: option.name, - }) - } - /> - )} -
); @@ -153,11 +203,11 @@ const VotersList = (props) => { return ( -
+
{data.voting.map((voter) => { return {voter}; })} @@ -280,13 +330,26 @@ const TimePanel = (props) => { {currentVote?.timeRemaining || 0}s {!!user.isLowerAdmin && ( - + + + + + + + + )}
From cd635a7aab03a29b574704dc95f65b13ad770408 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 2 May 2024 00:34:09 +0000 Subject: [PATCH 039/107] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-27523.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27532.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27543.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27544.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27545.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27548.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27549.yml | 5 ---- html/changelogs/AutoChangeLog-pr-27550.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27551.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27552.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27553.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27554.yml | 5 ---- html/changelogs/AutoChangeLog-pr-27555.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27557.yml | 4 ---- html/changelogs/archive/2024-05.yml | 27 ++++++++++++++++++++++ 15 files changed, 27 insertions(+), 58 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-27523.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27532.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27543.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27544.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27545.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27548.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27549.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27550.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27551.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27552.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27553.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27554.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27555.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27557.yml diff --git a/html/changelogs/AutoChangeLog-pr-27523.yml b/html/changelogs/AutoChangeLog-pr-27523.yml deleted file mode 100644 index baa4d1de8c7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27523.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - rscadd: "trainship hijack deathmatch map" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27532.yml b/html/changelogs/AutoChangeLog-pr-27532.yml deleted file mode 100644 index f8f1e0f81c9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27532.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "The syndicate infiltrator has no weak spots anymore" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27543.yml b/html/changelogs/AutoChangeLog-pr-27543.yml deleted file mode 100644 index 15114a8b2d7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27543.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "If you are a freerunner, you don't end up faceplanting despite having catlike grace." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27544.yml b/html/changelogs/AutoChangeLog-pr-27544.yml deleted file mode 100644 index 37de6179773..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27544.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - qol: "The Human AI's advanced security console can be repackaged with a screwdriver if you wish to move it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27545.yml b/html/changelogs/AutoChangeLog-pr-27545.yml deleted file mode 100644 index e74e2305992..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27545.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Monkey changelings that are disguised as someone can now take off their flesh clothes." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27548.yml b/html/changelogs/AutoChangeLog-pr-27548.yml deleted file mode 100644 index 6522426fbbf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27548.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Monkeys can no longer be knocked over by walking into a windoor on combat mode while they're behind it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27549.yml b/html/changelogs/AutoChangeLog-pr-27549.yml deleted file mode 100644 index 88c8117b5d4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27549.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "You can now re-construct pod doors that had deconstruction started." - - qol: "You can now make pod door assemblies using plasteel in-hand." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27550.yml b/html/changelogs/AutoChangeLog-pr-27550.yml deleted file mode 100644 index 9e7f592e1cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27550.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - admin: "Debug uplinks now shows all categories and won't lock upon buying items like his grace and the syndicate balloon." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27551.yml b/html/changelogs/AutoChangeLog-pr-27551.yml deleted file mode 100644 index d2ee71caa75..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27551.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - qol: "conveyor switches now have direction-specific input signals" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27552.yml b/html/changelogs/AutoChangeLog-pr-27552.yml deleted file mode 100644 index 7be2f164853..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27552.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "AIs can now track Silicon as long as their built-in camera is online." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27553.yml b/html/changelogs/AutoChangeLog-pr-27553.yml deleted file mode 100644 index 53b91414355..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27553.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Fixes hypercharged slime core cells and circuit guns having 1,000 times less energy than intended." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27554.yml b/html/changelogs/AutoChangeLog-pr-27554.yml deleted file mode 100644 index 986653310c8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27554.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fluffles" -delete-after: True -changes: - - qol: "you can pick up wheelchairs while on the ground" - - qol: "you can place wheelchairs a tile away from you, like roller beds" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27555.yml b/html/changelogs/AutoChangeLog-pr-27555.yml deleted file mode 100644 index 12a7abadaab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Constantly fleeing in Battle Arcade will no longer give you a very large amount of decimals due to halving your gold every time." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27557.yml b/html/changelogs/AutoChangeLog-pr-27557.yml deleted file mode 100644 index 79dafa368a8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27557.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Company imports button is brought back" \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index 83cf1ccebca..bec139f50a5 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -50,3 +50,30 @@ - bugfix: Automatically link machines to closest research server for off-station z levels (fixes Tarkon/DS-2 machines linking to wrong R&D server) - qol: Wrench down research console on DS-2 +2024-05-02: + Fluffles: + - qol: you can pick up wheelchairs while on the ground + - qol: you can place wheelchairs a tile away from you, like roller beds + Majkl-J: + - bugfix: Company imports button is brought back + SkyratBot: + - bugfix: The syndicate infiltrator has no weak spots anymore + - rscadd: trainship hijack deathmatch map + - qol: The Human AI's advanced security console can be repackaged with a screwdriver + if you wish to move it. + - bugfix: You can now re-construct pod doors that had deconstruction started. + - qol: You can now make pod door assemblies using plasteel in-hand. + - bugfix: If you are a freerunner, you don't end up faceplanting despite having + catlike grace. + - admin: Debug uplinks now shows all categories and won't lock upon buying items + like his grace and the syndicate balloon. + - qol: conveyor switches now have direction-specific input signals + - bugfix: AIs can now track Silicon as long as their built-in camera is online. + - bugfix: Constantly fleeing in Battle Arcade will no longer give you a very large + amount of decimals due to halving your gold every time. + - bugfix: Monkey changelings that are disguised as someone can now take off their + flesh clothes. + - bugfix: Fixes hypercharged slime core cells and circuit guns having 1,000 times + less energy than intended. + - bugfix: Monkeys can no longer be knocked over by walking into a windoor on combat + mode while they're behind it. From eccdc0c94c0d91d5acd72f64e070636decb29582 Mon Sep 17 00:00:00 2001 From: Gaxeer <44334376+Gaxeer@users.noreply.github.com> Date: Thu, 2 May 2024 04:14:35 +0300 Subject: [PATCH 040/107] make SSevents `frequeny_lower` and `frequency_upper` configurable, fix runtimes when no events were drafted to trigger (#82978) ## About The Pull Request Make events frequency configurable. Fix runtime when no events were drafted to be picked from. ## Why It's Good For The Game No runtimes good. No need to change frequency in code. :cl: fix: fix runtime when no events were drafted to be picked from config: make events frequency configurable /:cl: --------- Co-authored-by: san7890 --- code/__HELPERS/_lists.dm | 18 ++++++++++++------ .../configuration/entries/game_options.dm | 10 ++++++++++ code/controllers/subsystem/events.dm | 11 ++++++++--- config/game_options.txt | 7 +++++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 7af30c8d972..6811a31284a 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -417,7 +417,7 @@ **/ /proc/list_clear_nulls(list/list_to_clear) return (list_to_clear.RemoveAll(null) > 0) - + /** * Removes any empty weakrefs from the list @@ -473,17 +473,23 @@ * You should only pass integers in. */ /proc/pick_weight(list/list_to_pick) + if(length(list_to_pick) == 0) + return null + var/total = 0 - var/item - for(item in list_to_pick) + for(var/item in list_to_pick) if(!list_to_pick[item]) list_to_pick[item] = 0 total += list_to_pick[item] total = rand(1, total) - for(item in list_to_pick) - total -= list_to_pick[item] - if(total <= 0 && list_to_pick[item]) + for(var/item in list_to_pick) + var/item_weight = list_to_pick[item] + if(item_weight == 0) + continue + + total -= item_weight + if(total <= 0) return item return null diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 368ae3a3840..068f857c8cb 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -347,6 +347,16 @@ min_val = 0 integer = FALSE +/datum/config_entry/number/events_frequency_lower + default = 2.5 MINUTES + min_val = 0 + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/number/events_frequency_upper + default = 7 MINUTES + min_val = 0 + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/number/mice_roundstart default = 10 min_val = 0 diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 241622509af..23b36eb994e 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -25,6 +25,10 @@ SUBSYSTEM_DEF(events) if(!event.typepath || !event.valid_for_map()) continue //don't want this one! leave it for the garbage collector control += event //add it to the list of all events (controls) + + frequency_lower = CONFIG_GET(number/events_frequency_lower) + frequency_upper = CONFIG_GET(number/events_frequency_upper) + reschedule() // Instantiate our holidays list if it hasn't been already if(isnull(GLOB.holidays)) @@ -91,7 +95,8 @@ SUBSYSTEM_DEF(events) event_roster[event_to_check] = event_to_check.weight var/datum/round_event_control/event_to_run = pick_weight(event_roster) - TriggerEvent(event_to_run) + if(event_to_run) + TriggerEvent(event_to_run) ///Does the last pre-flight checks for the passed event, and runs it if the event is ready. /datum/controller/subsystem/events/proc/TriggerEvent(datum/round_event_control/event_to_trigger) @@ -109,8 +114,8 @@ SUBSYSTEM_DEF(events) ///Sets the event frequency bounds back to their initial value. /datum/controller/subsystem/events/proc/resetFrequency() - frequency_lower = initial(frequency_lower) - frequency_upper = initial(frequency_upper) + frequency_lower = CONFIG_GET(number/events_frequency_lower) + frequency_upper = CONFIG_GET(number/events_frequency_upper) /** * HOLIDAYS diff --git a/config/game_options.txt b/config/game_options.txt index 3cd2f34cc09..d6cb02f9a1b 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -147,6 +147,13 @@ EVENTS_MIN_TIME_MUL 1 ## Set to 0 to make dangerous events avaliable for all populations. EVENTS_MIN_PLAYERS_MUL 1 +## The lower bound, in deciseconds, for how soon another random event can be scheduled. +## Defaults to 1500 deciseconds or 2.5 minutes +EVENTS_FREQUENCY_LOWER 1500 + +## The upper bound, in deciseconds, for how soon another random event can be scheduled. +## Defaults to 4200 deciseconds or 7 minutes +EVENTS_FREQUENCY_UPPER 4200 ## AI ### From 88664c30fa381a32f2c30d967a132541367cda87 Mon Sep 17 00:00:00 2001 From: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> Date: Wed, 1 May 2024 19:18:33 -0600 Subject: [PATCH 042/107] Stamp papers quickly with a right click (#82993) ## About The Pull Request Right clicking a paper with a stamp will quickly place down the stamp ## Why It's Good For The Game ![fast](https://github.com/tgstation/tgstation/assets/95130227/de3eab11-e8bf-4266-aab6-97c8434663d7) ## Changelog :cl: qol: You can now quickly stamp papers with a right click /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> --- code/modules/paperwork/paper.dm | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 605e88f1e48..5dd5515c47c 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -441,8 +441,8 @@ // Handle stamping items. if(writing_stats["interaction_mode"] == MODE_STAMPING) if(!user.can_read(src) || user.is_blind()) - //The paper's stampable window area is assumed approx 400x500 - add_stamp(writing_stats["stamp_class"], rand(0, 400), rand(0, 500), rand(0, 360), writing_stats["stamp_icon_state"]) + //The paper's stampable window area is assumed approx 300x400 + add_stamp(writing_stats["stamp_class"], rand(0, 300), rand(0, 400), rand(0, 360), writing_stats["stamp_icon_state"]) user.visible_message(span_notice("[user] blindly stamps [src] with \the [attacking_item]!")) to_chat(user, span_notice("You stamp [src] with \the [attacking_item] the best you can!")) playsound(src, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) @@ -454,6 +454,25 @@ ui_interact(user) return ..() +/// Secondary right click interaction to quickly stamp things +/obj/item/paper/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + var/list/writing_stats = tool.get_writing_implement_details() + + if(!length(writing_stats)) + return NONE + if(writing_stats["interaction_mode"] != MODE_STAMPING) + return NONE + if(!user.can_read(src) || user.is_blind()) // Just leftclick instead + return NONE + + add_stamp(writing_stats["stamp_class"], rand(1, 300), rand(1, 400), stamp_icon_state = writing_stats["stamp_icon_state"]) + user.visible_message( + span_notice("[user] quickly stamps [src] with [tool] without looking."), + span_notice("You quickly stamp [src] with [tool] without looking."), + ) + playsound(src, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) + + return ITEM_INTERACT_BLOCKING // Stop the UI from opening. /** * Attempts to ui_interact the paper to the given user, with some sanity checking * to make sure the camera still exists via the weakref and that this paper is still From 9ca4f5e10cc081b03ef332e3bd4654ee1838e2ce Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 2 May 2024 04:28:44 +0200 Subject: [PATCH 044/107] Automatic changelog for PR #27558 [ci skip] --- html/changelogs/AutoChangeLog-pr-27558.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27558.yml diff --git a/html/changelogs/AutoChangeLog-pr-27558.yml b/html/changelogs/AutoChangeLog-pr-27558.yml new file mode 100644 index 00000000000..eecba8d4baf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27558.yml @@ -0,0 +1,4 @@ +author: "nikothedude" +delete-after: True +changes: + - bugfix: "Jousting no longer bypasses pacifism" \ No newline at end of file From aa0a07bf2a1a64188292cbd7fd3a767fd2703595 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 2 May 2024 04:29:15 +0200 Subject: [PATCH 045/107] Automatic changelog for PR #27559 [ci skip] --- html/changelogs/AutoChangeLog-pr-27559.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27559.yml diff --git a/html/changelogs/AutoChangeLog-pr-27559.yml b/html/changelogs/AutoChangeLog-pr-27559.yml new file mode 100644 index 00000000000..c6f0f76fc6a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27559.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "the civilian bounty control terminal displays the payout of new bounty options again" + - qol: "the civilian bounty control terminal displays the description of new bounty options" \ No newline at end of file From 254dfa598bf084d069c5113aaecc89c79c277955 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 2 May 2024 04:30:06 +0200 Subject: [PATCH 046/107] Automatic changelog for PR #27560 [ci skip] --- html/changelogs/AutoChangeLog-pr-27560.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27560.yml diff --git a/html/changelogs/AutoChangeLog-pr-27560.yml b/html/changelogs/AutoChangeLog-pr-27560.yml new file mode 100644 index 00000000000..b19efb8134b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27560.yml @@ -0,0 +1,7 @@ +author: "Melbert" +delete-after: True +changes: + - admin: "Custom Single and Custom Multi votes are now combined into one vote" + - admin: "Admins can now end votes instantly, rather than cancelling them" + - admin: "Admins can now reset the vote cooldown" + - bugfix: "Vote cooldown actually applies now" \ No newline at end of file From 60550634a8fec056104e18ce2e95ddc8aac8695f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 2 May 2024 04:40:46 +0200 Subject: [PATCH 047/107] Automatic changelog for PR #27562 [ci skip] --- html/changelogs/AutoChangeLog-pr-27562.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27562.yml diff --git a/html/changelogs/AutoChangeLog-pr-27562.yml b/html/changelogs/AutoChangeLog-pr-27562.yml new file mode 100644 index 00000000000..0e020a01f71 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27562.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "fix runtime when no events were drafted to be picked from" + - config: "make events frequency configurable" \ No newline at end of file From 8adfef3074f319b1e7139a6f21ef261e198ea6b8 Mon Sep 17 00:00:00 2001 From: Useroth <37159550+Useroth@users.noreply.github.com> Date: Thu, 2 May 2024 04:49:22 +0200 Subject: [PATCH 048/107] Done and done --- modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm b/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm index e7e760a6f27..64e199150f2 100644 --- a/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm +++ b/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm @@ -68,7 +68,7 @@ /obj/machinery/ammo_workbench/Initialize(mapload) AddComponent( \ /datum/component/material_container, \ - DSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ + SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ 200000, \ MATCONTAINER_EXAMINE, \ allowed_items = /obj/item/stack, \ From d7bfa24400c01a7a4e92b5f64803cbbb3471bcc2 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 2 May 2024 04:50:41 +0200 Subject: [PATCH 049/107] Automatic changelog for PR #27563 [ci skip] --- html/changelogs/AutoChangeLog-pr-27563.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27563.yml diff --git a/html/changelogs/AutoChangeLog-pr-27563.yml b/html/changelogs/AutoChangeLog-pr-27563.yml new file mode 100644 index 00000000000..caa7dca7488 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27563.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - qol: "You can now quickly stamp papers with a right click" \ No newline at end of file From f62bfc4ba3d0df6cb36806b1c0a9961f5da6d3d3 Mon Sep 17 00:00:00 2001 From: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com> Date: Thu, 2 May 2024 10:24:01 +0530 Subject: [PATCH 050/107] Porting fragile_customization --- .../items/devices/scanners/health_analyzer.dm | 11 +++++ .../code/datums/traits/negative.dm | 47 +++++++++++++++++-- .../skyrat/fragile_customization.tsx | 12 +++++ 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/fragile_customization.tsx diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 1a264cf3924..785a80b1e59 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -214,6 +214,17 @@ if(advanced) render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].\n" + // SKYRAT EDIT ADDITION START -- Show increased/decreased brute/burn mods, to "leave a paper trail" for the fragility quirk + if(ishuman(target)) + var/mob/living/carbon/human/humantarget = target + + var/datum/physiology/physiology = humantarget.physiology + if (physiology.brute_mod != 1) + render_list += "Subject takes [(physiology.brute_mod) * 100]% brute damage.\n" + if (physiology.burn_mod != 1) + render_list += "Subject takes [(physiology.burn_mod) * 100]% burn damage.\n" + // SKYRAT EDIT ADDITION END + if (HAS_TRAIT(target, TRAIT_IRRADIATED)) render_list += "Subject is irradiated. Supply toxin healing.\n" diff --git a/modular_skyrat/master_files/code/datums/traits/negative.dm b/modular_skyrat/master_files/code/datums/traits/negative.dm index 621795c25aa..5387f215df5 100644 --- a/modular_skyrat/master_files/code/datums/traits/negative.dm +++ b/modular_skyrat/master_files/code/datums/traits/negative.dm @@ -15,17 +15,56 @@ medical_record_text = "Patient's body has adapted to low gravity. Sadly low-gravity environments are not conducive to strong bone development." icon = FA_ICON_TIRED +/datum/quirk_constant_data/fragile + associated_typepath = /datum/quirk/fragile + customization_options = list( + /datum/preference/numeric/fragile_customization/brute, + /datum/preference/numeric/fragile_customization/burn, + ) + +/datum/preference/numeric/fragile_customization + abstract_type = /datum/preference/numeric/fragile_customization + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_identifier = PREFERENCE_CHARACTER + + minimum = 1.25 + maximum = 5 // 5x damage, arbitrary + + step = 0.01 + +/datum/preference/numeric/fragile_customization/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE + +/datum/preference/numeric/fragile_customization/create_default_value() + return 1.25 + +/datum/preference/numeric/fragile_customization/brute + savefile_key = "fragile_brute" + +/datum/preference/numeric/fragile_customization/burn + savefile_key = "fragile_burn" + /datum/quirk/fragile/post_add() . = ..() + var/mob/living/carbon/human/user = quirk_holder - user.physiology.brute_mod *= 1.25 - user.physiology.burn_mod *= 1.2 + var/datum/preferences/prefs = user.client.prefs + var/brutemod = prefs.read_preference(/datum/preference/numeric/fragile_customization/brute) + var/burnmod = prefs.read_preference(/datum/preference/numeric/fragile_customization/burn) + + user.physiology.brute_mod *= brutemod + user.physiology.burn_mod *= burnmod /datum/quirk/fragile/remove() . = ..() + var/mob/living/carbon/human/user = quirk_holder - user.physiology.brute_mod /= 1.25 - user.physiology.burn_mod /= 1.2 + var/datum/preferences/prefs = user.client.prefs + var/brutemod = prefs.read_preference(/datum/preference/numeric/fragile_customization/brute) + var/burnmod = prefs.read_preference(/datum/preference/numeric/fragile_customization/burn) + // will cause issues if the user changes this value before removal + user.physiology.brute_mod /= brutemod + user.physiology.burn_mod /= burnmod /datum/quirk/monophobia name = "Monophobia" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/fragile_customization.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/fragile_customization.tsx new file mode 100644 index 00000000000..32af5d28d96 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/fragile_customization.tsx @@ -0,0 +1,12 @@ +// THIS IS A SKYRAT UI FILE +import { Feature, FeatureNumberInput } from '../../base'; + +export const fragile_brute: Feature = { + name: 'Brute Modifier', + component: FeatureNumberInput, +}; + +export const fragile_burn: Feature = { + name: 'Burn Modifier', + component: FeatureNumberInput, +}; From 9b9041eecab187599acd7507668649faa3da61f0 Mon Sep 17 00:00:00 2001 From: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com> Date: Thu, 2 May 2024 10:48:29 +0530 Subject: [PATCH 051/107] shuttle fan --- _maps/shuttles/skyrat/arrivals_skyrat.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/shuttles/skyrat/arrivals_skyrat.dmm b/_maps/shuttles/skyrat/arrivals_skyrat.dmm index 8968c17261b..35bc8135425 100644 --- a/_maps/shuttles/skyrat/arrivals_skyrat.dmm +++ b/_maps/shuttles/skyrat/arrivals_skyrat.dmm @@ -218,6 +218,7 @@ /area/shuttle/arrival) "U" = ( /obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, /turf/open/floor/iron/shuttle/arrivals, /area/shuttle/arrival) "V" = ( From 9da56a7d745f2af1c75ecbf36abc24f39288d833 Mon Sep 17 00:00:00 2001 From: Waterpig Date: Thu, 2 May 2024 11:53:46 +0200 Subject: [PATCH 052/107] that was easy --- .../bodyparts/internal_computer/internal_computer.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm index ef17198a781..4ea599ba001 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm @@ -18,6 +18,7 @@ if(!istype(loc, /obj/item/organ/internal/brain/synth)) return INITIALIZE_HINT_QDEL +/* Action for opening the synthbrain computer */ /datum/action/item_action/synth/open_internal_computer name = "Open persocom emulation" desc = "Accesses your built-in virtual machine." @@ -28,6 +29,9 @@ var/obj/item/organ/internal/brain/synth/targetmachine = target targetmachine.internal_computer.interact(owner) +/* +Various overrides necessary to get the persocom working, namely ui status, power, and ID handling +*/ /obj/item/modular_computer/pda/synth/ui_state(mob/user) return GLOB.default_state @@ -44,6 +48,11 @@ ) return ..() +// Needed to tell the power check that we're handling power ourselves +/obj/item/modular_computer/pda/synth/check_power_override(amount) + return TRUE + +// Handles the id slot reading our id /obj/item/modular_computer/pda/synth/proc/handle_id_slot(mob/living/carbon/human/synth) if(!istype(synth)) return @@ -64,7 +73,7 @@ /obj/item/modular_computer/pda/synth/get_ntnet_status() . = ..() - if(is_centcom_level(loc.z)) // Centcom is excluded because cafe + if(is_centcom_level(loc.z)) // Centcom is excluded because cafe would allow people to abuse these . = NTNET_NO_SIGNAL return . From b9442b9113f1b9b16042ebcae6b31ba19a41ee27 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Thu, 2 May 2024 15:46:41 +0200 Subject: [PATCH 053/107] rad shutter directionals (#82997) --- icons/obj/doors/shutters_radiation.dmi | Bin 1477 -> 18358 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/doors/shutters_radiation.dmi b/icons/obj/doors/shutters_radiation.dmi index 657b613b0ccdef3dfe1bf0c010cf1c6650fdf4fa..2e70b24a4aa2aacbb463e9099d48ccd5a58e86ae 100644 GIT binary patch literal 18358 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 delta 1411 zcmZuxeK^wz9RF=BW@*DR<+AOBJrB*Cu5-$=JzR)IN={z3%1d4*mr%xUW{Xo7b-Eiq~eddDJ*$EBM@+(cpar{@-M~&fh1Rqi*LMLJwM{Eibpy>EAXNZrCHC(^xkiES~TgSED3>4Lz?7V%jZ~*}H zE4@8v2hvJr!djAsD42K8!DkyidJ2Cv4FwV^fq)d4iM=rA#dEw(0BXAVAc6oOMFNBD z`8267+YSs`uj&e0x`3HAa>RIrV^&`Pj2Rne(l?Mmryz?=PU zKcsOU3Ol(nu;zB?0Iunr;SUX~0b zhVO8U#+B2u$V?k$O8QZ)q(@(%4xZ)=Ql|<4* zvfNskl07$|9MAZHhQ)r5n>S&&DcBTsP23|gM57@nX0GWf_6|E-0R-UYO;bJ!>&ioW zP_&EFxh}}zoFT0L&eV;P&okHbRKJ{iI>`p3VB~Fd?eyY@CG$`W!c&Ie@MW3ba7wic zBdH$8{h52(eGJDyv|(Ne$^yA_ce6_Gyqrh+?51R-V7UeJ?^zTDZ!765vV3cK_6WGC z@P&1k=V?={V5|yR6<}rH`F1hBRaz=aZg5Wv+y;Hv5Y^OXYNf@4^$q{4Q-r!y|Z-(nI(XIM<5gCT?awLtrooHBKs}Ga%v7>w= z0gtZG3&GE8)-uAGs-?7|*-2E%cipT;(A}b4yo8u^iY$u2oK0(?o)@jG@Ops`nZb4) z^{WPV6@1Y_@+ozrutoxUnSV?M^R3qXct-0p=|YxN%g=v0t|2-u#%IthzTTa)ur3pG zt+J(@(keYP^f2miX;$0%VZ-88``l;ZbSV%gu(Y0()W)RaDKJZ|;0t&`2 z-ihy@JydWPeeAEL@^JTAP4t9bxe77G;dODc)2Q%UlUF&^x=Qc4>I;>SNn)nv-Nd2= zs`KV#D^E!O(&0{UOK=D#*;mTTa~qfPeyeA*X?<`JqT8Hu2vg4up`AmKkfu23A8jqP z0K1O{o6o?-BU~j8SVl@#*G*;WCpW<#mckfww-v@ugC)6p+oq*S;$N3k0XLHjQ^m>a|bT*su_1q(Ji2u>;57Bj{r8U3emN(oeTv@M&UlZ zb_5BVr^uEWkVEmo5n`&4%>;MT#Sz5QBfzeFF13PC+epY9$vT`U$(ba|)!gJJy7<(J zm--=Sb4{VCgjNb1GOgfjG|9oR)&OhHAJQ{Iwa&nFcGTQf-idT~7ENTFD Date: Thu, 2 May 2024 17:38:22 +0200 Subject: [PATCH 055/107] Extra husk info --- .../objects/items/devices/scanners/health_analyzer.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index f52f97aeeb5..566e504b476 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -164,9 +164,13 @@ if(HAS_TRAIT(target, TRAIT_HUSK)) if(advanced) if(HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) - render_list += "Subject has been husked by severe burns.\n" + /* SKYRAT EDIT START: More unhusking information */ + render_list += "Subject has been husked by severe burns. Use repairing burn damage and following up with \ + application of [SYNTHFLESH_UNHUSK_AMOUNT]u synthflesh or injection of rezadone as treatment.\n" else if (HAS_TRAIT_FROM(target, TRAIT_HUSK, CHANGELING_DRAIN)) - render_list += "Subject has been husked by dessication.\n" + render_list += "Subject has been husked by dessication. Use applying [SYNTHFLESH_LING_UNHUSK_AMOUNT]u \ + of synthflesh or injection of rezadone as treatment.\n" + /* SKYRAT EDIT END */ else render_list += "Subject has been husked by mysterious causes.\n" From c8c1ab23d063d7fdf6125ebacf5ea6f74827bec6 Mon Sep 17 00:00:00 2001 From: Waterpig Date: Thu, 2 May 2024 17:48:32 +0200 Subject: [PATCH 056/107] blep --- code/game/objects/items/devices/scanners/health_analyzer.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 566e504b476..a284ec87f88 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -165,10 +165,10 @@ if(advanced) if(HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) /* SKYRAT EDIT START: More unhusking information */ - render_list += "Subject has been husked by severe burns. Use repairing burn damage and following up with \ + render_list += "Subject has been husked by severe burns. Proceed by repairing burn damage and following up with \ application of [SYNTHFLESH_UNHUSK_AMOUNT]u synthflesh or injection of rezadone as treatment.\n" else if (HAS_TRAIT_FROM(target, TRAIT_HUSK, CHANGELING_DRAIN)) - render_list += "Subject has been husked by dessication. Use applying [SYNTHFLESH_LING_UNHUSK_AMOUNT]u \ + render_list += "Subject has been husked by dessication. Use application of [SYNTHFLESH_LING_UNHUSK_AMOUNT]u \ of synthflesh or injection of rezadone as treatment.\n" /* SKYRAT EDIT END */ else From 723d42122d7a25ca609e599dab88f7529a819bc6 Mon Sep 17 00:00:00 2001 From: Echriser Date: Thu, 2 May 2024 11:08:59 -0500 Subject: [PATCH 057/107] Conveyors switches now use left and right click (#83001) ## About The Pull Request Replaces current switch behavior from having to spam to get between forward, off, and reversing states to just use left and right click. It also removes the previous toggle behavior from the circuit trigger in favor or the forward, backwards, and stop buttons. Follow up to suggested changes from #82857 ## Why It's Good For The Game No more spamming left click to get to the state you want, nor worrying about what the previous direction was and not knowing which way it's gonna go. ## Changelog :cl: qol: conveyors now use left and right click controls qol: add screentips for conveyor switches del: removes circuit conveyor circuit default trigger behavior in favor in favor of the three state triggers /:cl: --- code/modules/recycling/conveyor.dm | 53 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 36d73552159..6ef15929ecc 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -350,8 +350,6 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /// The current state of the switch. var/position = CONVEYOR_OFF - /// Last direction setting. - var/last_pos = CONVEYOR_BACKWARDS /// If the switch only operates the conveyor belts in a single direction. var/oneway = FALSE /// If the level points the opposite direction when it's turned on. @@ -372,6 +370,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) AddComponent(/datum/component/usb_port, list( /obj/item/circuit_component/conveyor_switch, )) + register_context() /obj/machinery/conveyor_switch/Destroy() LAZYREMOVE(GLOB.conveyors_by_id[id], src) @@ -397,6 +396,27 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) icon_state = "[base_icon_state]-[invert_icon ? "rev" : "fwd"]" return ..() +/obj/machinery/conveyor_switch/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(!held_item) + context[SCREENTIP_CONTEXT_LMB] = "Toggle forwards" + if(!oneway) + context[SCREENTIP_CONTEXT_RMB] = "Toggle backwards" + return CONTEXTUAL_SCREENTIP_SET + if(held_item.tool_behaviour == TOOL_MULTITOOL) + context[SCREENTIP_CONTEXT_LMB] = "Set speed" + context[SCREENTIP_CONTEXT_RMB] = "View wires" + return CONTEXTUAL_SCREENTIP_SET + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Toggle oneway" + return CONTEXTUAL_SCREENTIP_SET + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Detach" + return CONTEXTUAL_SCREENTIP_SET + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "Invert" + return CONTEXTUAL_SCREENTIP_SET + /// Updates all conveyor belts that are linked to this switch, and tells them to start processing. /obj/machinery/conveyor_switch/proc/update_linked_conveyors() for(var/obj/machinery/conveyor/belt in GLOB.conveyors_by_id[id]) @@ -414,28 +434,29 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) CHECK_TICK /// Updates the switch's `position` and `last_pos` variable. Useful so that the switch can properly cycle between the forwards, backwards and neutral positions. -/obj/machinery/conveyor_switch/proc/update_position() +/obj/machinery/conveyor_switch/proc/update_position(direction) if(position == CONVEYOR_OFF) if(oneway) //is it a oneway switch position = oneway else - if(last_pos < CONVEYOR_OFF) + if(direction == CONVEYOR_FORWARD) position = CONVEYOR_FORWARD - last_pos = CONVEYOR_OFF else position = CONVEYOR_BACKWARDS - last_pos = CONVEYOR_OFF else - last_pos = position position = CONVEYOR_OFF /// Called when a user clicks on this switch with an open hand. -/obj/machinery/conveyor_switch/interact(mob/user) +/obj/machinery/conveyor_switch/attack_hand(mob/living/user, list/modifiers) add_fingerprint(user) - update_position() + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + update_position(CONVEYOR_BACKWARDS) + else + update_position(CONVEYOR_FORWARD) update_appearance() update_linked_conveyors() update_linked_switches() + return TRUE /obj/machinery/conveyor_switch/attackby(obj/item/attacking_item, mob/user, params) if(is_wire_tool(attacking_item)) @@ -588,7 +609,6 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/item/circuit_component/conveyor_switch display_name = "Conveyor Switch" desc = "Allows to control connected conveyor belts." - circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL /// Direction input ports. var/datum/port/input/stop @@ -619,12 +639,6 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) attached_switch = null return ..() -/obj/item/circuit_component/conveyor_switch/input_received(datum/port/input/port) - if(!attached_switch) - return - - INVOKE_ASYNC(src, PROC_REF(update_conveyors), port) - /obj/item/circuit_component/conveyor_switch/proc/on_switch_changed() attached_switch.update_appearance() attached_switch.update_linked_conveyors() @@ -646,13 +660,6 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) attached_switch.position = CONVEYOR_BACKWARDS INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) -/obj/item/circuit_component/conveyor_switch/proc/update_conveyors(datum/port/input/port) - if(!attached_switch) - return - - attached_switch.update_position() - INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) - #undef CONVEYOR_BACKWARDS #undef CONVEYOR_OFF #undef CONVEYOR_FORWARD From 9f9ef7288d9e41b93a1f550296cd3c57eb0c453a Mon Sep 17 00:00:00 2001 From: Zenog400 <41298161+Zenog400@users.noreply.github.com> Date: Thu, 2 May 2024 09:28:11 -0700 Subject: [PATCH 059/107] More Machine Blessing Options (#82606) ## About The Pull Request Adds more implants to the pool that the Machine Blessing rite can draw from, and rebalances the drop rates so that you're more likely to get thematically-consistent implants. ## Why It's Good For The Game Currently, the options for what the Machine Blessing rite can give you are kinda garbage, considering that _one_ implant from the rite is the same value as _two_ full species conversions. This adds a few more that are actually useful. Specific implants added: - Combat arm (extremely low drop rate) - Tool arm (higher drop rate) - Reviver implant (lower drop rate) - Anti-drop implant - Anti-stun implant (significantly lower drop rate) - Welding eyes Additionally, slightly lowers the drop rate of the breathing tube implant, because androids don't have lungs ## Changelog :cl: add: increased the size of the pool that Machine Blessing draws from balance: weighted some of the implants that Machine Blessing can give /:cl: --------- Co-authored-by: Jacquerel --- code/modules/religion/rites.dm | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index d907191c33d..fa7d31c3249 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -128,13 +128,33 @@ /datum/religion_rites/machine_blessing/invoke_effect(mob/living/user, atom/movable/religious_tool) ..() var/altar_turf = get_turf(religious_tool) - var/blessing = pick( - /obj/item/organ/internal/cyberimp/arm/surgery, + var/arm = list( + /obj/item/organ/internal/cyberimp/arm/combat, + /obj/item/organ/internal/cyberimp/arm/surgery = 1000000, + /obj/item/organ/internal/cyberimp/arm/toolset = 1500000 + ) + var/eyes = list( /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, /obj/item/organ/internal/cyberimp/eyes/hud/medical, - /obj/item/organ/internal/cyberimp/mouth/breathing_tube, - /obj/item/organ/internal/cyberimp/chest/thrusters, - /obj/item/organ/internal/eyes/robotic/glow, + /obj/item/organ/internal/eyes/robotic/shield = 2, + /obj/item/organ/internal/eyes/robotic/glow + ) + var/chest = list( + /obj/item/organ/internal/cyberimp/chest/reviver, + /obj/item/organ/internal/cyberimp/chest/thrusters = 2 + ) + var/head = list( + /obj/item/organ/internal/cyberimp/brain/anti_drop = 100, + /obj/item/organ/internal/cyberimp/brain/anti_stun = 10 + ) + var/blessing = pick_weight_recursive( + list( + arm = 15, + eyes = 15, + chest = 9, + head = 10, + /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 5, + ) ) new blessing(altar_turf) return TRUE From cc6a41a5927e876a14f584c40f931590a04e6aa3 Mon Sep 17 00:00:00 2001 From: VrazzleDazzle Date: Thu, 2 May 2024 18:59:59 +0200 Subject: [PATCH 061/107] Update chem_master.dm --- code/modules/reagents/chemistry/machinery/chem_master.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index e7bb73d29f2..7013c9bdb96 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -174,6 +174,8 @@ CAT_TUBES = GLOB.reagent_containers[CAT_TUBES], CAT_PILLS = GLOB.reagent_containers[CAT_PILLS], CAT_PATCHES = GLOB.reagent_containers[CAT_PATCHES], + CAT_HYPOS = GLOB.reagent_containers[CAT_HYPOS], // SKYRAT EDIT + CAT_DARTS = GLOB.reagent_containers[CAT_DARTS], // SKYRAT EDIT ) return containers @@ -488,6 +490,10 @@ item_name_default = "[master_reagent.name] [item_name_default]" if(!(initial(selected_container.reagent_flags) & OPENCONTAINER)) // Closed containers get both reagent name and units in the name item_name_default = "[master_reagent.name] [item_name_default] ([volume_in_each]u)" + // SKYRAT EDIT ADDITION START - Autonamed hyposprays/smartdarts + if(ispath(selected_container, /obj/item/reagent_containers/cup/vial) || ispath(selected_container, /obj/item/reagent_containers/syringe/smartdart)) + item_name_default = "[master_reagent.name] [item_name_default]" + // SKYRAT EDIT ADDITION END var/item_name = tgui_input_text(usr, "Container name", "Name", From 13a2c03764276d6db1f5a00c5dc9b2853e16547d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 00:21:21 +0200 Subject: [PATCH 062/107] Automatic changelog for PR #27564 [ci skip] --- html/changelogs/AutoChangeLog-pr-27564.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27564.yml diff --git a/html/changelogs/AutoChangeLog-pr-27564.yml b/html/changelogs/AutoChangeLog-pr-27564.yml new file mode 100644 index 00000000000..4787b05da95 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27564.yml @@ -0,0 +1,4 @@ +author: "SpaceLoveSs13" +delete-after: True +changes: + - rscadd: "Fragile now has customization for damage from 1.2x to 5x modifier." \ No newline at end of file From e629da0fab7736c5ed5da7e3938f81d3333a2f3e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 00:22:32 +0200 Subject: [PATCH 063/107] Automatic changelog for PR #27566 [ci skip] --- html/changelogs/AutoChangeLog-pr-27566.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27566.yml diff --git a/html/changelogs/AutoChangeLog-pr-27566.yml b/html/changelogs/AutoChangeLog-pr-27566.yml new file mode 100644 index 00000000000..8ee216f39d7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27566.yml @@ -0,0 +1,4 @@ +author: "Majkl-J" +delete-after: True +changes: + - bugfix: "Synth computers no longer force open the messenger app" \ No newline at end of file From 0b41c89ba5ace67efd6786f263a77d3a92e6eb8f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 01:14:49 +0200 Subject: [PATCH 064/107] Automatic changelog for PR #27565 [ci skip] --- html/changelogs/AutoChangeLog-pr-27565.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27565.yml diff --git a/html/changelogs/AutoChangeLog-pr-27565.yml b/html/changelogs/AutoChangeLog-pr-27565.yml new file mode 100644 index 00000000000..30e77d04423 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27565.yml @@ -0,0 +1,4 @@ +author: "SpaceLoveSs13" +delete-after: True +changes: + - bugfix: "Interlink Arrivals shuttles have tiny fans for air support!" \ No newline at end of file From e7c4d103f503f956f293df6c36382dbd9e195d9d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 01:55:26 +0200 Subject: [PATCH 065/107] Automatic changelog for PR #27567 [ci skip] --- html/changelogs/AutoChangeLog-pr-27567.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27567.yml diff --git a/html/changelogs/AutoChangeLog-pr-27567.yml b/html/changelogs/AutoChangeLog-pr-27567.yml new file mode 100644 index 00000000000..c5c02ffc98a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27567.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - image: "added directional sprites for radiation shutters" \ No newline at end of file From 46e96cd8c3ab0fb8653498b372ee29e8ca79504f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 01:56:37 +0200 Subject: [PATCH 066/107] Automatic changelog for PR #27568 [ci skip] --- html/changelogs/AutoChangeLog-pr-27568.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27568.yml diff --git a/html/changelogs/AutoChangeLog-pr-27568.yml b/html/changelogs/AutoChangeLog-pr-27568.yml new file mode 100644 index 00000000000..9f83d3995fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27568.yml @@ -0,0 +1,4 @@ +author: "Majkl-J" +delete-after: True +changes: + - qol: "Health analyzers now include basic information on treatment of husked bodies." \ No newline at end of file From ecf552fa6074e1c71985636e4ea9dcc3631a55c6 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 01:57:28 +0200 Subject: [PATCH 067/107] Automatic changelog for PR #27569 [ci skip] --- html/changelogs/AutoChangeLog-pr-27569.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27569.yml diff --git a/html/changelogs/AutoChangeLog-pr-27569.yml b/html/changelogs/AutoChangeLog-pr-27569.yml new file mode 100644 index 00000000000..93633cf4694 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27569.yml @@ -0,0 +1,6 @@ +author: "SkyratBot" +delete-after: True +changes: + - qol: "conveyors now use left and right click controls" + - qol: "add screentips for conveyor switches" + - rscdel: "removes circuit conveyor circuit default trigger behavior in favor in favor of the three state triggers" \ No newline at end of file From b8e09ed21bb7e52168853cec90def632faec58e8 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 02:07:35 +0200 Subject: [PATCH 068/107] Automatic changelog for PR #27570 [ci skip] --- html/changelogs/AutoChangeLog-pr-27570.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27570.yml diff --git a/html/changelogs/AutoChangeLog-pr-27570.yml b/html/changelogs/AutoChangeLog-pr-27570.yml new file mode 100644 index 00000000000..3bd96b35676 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27570.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - rscadd: "increased the size of the pool that Machine Blessing draws from" + - balance: "weighted some of the implants that Machine Blessing can give" \ No newline at end of file From f1ba642e68096230900ed3b93fd4e31a2a15072d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 3 May 2024 00:36:39 +0000 Subject: [PATCH 069/107] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-27558.yml | 4 --- html/changelogs/AutoChangeLog-pr-27559.yml | 5 ---- html/changelogs/AutoChangeLog-pr-27560.yml | 7 ------ html/changelogs/AutoChangeLog-pr-27562.yml | 5 ---- html/changelogs/AutoChangeLog-pr-27563.yml | 4 --- html/changelogs/AutoChangeLog-pr-27564.yml | 4 --- html/changelogs/AutoChangeLog-pr-27565.yml | 4 --- html/changelogs/AutoChangeLog-pr-27566.yml | 4 --- html/changelogs/AutoChangeLog-pr-27567.yml | 4 --- html/changelogs/AutoChangeLog-pr-27568.yml | 4 --- html/changelogs/AutoChangeLog-pr-27569.yml | 6 ----- html/changelogs/AutoChangeLog-pr-27570.yml | 5 ---- html/changelogs/archive/2024-05.yml | 29 ++++++++++++++++++++++ 13 files changed, 29 insertions(+), 56 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-27558.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27559.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27560.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27562.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27563.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27564.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27565.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27566.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27567.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27568.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27569.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27570.yml diff --git a/html/changelogs/AutoChangeLog-pr-27558.yml b/html/changelogs/AutoChangeLog-pr-27558.yml deleted file mode 100644 index eecba8d4baf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27558.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - bugfix: "Jousting no longer bypasses pacifism" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27559.yml b/html/changelogs/AutoChangeLog-pr-27559.yml deleted file mode 100644 index c6f0f76fc6a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27559.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "the civilian bounty control terminal displays the payout of new bounty options again" - - qol: "the civilian bounty control terminal displays the description of new bounty options" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27560.yml b/html/changelogs/AutoChangeLog-pr-27560.yml deleted file mode 100644 index b19efb8134b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27560.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - admin: "Custom Single and Custom Multi votes are now combined into one vote" - - admin: "Admins can now end votes instantly, rather than cancelling them" - - admin: "Admins can now reset the vote cooldown" - - bugfix: "Vote cooldown actually applies now" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27562.yml b/html/changelogs/AutoChangeLog-pr-27562.yml deleted file mode 100644 index 0e020a01f71..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27562.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "fix runtime when no events were drafted to be picked from" - - config: "make events frequency configurable" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27563.yml b/html/changelogs/AutoChangeLog-pr-27563.yml deleted file mode 100644 index caa7dca7488..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27563.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - qol: "You can now quickly stamp papers with a right click" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27564.yml b/html/changelogs/AutoChangeLog-pr-27564.yml deleted file mode 100644 index 4787b05da95..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27564.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpaceLoveSs13" -delete-after: True -changes: - - rscadd: "Fragile now has customization for damage from 1.2x to 5x modifier." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27565.yml b/html/changelogs/AutoChangeLog-pr-27565.yml deleted file mode 100644 index 30e77d04423..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27565.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpaceLoveSs13" -delete-after: True -changes: - - bugfix: "Interlink Arrivals shuttles have tiny fans for air support!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27566.yml b/html/changelogs/AutoChangeLog-pr-27566.yml deleted file mode 100644 index 8ee216f39d7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27566.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Synth computers no longer force open the messenger app" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27567.yml b/html/changelogs/AutoChangeLog-pr-27567.yml deleted file mode 100644 index c5c02ffc98a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27567.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - image: "added directional sprites for radiation shutters" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27568.yml b/html/changelogs/AutoChangeLog-pr-27568.yml deleted file mode 100644 index 9f83d3995fc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27568.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - qol: "Health analyzers now include basic information on treatment of husked bodies." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27569.yml b/html/changelogs/AutoChangeLog-pr-27569.yml deleted file mode 100644 index 93633cf4694..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27569.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - qol: "conveyors now use left and right click controls" - - qol: "add screentips for conveyor switches" - - rscdel: "removes circuit conveyor circuit default trigger behavior in favor in favor of the three state triggers" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27570.yml b/html/changelogs/AutoChangeLog-pr-27570.yml deleted file mode 100644 index 3bd96b35676..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27570.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - rscadd: "increased the size of the pool that Machine Blessing draws from" - - balance: "weighted some of the implants that Machine Blessing can give" \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index bec139f50a5..f34acb64002 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -77,3 +77,32 @@ less energy than intended. - bugfix: Monkeys can no longer be knocked over by walking into a windoor on combat mode while they're behind it. +2024-05-03: + Majkl-J: + - qol: Health analyzers now include basic information on treatment of husked bodies. + - bugfix: Synth computers no longer force open the messenger app + Melbert: + - admin: Custom Single and Custom Multi votes are now combined into one vote + - admin: Admins can now end votes instantly, rather than cancelling them + - admin: Admins can now reset the vote cooldown + - bugfix: Vote cooldown actually applies now + SkyratBot: + - qol: You can now quickly stamp papers with a right click + - image: added directional sprites for radiation shutters + - bugfix: the civilian bounty control terminal displays the payout of new bounty + options again + - qol: the civilian bounty control terminal displays the description of new bounty + options + - qol: conveyors now use left and right click controls + - qol: add screentips for conveyor switches + - rscdel: removes circuit conveyor circuit default trigger behavior in favor in + favor of the three state triggers + - bugfix: fix runtime when no events were drafted to be picked from + - config: make events frequency configurable + - rscadd: increased the size of the pool that Machine Blessing draws from + - balance: weighted some of the implants that Machine Blessing can give + SpaceLoveSs13: + - rscadd: Fragile now has customization for damage from 1.2x to 5x modifier. + - bugfix: Interlink Arrivals shuttles have tiny fans for air support! + nikothedude: + - bugfix: Jousting no longer bypasses pacifism From d790195c073f5c8ca94e418334d3a96391065a1e Mon Sep 17 00:00:00 2001 From: Ikalpo Date: Thu, 2 May 2024 18:57:01 -0700 Subject: [PATCH 070/107] 13 year old singularity bug fixed (#83005) ## About The Pull Request Stage 2 singularities have the wrong step size, allowing them to eat the containment field if they happen to be right next to it. (For instance, if they are contained in a 3x3 or 4x4 field) 2 lines of code, and that's fixed. ## Why It's Good For The Game BEFORE https://github.com/tgstation/tgstation/assets/23534908/821f43f6-85ca-482b-a905-614f2b1c8359 AFTER https://github.com/tgstation/tgstation/assets/23534908/4580d23a-41f0-4485-8454-4e991aa38344 ## The Source This was introduced in a googlecode commit in 2011: https://github.com/tgstation/tgstation/blob/337be2c3bcc7a739ffc927ccce9d6aa2b43c114c/code/modules/power/singularity/singularity.dm#L269 No, mport2004, I *don't* think this is right. ## Changelog :cl: fix: Stage 2 singularities should no longer escape containment /:cl: --- code/datums/components/singularity.dm | 2 +- code/modules/power/singularity/singularity.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 56a6723f21f..14aaedff717 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -286,7 +286,7 @@ if (STAGE_ONE) steps = 1 if (STAGE_TWO) - steps = 3//Yes this is right + steps = 2 if (STAGE_THREE) steps = 3 if (STAGE_FOUR) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index d47d7536094..74b7bfdbcdc 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -340,7 +340,7 @@ if(STAGE_ONE) steps = 1 if(STAGE_TWO) - steps = 3//Yes this is right + steps = 2 if(STAGE_THREE) steps = 3 if(STAGE_FOUR) From 18d8ba4d3ec6707ff6de5b8b8771b011910aedca Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 2 May 2024 18:56:38 -0700 Subject: [PATCH 072/107] Bump supported client api version to 515 (#83011) --- .github/max_required_byond_client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/max_required_byond_client.txt b/.github/max_required_byond_client.txt index faf8058076a..bd10125cce9 100644 --- a/.github/max_required_byond_client.txt +++ b/.github/max_required_byond_client.txt @@ -5,4 +5,4 @@ # (Requiring clients update to connect to the game server is not something we like to spring on them with no notice, # especially for beta builds where the pager/updater won't let them update without additional configuration.) -514 +515 From 328326c42665f260e54fa370c60556e12e59c72d Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Thu, 2 May 2024 21:02:30 -0500 Subject: [PATCH 074/107] Fix warning on master (#83014) ## Changelog :cl: Melbert fix: New machine god blessings now actually works probably /:cl: --- code/modules/religion/rites.dm | 55 ++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index fa7d31c3249..d7d0fa81844 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -128,33 +128,36 @@ /datum/religion_rites/machine_blessing/invoke_effect(mob/living/user, atom/movable/religious_tool) ..() var/altar_turf = get_turf(religious_tool) - var/arm = list( - /obj/item/organ/internal/cyberimp/arm/combat, - /obj/item/organ/internal/cyberimp/arm/surgery = 1000000, - /obj/item/organ/internal/cyberimp/arm/toolset = 1500000 - ) - var/eyes = list( - /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, - /obj/item/organ/internal/cyberimp/eyes/hud/medical, - /obj/item/organ/internal/eyes/robotic/shield = 2, - /obj/item/organ/internal/eyes/robotic/glow - ) - var/chest = list( - /obj/item/organ/internal/cyberimp/chest/reviver, - /obj/item/organ/internal/cyberimp/chest/thrusters = 2 - ) - var/head = list( - /obj/item/organ/internal/cyberimp/brain/anti_drop = 100, - /obj/item/organ/internal/cyberimp/brain/anti_stun = 10 - ) var/blessing = pick_weight_recursive( - list( - arm = 15, - eyes = 15, - chest = 9, - head = 10, - /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 5, - ) + list( + // Arms + list( + /obj/item/organ/internal/cyberimp/arm/combat = 1, + /obj/item/organ/internal/cyberimp/arm/surgery = 1000000, + /obj/item/organ/internal/cyberimp/arm/toolset = 1500000, + ) = 15, + // Eyes + list( + /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic = 1, + /obj/item/organ/internal/cyberimp/eyes/hud/medical = 1, + /obj/item/organ/internal/eyes/robotic/glow = 1, + /obj/item/organ/internal/eyes/robotic/shield = 2, + ) = 15, + // Chest + list( + /obj/item/organ/internal/cyberimp/chest/reviver = 1, + /obj/item/organ/internal/cyberimp/chest/thrusters = 2, + ) = 9, + // Brain / Head + list( + /obj/item/organ/internal/cyberimp/brain/anti_drop = 100, + /obj/item/organ/internal/cyberimp/brain/anti_stun = 10, + ) = 10, + // Misc + list( + /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 1, + ) = 5, + ) ) new blessing(altar_turf) return TRUE From 7ae9d120f1f0b080e9139395bb1bd37ebb1ba27c Mon Sep 17 00:00:00 2001 From: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com> Date: Thu, 2 May 2024 22:03:41 -0400 Subject: [PATCH 076/107] Pacifists can no longer endlessly spam rocket launcher backblasts (#82992) ## About The Pull Request Fixes: #82990 Backblasts from a rocket launcher are often the last thing an untrained person thinks of when they fire a rocket launcher. I did not consider the moral stance of pacifists who nevertheless try to shoot rocket launchers when I implemented rocket launcher backblast, because currently pacifists trying to shoot a loaded rocket launcher can spam backblast as much as they want, even if they aren't able to actually shoot. This PR filters out pacifists before they trigger the backblast, to make sure only actual live shots deliver the hellpayload to their allies behind them. ## Why It's Good For The Game A magical reverse flamethrower with no ammo limit (because at no point is the rocket in the chamber actually expended when a pacifist fails to fire it) is bad. A weapon as destructive as that left solely in the hands of pacifists is even worse. ## Changelog :cl: Ryll/Shaps fix: Pacifists can no longer endlessly spam the backblast functionality of loaded rocket launchers that they cannot actually fire /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> --- code/datums/elements/backblast.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/datums/elements/backblast.dm b/code/datums/elements/backblast.dm index 8952afbfeaa..f5e73977159 100644 --- a/code/datums/elements/backblast.dm +++ b/code/datums/elements/backblast.dm @@ -38,6 +38,9 @@ /// For firing an actual backblast pellet /datum/element/backblast/proc/pew(obj/item/gun/weapon, mob/living/user, atom/target) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + return + var/turf/origin = get_turf(weapon) var/backblast_angle = get_angle(target, origin) explosion(weapon, devastation_range = dev_range, heavy_impact_range = heavy_range, light_impact_range = light_range, flame_range = flame_range, adminlog = FALSE, protect_epicenter = TRUE, explosion_direction = backblast_angle, explosion_arc = blast_angle) From 649f2f9eaa16e2bf4171e2a246c5b9cce19df619 Mon Sep 17 00:00:00 2001 From: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Date: Fri, 3 May 2024 05:03:19 +0300 Subject: [PATCH 078/107] fixes a few problems in ai targetting (#82998) ## About The Pull Request fixes #82964 , fixes #82866 ## Why It's Good For The Game fixes several problems with ai targetting. this pr resolves civil war that was brewing between several mobs. also fixes a major problem where mobs would only search for targets and not perform any other behaviors. also fixes a small problem where mobs would constantly stop and start while chasing targets ## Changelog :cl: fix: mobs in the same faction will no longer be at odds against one another fix: mobs can now perform behaviors alongside searching for targets fix: mobs will no longer be starting and stopping when chasing targets /:cl: --- code/datums/ai/_ai_controller.dm | 8 ++++++-- code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm | 3 ++- .../ai/basic_mobs/basic_subtrees/capricious_retaliate.dm | 1 + .../ai/basic_mobs/basic_subtrees/target_retaliate.dm | 5 +---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 309be508783..35615c6704c 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -172,9 +172,13 @@ multiple modular subtrees with behaviors return FALSE return TRUE -/datum/ai_controller/proc/recalculate_idle() +/datum/ai_controller/proc/recalculate_idle(datum/exited) if(ai_status == AI_STATUS_OFF) return + + if(exited && (get_dist(pawn, (islist(exited) ? exited[1] : exited)) <= interesting_dist)) //is our target in between interesting cells? + return + if(should_idle()) set_ai_status(AI_STATUS_IDLE) @@ -187,7 +191,7 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/on_client_exit(datum/source, datum/exited) SIGNAL_HANDLER - recalculate_idle() + recalculate_idle(exited) /// Sets the AI on or off based on current conditions, call to reset after you've manually disabled it somewhere /datum/ai_controller/proc/reset_ai_status() diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm index f0ee4bb9bba..4cf04039e85 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/ /datum/ai_behavior/find_potential_targets action_cooldown = 2 SECONDS + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION /// How far can we see stuff? var/vision_range = 9 /// Blackboard key for aggro range, uses vision range if not specified @@ -34,7 +35,7 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/ // If we're using a field rn, just don't do anything yeah? if(controller.blackboard[BB_FIND_TARGETS_FIELD(type)]) - return + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED var/list/potential_targets = hearers(aggro_range, get_turf(controller.pawn)) - living_mob //Remove self, so we don't suicide diff --git a/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm index a4fc49facc0..52b19036b9a 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm @@ -21,6 +21,7 @@ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED pawn.visible_message(span_notice("[pawn] calms down.")) // We can blackboard key this if anyone else actually wants to customise it controller.clear_blackboard_key(BB_BASIC_MOB_RETALIATE_LIST) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) controller.CancelActions() // Otherwise they will try and get one last kick in return AI_BEHAVIOR_DELAY diff --git a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm index d327b1047cf..042ccb2310c 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm @@ -11,7 +11,6 @@ var/check_faction = FALSE /datum/ai_planning_subtree/target_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - . = ..() controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targeting_strategy_key, hiding_place_key, check_faction) /datum/ai_planning_subtree/target_retaliate/check_faction @@ -35,7 +34,6 @@ var/vision_range = 9 /datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targeting_strategy_key, hiding_location_key, check_faction) - . = ..() var/mob/living/living_mob = controller.pawn var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) if(!targeting_strategy) @@ -58,7 +56,6 @@ enemies_list += potential_target if(!length(enemies_list)) - controller.clear_blackboard_key(target_key) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED var/atom/new_target = pick_final_target(controller, enemies_list) @@ -75,7 +72,7 @@ /datum/ai_behavior/target_from_retaliate_list/proc/pick_final_target(datum/ai_controller/controller, list/enemies_list) return pick(enemies_list) -/datum/ai_behavior/target_from_retaliate_list/finish_action(datum/ai_controller/controller, succeeded, check_faction) +/datum/ai_behavior/target_from_retaliate_list/finish_action(datum/ai_controller/controller, succeeded, shitlist_key, target_key, targeting_strategy_key, hiding_location_key, check_faction) . = ..() if (succeeded || check_faction) return From 438ccc1059566f7d904e2b732787b819c1081a48 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Thu, 2 May 2024 20:09:30 -0700 Subject: [PATCH 080/107] Detective buff: Fixes detective's candy dispenser (#83004) ## About The Pull Request Alt click was broken on detective's hat. Couldn't draw candy corn, oh no! This issue is somewhat rightly caused from the alt click refactor, as its aim was to prevent double interactions from one click. In this case, both withdrawing morsels and opening storage at the same time --- code/datums/storage/storage.dm | 18 ++++++++++++- code/datums/storage/subtypes/pockets.dm | 1 + code/modules/clothing/head/jobs.dm | 35 ++++++++++++++++++++----- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index b1bacfbceab..9b661688258 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -113,6 +113,10 @@ /// If TRUE, shows the contents of the storage in open_storage var/display_contents = TRUE + /// Switch this off if you want to handle click_alt in the parent atom + var/click_alt_open = TRUE + + /datum/storage/New( atom/parent, max_slots = src.max_slots, @@ -198,7 +202,7 @@ RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(on_preattack)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(mass_empty)) - RegisterSignals(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_ATTACK_HAND_SECONDARY), PROC_REF(open_storage_on_signal)) + RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_ATTACK_HAND_SECONDARY), PROC_REF(open_storage_on_signal)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(open_storage_attackby_secondary)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(close_distance)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(update_actions)) @@ -208,6 +212,7 @@ RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_deconstruct)) RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) RegisterSignal(parent, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, PROC_REF(contents_changed_w_class)) + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt)) /** * Sets where items are physically being stored in the case it shouldn't be on the parent. @@ -919,6 +924,17 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(display_contents) return COMPONENT_NO_AFTERATTACK + +/// Alt click on the storage item. Default: Open the storage. +/datum/storage/proc/on_click_alt(datum/source, mob/user) + SIGNAL_HANDLER + + if(!click_alt_open) + return + + return open_storage_on_signal(source, user) + + /// Opens the storage to the mob, showing them the contents to their UI. /datum/storage/proc/open_storage(mob/to_show) if(isobserver(to_show)) diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index 67a8b2dda78..2b100d5d323 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -45,6 +45,7 @@ /datum/storage/pockets/small/fedora/detective attack_hand_interact = TRUE // so the detectives would discover pockets in their hats + click_alt_open = FALSE /datum/storage/pockets/chefhat attack_hand_interact = TRUE diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 4f5d377ddac..e0b06a5ab6e 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -166,6 +166,8 @@ desc = "An opulent hat that functions as a radio to God. Or as a lightning rod, depending on who you ask." icon_state = "bishopmitre" +#define CANDY_CD_TIME 2 MINUTES + //Detective /obj/item/clothing/head/fedora/det_hat name = "detective's fedora" @@ -174,11 +176,12 @@ icon_state = "detective" inhand_icon_state = "det_hat" interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING - /// Cooldown for retrieving precious candy corn on alt click - var/candy_cooldown = 0 dog_fashion = /datum/dog_fashion/head/detective - ///Path for the flask that spawns inside their hat roundstart + /// Path for the flask that spawns inside their hat roundstart var/flask_path = /obj/item/reagent_containers/cup/glass/flask/det + /// Cooldown for retrieving precious candy corn with rmb + COOLDOWN_DECLARE(candy_cooldown) + /datum/armor/fedora_det_hat melee = 25 @@ -189,28 +192,46 @@ acid = 50 wound = 5 + /obj/item/clothing/head/fedora/det_hat/Initialize(mapload) . = ..() create_storage(storage_type = /datum/storage/pockets/small/fedora/detective) + register_context() + new flask_path(src) + /obj/item/clothing/head/fedora/det_hat/examine(mob/user) . = ..() . += span_notice("Alt-click to take a candy corn.") + +/obj/item/clothing/head/fedora/det_hat/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + context[SCREENTIP_CONTEXT_ALT_LMB] = "Candy Time" + + return CONTEXTUAL_SCREENTIP_SET + + +/// Now to solve where all these keep coming from /obj/item/clothing/head/fedora/det_hat/click_alt(mob/user) - if(candy_cooldown >= world.time) + if(!COOLDOWN_FINISHED(src, candy_cooldown)) to_chat(user, span_warning("You just took a candy corn! You should wait a couple minutes, lest you burn through your stash.")) return CLICK_ACTION_BLOCKING - var/obj/item/food/candy_corn/CC = new /obj/item/food/candy_corn(src) - user.put_in_hands(CC) + var/obj/item/food/candy_corn/sweets = new /obj/item/food/candy_corn(src) + user.put_in_hands(sweets) to_chat(user, span_notice("You slip a candy corn from your hat.")) - candy_cooldown = world.time+1200 + COOLDOWN_START(src, candy_cooldown, CANDY_CD_TIME) + return CLICK_ACTION_SUCCESS + +#undef CANDY_CD_TIME + /obj/item/clothing/head/fedora/det_hat/minor flask_path = /obj/item/reagent_containers/cup/glass/flask/det/minor From a512644e8ba68cf4661ad73ef611edc0b1d09cba Mon Sep 17 00:00:00 2001 From: mogeoko <109075486+mogeoko@users.noreply.github.com> Date: Fri, 3 May 2024 06:05:41 +0200 Subject: [PATCH 082/107] [NO GBP] Multiz deck revert (#82996) ## About The Pull Request I've probably did unnecessary things in my old PR and it made a little problem for larvas. Now I revert my mistakes so they can feel great again. Partially reverts #81452, fixes https://github.com/tgstation/tgstation/pull/82996 ## Why It's Good For The Game Larvas can change Z levels using multiz-deck again. Is good or at least I hope so. ## Changelog :cl: mogeoko fix: Ventcrawling mobs can change Z-level using multiz-decks again. /:cl: --- code/modules/atmospherics/machinery/atmosmachinery.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index d152cf09e71..fa8b8332345 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -301,8 +301,8 @@ * * given_layer - the piping_layer we are checking */ /obj/machinery/atmospherics/proc/connection_check(obj/machinery/atmospherics/target, given_layer) - //check if the target & src connect in the same direction - if(!((initialize_directions & get_dir(src, target)) && (target.initialize_directions & get_dir(target, src)))) + //if target is not multiz then we have to check if the target & src connect in the same direction + if(!istype(target, /obj/machinery/atmospherics/pipe/multiz) && !((initialize_directions & get_dir(src, target)) && (target.initialize_directions & get_dir(target, src)))) return FALSE //both target & src can't be connected either way From d6fab55a3513c93a9d72b974e660506f17729224 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Fri, 3 May 2024 13:23:52 +0200 Subject: [PATCH 084/107] Adds a station trait that brightens up IceBox's surface. (#82945) ## About The Pull Request This PR adds a positive trait that brings lights to the outdoors surface areas of Icebox. ## Why It's Good For The Game Building upon the features of the station traits. This is how it'd look: ![It's Always Sunny On IceBoxStation](https://github.com/tgstation/tgstation/assets/42542238/af4238e9-c731-41c9-9eaf-8fcb04d6fe4f) ## Changelog :cl: add: Adds an Icebox-specific station trait that brightens outdoors areas on the surface level. /:cl: --- code/__DEFINES/traits/declarations.dm | 1 + code/_globalvars/traits/_traits.dm | 1 + code/datums/station_traits/positive_traits.dm | 9 +++++++++ code/game/area/areas/mining.dm | 5 +++++ 4 files changed, 16 insertions(+) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index f2cb9069fb6..a3218bd5db7 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -950,6 +950,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods" #define STATION_TRAIT_BIRTHDAY "station_trait_birthday" #define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch" +#define STATION_TRAIT_BRIGHT_DAY "station_trait_bright_day" #define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation" #define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution" #define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 9e3c2ed7ee0..ffb9d95f918 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -80,6 +80,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "STATION_TRAIT_BIGGER_PODS" = STATION_TRAIT_BIGGER_PODS, "STATION_TRAIT_BIRTHDAY" = STATION_TRAIT_BIRTHDAY, "STATION_TRAIT_BOTS_GLITCHED" = STATION_TRAIT_BOTS_GLITCHED, + "STATION_TRAIT_BRIGHT_DAY" = STATION_TRAIT_BRIGHT_DAY, "STATION_TRAIT_CARP_INFESTATION" = STATION_TRAIT_CARP_INFESTATION, "STATION_TRAIT_CYBERNETIC_REVOLUTION" = STATION_TRAIT_CYBERNETIC_REVOLUTION, "STATION_TRAIT_EMPTY_MAINT" = STATION_TRAIT_EMPTY_MAINT, diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index cc2c49f1b86..22d5fb04339 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -304,6 +304,15 @@ weight_multiplier = 3 max_occurrences_modifier = 10 //lotta cows +/datum/station_trait/bright_day + name = "Bright Day" + report_message = "The stars shine bright and the clouds are scarcer than usual. It's a bright day here on the Ice Moon's surface." + trait_type = STATION_TRAIT_POSITIVE + weight = 5 + show_in_report = TRUE + trait_flags = STATION_TRAIT_PLANETARY + trait_to_give = STATION_TRAIT_BRIGHT_DAY + /datum/station_trait/shuttle_sale name = "Shuttle Firesale" report_message = "The Nanotrasen Emergency Dispatch team is celebrating a record number of shuttle calls in the recent quarter. Some of your emergency shuttle options have been discounted!" diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 1582f7390cf..38855de366f 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -209,6 +209,11 @@ name = "Icemoon Wastes" outdoors = TRUE +/area/icemoon/surface/outdoors/Initialize(mapload) + if(HAS_TRAIT(SSstation, STATION_TRAIT_BRIGHT_DAY)) + base_lighting_alpha = 145 + return ..() + /area/icemoon/surface/outdoors/nospawn // this is the area you use for stuff to not spawn, but if you still want weather. /area/icemoon/surface/outdoors/nospawn/New() // unless you roll forested trait lol From 158cc3037b90300aeb374dc9c4f39a3841c59cb8 Mon Sep 17 00:00:00 2001 From: cnleth <113535457+cnleth@users.noreply.github.com> Date: Fri, 3 May 2024 14:32:27 +0300 Subject: [PATCH 086/107] Fire ant colonies created by burning actually contain fire ants (#83002) ## About The Pull Request Fire ant colonies created by burning regular ants now give you fire ants when scooped up There were 2 lines of code clearing the ants' reagent when they're burned. They're not needed because ants use `decal_reagent` Tested and it works without these 2 lines ![fireants](https://github.com/tgstation/tgstation/assets/113535457/aee4ec28-a767-4dfe-b870-2a222848ae3a) ## Why It's Good For The Game Fixes #82864 ## Changelog :cl: fix: Fire ant colonies created by burning regular ants will now contain fire ants as their reagent /:cl: --- code/game/objects/effects/decals/cleanable/misc.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index f21bfc47884..0af1e402ee1 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -412,9 +412,7 @@ . += emissive_appearance(icon, "[icon_state]_light", src, alpha = src.alpha) /obj/effect/decal/cleanable/ants/fire_act(exposed_temperature, exposed_volume) - var/obj/effect/decal/cleanable/ants/fire/fire_ants = new(loc) - fire_ants.reagents.clear_reagents() - reagents.trans_to(fire_ants, fire_ants.reagents.maximum_volume) + new /obj/effect/decal/cleanable/ants/fire(loc) qdel(src) /obj/effect/decal/cleanable/ants/fire From 398a347eca13e75e19ab5bbc62e7823416429b69 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 15:21:04 +0200 Subject: [PATCH 088/107] Automatic changelog for PR #27574 [ci skip] --- html/changelogs/AutoChangeLog-pr-27574.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27574.yml diff --git a/html/changelogs/AutoChangeLog-pr-27574.yml b/html/changelogs/AutoChangeLog-pr-27574.yml new file mode 100644 index 00000000000..ebd44714a49 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27574.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "New machine god blessings now actually works probably" \ No newline at end of file From 0af6e97d3d2462cae79af84dfa0c774438a1184c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 15:28:53 +0200 Subject: [PATCH 089/107] Automatic changelog for PR #27572 [ci skip] --- html/changelogs/AutoChangeLog-pr-27572.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27572.yml diff --git a/html/changelogs/AutoChangeLog-pr-27572.yml b/html/changelogs/AutoChangeLog-pr-27572.yml new file mode 100644 index 00000000000..809d34999d6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27572.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Stage 2 singularities should no longer escape containment" \ No newline at end of file From 1ab990027f6ab0d5f39898b49642206601ade883 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 15:30:08 +0200 Subject: [PATCH 090/107] Automatic changelog for PR #27575 [ci skip] --- html/changelogs/AutoChangeLog-pr-27575.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27575.yml diff --git a/html/changelogs/AutoChangeLog-pr-27575.yml b/html/changelogs/AutoChangeLog-pr-27575.yml new file mode 100644 index 00000000000..eb03652dc14 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27575.yml @@ -0,0 +1,4 @@ +author: "Ryll/Shaps" +delete-after: True +changes: + - bugfix: "Pacifists can no longer endlessly spam the backblast functionality of loaded rocket launchers that they cannot actually fire" \ No newline at end of file From f94f46f8e55b3e3e8fe529ecf7985abb10b5055f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 15:31:47 +0200 Subject: [PATCH 091/107] Automatic changelog for PR #27576 [ci skip] --- html/changelogs/AutoChangeLog-pr-27576.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27576.yml diff --git a/html/changelogs/AutoChangeLog-pr-27576.yml b/html/changelogs/AutoChangeLog-pr-27576.yml new file mode 100644 index 00000000000..02270043e27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27576.yml @@ -0,0 +1,6 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "mobs in the same faction will no longer be at odds against one another" + - bugfix: "mobs can now perform behaviors alongside searching for targets" + - bugfix: "mobs will no longer be starting and stopping when chasing targets" \ No newline at end of file From c56c0af37b3e399cc08d68dfbe66498bb5eaca53 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 15:32:30 +0200 Subject: [PATCH 092/107] Automatic changelog for PR #27577 [ci skip] --- html/changelogs/AutoChangeLog-pr-27577.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27577.yml diff --git a/html/changelogs/AutoChangeLog-pr-27577.yml b/html/changelogs/AutoChangeLog-pr-27577.yml new file mode 100644 index 00000000000..4c9ebb81c47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27577.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Candy corn is once again available to detective fedoras" \ No newline at end of file From 7d6b463165f66aae985c628dda002999e4e0ca04 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 16:12:49 +0200 Subject: [PATCH 093/107] Automatic changelog for PR #27578 [ci skip] --- html/changelogs/AutoChangeLog-pr-27578.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27578.yml diff --git a/html/changelogs/AutoChangeLog-pr-27578.yml b/html/changelogs/AutoChangeLog-pr-27578.yml new file mode 100644 index 00000000000..fada9ce1d19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27578.yml @@ -0,0 +1,4 @@ +author: "mogeoko" +delete-after: True +changes: + - bugfix: "Ventcrawling mobs can change Z-level using multiz-decks again." \ No newline at end of file From 2d15acfd902b6f1a6b211abecd70c28948971934 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 16:13:19 +0200 Subject: [PATCH 094/107] Automatic changelog for PR #27580 [ci skip] --- html/changelogs/AutoChangeLog-pr-27580.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27580.yml diff --git a/html/changelogs/AutoChangeLog-pr-27580.yml b/html/changelogs/AutoChangeLog-pr-27580.yml new file mode 100644 index 00000000000..eb453e1cfbe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27580.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - rscadd: "Adds an Icebox-specific station trait that brightens outdoors areas on the surface level." \ No newline at end of file From 913e088642ed5afb4e84b49ebaed9e7a6f789222 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 3 May 2024 16:13:46 +0200 Subject: [PATCH 095/107] Automatic changelog for PR #27581 [ci skip] --- html/changelogs/AutoChangeLog-pr-27581.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27581.yml diff --git a/html/changelogs/AutoChangeLog-pr-27581.yml b/html/changelogs/AutoChangeLog-pr-27581.yml new file mode 100644 index 00000000000..b88dd882793 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27581.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Fire ant colonies created by burning regular ants will now contain fire ants as their reagent" \ No newline at end of file From 4728ec0766db8c77727598442c5ecca3cbcab4d2 Mon Sep 17 00:00:00 2001 From: Profakos Date: Fri, 3 May 2024 22:10:10 +0200 Subject: [PATCH 096/107] Bepis techs can be found in bitrunning crates, removed from vendors (#82872) ## About The Pull Request This PR adds Bepis disks to the main rewards of the Bitrunning crate in addition to the minerals and domain specific rewards. It also removes it from the Bepis vending machine. Once per domain, if its difficult was Medium or higher, and the completion score was A or S, and if there are still any leftover locked Bepis tech nodes, a Bepis disk will spawn.
Original PR text If domain has a reward value greater than one, it has 10% chance per reward value to drop. No disk is gained if they ran out of techs to unlock. Most of the domains have a reward value of three, so by the law of great numbers they probably get one disk per every three domains run, which should be one disk every 20-30 minutes. At least, if I am correct that domain runs take about five to ten minutes, and the server cooldown is three minutes. If I am incorrect, I can edit the drop chance as needed, of course. Edit: As I have underestimated how fast Bitrunners can be, I have decreased the chance to be 5% per reward tier.
## Why It's Good For The Game - Bepis disks are expensive, and bitrunners need to spend almost all their NP on gear and abilities - Downloading secret research data, is flavourful, fitting for invading the forgotten nooks of cyberspace. - This will allow Bepis tech to be actually used in rounds ## Changelog :cl: balance: Bitrunners can now earn Bepis disks, once per medium domain or above, if they scored at least an A. del: Bitrunners can not buy Bepis disks from their vendors. /:cl: --- code/modules/bitrunning/orders/bepis.dm | 4 -- code/modules/bitrunning/server/loot.dm | 54 ++++++++++++++----- .../virtual_domain/virtual_domain.dm | 2 + 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/code/modules/bitrunning/orders/bepis.dm b/code/modules/bitrunning/orders/bepis.dm index 286e9817f3c..4b7253bdaf2 100644 --- a/code/modules/bitrunning/orders/bepis.dm +++ b/code/modules/bitrunning/orders/bepis.dm @@ -17,7 +17,3 @@ /datum/orderable_item/bepis/sprayoncan item_path = /obj/item/toy/sprayoncan cost_per_order = 750 - -/datum/orderable_item/bepis/pristine - item_path = /obj/item/disk/design_disk/bepis/remove_tech - cost_per_order = 1000 diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index cb4902abfe3..aa7b99d6e92 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -1,3 +1,9 @@ +#define GRADE_D "D" +#define GRADE_C "C" +#define GRADE_B "B" +#define GRADE_A "A" +#define GRADE_S "S" + /// Handles calculating rewards based on number of players, parts, threats, etc /obj/machinery/quantum_server/proc/calculate_rewards() var/rewards_base = 0.8 @@ -28,8 +34,11 @@ var/bonus = calculate_rewards() + var/time_difference = world.time - generated_domain.start_time + var/grade = grade_completion(time_difference) + var/obj/item/paper/certificate = new() - certificate.add_raw_text(get_completion_certificate()) + certificate.add_raw_text(get_completion_certificate(time_difference, grade)) certificate.name = "certificate of domain completion" certificate.update_appearance() @@ -37,6 +46,10 @@ reward_cache.manifest = certificate reward_cache.update_appearance() + if(can_generate_tech_disk(grade)) + new /obj/item/disk/design_disk/bepis/remove_tech(reward_cache) + generated_domain.disk_reward_spawned = TRUE + chosen_forge.start_to_spawn(reward_cache) return TRUE @@ -50,7 +63,7 @@ return TRUE /// Returns the markdown text containing domain completion information -/obj/machinery/quantum_server/proc/get_completion_certificate() +/obj/machinery/quantum_server/proc/get_completion_certificate(time_difference, grade) var/base_points = generated_domain.reward_points if(domain_randomized) base_points -= 1 @@ -59,11 +72,9 @@ var/domain_threats = length(spawned_threat_refs) - var/time_difference = world.time - generated_domain.start_time - var/completion_time = "### Completion Time: [DisplayTimeText(time_difference)]\n" - var/grade = "\n---\n\n# Rating: [grade_completion(time_difference)]" + var/completion_grade = "\n---\n\n# Rating: [grade]" var/text = "# Certificate of Domain Completion\n\n---\n\n" @@ -75,7 +86,7 @@ if(bonuses <= 1) text += completion_time - text += grade + text += completion_grade return text text += "### Bonuses\n" @@ -94,10 +105,24 @@ text += "- **Components:** + [servo_rating]\n" text += completion_time - text += grade + text += completion_grade return text +/// Checks if the players should get a bepis reward +/obj/machinery/quantum_server/proc/can_generate_tech_disk(grade) + if(generated_domain.disk_reward_spawned) + return FALSE + + if(!LAZYLEN(SSresearch.techweb_nodes_experimental)) + return FALSE + + var/static/list/passing_grades = list() + if(!passing_grades.len) + passing_grades = list(GRADE_A,GRADE_S) + + return generated_domain.difficulty >= BITRUNNER_DIFFICULTY_MEDIUM && (grade in passing_grades) + /// Grades the player's run based on several factors /obj/machinery/quantum_server/proc/grade_completion(completion_time) var/score = length(spawned_threat_refs) * 5 @@ -124,13 +149,18 @@ switch(score) if(1 to 4) - return "D" + return GRADE_D if(5 to 7) - return "C" + return GRADE_C if(8 to 10) - return "B" + return GRADE_B if(11 to 13) - return "A" + return GRADE_A else - return "S" + return GRADE_S +#undef GRADE_D +#undef GRADE_C +#undef GRADE_B +#undef GRADE_A +#undef GRADE_S diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index b316bb97cae..21898daad72 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -44,6 +44,8 @@ var/start_time /// This map is specifically for unit tests. Shouldn't display in game var/test_only = FALSE + /// Has this domain been beaten with high enough score to spawn a tech disk? + var/disk_reward_spawned = FALSE /// Sends a point to any loot signals on the map /datum/lazy_template/virtual_domain/proc/add_points(points_to_add) From ca869e5d4f3f40114a60a3d746f1e3c5560656a5 Mon Sep 17 00:00:00 2001 From: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Date: Fri, 3 May 2024 20:15:35 +0000 Subject: [PATCH 098/107] Fixes lua breaking when registering signals on turfs (#83018) ## About The Pull Request Signals don't get removed on turfs when they're deleted. This fixes that so that it is reflected in lua as well. ## Why It's Good For The Game Lua bugfixes ## Changelog :cl: fix: Fixed lua scripts breaking when turfs with registered signals get deleted. /:cl: --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> --- lua/SS13_base.lua | 8 +++++++- lua/handler_group.lua | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lua/SS13_base.lua b/lua/SS13_base.lua index f49908f0942..ea04c8c6503 100644 --- a/lua/SS13_base.lua +++ b/lua/SS13_base.lua @@ -100,7 +100,8 @@ function SS13.register_signal(datum, signal, func) callback:call_proc("RegisterSignal", datum, signal, "Invoke") local path = { "__SS13_signal_handlers", datumWeakRef, signal, callbackWeakRef, "func" } callback.vars.arguments = { path } - if not __SS13_signal_handlers[datumWeakRef]._cleanup then + -- Turfs don't remove their signals on deletion. + if not __SS13_signal_handlers[datumWeakRef]._cleanup and not SS13.istype(datum, "/turf") then local cleanupCallback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") local cleanupPath = { "__SS13_signal_handlers", datumWeakRef, "_cleanup"} cleanupCallback.vars.arguments = { cleanupPath } @@ -134,6 +135,11 @@ function SS13.unregister_signal(datum, signal, callback) local callbackWeakRef = dm.global_proc("WEAKREF", handler_callback) if not SS13.istype(datum, "/datum/weakref") then handler_callback:call_proc("UnregisterSignal", datum, signal) + else + local actualDatum = datum:call_proc("hard_resolve") + if SS13.is_valid(actualDatum) then + handler_callback:call_proc("UnregisterSignal", actualDatum, signal) + end end SS13.stop_tracking(handler_callback) end diff --git a/lua/handler_group.lua b/lua/handler_group.lua index fff63ad18e4..0246d33c744 100644 --- a/lua/handler_group.lua +++ b/lua/handler_group.lua @@ -14,7 +14,7 @@ function HandlerGroup:register_signal(datum, signal, func) if not callback then return end - table.insert(self.registered, { datum = datum, signal = signal, callback = callback }) + table.insert(self.registered, { datum = dm.global_proc("WEAKREF", datum), signal = signal, callback = callback }) end -- Clears all the signals that have been registered on this HandlerGroup From 509d420d329a6668f268f1a42b1830c38b5733f9 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Fri, 3 May 2024 17:12:26 -0700 Subject: [PATCH 100/107] Adds debug dna disk to runtimestation (#83013) ## About The Pull Request Title || Puts it next to the dna scanner ## Why It's Good For The Game Easier debugging genetics / dna ui --- _maps/map_files/debug/runtimestation.dmm | 250 ++++++++++++----------- 1 file changed, 127 insertions(+), 123 deletions(-) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 38463d849ea..b36684a2dab 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -668,23 +668,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/medical/medbay) -"cK" = ( -/obj/machinery/light/directional/south, -/obj/structure/table/glass, -/obj/item/disk/surgery/debug, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 1 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner, -/area/station/medical/medbay) "cL" = ( /obj/item/surgery_tray/full/advanced, /obj/structure/table/glass, @@ -1751,16 +1734,19 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/plating, /area/station/engineering/atmos) +"hv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/storage/part_replacer/bluespace/tier4, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "hD" = ( /obj/structure/closet/secure_closet/chemical/heisenberg{ locked = 0 }, /turf/open/floor/iron, /area/station/medical/chemistry) -"ib" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/bitrunning/den) "ii" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1819,13 +1805,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"lE" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/machinery/computer/quantum_console, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) "lH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 @@ -1849,11 +1828,6 @@ /obj/machinery/chem_mass_spec, /turf/open/floor/iron, /area/station/medical/chemistry) -"mV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) "nn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -1871,6 +1845,12 @@ /obj/item/storage/toolbox/syndicate, /turf/open/floor/iron, /area/station/commons/storage/primary) +"nI" = ( +/obj/machinery/door/airlock, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "od" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1899,9 +1879,6 @@ /obj/machinery/door/airlock/external/glass/ruin, /turf/open/floor/plating, /area/station/medical/medbay) -"pK" = ( -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) "qb" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, @@ -1932,23 +1909,34 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"rM" = ( -/obj/machinery/quantum_server, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) -"rS" = ( +"rT" = ( /turf/open/floor/circuit/green, /area/station/cargo/bitrunning/den) "sr" = ( /obj/machinery/door/airlock/shell, /turf/open/floor/iron/dark, /area/station/construction) -"sH" = ( -/obj/structure/table, -/obj/item/storage/box/shipping, -/obj/item/boulder_beacon, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +"tz" = ( +/obj/machinery/light/directional/south, +/obj/structure/table/glass, +/obj/item/disk/surgery/debug, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/disk/data/debug{ + pixel_y = 9; + pixel_x = 7 + }, +/turf/open/floor/iron/white/corner, +/area/station/medical/medbay) "tE" = ( /obj/machinery/door/airlock/research, /turf/open/floor/iron/dark, @@ -2006,6 +1994,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/explab) +"vb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "vm" = ( /mob/living/circuit_drone, /turf/open/floor/iron/dark, @@ -2079,16 +2072,16 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/science) +"Aj" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "AP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, /turf/open/floor/iron, /area/station/science) -"Ba" = ( -/obj/machinery/netpod, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) "BD" = ( /obj/structure/closet/secure_closet/chief_medical{ locked = 0 @@ -2109,10 +2102,6 @@ /obj/structure/closet/syndicate/resources/everything, /turf/open/floor/iron, /area/station/science) -"Cz" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) "CQ" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -2230,6 +2219,13 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"IF" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/airalarm/directional/east, +/obj/machinery/computer/quantum_console, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "IH" = ( /obj/structure/closet/secure_closet/engineering_welding{ locked = 0 @@ -2263,13 +2259,6 @@ /obj/effect/mapping_helpers/airalarm/unlocked, /turf/open/floor/iron, /area/station/hallway/primary/central) -"Kf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/item/storage/part_replacer/bluespace/tier4, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) "Kx" = ( /obj/structure/table, /obj/item/analyzer, @@ -2277,15 +2266,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/plating, /area/station/engineering/atmos) -"Lb" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/obj/item/bitrunning_debug, -/turf/open/floor/iron, -/area/station/cargo/bitrunning/den) -"Le" = ( -/turf/closed/wall/r_wall, -/area/station/cargo/bitrunning/den) "Ly" = ( /obj/machinery/chem_dispenser/chem_synthesizer, /turf/open/floor/iron/dark, @@ -2298,6 +2278,10 @@ /obj/machinery/door/airlock/research, /turf/open/floor/iron/dark, /area/station/science/explab) +"LS" = ( +/obj/machinery/quantum_server, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "LW" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -2329,10 +2313,6 @@ /obj/machinery/chem_recipe_debug, /turf/open/floor/iron, /area/station/medical/chemistry) -"Nj" = ( -/obj/machinery/byteforge, -/turf/open/floor/circuit/green, -/area/station/cargo/bitrunning/den) "Ns" = ( /obj/machinery/door/airlock/public/glass, /obj/structure/cable, @@ -2404,11 +2384,9 @@ }, /turf/open/floor/engine, /area/station/cargo/miningoffice) -"QU" = ( -/obj/machinery/door/airlock, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron, +"QY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/station/cargo/bitrunning/den) "Rb" = ( /obj/effect/spawner/structure/window/reinforced, @@ -2420,6 +2398,10 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"Rp" = ( +/obj/machinery/byteforge, +/turf/open/floor/circuit/green, +/area/station/cargo/bitrunning/den) "RM" = ( /obj/structure/closet/secure_closet/hop{ locked = 0 @@ -2442,6 +2424,12 @@ }, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) +"SC" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/south, +/obj/item/bitrunning_debug, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "Td" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -2456,11 +2444,18 @@ "Tt" = ( /turf/open/floor/plating, /area/station/maintenance/aft) +"TR" = ( +/obj/machinery/netpod, +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "TV" = ( /obj/machinery/door/airlock, /obj/structure/cable, /turf/open/floor/iron, /area/station/construction) +"Ue" = ( +/turf/closed/wall/r_wall, +/area/station/cargo/bitrunning/den) "Ut" = ( /obj/structure/closet/secure_closet/medical3{ locked = 0 @@ -2468,6 +2463,16 @@ /obj/item/healthanalyzer/advanced, /turf/open/floor/iron, /area/station/medical/medbay) +"Va" = ( +/obj/machinery/power/smes/full, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/unlocked, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "Vg" = ( /obj/machinery/light/directional/south, /obj/structure/cable, @@ -2512,16 +2517,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"Wy" = ( -/obj/machinery/power/smes/full, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/unlocked, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "WK" = ( /obj/structure/money_bot, /turf/open/floor/iron/dark, @@ -2581,6 +2576,9 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/commons/storage/primary) +"Yd" = ( +/turf/open/floor/iron, +/area/station/cargo/bitrunning/den) "Ym" = ( /obj/structure/table, /obj/item/storage/toolbox/electrical, @@ -2623,6 +2621,12 @@ /obj/machinery/suit_storage_unit/ce, /turf/open/floor/iron, /area/station/engineering/atmos) +"ZK" = ( +/obj/structure/table, +/obj/item/storage/box/shipping, +/obj/item/boulder_beacon, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "ZP" = ( /turf/open/floor/iron/dark, /area/station/science/explab) @@ -3200,12 +3204,12 @@ aa aa aa aa -Le -Le -Le -Le -Le -Le +Ue +Ue +Ue +Ue +Ue +Ue aa aa aa @@ -3292,12 +3296,12 @@ aa aa aa aa -Le -rS -Nj -pK -Ba -Le +Ue +rT +Rp +Yd +TR +Ue aa aa aa @@ -3384,12 +3388,12 @@ aa aa aa aa -Le -rM -pK -Kf -Ba -Le +Ue +LS +Yd +hv +TR +Ue aa aa aa @@ -3476,12 +3480,12 @@ aa aa aa aa -Le -lE -Cz -mV -Lb -Le +Ue +IF +Aj +vb +SC +Ue aa aa aa @@ -3568,12 +3572,12 @@ em em em em -Le -Le -Le -QU -ib -Le +Ue +Ue +Ue +nI +QY +Ue Tj Tj Tj @@ -7611,7 +7615,7 @@ aa ad af ak -Wy +Va aG aV bg @@ -7820,7 +7824,7 @@ dJ dJ dJ dJ -sH +ZK cS fP fO @@ -8267,7 +8271,7 @@ is cy Ut cm -cK +tz by dB dx From e55f4ba97ccc9ad9c92d5a11b0aea7c7c7f2fd9c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 4 May 2024 00:34:02 +0000 Subject: [PATCH 102/107] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-27572.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27574.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27575.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27576.yml | 6 ------ html/changelogs/AutoChangeLog-pr-27577.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27578.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27580.yml | 4 ---- html/changelogs/AutoChangeLog-pr-27581.yml | 4 ---- html/changelogs/archive/2024-05.yml | 18 ++++++++++++++++++ 9 files changed, 18 insertions(+), 34 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-27572.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27574.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27575.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27576.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27577.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27578.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27580.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-27581.yml diff --git a/html/changelogs/AutoChangeLog-pr-27572.yml b/html/changelogs/AutoChangeLog-pr-27572.yml deleted file mode 100644 index 809d34999d6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27572.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Stage 2 singularities should no longer escape containment" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27574.yml b/html/changelogs/AutoChangeLog-pr-27574.yml deleted file mode 100644 index ebd44714a49..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27574.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "New machine god blessings now actually works probably" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27575.yml b/html/changelogs/AutoChangeLog-pr-27575.yml deleted file mode 100644 index eb03652dc14..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27575.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ryll/Shaps" -delete-after: True -changes: - - bugfix: "Pacifists can no longer endlessly spam the backblast functionality of loaded rocket launchers that they cannot actually fire" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27576.yml b/html/changelogs/AutoChangeLog-pr-27576.yml deleted file mode 100644 index 02270043e27..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27576.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "mobs in the same faction will no longer be at odds against one another" - - bugfix: "mobs can now perform behaviors alongside searching for targets" - - bugfix: "mobs will no longer be starting and stopping when chasing targets" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27577.yml b/html/changelogs/AutoChangeLog-pr-27577.yml deleted file mode 100644 index 4c9ebb81c47..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27577.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Candy corn is once again available to detective fedoras" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27578.yml b/html/changelogs/AutoChangeLog-pr-27578.yml deleted file mode 100644 index fada9ce1d19..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27578.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mogeoko" -delete-after: True -changes: - - bugfix: "Ventcrawling mobs can change Z-level using multiz-decks again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27580.yml b/html/changelogs/AutoChangeLog-pr-27580.yml deleted file mode 100644 index eb453e1cfbe..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27580.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - rscadd: "Adds an Icebox-specific station trait that brightens outdoors areas on the surface level." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27581.yml b/html/changelogs/AutoChangeLog-pr-27581.yml deleted file mode 100644 index b88dd882793..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27581.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Fire ant colonies created by burning regular ants will now contain fire ants as their reagent" \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index f34acb64002..c974f37b27e 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -106,3 +106,21 @@ - bugfix: Interlink Arrivals shuttles have tiny fans for air support! nikothedude: - bugfix: Jousting no longer bypasses pacifism +2024-05-04: + Melbert: + - bugfix: New machine god blessings now actually works probably + Ryll/Shaps: + - bugfix: Pacifists can no longer endlessly spam the backblast functionality of + loaded rocket launchers that they cannot actually fire + SkyratBot: + - bugfix: mobs in the same faction will no longer be at odds against one another + - bugfix: mobs can now perform behaviors alongside searching for targets + - bugfix: mobs will no longer be starting and stopping when chasing targets + - bugfix: Candy corn is once again available to detective fedoras + - rscadd: Adds an Icebox-specific station trait that brightens outdoors areas on + the surface level. + - bugfix: Stage 2 singularities should no longer escape containment + - bugfix: Fire ant colonies created by burning regular ants will now contain fire + ants as their reagent + mogeoko: + - bugfix: Ventcrawling mobs can change Z-level using multiz-decks again. From 39d7db0b4c13d6e8ee25a647facce2d0a1b129bc Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 4 May 2024 03:11:32 +0200 Subject: [PATCH 103/107] Automatic changelog for PR #27586 [ci skip] --- html/changelogs/AutoChangeLog-pr-27586.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27586.yml diff --git a/html/changelogs/AutoChangeLog-pr-27586.yml b/html/changelogs/AutoChangeLog-pr-27586.yml new file mode 100644 index 00000000000..dd43731450a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27586.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Fixed lua scripts breaking when turfs with registered signals get deleted." \ No newline at end of file From f867b8ed482c9ac0e9f2007ba67733619ac92d2d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 4 May 2024 03:11:39 +0200 Subject: [PATCH 104/107] Automatic changelog for PR #27585 [ci skip] --- html/changelogs/AutoChangeLog-pr-27585.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27585.yml diff --git a/html/changelogs/AutoChangeLog-pr-27585.yml b/html/changelogs/AutoChangeLog-pr-27585.yml new file mode 100644 index 00000000000..6105e70440d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27585.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - balance: "Bitrunners can now earn Bepis disks, once per medium domain or above, if they scored at least an A." + - rscdel: "Bitrunners can not buy Bepis disks from their vendors." \ No newline at end of file From 0d6326496f35719cb3ac721334bba177387ec51c Mon Sep 17 00:00:00 2001 From: Useroth <37159550+Useroth@users.noreply.github.com> Date: Sat, 4 May 2024 03:17:35 +0200 Subject: [PATCH 105/107] Removes modular electrocution damage overrides. --- modular_skyrat/master_files/code/modules/power/powernet.dm | 6 ------ tgstation.dme | 1 - 2 files changed, 7 deletions(-) delete mode 100644 modular_skyrat/master_files/code/modules/power/powernet.dm diff --git a/modular_skyrat/master_files/code/modules/power/powernet.dm b/modular_skyrat/master_files/code/modules/power/powernet.dm deleted file mode 100644 index 189a4aa0449..00000000000 --- a/modular_skyrat/master_files/code/modules/power/powernet.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/powernet/get_electrocute_damage() - if(avail >= 1000) - var/damage = clamp(20 + round(avail/25000), 20, 195) + rand(-5,5) - return damage * HUMAN_HEALTH_MODIFIER - else - return 0 diff --git a/tgstation.dme b/tgstation.dme index 38f4813a69c..41b38456b53 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6616,7 +6616,6 @@ #include "modular_skyrat\master_files\code\modules\paperwork\stamps.dm" #include "modular_skyrat\master_files\code\modules\power\cable.dm" #include "modular_skyrat\master_files\code\modules\power\circulator.dm" -#include "modular_skyrat\master_files\code\modules\power\powernet.dm" #include "modular_skyrat\master_files\code\modules\power\thermoelectric_generator.dm" #include "modular_skyrat\master_files\code\modules\power\lighting\light_mapping_helpers.dm" #include "modular_skyrat\master_files\code\modules\power\singularity\containment_field.dm" From a4ab4d31883213500b0acb93d6bfe13bbfb18d08 Mon Sep 17 00:00:00 2001 From: Useroth <37159550+Useroth@users.noreply.github.com> Date: Sat, 4 May 2024 04:05:13 +0200 Subject: [PATCH 106/107] Fixes transfer votes. --- .../autotransfer/code/transfer_vote.dm | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/modular_skyrat/modules/autotransfer/code/transfer_vote.dm b/modular_skyrat/modules/autotransfer/code/transfer_vote.dm index 709c6369dc4..97703fe4805 100644 --- a/modular_skyrat/modules/autotransfer/code/transfer_vote.dm +++ b/modular_skyrat/modules/autotransfer/code/transfer_vote.dm @@ -7,34 +7,26 @@ CHOICE_TRANSFER, CHOICE_CONTINUE, ) + default_message = "Vote to initiate a crew transfer." -/datum/vote/transfer_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - - +/datum/vote/transfer_vote/toggle_votable() CONFIG_SET(flag/allow_vote_transfer, !CONFIG_GET(flag/allow_vote_transfer)) - return TRUE /datum/vote/transfer_vote/is_config_enabled() return CONFIG_GET(flag/autotransfer) && CONFIG_GET(flag/allow_vote_transfer) -/datum/vote/transfer_vote/can_be_initiated(mob/by_who, forced) +/datum/vote/transfer_vote/can_be_initiated(forced) . = ..() - if(!.) - return FALSE + if(. != VOTE_AVAILABLE) + return . if(forced) - return TRUE + return VOTE_AVAILABLE if(!CONFIG_GET(flag/autotransfer) || !CONFIG_GET(flag/allow_vote_transfer)) - if(by_who) - to_chat(by_who, span_warning("Transfer voting is disabled.")) - return FALSE + return "Transfer voting is disabled." - return TRUE + return VOTE_AVAILABLE /datum/vote/transfer_vote/finalize_vote(winning_option) if(winning_option == CHOICE_CONTINUE) From da8c4123593b71a12ada45117d13e50d11fe2d21 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 4 May 2024 04:25:55 +0200 Subject: [PATCH 107/107] Automatic changelog for PR #27588 [ci skip] --- html/changelogs/AutoChangeLog-pr-27588.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-27588.yml diff --git a/html/changelogs/AutoChangeLog-pr-27588.yml b/html/changelogs/AutoChangeLog-pr-27588.yml new file mode 100644 index 00000000000..f79ea04becd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27588.yml @@ -0,0 +1,5 @@ +author: "Useroth" +delete-after: True +changes: + - bugfix: "Fixes transfer votes" + - refactor: "Removes modular piece of code related to electrocution that is no longer necessary." \ No newline at end of file