From 7ace3d6ab1a1ad300701e74b517b3435632d465b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 17 Jul 2024 21:05:38 -0500 Subject: [PATCH 001/212] this might fix it --- code/modules/mob/dead/observer/orbit.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index da3bc7c2dfb5..5dcc9d06f651 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -60,15 +60,21 @@ var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE, only_realname = TRUE) for (var/name in pois) var/list/serialized = list() - serialized["name"] = name + if(name) + serialized["name"] = name + else + serialized["name"] = "Unknown" var/poi = pois[name] serialized["ref"] = REF(poi) var/mob/M = poi + if(M.name) + serialized["fake_name"] = M.name + else + serialized["fake_name"] = "Unknown" - serialized["fake_name"] = M.name if (istype(M)) if (isobserver(M)) ghosts += list(serialized) From a5ca9c5f38dca2e019370086d8109b573eceaeec Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 21 Jul 2024 05:54:50 -0500 Subject: [PATCH 002/212] ports most of the tg orbit menu --- code/__DEFINES/dcs/signals.dm | 6 + code/__HELPERS/_lists.dm | 36 +++ code/__HELPERS/roundend.dm | 2 +- code/__HELPERS/unsorted.dm | 2 +- code/_globalvars/lists/objects.dm | 2 - .../subsystem/points_of_interest.dm | 225 ++++++++++++++++ code/datums/elements/point_of_interest.dm | 20 ++ code/datums/spawners_menu.dm | 2 +- code/game/atom/atom_orbit.dm | 33 +++ code/game/atoms.dm | 5 - code/game/gamemodes/wizard/wizard.dm | 2 +- code/game/mecha/mecha.dm | 4 +- code/game/objects/items/eightball.dm | 4 +- .../antagonists/blob/structures/core.dm | 4 +- code/modules/antagonists/cult/runes.dm | 6 +- .../nukeop/equipment/nuclearbomb.dm | 8 +- .../nukeop/equipment/pinpointer.dm | 2 +- code/modules/antagonists/nukeop/nukeop.dm | 2 +- code/modules/awaymissions/capture_the_flag.dm | 4 +- code/modules/awaymissions/corpse.dm | 4 +- code/modules/events/immovable_rod.dm | 4 +- code/modules/events/wizard/greentext.dm | 4 +- .../mining/lavaland/necropolis_chests.dm | 4 +- code/modules/mob/dead/observer/observer.dm | 5 + code/modules/mob/dead/observer/orbit.dm | 244 ++++++++++++++---- code/modules/mob/living/living.dm | 1 + .../friendly/drone/drones_as_items.dm | 4 +- .../hostile/megafauna/colossus.dm | 4 +- .../file_system/programs/radar.dm | 6 +- code/modules/overmap/helm.dm | 3 + code/modules/power/singularity/singularity.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 4 +- code/modules/power/tesla/energy_ball.dm | 2 +- code/modules/projectiles/guns/energy/pulse.dm | 4 +- code/modules/spells/spell_types/lichdom.dm | 4 +- shiptest.dme | 3 + tgui/packages/tgui/interfaces/Orbit.js | 220 ---------------- .../tgui/interfaces/Orbit/OrbitContent.tsx | 104 ++++++++ .../tgui/interfaces/Orbit/OrbitItem.tsx | 64 +++++ .../tgui/interfaces/Orbit/OrbitSection.tsx | 66 +++++ .../tgui/interfaces/Orbit/OrbitTooltip.tsx | 57 ++++ .../tgui/interfaces/Orbit/constants.ts | 8 + .../packages/tgui/interfaces/Orbit/helpers.ts | 116 +++++++++ tgui/packages/tgui/interfaces/Orbit/index.tsx | 103 ++++++++ tgui/packages/tgui/interfaces/Orbit/types.ts | 38 +++ 45 files changed, 1127 insertions(+), 322 deletions(-) create mode 100644 code/controllers/subsystem/points_of_interest.dm create mode 100644 code/datums/elements/point_of_interest.dm create mode 100644 code/game/atom/atom_orbit.dm delete mode 100644 tgui/packages/tgui/interfaces/Orbit.js create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/constants.ts create mode 100644 tgui/packages/tgui/interfaces/Orbit/helpers.ts create mode 100644 tgui/packages/tgui/interfaces/Orbit/index.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/types.ts diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index d0038cf5277e..738758377fc1 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -792,3 +792,9 @@ ///sent when the access on an id is changed/updated, ensures wallets get updated once ids generate there access #define COSMIG_ACCESS_UPDATED "acces_updated" + +// Point of interest signals +/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_added : (atom/new_poi) +#define COMSIG_ADDED_POINT_OF_INTEREST "added_point_of_interest" +/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed : (atom/old_poi) +#define COMSIG_REMOVED_POINT_OF_INTEREST "removed_point_of_interest" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index f603e85292ad..f536336876e8 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -87,6 +87,42 @@ };\ } while(FALSE) + +/** + * Custom binary search sorted insert utilising comparison procs instead of vars. + * INPUT: Object to be inserted + * LIST: List to insert object into + * TYPECONT: The typepath of the contents of the list + * COMPARE: The object to compare against, usualy the same as INPUT + * COMPARISON: The plaintext name of a proc on INPUT that takes a single argument to accept a single element from LIST and returns a positive, negative or zero number to perform a comparison. + * COMPTYPE: How should the values be compared? Either COMPARE_KEY or COMPARE_VALUE. + */ +#define BINARY_INSERT_PROC_COMPARE(INPUT, LIST, TYPECONT, COMPARE, COMPARISON, COMPTYPE) \ + do {\ + var/list/__BIN_LIST = LIST;\ + var/__BIN_CTTL = length(__BIN_LIST);\ + if(!__BIN_CTTL) {\ + __BIN_LIST += INPUT;\ + } else {\ + var/__BIN_LEFT = 1;\ + var/__BIN_RIGHT = __BIN_CTTL;\ + var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + var ##TYPECONT/__BIN_ITEM;\ + while(__BIN_LEFT < __BIN_RIGHT) {\ + __BIN_ITEM = COMPTYPE;\ + if(__BIN_ITEM.##COMPARISON(COMPARE) <= 0) {\ + __BIN_LEFT = __BIN_MID + 1;\ + } else {\ + __BIN_RIGHT = __BIN_MID;\ + };\ + __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + };\ + __BIN_ITEM = COMPTYPE;\ + __BIN_MID = __BIN_ITEM.##COMPARISON(COMPARE) > 0 ? __BIN_MID : __BIN_MID + 1;\ + __BIN_LIST.Insert(__BIN_MID, INPUT);\ + };\ + } while(FALSE) + //Returns a list in plain english as a string /proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) var/total = length(input) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5301f0ec9d3e..c3cbaa7c33f2 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -121,7 +121,7 @@ SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) /datum/controller/subsystem/ticker/proc/record_nuke_disk_location() - var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list + var/obj/item/disk/nuclear/N = locate() in SSpoints_of_interest.other_points_of_interest if(N) var/list/data = list() var/turf/T = get_turf(N) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d6b048de4289..c1e8f9a8cad7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -319,7 +319,7 @@ Turf and target are separate in case you want to teleport some distance from a t pois[name] = M if(!mobs_only) - for(var/atom/A in GLOB.poi_list) + for(var/atom/A in SSpoints_of_interest.other_points_of_interest) if(!A || !A.loc) continue pois[avoid_assoc_duplicate_keys(A.name, namecounts)] = A diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 7ee53ec1f37b..6d08f1d1bceb 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -46,8 +46,6 @@ GLOBAL_LIST_EMPTY(apcs_list) GLOBAL_LIST_EMPTY(tracked_implants) /// List of implants the prisoner console can track and send inject commands too GLOBAL_LIST_EMPTY(tracked_chem_implants) -/// List of points of interest for observe/follow -GLOBAL_LIST_EMPTY(poi_list) /// List of all pinpointers. Used to change stuff they are pointing to all at once. GLOBAL_LIST_EMPTY(pinpointer_list) /// List of all zombie_infection organs, for any mass "animation" diff --git a/code/controllers/subsystem/points_of_interest.dm b/code/controllers/subsystem/points_of_interest.dm new file mode 100644 index 000000000000..b8e8b6397424 --- /dev/null +++ b/code/controllers/subsystem/points_of_interest.dm @@ -0,0 +1,225 @@ +/// Subsystem for managing all POIs. +SUBSYSTEM_DEF(points_of_interest) + name = "Points of Interest" + + flags = SS_NO_FIRE | SS_NO_INIT + + /// List of mob POIs. This list is automatically sorted. + var/list/datum/point_of_interest/mob_poi/mob_points_of_interest = list() + /// List of non-mob POIs. This list is automatically sorted. + var/list/datum/point_of_interest/other_points_of_interest = list() + /// List of all value:POI datums by their key:target refs. + var/list/datum/point_of_interest/points_of_interest_by_target_ref = list() + +/** + * Turns new_poi into a new point of interest by adding the /datum/element/point_of_interest element to it. + */ +/datum/controller/subsystem/points_of_interest/proc/make_point_of_interest(atom/new_poi) + new_poi.AddElement(/datum/element/point_of_interest) + +/** + * Stops old_poi from being a point of interest by removing the /datum/element/point_of_interest element from it. + */ +/datum/controller/subsystem/points_of_interest/proc/remove_point_of_interest(atom/old_poi) + old_poi.RemoveElement(/datum/element/point_of_interest) + +/** + * Called by [/datum/element/point_of_interest] when it gets removed from old_poi. + */ +/datum/controller/subsystem/points_of_interest/proc/on_poi_element_added(atom/new_poi) + var/datum/point_of_interest/new_poi_datum + if(ismob(new_poi)) + new_poi_datum = new /datum/point_of_interest/mob_poi(new_poi) + BINARY_INSERT_PROC_COMPARE(new_poi_datum, mob_points_of_interest, /datum/point_of_interest/mob_poi, new_poi_datum, compare_to, COMPARE_KEY) + points_of_interest_by_target_ref[REF(new_poi)] = new_poi_datum + else + new_poi_datum = new /datum/point_of_interest(new_poi) + BINARY_INSERT_PROC_COMPARE(new_poi_datum, other_points_of_interest, /datum/point_of_interest, new_poi_datum, compare_to, COMPARE_KEY) + points_of_interest_by_target_ref[REF(new_poi)] = new_poi_datum + + + SEND_SIGNAL(src, COMSIG_ADDED_POINT_OF_INTEREST, new_poi) + +/** + * Called by [/datum/element/point_of_interest] when it gets removed from old_poi. + */ +/datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed(atom/old_poi) + var/poi_ref = REF(old_poi) + var/datum/point_of_interest/poi_to_remove = points_of_interest_by_target_ref[poi_ref] + + if(!poi_to_remove) + return + + if(ismob(old_poi)) + mob_points_of_interest -= poi_to_remove + else + other_points_of_interest -= poi_to_remove + + points_of_interest_by_target_ref -= poi_ref + + poi_to_remove.target = null + + SEND_SIGNAL(src, COMSIG_REMOVED_POINT_OF_INTEREST, old_poi) + +/** + * If there is a valid POI for a given reference, it returns that POI's associated atom. Otherwise, it returns null. + */ +/datum/controller/subsystem/points_of_interest/proc/get_poi_atom_by_ref(reference) + return points_of_interest_by_target_ref[reference]?.target + +/** + * Returns a list of mob POIs with names as keys and mobs as values. + * + * If multiple POIs have the same name, then avoid_assoc_duplicate_keys is used alongside used_name_list to + * tag them as Mob Name (1), Mob Name (2), Mob Name (3) etc. + * + * Arguments: + * * poi_validation_override - [OPTIONAL] Callback to a proc that takes a single argument for the POI and returns TRUE if this POI should be included. Overrides standard POI validation. + * * append_dead_role - [OPTIONAL] If TRUE, adds a ghost tag to the end of observer names and a dead tag to the end of any other mob which is not alive. + */ +/datum/controller/subsystem/points_of_interest/proc/get_mob_pois(datum/callback/poi_validation_override = null, append_dead_role = TRUE) + var/list/pois = list() + var/list/used_name_list = list() + + for(var/datum/point_of_interest/mob_poi/mob_poi as anything in mob_points_of_interest) + if(poi_validation_override) + if(!poi_validation_override.Invoke(mob_poi)) + continue + else if(!mob_poi.validate()) + continue + + var/mob/target_mob = mob_poi.target + var/name = avoid_assoc_duplicate_keys(target_mob.name, used_name_list) + target_mob.get_realname_string() + + // Add the ghost/dead tag to the end of dead mob POIs. + if(append_dead_role && target_mob.stat == DEAD) + if(isobserver(target_mob)) + name += " \[ghost\]" + else + name += " \[dead\]" + + pois[name] = target_mob + + return pois + +/** + * Returns a list of non-mob POIs with names as keys and atoms as values. + * + * If multiple POIs have the same name, then avoid_assoc_duplicate_keys is used alongside used_name_list to + * tag them as Object Name (1), Object Name (2), Object Name (3) etc. + * + * Arguments: + * * poi_validation_override - [OPTIONAL] Callback to a proc that takes a single argument for the POI and returns TRUE if this POI should be included. Overrides standard POI validation. + */ +/datum/controller/subsystem/points_of_interest/proc/get_other_pois(datum/callback/poi_validation_override = null) + var/list/pois = list() + var/list/used_name_list = list() + + for(var/datum/point_of_interest/other_poi as anything in other_points_of_interest) + if(poi_validation_override) + if(!poi_validation_override.Invoke(other_poi)) + continue + else if(!other_poi.validate()) + continue + + var/atom/target_poi = other_poi.target + + pois[avoid_assoc_duplicate_keys(target_poi.name, used_name_list)] = target_poi + + return pois + +/// Returns TRUE if potential_poi has an associated poi_datum that validates. +/datum/controller/subsystem/points_of_interest/proc/is_valid_poi(atom/potential_poi, datum/callback/poi_validation_override = null) + var/datum/point_of_interest/poi_datum = points_of_interest_by_target_ref[REF(potential_poi)] + + if(!poi_datum) + return FALSE + + if(poi_validation_override) + return poi_validation_override.Invoke(poi_datum) + + return poi_datum.validate() + +/// Simple helper datum for points of interest. +/datum/point_of_interest + /// The specific point of interest this datum references. This won't hard del as the POI element will be removed from the target when it qdels, which will clear this reference. + var/atom/target + /// The type of POI this datum references. + var/poi_type = /atom + +/datum/point_of_interest/New(poi_target) + if(!istype(poi_target, poi_type)) + CRASH("Incorrect target type provided to /datum/point_of_interest/New: Expected \[[poi_type]\]") + + target = poi_target + +/// Validates the POI. Returns TRUE if the POI has valid state, returns FALSE if the POI has invalid state. +/datum/point_of_interest/proc/validate() + // In nullspace, invalid as a POI. + if(!target.loc) + return FALSE + + return TRUE + +/// Comparison proc used to sort POIs. Override to implement logic used doing binary sort insertions. +/datum/point_of_interest/proc/compare_to(datum/point_of_interest/rhs) + return cmp_name_asc(target, rhs.target) + +/datum/point_of_interest/mob_poi + poi_type = /mob + +/// Validation for mobs is expanded to invalidate stealthmins and /mob/dead/new_player as POIs. +/datum/point_of_interest/mob_poi/validate() + . = ..() + + if(!.) + return + + var/mob/poi_mob = target + + // Stealthmin, invalid as a POI. + if(poi_mob.client?.holder?.fakekey) + return FALSE + + // POI is a /mob/dead/new_player, players in the lobby are invalid as POIs. + if(isnewplayer(poi_mob)) + return FALSE + + return TRUE + +/// Mob POIs are sorted by a simple priority list depending on their type. When their type priority is identical, they're sub-sorted by name. +/datum/point_of_interest/mob_poi/compare_to(datum/point_of_interest/mob_poi/rhs) + var/sort_difference = get_type_sort_priority() - rhs.get_type_sort_priority() + + // If they're equal in priority, call parent to sort by name. + if(sort_difference == 0) + return ..() + // Else sort by priority. + else + return sort_difference + +/// Priority list broadly stolen from /proc/sortmobs(). Lower numbers are higher priorities when sorted and appear closer to the top or start of lists. +/datum/point_of_interest/mob_poi/proc/get_type_sort_priority() + if(isAI(target)) + return 0 + if(iscameramob(target)) + return 1 + if(ispAI(target)) + return 2 + if(iscyborg(target)) + return 3 + if(ishuman(target)) + return 4 + if(isbrain(target)) + return 5 + if(isalien(target)) + return 6 + if(isobserver(target)) + return 7 + if(isnewplayer(target)) + return 8 + if(isslime(target)) + return 9 + if(isanimal(target)) + return 10 + return 11 diff --git a/code/datums/elements/point_of_interest.dm b/code/datums/elements/point_of_interest.dm new file mode 100644 index 000000000000..3ab6c6296293 --- /dev/null +++ b/code/datums/elements/point_of_interest.dm @@ -0,0 +1,20 @@ +/// Designates the atom as a "point of interest", meaning it can be directly orbited +/datum/element/point_of_interest + element_flags = ELEMENT_DETACH + +/datum/element/point_of_interest/Attach(datum/target) + if (!isatom(target)) + return ELEMENT_INCOMPATIBLE + + // New players are abstract mobs assigned to people who are still in the lobby screen. + // As a result, they are not a valid POI and should never be a valid POI. If they + // somehow get this element attached to them, there's something we need to debug. + if(isnewplayer(target)) + return ELEMENT_INCOMPATIBLE + + SSpoints_of_interest.on_poi_element_added(target) + return ..() + +/datum/element/point_of_interest/Detach(datum/target) + SSpoints_of_interest.on_poi_element_removed(target) + return ..() diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index 9e7e4b334ddc..01709a00c1a1 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -53,7 +53,7 @@ if(!spawnerlist.len) return var/obj/effect/mob_spawn/MS = pick(spawnerlist) - if(!istype(MS) || !(MS in GLOB.poi_list)) + if(!istype(MS) || !(MS in SSpoints_of_interest.other_points_of_interest)) return switch(action) if("jump") diff --git a/code/game/atom/atom_orbit.dm b/code/game/atom/atom_orbit.dm new file mode 100644 index 000000000000..2294293bd8b7 --- /dev/null +++ b/code/game/atom/atom_orbit.dm @@ -0,0 +1,33 @@ +/atom + ///Reference to atom being orbited + var/atom/orbit_target + ///The orbiter component, if there's anything orbiting this atom + var/datum/component/orbiter/orbiters + +/** + * Recursive getter method to return a list of all ghosts orbitting this atom + * + * This will work fine without manually passing arguments. + * * processed - The list of atoms we've already convered + * * source - Is this the atom for who we're counting up all the orbiters? + * * ignored_stealthed_admins - If TRUE, don't count admins who are stealthmoded and orbiting this + */ +/atom/proc/get_all_orbiters(list/processed, source = TRUE, ignore_stealthed_admins = TRUE) + var/list/output = list() + if(!processed) + processed = list() + else if(src in processed) + return output + + if(!source) + output += src + + processed += src + for(var/atom/atom_orbiter as anything in orbiters?.orbiters) + output += atom_orbiter.get_all_orbiters(processed, source = FALSE) + return output + +/mob/get_all_orbiters(list/processed, source = TRUE, ignore_stealthed_admins = TRUE) + if(!source && ignore_stealthed_admins && client?.holder?.fakekey) + return list() + return ..() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6d9f0df9f2ec..b2e4027e6125 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -67,9 +67,6 @@ ///Economy cost of item in premium vendor var/custom_premium_price - //List of datums orbiting this atom - var/datum/component/orbiter/orbiters - /// Radiation insulation types var/rad_insulation = RAD_NO_INSULATION @@ -146,8 +143,6 @@ /// The current connector overlay appearance. Saved so that it can be cut when necessary. var/connector_overlay - ///Reference to atom being orbited - var/atom/orbit_target ///Default X pixel offset var/base_pixel_x ///Default Y pixel offset diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index c3895f302279..83d7a32d1fd9 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -56,7 +56,7 @@ if(isliving(wizard.current) && wizard.current.stat!=DEAD) return FALSE - for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead() + for(var/obj/item/phylactery/P in SSpoints_of_interest.other_points_of_interest) //TODO : IsProperlyDead() if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard)) return FALSE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 48cc0388b508..4b05ca018380 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -137,7 +137,7 @@ add_scanmod() add_capacitor() START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) log_message("[src.name] created.", LOG_MECHA) GLOB.mechas_list += src //global mech list prepare_huds() @@ -175,7 +175,7 @@ AI.gib() //No wreck, no AI to recover AI = null STOP_PROCESSING(SSobj, src) - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) equipment.Cut() for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 1396521aaf9a..b721393e85ed 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -136,10 +136,10 @@ become_hearing_sensitive(ROUNDSTART_TRAIT) for (var/answer in haunted_answers) votes[answer] = 0 - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/item/toy/eightball/haunted/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/toy/eightball/haunted/MakeHaunted() diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index 6a1ccb1dd465..33e5f5b930b2 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -13,7 +13,7 @@ /obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, placed = 0) GLOB.blob_cores += src START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) update_appearance() //so it atleast appears if(!placed && !overmind) return INITIALIZE_HINT_QDEL @@ -23,7 +23,7 @@ /obj/structure/blob/core/Destroy() GLOB.blob_cores -= src - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) if(overmind) overmind.blob_core = null overmind = null diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 5058dc73f081..d27ee061d462 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -458,10 +458,10 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/narsie/Initialize(mapload, set_keyword) . = ..() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/effect/rune/narsie/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/effect/rune/narsie/conceal() //can't hide this, and you wouldn't want to @@ -477,7 +477,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(!(place in summon_objective.summon_spots)) to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") return - if(locate(/obj/singularity/narsie) in GLOB.poi_list) + if(locate(/obj/singularity/narsie) in SSpoints_of_interest.other_points_of_interest) for(var/M in invokers) to_chat(M, "Nar'Sie is already on this plane!") log_game("Nar'Sie rune failed - already summoned") diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 648803185661..b9c71256e5d7 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -38,7 +38,7 @@ core = new /obj/item/nuke_core(src) STOP_PROCESSING(SSobj, core) update_appearance() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) previous_level = get_security_level() /obj/machinery/nuclearbomb/Destroy() @@ -46,7 +46,7 @@ if(!exploding) // If we're not exploding, set the alert level back to normal set_safety() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) GLOB.nuke_list -= src QDEL_NULL(countdown) QDEL_NULL(core) @@ -616,7 +616,7 @@ This is here to make the tiles around the station mininuke change when it's arme AddElement(/datum/element/bed_tuckable, 6, -6, 0) if(!fake) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) last_disk_move = world.time START_PROCESSING(SSobj, src) @@ -680,7 +680,7 @@ This is here to make the tiles around the station mininuke change when it's arme /obj/item/disk/nuclear/Destroy(force=FALSE) // respawning is handled in /obj/Destroy() if(force) - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/disk/nuclear/fake diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index b316e60c5e14..c1f9ffa37428 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -32,7 +32,7 @@ target = null switch(mode) if(TRACK_NUKE_DISK) - var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list + var/obj/item/disk/nuclear/N = locate() in SSpoints_of_interest.other_points_of_interest target = N if(TRACK_MALF_AI) for(var/V in GLOB.ai_list) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 9f807d9521e7..f51c64142450 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -345,7 +345,7 @@ /datum/team/nuclear/antag_listing_entry() var/disk_report = "Nuclear Disk(s)
" disk_report += "" - for(var/obj/item/disk/nuclear/N in GLOB.poi_list) + for(var/obj/item/disk/nuclear/N in SSpoints_of_interest.other_points_of_interest) disk_report += "
[N.name], " var/atom/disk_loc = N.loc while(!isturf(disk_loc)) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 2f87eea6d2a7..17458c661f1b 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -194,10 +194,10 @@ /obj/machinery/capture_the_flag/Initialize() . = ..() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/machinery/capture_the_flag/Destroy() - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) return ..() /obj/machinery/capture_the_flag/process() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 0bf0b74c715a..26361b99cfc6 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -61,11 +61,11 @@ if(instant || (roundstart && (mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP)))) INVOKE_ASYNC(src, PROC_REF(create)) else if(ghost_usable) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) LAZYADD(GLOB.mob_spawners[name], src) /obj/effect/mob_spawn/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) var/list/spawners = GLOB.mob_spawners[name] LAZYREMOVE(spawners, src) if(!LAZYLEN(spawners)) diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index adde1124935f..4ba2d878ad46 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -62,7 +62,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 z_original = z destination = end special_target = aimed_at - GLOB.poi_list += src + SSpoints_of_interest.make_point_of_interest(src) var/special_target_valid = FALSE if(special_target) @@ -81,7 +81,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 ghost.ManualFollow(src) /obj/effect/immovablerod/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/effect/immovablerod/Moved() diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 890bbc0f1f2b..8e4baab893fc 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -34,7 +34,7 @@ /obj/item/greentext/Initialize(mapload) . = ..() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) roundend_callback = CALLBACK(src, PROC_REF(check_winner)) SSticker.OnRoundend(roundend_callback) @@ -83,7 +83,7 @@ if(!(resistance_flags & ON_FIRE) && !force) return QDEL_HINT_LETMELIVE - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) LAZYREMOVE(SSticker.round_end_events, roundend_callback) roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling for(var/i in GLOB.player_list) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index e48f4d5af5aa..1fcfabefb5e1 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1234,7 +1234,7 @@ . = ..() spirits = list() START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) AddComponent(/datum/component/butchering, 150, 90) /obj/item/melee/ghost_sword/Destroy() @@ -1242,7 +1242,7 @@ G.invisibility = GLOB.observer_default_invisibility spirits.Cut() STOP_PROCESSING(SSobj, src) - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/melee/ghost_sword/attack_self(mob/user) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4a768fc1c501..f727d04d4aa4 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -62,6 +62,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/datum/orbit_menu/orbit_menu var/datum/spawners_menu/spawners_menu + // The POI we're orbiting (orbit menu) + var/orbiting_ref + /mob/dead/observer/Initialize() set_invisibility(GLOB.observer_default_invisibility) @@ -142,6 +145,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) . = ..() + SSpoints_of_interest.make_point_of_interest(src) + grant_all_languages() show_data_huds() data_huds_on = 1 diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 5dcc9d06f651..3cfa4612f6c7 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -1,4 +1,8 @@ /datum/orbit_menu + ///mobs worth orbiting. Because spaghetti, all mobs have the point of interest, but only some are allowed to actually show up. + ///this obviously should be changed in the future, so we only add mobs as POI if they actually are interesting, and we don't use + ///a typecache. + var/static/list/mob_allowed_typecache var/mob/dead/observer/owner var/auto_observe = FALSE @@ -23,7 +27,7 @@ switch(action) if ("orbit") var/ref = params["ref"] - var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list) + var/atom/movable/poi = SSpoints_of_interest.get_poi_atom_by_ref(ref) if (poi == null) . = TRUE return @@ -48,70 +52,210 @@ return data /datum/orbit_menu/ui_static_data(mob/user) - var/list/data = list() +/datum/orbit_menu/ui_static_data(mob/user) + var/list/new_mob_pois = SSpoints_of_interest.get_mob_pois(CALLBACK(src, PROC_REF(validate_mob_poi)), append_dead_role = FALSE) + var/list/new_other_pois = SSpoints_of_interest.get_other_pois() var/list/alive = list() var/list/antagonists = list() + var/list/critical = list() var/list/dead = list() var/list/ghosts = list() var/list/misc = list() var/list/npcs = list() + var/list/ships = list() - var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE, only_realname = TRUE) - for (var/name in pois) + for(var/name in new_mob_pois) var/list/serialized = list() - if(name) - serialized["name"] = name - else - serialized["name"] = "Unknown" + var/mob/mob_poi = new_mob_pois[name] + var/number_of_orbiters = length(mob_poi.get_all_orbiters()) - var/poi = pois[name] + serialized["ref"] = REF(mob_poi) + serialized["full_name"] = name + if(number_of_orbiters) + serialized["orbiters"] = number_of_orbiters - serialized["ref"] = REF(poi) + if(isobserver(mob_poi)) + ghosts += list(serialized) + continue - var/mob/M = poi - if(M.name) - serialized["fake_name"] = M.name - else - serialized["fake_name"] = "Unknown" - - if (istype(M)) - if (isobserver(M)) - ghosts += list(serialized) - else if (M.stat == DEAD) - dead += list(serialized) - else if (M.mind == null) - npcs += list(serialized) - else - var/number_of_orbiters = M.orbiters?.orbiters?.len - if (number_of_orbiters) - serialized["orbiters"] = number_of_orbiters - - var/datum/mind/mind = M.mind - var/was_antagonist = FALSE - - for (var/_A in mind.antag_datums) - var/datum/antagonist/A = _A - if (A.show_to_ghosts) - was_antagonist = TRUE - serialized["antag"] = A.name - antagonists += list(serialized) - break - - if (!was_antagonist) - alive += list(serialized) + if(mob_poi.stat == DEAD) + dead += list(serialized) + continue + + if(isnull(mob_poi.mind)) + if(isliving(mob_poi)) + var/mob/living/npc = mob_poi + serialized["health"] = FLOOR((npc.health / npc.maxHealth * 100), 1) + + npcs += list(serialized) + continue + + serialized["client"] = !!mob_poi.client + serialized["name"] = mob_poi.real_name + + if(isliving(mob_poi)) + serialized += get_living_data(mob_poi) + + var/list/antag_data = get_antag_data(mob_poi.mind) + if(length(antag_data)) + serialized += antag_data + antagonists += list(serialized) + continue + + alive += list(serialized) + + for(var/name in new_other_pois) + var/atom/atom_poi = new_other_pois[name] + + var/list/other_data = get_misc_data(atom_poi) + var/misc_data = list(other_data[1]) + + if(istype(atom_poi, /obj/machinery/computer/helm)) + ships += misc_data else - misc += list(serialized) - - data["alive"] = alive - data["antagonists"] = antagonists - data["dead"] = dead - data["ghosts"] = ghosts - data["misc"] = misc - data["npcs"] = npcs - return data + misc += misc_data + + if(other_data[2]) // Critical = TRUE + critical += misc_data + + return list( + "alive" = alive, + "antagonists" = antagonists, + "critical" = critical, + "dead" = dead, + "ghosts" = ghosts, + "misc" = misc, + "npcs" = npcs, + "ships" = ships, + ) /datum/orbit_menu/ui_assets() . = ..() || list() . += get_asset_datum(/datum/asset/simple/orbit) +/// Helper function to get threat type, group, overrides for job and icon +/datum/orbit_menu/proc/get_antag_data(datum/mind/poi_mind) as /list + var/list/serialized = list() + + for(var/datum/antagonist/antag as anything in poi_mind.antag_datums) + if(!antag.show_to_ghosts) + continue + + serialized["antag"] = antag.name + serialized["antag_group"] = antag.antagpanel_category + serialized["job"] = antag.name + serialized["icon"] = antag.antag_hud_name + + return serialized + +/// Helper to get the current thing we're orbiting (if any) +/datum/orbit_menu/proc/get_currently_orbiting(mob/dead/observer/user) + if(isnull(user.orbiting_ref)) + return + + var/atom/poi = SSpoints_of_interest.get_poi_atom_by_ref(user.orbiting_ref) + if(isnull(poi)) + user.orbiting_ref = null + return + + if((ismob(poi) && !SSpoints_of_interest.is_valid_poi(poi, CALLBACK(src, PROC_REF(validate_mob_poi)))) \ + || !SSpoints_of_interest.is_valid_poi(poi) + ) + user.orbiting_ref = null + return + + var/list/serialized = list() + + if(!ismob(poi)) + var/list/misc_info = get_misc_data(poi) + serialized += misc_info[1] + return serialized + + var/mob/mob_poi = poi + serialized["full_name"] = mob_poi.name + serialized["ref"] = REF(poi) + + if(mob_poi.mind) + serialized["client"] = !!mob_poi.client + serialized["name"] = mob_poi.real_name + + if(isliving(mob_poi)) + serialized += get_living_data(mob_poi) + + return serialized + +/// Helper function to get job / icon / health data for a living mob +/datum/orbit_menu/proc/get_living_data(mob/living/player) as /list + var/list/serialized = list() + + serialized["health"] = FLOOR((player.health / player.maxHealth * 100), 1) + + return serialized + + +/// Gets a list: Misc data and whether it's critical. Handles all snowflakey type cases +/datum/orbit_menu/proc/get_misc_data(atom/movable/atom_poi) as /list + var/list/misc = list() + var/critical = FALSE + + misc["ref"] = REF(atom_poi) + misc["full_name"] = atom_poi.name + + // Display the nuke timer + if(istype(atom_poi, /obj/machinery/nuclearbomb)) + var/obj/machinery/nuclearbomb/bomb = atom_poi + + if(bomb.timing) + misc["extra"] = "Timer: [bomb.countdown?.displayed_text]s" + critical = TRUE + + return list(misc, critical) + + // Display the holder if its a nuke disk + if(istype(atom_poi, /obj/item/disk/nuclear)) + var/obj/item/disk/nuclear/disk = atom_poi + var/mob/holder = disk.pulledby || get(disk, /mob) + misc["extra"] = "Location: [holder?.real_name || "Unsecured"]" + + return list(misc, critical) + + // Display singuloths if they exist + if(istype(atom_poi, /obj/singularity)) + var/obj/singularity/singulo = atom_poi + misc["extra"] = "Energy: [round(singulo.energy)]" + + if(singulo.current_size > 2) + critical = TRUE + + return list(misc, critical) + + if(istype(atom_poi, /obj/machinery/computer/helm)) + var/obj/machinery/computer/helm/helm_poi = atom_poi + if(helm_poi.current_ship) + misc["extra"] = "Ship: [helm_poi.current_ship.name]" + + return list(misc, critical) + + return list(misc, critical) + +/** + * Helper POI validation function passed as a callback to various SSpoints_of_interest procs. + * + * Provides extended validation above and beyond standard, limiting mob POIs without minds or ckeys + * unless they're mobs, camera mobs or megafauna. Also allows exceptions for mobs that are deadchat controlled. + * + * If they satisfy that requirement, falls back to default validation for the POI. + */ +/datum/orbit_menu/proc/validate_mob_poi(datum/point_of_interest/mob_poi/potential_poi) + var/mob/potential_mob_poi = potential_poi.target + if(!potential_mob_poi.mind && !potential_mob_poi.ckey) + if(!mob_allowed_typecache) + mob_allowed_typecache = typecacheof(list( + /mob/living/simple_animal/hostile/megafauna, + /mob/living/simple_animal/hostile/boss + )) + if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache) && !potential_mob_poi.GetComponent(/datum/component/deadchat_control)) + return FALSE + + return potential_poi.validate() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 269c74a837bd..14ffb2ff2839 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -9,6 +9,7 @@ diag_hud.add_to_hud(src) faction += "[REF(src)]" GLOB.mob_living_list += src + SSpoints_of_interest.make_point_of_interest(src) if(speed) update_living_varspeed() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index e0537594c8ff..4afdf9110e65 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -30,10 +30,10 @@ var/area/A = get_area(src) if(A) notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/effect/mob_spawn/drone/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE 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 863abf56dad1..ff06df9c6113 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -607,12 +607,12 @@ GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) var/ready_to_deploy = FALSE /obj/machinery/anomalous_crystal/helpers/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method) if(..() && !ready_to_deploy) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) ready_to_deploy = TRUE notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK, header = "Anomalous crystal activated") diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index d082503a012d..06324b8f8b78 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -156,7 +156,7 @@ *something like "mob_209". In order to find the actual atom, we need *to search the appropriate list for the REF string. This is dependant *on the program (Lifeline uses GLOB.human_list, while Fission360 uses - *GLOB.poi_list), but the result will be the same; evaluate the string and + *SSpoints_of_interest.other_points_of_interest), but the result will be the same; evaluate the string and *return an atom reference. */ /datum/computer_file/program/radar/proc/find_atom() @@ -269,7 +269,7 @@ pointercolor = "red" /datum/computer_file/program/radar/fission360/find_atom() - return locate(selected) in GLOB.poi_list + return locate(selected) in SSpoints_of_interest.other_points_of_interest /datum/computer_file/program/radar/fission360/scan() if(world.time < next_scan) @@ -286,7 +286,7 @@ name = nuke.name, ) objects += list(nukeinfo) - var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list + var/obj/item/disk/nuclear/disk = locate() in SSpoints_of_interest.other_points_of_interest if(trackable(disk)) var/list/nukeinfo = list( ref = REF(disk), diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm index 5b1f27fa2cb9..3b825ce39524 100644 --- a/code/modules/overmap/helm.dm +++ b/code/modules/overmap/helm.dm @@ -49,6 +49,8 @@ /obj/machinery/computer/helm/Initialize(mapload, obj/item/circuitboard/C) . = ..() + if(!viewer) + SSpoints_of_interest.make_point_of_interest(src) jump_allowed = world.time + CONFIG_GET(number/bluespace_jump_wait) ntnet_relay = new(src) @@ -76,6 +78,7 @@ SStgui.close_uis(src) ASSERT(length(concurrent_users) == 0) QDEL_NULL(ntnet_relay) + SSpoints_of_interest.remove_point_of_interest(src) if(current_ship) current_ship.helms -= src current_ship = null diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 875f9cd441f2..2e89823683f1 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -38,7 +38,7 @@ src.energy = starting_energy . = ..() START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) GLOB.singularities |= src for(var/obj/machinery/power/singularity_beacon/singubeacon in GLOB.machines) if(singubeacon.active) @@ -53,7 +53,7 @@ /obj/singularity/Destroy() STOP_PROCESSING(SSobj, src) - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) GLOB.singularities.Remove(src) return ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 5593744219d0..93f410d79b19 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -275,7 +275,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) SSair.start_processing_machine(src, mapload) countdown = new(src) countdown.start() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) radio = new(src) radio.keyslot = new radio_key radio.listening = 0 @@ -293,7 +293,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER) SSair.stop_processing_machine(src) QDEL_NULL(radio) - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) QDEL_NULL(countdown) if(is_main_engine && GLOB.main_supermatter_engine == src) GLOB.main_supermatter_engine = null diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index fbece73764a4..2b338e48e811 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -151,7 +151,7 @@ /obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target) if (istype(target)) target.orbiting_balls += src - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) target.dissipate_strength = target.orbiting_balls.len . = ..() diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index c2e5b4cb2933..40fd10e94785 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -46,7 +46,7 @@ /obj/item/gun/energy/pulse/prize/Initialize() . = ..() - GLOB.poi_list += src + SSpoints_of_interest.make_point_of_interest(src) var/turf/T = get_turf(src) message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]") @@ -55,7 +55,7 @@ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize") /obj/item/gun/energy/pulse/prize/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/gun/energy/pulse/pistol diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 720670e3fc21..38e2f0df145e 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -99,7 +99,7 @@ name = "phylactery of [mind.name]" active_phylacteries++ - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) START_PROCESSING(SSobj, src) if(initial(SSticker.mode.round_ends_with_antag_death)) SSticker.mode.round_ends_with_antag_death = FALSE @@ -107,7 +107,7 @@ /obj/item/phylactery/Destroy(force=FALSE) STOP_PROCESSING(SSobj, src) active_phylacteries-- - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) if(!active_phylacteries) SSticker.mode.round_ends_with_antag_death = initial(SSticker.mode.round_ends_with_antag_death) . = ..() diff --git a/shiptest.dme b/shiptest.dme index c0d9a7d4df66..b76eace8cf99 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -348,6 +348,7 @@ #include "code\controllers\subsystem\persistence.dm" #include "code\controllers\subsystem\physics.dm" #include "code\controllers\subsystem\ping.dm" +#include "code\controllers\subsystem\points_of_interest.dm" #include "code\controllers\subsystem\profiler.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" @@ -648,6 +649,7 @@ #include "code\datums\elements\lazy_fishing_spot.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\mobappearance.dm" +#include "code\datums\elements\point_of_interest.dm" #include "code\datums\elements\renamemob.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\snail_crawl.dm" @@ -829,6 +831,7 @@ #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" #include "code\game\area\areas\ruins\wasteplanet.dm" +#include "code\game\atom\atom_orbit.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js deleted file mode 100644 index c34dccacf367..000000000000 --- a/tgui/packages/tgui/interfaces/Orbit.js +++ /dev/null @@ -1,220 +0,0 @@ -import { createSearch } from 'common/string'; -import { multiline } from 'common/string'; -import { resolveAsset } from '../assets'; -import { useBackend, useLocalState } from '../backend'; -import { - Box, - Button, - Divider, - Flex, - Icon, - Input, - Section, -} from '../components'; -import { Window } from '../layouts'; - -const PATTERN_NUMBER = / \(([0-9]+)\)$/; - -const searchFor = (searchText) => - createSearch(searchText, (thing) => thing.name); - -const compareString = (a, b) => (a < b ? -1 : a > b); - -const compareNumberedText = (a, b) => { - const aName = a.name; - const bName = b.name; - - // Check if aName and bName are the same except for a number at the end - // e.g. Medibot (2) and Medibot (3) - const aNumberMatch = aName.match(PATTERN_NUMBER); - const bNumberMatch = bName.match(PATTERN_NUMBER); - - if ( - aNumberMatch && - bNumberMatch && - aName.replace(PATTERN_NUMBER, '') === bName.replace(PATTERN_NUMBER, '') - ) { - const aNumber = parseInt(aNumberMatch[1], 10); - const bNumber = parseInt(bNumberMatch[1], 10); - - return aNumber - bNumber; - } - - return compareString(aName, bName); -}; - -const BasicSection = (props, context) => { - const { act } = useBackend(context); - const { searchText, source, title } = props; - const things = source.filter(searchFor(searchText)); - things.sort(compareNumberedText); - return ( - source.length > 0 && ( -
- {things.map((thing) => ( -
- ) - ); -}; - -const OrbitedButton = (props, context) => { - const { act } = useBackend(context); - const { color, thing } = props; - - return ( - - ); -}; - -export const Orbit = (props, context) => { - const { act, data } = useBackend(context); - const { alive, antagonists, auto_observe, dead, ghosts, misc, npcs } = data; - - const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - - const collatedAntagonists = {}; - for (const antagonist of antagonists) { - if (collatedAntagonists[antagonist.antag] === undefined) { - collatedAntagonists[antagonist.antag] = []; - } - collatedAntagonists[antagonist.antag].push(antagonist); - } - - const sortedAntagonists = Object.entries(collatedAntagonists); - sortedAntagonists.sort((a, b) => { - return compareString(a[0], b[0]); - }); - - const orbitMostRelevant = (searchText) => { - for (const source of [ - sortedAntagonists.map(([_, antags]) => antags), - alive, - ghosts, - dead, - npcs, - misc, - ]) { - const member = source - .filter(searchFor(searchText)) - .sort(compareNumberedText)[0]; - if (member !== undefined) { - act('orbit', { ref: member.ref }); - break; - } - } - }; - - return ( - - -
- - - - - - setSearchText(value)} - onEnter={(_, value) => orbitMostRelevant(value)} - /> - - - - - -
- {antagonists.length > 0 && ( -
- {sortedAntagonists.map(([name, antags]) => ( -
- {antags - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map((antag) => ( - - ))} -
- ))} -
- )} - -
- {alive - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map((thing) => ( - - ))} -
- -
- {ghosts - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map((thing) => ( - - ))} -
- - - - - - -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx new file mode 100644 index 000000000000..938d640661f4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -0,0 +1,104 @@ +import { toTitleCase } from 'common/string'; + +import { useBackend, useLocalState } from '../../backend'; +import { + NoticeBox, + Section, + Stack, + Table, + Tooltip, + Button, + Box, +} from '../../components'; + +import { getAntagCategories } from './helpers'; +import { AntagGroup, Observable, OrbitData } from './types'; +import { OrbitSection } from './OrbitSection'; + +type ContentSection = { + content: Observable[]; + title: string; + color?: string; +}; + +export function OrbitContent(props, context) { + const { act, data } = useBackend(context); + const { antagonists = [], critical = [], searchText } = props; + + + let antagGroups: AntagGroup[] = []; + if (antagonists.length) { + antagGroups = getAntagCategories(antagonists); + } + + const sections: readonly ContentSection[] = [ + { + content: data.alive, + title: 'Alive', + color: 'good', + }, + { + content: data.dead, + title: 'Dead', + }, + { + content: data.ghosts, + title: 'Ghosts', + }, + { + content: data.misc, + title: 'Misc', + }, + { + content: data.npcs, + title: 'NPCs', + }, + { + content: data.ships, + title: 'Ships', + }, + ]; + + return ( +
+ + {critical.map((crit) => ( + + act('orbit', { ref: crit.ref })} + > + + + {toTitleCase(crit.full_name)} + {crit.extra} + +
+
+
+ ))} + + {antagGroups.map(([title, members]) => ( + + ))} + + {sections.map((section) => ( + + ))} +
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx new file mode 100644 index 000000000000..983a4034be3c --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx @@ -0,0 +1,64 @@ +import { resolveAsset } from '../../assets'; +import { useBackend, useLocalState } from '../../backend'; +import { + NoticeBox, + Section, + Stack, + Table, + Tooltip, + Button, + Box, + Flex, + Icon +} from '../../components'; + +import { capitalizeFirst } from 'common/string'; + +import { getDisplayColor, getDisplayName, searchFor, compareNumberedText} from './helpers'; +import { Antagonist, Observable, OrbitData } from './types'; + +type Props = { + item: Observable | Antagonist; + color: string | undefined; +}; + +export const OrbitItem = (props: Props, context) => { + const { item, color } = props; + const { full_name, icon, job, name, orbiters, ref } = item; + + const { act, data } = useBackend(context); + const { orbiting } = data; + + const selected = ref === orbiting?.ref; + const validIcon = !!job && !!icon && icon !== 'hudunknown'; + + + return ( + act('orbit', { ref })} + style={{ + display: 'flex', + }} + > + + + ); +} diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx new file mode 100644 index 000000000000..4cbcde13bbc2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -0,0 +1,66 @@ +import { Collapsible, Flex, Tooltip } from '../../components'; +import { + isJobOrNameMatch, +} from './helpers'; +import { useBackend, useLocalState } from '../../backend'; +import { OrbitItem } from './OrbitItem'; +import { OrbitTooltip } from './OrbitTooltip'; +import { Observable, OrbitData } from './types'; + +type Props = { + color?: string; + section: Observable[]; + title: string; + searchQuery: string; +}; + +/** + * Displays a collapsible with a map of observable items. + * Filters the results if there is a provided search query. + */ +export function OrbitSection(props: Props) { + const { color, section = [], title, searchQuery } = props; + + const filteredSection = section.filter((observable) => + isJobOrNameMatch(observable, searchQuery), + ); + + if (!filteredSection.length) { + return; + } + + return ( + + + {filteredSection.map((item) => { + const content = ( + + ); + + if (!item.health && !item.extra) { + return content; + } + + return ( + } + key={item.ref} + position="bottom-start" + > + {content} + + ); + })} + + + ); +} diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx new file mode 100644 index 000000000000..4d1c73f32c5d --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx @@ -0,0 +1,57 @@ +import { LabeledList, NoticeBox } from '../../components'; +import { Antagonist, Observable } from './types'; + +type Props = { + item: Observable | Antagonist; +}; + +/** Displays some info on the mob as a tooltip. */ +export function OrbitTooltip(props: Props) { + const { item } = props; + const { extra, name, full_name, health, job } = item; + + let antag; + if ('antag' in item) { + antag = item.antag; + } + + const extraInfo = extra?.split(':'); + const displayHealth = !!health && health >= 0 ? `${health}%` : 'Critical'; + const showAFK = 'client' in item && !item.client; + + return ( + <> + + Last Known Data + + + {extraInfo ? ( + + {extraInfo[1]} + + ) : ( + <> + {!!name && ( + {name} + )} + {!!full_name && ( + {full_name} + )} + {!!job && !antag && ( + {job} + )} + {!!antag && ( + {antag} + )} + {!!health && ( + + {displayHealth} + + )} + + )} + {showAFK && Away} + + + ); +} diff --git a/tgui/packages/tgui/interfaces/Orbit/constants.ts b/tgui/packages/tgui/interfaces/Orbit/constants.ts new file mode 100644 index 000000000000..1edadc9bfe45 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/constants.ts @@ -0,0 +1,8 @@ +export const HEALTH = { + Good: 69, // nice + Average: 19, + Bad: 0, + Crit: -30, + Dead: -100, + Ruined: -200, +} as const; diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts new file mode 100644 index 000000000000..ed154d3b58e5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -0,0 +1,116 @@ +import { createSearch } from '../../../common/string'; + +import { HEALTH } from './constants'; +import { AntagGroup, Antagonist, Observable } from './types'; + +const PATTERN_NUMBER = / \(([0-9]+)\)$/; + +/** Return a map of strings with each antag in its antag_category */ +export function getAntagCategories(antagonists: Antagonist[]): AntagGroup[] { + const categories = new Map(); + + for (const player of antagonists) { + const { antag_group } = player; + + if (!categories.has(antag_group)) { + categories.set(antag_group, []); + } + categories.get(antag_group)!.push(player); + } + + const sorted = Array.from(categories.entries()).sort((a, b) => { + const lowerA = a[0].toLowerCase(); + const lowerB = b[0].toLowerCase(); + + if (lowerA < lowerB) return -1; + if (lowerA > lowerB) return 1; + return 0; + }); + + return sorted; +} + +/** Returns a disguised name in case the person is wearing someone else's ID */ +export function getDisplayName(full_name: string, nickname?: string): string { + if (!nickname) { + return full_name; + } + + return nickname; +} + +/** Displays color for buttons based on the health or orbiter count. */ +export function getDisplayColor( + item: Observable, + override?: string, +): string { + const { job, health, orbiters } = item; + + // Things like blob camera, etc + if (typeof health !== 'number') { + return override ? 'good' : 'grey'; + } + + // Players that are AFK + if ('client' in item && !item.client) { + return 'grey'; + } + + return getHealthColor(health); +} + +/** Returns the display color for certain health percentages */ +function getHealthColor(health: number): string { + switch (true) { + case health > HEALTH.Good: + return 'good'; + case health > HEALTH.Average: + return 'average'; + default: + return 'bad'; + } +} + +/** Checks if a full name or job title matches the search. */ +export function isJobOrNameMatch( + observable: Observable, + searchQuery: string, +): boolean { + if (!searchQuery) return true; + + const { full_name, job } = observable; + + return ( + full_name?.toLowerCase().includes(searchQuery?.toLowerCase()) || + job?.toLowerCase().includes(searchQuery?.toLowerCase()) || + false + ); +} + +export const searchFor = (searchText) => + createSearch(searchText, (thing) => thing.name); + +export const compareString = (a, b) => (a < b ? -1 : a > b); + +export const compareNumberedText = (a, b) => { + const aName = a.name; + const bName = b.name; + + // Check if aName and bName are the same except for a number at the end + // e.g. Medibot (2) and Medibot (3) + const aNumberMatch = aName.match(PATTERN_NUMBER); + const bNumberMatch = bName.match(PATTERN_NUMBER); + + if ( + aNumberMatch && + bNumberMatch && + aName.replace(PATTERN_NUMBER, '') === bName.replace(PATTERN_NUMBER, '') + ) { + const aNumber = parseInt(aNumberMatch[1], 10); + const bNumber = parseInt(bNumberMatch[1], 10); + + return aNumber - bNumber; + } + + return compareString(aName, bName); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx new file mode 100644 index 000000000000..94bac92ba1b1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -0,0 +1,103 @@ + +import { multiline } from '../../../common/string'; +import { useBackend, useLocalState } from '../../backend'; +import { + Box, + Button, + Divider, + Flex, + Icon, + Input, + Section, +} from '../../components'; +import { Window } from '../../layouts'; + +import { searchFor, compareString, compareNumberedText } from './helpers' +import { OrbitData } from './types'; +import { OrbitContent } from './OrbitContent'; + +export const Orbit = (props, context) => { + const { act, data } = useBackend(context); + const { antagonists, autoObserve } = data; + + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + + const collatedAntagonists = {}; + for (const antagonist of antagonists) { + if (collatedAntagonists[antagonist.antag] === undefined) { + collatedAntagonists[antagonist.antag] = []; + } + collatedAntagonists[antagonist.antag].push(antagonist); + } + + function orbitMostRelevant() { + const mostRelevant = [ + data.antagonists, + data.alive, + data.ghosts, + data.dead, + data.npcs, + data.misc, + data.ships + ] + .flat() + .filter(searchFor(searchText)) + .sort()[0]; + + if (mostRelevant !== undefined) { + act('orbit', { ref: mostRelevant.ref + }); + } + } + + return ( + + +
+ + + + + + setSearchText(value)} + onEnter={(_, value) => orbitMostRelevant()} + /> + + + + + +
+ +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/types.ts b/tgui/packages/tgui/interfaces/Orbit/types.ts new file mode 100644 index 000000000000..4912ae10db4c --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/types.ts @@ -0,0 +1,38 @@ +import { BooleanLike } from '../../../common/react'; + +export type Antagonist = Observable & { antag: string; antag_group: string }; + +export type AntagGroup = [string, Antagonist[]]; + +export type OrbitData = { + alive: Observable[]; + antagonists: Antagonist[]; + critical: Critical[]; + dead: Observable[]; + ghosts: Observable[]; + misc: Observable[]; + npcs: Observable[]; + ships: Observable[]; + orbiting: Observable | null; + autoObserve: boolean; +}; + +export type Observable = { + full_name: string; + ref: string; + // Optionals +} & Partial<{ + client: BooleanLike; + extra: string; + health: number; + icon: string; + job: string; + name: string; + orbiters: number; +}>; + +type Critical = { + extra: string; + full_name: string; + ref: string; +}; From b07af8d6ccab82232ed16ded7ffcec8a433c6d7b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 21 Jul 2024 06:52:31 -0500 Subject: [PATCH 003/212] few more small fixees --- code/modules/mob/dead/observer/orbit.dm | 27 ++++++++++--------- .../tgui/interfaces/Orbit/OrbitContent.tsx | 7 +++-- .../tgui/interfaces/Orbit/OrbitItem.tsx | 5 ++-- .../tgui/interfaces/Orbit/OrbitSection.tsx | 4 ++- tgui/packages/tgui/interfaces/Orbit/index.tsx | 13 ++------- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 3cfa4612f6c7..958021f7801d 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -4,7 +4,6 @@ ///a typecache. var/static/list/mob_allowed_typecache var/mob/dead/observer/owner - var/auto_observe = FALSE /datum/orbit_menu/New(mob/dead/observer/new_owner) if(!istype(new_owner)) @@ -27,31 +26,35 @@ switch(action) if ("orbit") var/ref = params["ref"] + var/auto_observe = params["auto_observe"] var/atom/movable/poi = SSpoints_of_interest.get_poi_atom_by_ref(ref) - if (poi == null) - . = TRUE - return + + if((ismob(poi) && !SSpoints_of_interest.is_valid_poi(poi, CALLBACK(src, PROC_REF(validate_mob_poi)))) \ + || !SSpoints_of_interest.is_valid_poi(poi) + ) + to_chat(usr, span_notice("That point of interest is no longer valid.")) + return TRUE + + var/mob/dead/observer/user = usr owner.ManualFollow(poi) owner.reset_perspective(null) + user.orbiting_ref = ref if (auto_observe) owner.do_observe(poi) . = TRUE if ("refresh") update_static_data(owner, ui) . = TRUE - if ("toggle_observe") - auto_observe = !auto_observe - if (auto_observe && owner.orbit_target) - owner.do_observe(owner.orbit_target) - else - owner.reset_perspective(null) + /datum/orbit_menu/ui_data(mob/user) var/list/data = list() - data["auto_observe"] = auto_observe + + if(isobserver(user)) + data["orbiting"] = get_currently_orbiting(user) + return data -/datum/orbit_menu/ui_static_data(mob/user) /datum/orbit_menu/ui_static_data(mob/user) var/list/new_mob_pois = SSpoints_of_interest.get_mob_pois(CALLBACK(src, PROC_REF(validate_mob_poi)), append_dead_role = FALSE) var/list/new_other_pois = SSpoints_of_interest.get_other_pois() diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index 938d640661f4..e2d262ce9983 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -23,7 +23,8 @@ type ContentSection = { export function OrbitContent(props, context) { const { act, data } = useBackend(context); - const { antagonists = [], critical = [], searchText } = props; + const { antagonists = [], critical = [] } = data; + const { searchText, autoObserve } = props; let antagGroups: AntagGroup[] = []; @@ -60,7 +61,7 @@ export function OrbitContent(props, context) { ]; return ( -
+
{critical.map((crit) => ( @@ -86,6 +87,7 @@ export function OrbitContent(props, context) { section={members} title={title} searchQuery={searchText} + autoObserve={autoObserve} /> ))} @@ -96,6 +98,7 @@ export function OrbitContent(props, context) { section={section.content} title={section.title} searchQuery={searchText} + autoObserve={autoObserve} /> ))} diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx index 983a4034be3c..5727cf93a183 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx @@ -19,11 +19,12 @@ import { Antagonist, Observable, OrbitData } from './types'; type Props = { item: Observable | Antagonist; + autoObserve: boolean; color: string | undefined; }; export const OrbitItem = (props: Props, context) => { - const { item, color } = props; + const { item, autoObserve, color } = props; const { full_name, icon, job, name, orbiters, ref } = item; const { act, data } = useBackend(context); @@ -37,7 +38,7 @@ export const OrbitItem = (props: Props, context) => { act('orbit', { ref })} + onClick={() => act('orbit', { auto_observe: autoObserve, ref })} style={{ display: 'flex', }} diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index 4cbcde13bbc2..8c61543e1bda 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -12,6 +12,7 @@ type Props = { section: Observable[]; title: string; searchQuery: string; + autoObserve: boolean; }; /** @@ -19,7 +20,7 @@ type Props = { * Filters the results if there is a provided search query. */ export function OrbitSection(props: Props) { - const { color, section = [], title, searchQuery } = props; + const { color, section = [], title, searchQuery, autoObserve } = props; const filteredSection = section.filter((observable) => isJobOrNameMatch(observable, searchQuery), @@ -40,6 +41,7 @@ export function OrbitSection(props: Props) { {filteredSection.map((item) => { const content = ( { const { act, data } = useBackend(context); - const { antagonists, autoObserve } = data; const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - - const collatedAntagonists = {}; - for (const antagonist of antagonists) { - if (collatedAntagonists[antagonist.antag] === undefined) { - collatedAntagonists[antagonist.antag] = []; - } - collatedAntagonists[antagonist.antag].push(antagonist); - } + const [autoObserve, setAutoObserve] = useLocalState(context, 'autoObserve', false); function orbitMostRelevant() { const mostRelevant = [ @@ -80,7 +72,7 @@ export const Orbit = (props, context) => { tooltipPosition="bottom-start" selected={autoObserve} icon={autoObserve ? 'toggle-on' : 'toggle-off'} - onClick={() => act('toggle_observe')} + onClick={() => setAutoObserve(!autoObserve)} />
From 795854a3dd40172720241bb34ee308f56e70b846 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 21 Jul 2024 06:55:47 -0500 Subject: [PATCH 004/212] removes unused vars --- tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx | 4 +--- tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx | 10 ++-------- tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx | 3 +-- tgui/packages/tgui/interfaces/Orbit/index.tsx | 3 +-- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index e2d262ce9983..0e0d09c6ebef 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -1,14 +1,12 @@ import { toTitleCase } from 'common/string'; -import { useBackend, useLocalState } from '../../backend'; +import { useBackend } from '../../backend'; import { NoticeBox, Section, Stack, Table, Tooltip, - Button, - Box, } from '../../components'; import { getAntagCategories } from './helpers'; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx index 5727cf93a183..6c4205cbf892 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx @@ -1,20 +1,14 @@ -import { resolveAsset } from '../../assets'; -import { useBackend, useLocalState } from '../../backend'; +import { useBackend } from '../../backend'; import { - NoticeBox, - Section, Stack, - Table, - Tooltip, Button, - Box, Flex, Icon } from '../../components'; import { capitalizeFirst } from 'common/string'; -import { getDisplayColor, getDisplayName, searchFor, compareNumberedText} from './helpers'; +import { getDisplayColor, getDisplayName } from './helpers'; import { Antagonist, Observable, OrbitData } from './types'; type Props = { diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index 8c61543e1bda..4291ea7665f8 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -2,10 +2,9 @@ import { Collapsible, Flex, Tooltip } from '../../components'; import { isJobOrNameMatch, } from './helpers'; -import { useBackend, useLocalState } from '../../backend'; import { OrbitItem } from './OrbitItem'; import { OrbitTooltip } from './OrbitTooltip'; -import { Observable, OrbitData } from './types'; +import { Observable } from './types'; type Props = { color?: string; diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index fb17035c3b4d..524aa96a97e8 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -2,7 +2,6 @@ import { multiline } from '../../../common/string'; import { useBackend, useLocalState } from '../../backend'; import { - Box, Button, Divider, Flex, @@ -12,7 +11,7 @@ import { } from '../../components'; import { Window } from '../../layouts'; -import { searchFor, compareString, compareNumberedText } from './helpers' +import { searchFor } from './helpers' import { OrbitData } from './types'; import { OrbitContent } from './OrbitContent'; From 7d4c006b035af63b4339f14a4fa75591498aafc2 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 21 Jul 2024 06:59:01 -0500 Subject: [PATCH 005/212] prettier --- .../tgui/interfaces/Orbit/OrbitContent.tsx | 9 +----- .../tgui/interfaces/Orbit/OrbitItem.tsx | 15 ++-------- .../tgui/interfaces/Orbit/OrbitSection.tsx | 6 ++-- .../packages/tgui/interfaces/Orbit/helpers.ts | 9 ++---- tgui/packages/tgui/interfaces/Orbit/index.tsx | 29 +++++++------------ 5 files changed, 20 insertions(+), 48 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index 0e0d09c6ebef..d4cbc08632a6 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -1,13 +1,7 @@ import { toTitleCase } from 'common/string'; import { useBackend } from '../../backend'; -import { - NoticeBox, - Section, - Stack, - Table, - Tooltip, -} from '../../components'; +import { NoticeBox, Section, Stack, Table, Tooltip } from '../../components'; import { getAntagCategories } from './helpers'; import { AntagGroup, Observable, OrbitData } from './types'; @@ -24,7 +18,6 @@ export function OrbitContent(props, context) { const { antagonists = [], critical = [] } = data; const { searchText, autoObserve } = props; - let antagGroups: AntagGroup[] = []; if (antagonists.length) { antagGroups = getAntagCategories(antagonists); diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx index 6c4205cbf892..957104afa8b9 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx @@ -1,10 +1,5 @@ import { useBackend } from '../../backend'; -import { - Stack, - Button, - Flex, - Icon -} from '../../components'; +import { Stack, Button, Flex, Icon } from '../../components'; import { capitalizeFirst } from 'common/string'; @@ -27,7 +22,6 @@ export const OrbitItem = (props: Props, context) => { const selected = ref === orbiting?.ref; const validIcon = !!job && !!icon && icon !== 'hudunknown'; - return ( { display: 'flex', }} > - ); -} +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index 4291ea7665f8..6a3bbc37eac5 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -1,7 +1,5 @@ import { Collapsible, Flex, Tooltip } from '../../components'; -import { - isJobOrNameMatch, -} from './helpers'; +import { isJobOrNameMatch } from './helpers'; import { OrbitItem } from './OrbitItem'; import { OrbitTooltip } from './OrbitTooltip'; import { Observable } from './types'; @@ -22,7 +20,7 @@ export function OrbitSection(props: Props) { const { color, section = [], title, searchQuery, autoObserve } = props; const filteredSection = section.filter((observable) => - isJobOrNameMatch(observable, searchQuery), + isJobOrNameMatch(observable, searchQuery) ); if (!filteredSection.length) { diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index ed154d3b58e5..2336dbc5cfdd 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -40,10 +40,7 @@ export function getDisplayName(full_name: string, nickname?: string): string { } /** Displays color for buttons based on the health or orbiter count. */ -export function getDisplayColor( - item: Observable, - override?: string, -): string { +export function getDisplayColor(item: Observable, override?: string): string { const { job, health, orbiters } = item; // Things like blob camera, etc @@ -56,7 +53,7 @@ export function getDisplayColor( return 'grey'; } - return getHealthColor(health); + return getHealthColor(health); } /** Returns the display color for certain health percentages */ @@ -74,7 +71,7 @@ function getHealthColor(health: number): string { /** Checks if a full name or job title matches the search. */ export function isJobOrNameMatch( observable: Observable, - searchQuery: string, + searchQuery: string ): boolean { if (!searchQuery) return true; diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index 524aa96a97e8..85d02bd1e048 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -1,17 +1,9 @@ - import { multiline } from '../../../common/string'; import { useBackend, useLocalState } from '../../backend'; -import { - Button, - Divider, - Flex, - Icon, - Input, - Section, -} from '../../components'; +import { Button, Divider, Flex, Icon, Input, Section } from '../../components'; import { Window } from '../../layouts'; -import { searchFor } from './helpers' +import { searchFor } from './helpers'; import { OrbitData } from './types'; import { OrbitContent } from './OrbitContent'; @@ -19,7 +11,11 @@ export const Orbit = (props, context) => { const { act, data } = useBackend(context); const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - const [autoObserve, setAutoObserve] = useLocalState(context, 'autoObserve', false); + const [autoObserve, setAutoObserve] = useLocalState( + context, + 'autoObserve', + false + ); function orbitMostRelevant() { const mostRelevant = [ @@ -29,15 +25,14 @@ export const Orbit = (props, context) => { data.dead, data.npcs, data.misc, - data.ships + data.ships, ] .flat() .filter(searchFor(searchText)) .sort()[0]; - if (mostRelevant !== undefined) { - act('orbit', { ref: mostRelevant.ref - }); + if (mostRelevant !== undefined) { + act('orbit', { ref: mostRelevant.ref }); } } @@ -84,9 +79,7 @@ export const Orbit = (props, context) => {
- + ); From d0ce67a8ae1d59119db54982279f50a4c3a8c67f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 21 Jul 2024 07:10:47 -0500 Subject: [PATCH 006/212] removes some cruft vars --- code/__HELPERS/unsorted.dm | 66 +--------------------- code/modules/admin/player_panel.dm | 2 +- code/modules/admin/verbs/adminjump.dm | 2 +- code/modules/cargo/centcom_podlauncher.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 4 +- 5 files changed, 6 insertions(+), 70 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c1e8f9a8cad7..f8fe37170864 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -294,70 +294,6 @@ Turf and target are separate in case you want to teleport some distance from a t /proc/ionnum() return "[pick("!","@","#","$","%","^","&")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" -//Returns a list of all items of interest with their name -/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE, only_realname = FALSE) - var/list/mobs = sortmobs() - var/list/namecounts = list() - var/list/pois = list() - for(var/mob/M in mobs) - if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !iscameramob(M) && !ismegafauna(M)) - continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins - continue - var/name = "" - if(only_realname) - name = avoid_assoc_duplicate_keys(M.real_name, namecounts) - else - name = avoid_assoc_duplicate_keys(M.name, namecounts) + M.get_realname_string() - - if(M.stat == DEAD && specify_dead_role) - if(isobserver(M)) - name += " \[ghost\]" - else - name += " \[dead\]" - pois[name] = M - - if(!mobs_only) - for(var/atom/A in SSpoints_of_interest.other_points_of_interest) - if(!A || !A.loc) - continue - pois[avoid_assoc_duplicate_keys(A.name, namecounts)] = A - - return pois - -//Orders mobs by type then by name -/proc/sortmobs() - var/list/moblist = list() - var/list/sortmob = sortNames(GLOB.mob_list) - for(var/mob/living/silicon/ai/M in sortmob) - moblist.Add(M) - for(var/mob/camera/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/pai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/human/M in sortmob) - moblist.Add(M) - for(var/mob/living/brain/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) - moblist.Add(M) - for(var/mob/dead/observer/M in sortmob) - moblist.Add(M) - for(var/mob/dead/new_player/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/monkey/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_animal/slime/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_animal/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/true_devil/M in sortmob) - moblist.Add(M) - return moblist - // Format a power value in W, kW, MW, or GW. /proc/DisplayPower(powerused) if(powerused < 1000) //Less than a kW @@ -389,7 +325,7 @@ Turf and target are separate in case you want to teleport some distance from a t /proc/get_mob_by_ckey(key) if(!key) return - var/list/mobs = sortmobs() + var/list/mobs = SSpoints_of_interest.get_mob_pois() for(var/mob/M in mobs) if(M.ckey == key) return M diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index cf834c9f9c5d..2e502148871a 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -216,7 +216,7 @@ "} - var/list/mobs = sortmobs() + var/list/mobs = SSpoints_of_interest.get_mob_pois() var/i = 1 for(var/mob/M in mobs) if(M.ckey) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 9b84224317a9..708448cf52cd 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -140,7 +140,7 @@ usr.forceMove(M.loc) SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/sendmob(mob/M in sortmobs()) +/client/proc/sendmob(mob/M in SSpoints_of_interest.get_mob_pois()) set category = "Admin.Game" set name = "Send Mob" if(!src.holder) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index dfec659e1644..0b302925e10e 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -383,7 +383,7 @@ if (specificTarget) specificTarget = null return - var/list/mobs = getpois()//code stolen from observer.dm + var/list/mobs = SSpoints_of_interest.get_mob_pois() var/inputTarget = input("Select a mob! (Smiting does this automatically)", "Target", null, null) as null|anything in mobs if (isnull(inputTarget)) return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index f727d04d4aa4..71a84131bc6d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -503,7 +503,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/list/dest = list() //List of possible destinations (mobs) var/target = null //Chosen target. - dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list + dest += SSpoints_of_interest.get_mob_pois() target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest if (!target)//Make sure we actually have a target @@ -856,7 +856,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Observe" set category = "Ghost" - var/list/creatures = getpois() + var/list/creatures = SSpoints_of_interest.get_mob_pois() reset_perspective(null) From 816d8c07318d5517807d736617fd57d767a3dd23 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 16:52:46 -0500 Subject: [PATCH 007/212] const instead of functions --- tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/helpers.ts | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index d4cbc08632a6..df04bf4e4334 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -13,7 +13,7 @@ type ContentSection = { color?: string; }; -export function OrbitContent(props, context) { +export const OrbitContent(props, context) => { const { act, data } = useBackend(context); const { antagonists = [], critical = [] } = data; const { searchText, autoObserve } = props; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index 6a3bbc37eac5..e716d2cde78c 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -16,7 +16,7 @@ type Props = { * Displays a collapsible with a map of observable items. * Filters the results if there is a provided search query. */ -export function OrbitSection(props: Props) { +export const OrbitSection(props: Props) => { const { color, section = [], title, searchQuery, autoObserve } = props; const filteredSection = section.filter((observable) => diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx index 4d1c73f32c5d..565996cc8de5 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx @@ -6,7 +6,7 @@ type Props = { }; /** Displays some info on the mob as a tooltip. */ -export function OrbitTooltip(props: Props) { +export const OrbitTooltip(props: Props) => { const { item } = props; const { extra, name, full_name, health, job } = item; diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index 2336dbc5cfdd..275140070139 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -6,7 +6,7 @@ import { AntagGroup, Antagonist, Observable } from './types'; const PATTERN_NUMBER = / \(([0-9]+)\)$/; /** Return a map of strings with each antag in its antag_category */ -export function getAntagCategories(antagonists: Antagonist[]): AntagGroup[] { +export const getAntagCategories(antagonists: Antagonist[]): AntagGroup[] => { const categories = new Map(); for (const player of antagonists) { @@ -31,7 +31,7 @@ export function getAntagCategories(antagonists: Antagonist[]): AntagGroup[] { } /** Returns a disguised name in case the person is wearing someone else's ID */ -export function getDisplayName(full_name: string, nickname?: string): string { +export const getDisplayName(full_name: string, nickname?: string): string => { if (!nickname) { return full_name; } @@ -40,7 +40,7 @@ export function getDisplayName(full_name: string, nickname?: string): string { } /** Displays color for buttons based on the health or orbiter count. */ -export function getDisplayColor(item: Observable, override?: string): string { +export const getDisplayColor(item: Observable, override?: string): string => { const { job, health, orbiters } = item; // Things like blob camera, etc @@ -57,7 +57,7 @@ export function getDisplayColor(item: Observable, override?: string): string { } /** Returns the display color for certain health percentages */ -function getHealthColor(health: number): string { +const getHealthColor(health: number): string => { switch (true) { case health > HEALTH.Good: return 'good'; @@ -69,10 +69,10 @@ function getHealthColor(health: number): string { } /** Checks if a full name or job title matches the search. */ -export function isJobOrNameMatch( +export const isJobOrNameMatch( observable: Observable, searchQuery: string -): boolean { +): boolean => { if (!searchQuery) return true; const { full_name, job } = observable; From 6e917061cd3cf773f614c17c17c94dbdce77346d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 16:56:58 -0500 Subject: [PATCH 008/212] oops had the syntax wrong on the const, was still using func syntax --- tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/helpers.ts | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index df04bf4e4334..e4a3c548ddee 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -13,7 +13,7 @@ type ContentSection = { color?: string; }; -export const OrbitContent(props, context) => { +export const OrbitContent = (props, context) => { const { act, data } = useBackend(context); const { antagonists = [], critical = [] } = data; const { searchText, autoObserve } = props; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index e716d2cde78c..950a6a9336be 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -16,7 +16,7 @@ type Props = { * Displays a collapsible with a map of observable items. * Filters the results if there is a provided search query. */ -export const OrbitSection(props: Props) => { +export const OrbitSection = (props: Props) => { const { color, section = [], title, searchQuery, autoObserve } = props; const filteredSection = section.filter((observable) => diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx index 565996cc8de5..9385e0a51ada 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx @@ -6,7 +6,7 @@ type Props = { }; /** Displays some info on the mob as a tooltip. */ -export const OrbitTooltip(props: Props) => { +export const OrbitTooltip = (props: Props) => { const { item } = props; const { extra, name, full_name, health, job } = item; diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index 275140070139..f3a730f04682 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -6,7 +6,7 @@ import { AntagGroup, Antagonist, Observable } from './types'; const PATTERN_NUMBER = / \(([0-9]+)\)$/; /** Return a map of strings with each antag in its antag_category */ -export const getAntagCategories(antagonists: Antagonist[]): AntagGroup[] => { +export const getAntagCategories = (antagonists: Antagonist[]): AntagGroup[] => { const categories = new Map(); for (const player of antagonists) { @@ -31,7 +31,7 @@ export const getAntagCategories(antagonists: Antagonist[]): AntagGroup[] => { } /** Returns a disguised name in case the person is wearing someone else's ID */ -export const getDisplayName(full_name: string, nickname?: string): string => { +export const getDisplayName = (full_name: string, nickname?: string): string => { if (!nickname) { return full_name; } @@ -40,7 +40,7 @@ export const getDisplayName(full_name: string, nickname?: string): string => { } /** Displays color for buttons based on the health or orbiter count. */ -export const getDisplayColor(item: Observable, override?: string): string => { +export const getDisplayColor = (item: Observable, override?: string): string => { const { job, health, orbiters } = item; // Things like blob camera, etc @@ -57,7 +57,7 @@ export const getDisplayColor(item: Observable, override?: string): string => { } /** Returns the display color for certain health percentages */ -const getHealthColor(health: number): string => { +const getHealthColor = (health: number): string => { switch (true) { case health > HEALTH.Good: return 'good'; @@ -69,7 +69,7 @@ const getHealthColor(health: number): string => { } /** Checks if a full name or job title matches the search. */ -export const isJobOrNameMatch( +export const isJobOrNameMatch = ( observable: Observable, searchQuery: string ): boolean => { From 28d48d1d73762f7fd776f30dffffd6da8eb3e45b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 17:01:44 -0500 Subject: [PATCH 009/212] this? --- .../tgui/interfaces/Orbit/OrbitContent.tsx | 2 +- .../tgui/interfaces/Orbit/OrbitSection.tsx | 2 +- .../tgui/interfaces/Orbit/OrbitTooltip.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/helpers.ts | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index e4a3c548ddee..f3c59a75e189 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -95,4 +95,4 @@ export const OrbitContent = (props, context) => { ); -} +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index 950a6a9336be..7963b113538b 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -62,4 +62,4 @@ export const OrbitSection = (props: Props) => { ); -} +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx index 9385e0a51ada..92f4741cd92b 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx @@ -54,4 +54,4 @@ export const OrbitTooltip = (props: Props) => { ); -} +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index f3a730f04682..e502446e855c 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -28,7 +28,7 @@ export const getAntagCategories = (antagonists: Antagonist[]): AntagGroup[] => { }); return sorted; -} +}; /** Returns a disguised name in case the person is wearing someone else's ID */ export const getDisplayName = (full_name: string, nickname?: string): string => { @@ -37,7 +37,7 @@ export const getDisplayName = (full_name: string, nickname?: string): string => } return nickname; -} +}; /** Displays color for buttons based on the health or orbiter count. */ export const getDisplayColor = (item: Observable, override?: string): string => { @@ -54,10 +54,10 @@ export const getDisplayColor = (item: Observable, override?: string): string => } return getHealthColor(health); -} +}; /** Returns the display color for certain health percentages */ -const getHealthColor = (health: number): string => { +const getHealthColor = (health: number): string => { switch (true) { case health > HEALTH.Good: return 'good'; @@ -66,13 +66,13 @@ const getHealthColor = (health: number): string => { default: return 'bad'; } -} +}; /** Checks if a full name or job title matches the search. */ export const isJobOrNameMatch = ( observable: Observable, searchQuery: string -): boolean => { +): boolean => { if (!searchQuery) return true; const { full_name, job } = observable; @@ -82,7 +82,7 @@ export const isJobOrNameMatch = ( job?.toLowerCase().includes(searchQuery?.toLowerCase()) || false ); -} +}; export const searchFor = (searchText) => createSearch(searchText, (thing) => thing.name); From 65db0ec93949bbab596b59a3e02160326c52045f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 17:03:44 -0500 Subject: [PATCH 010/212] small fix to syntax --- tgui/packages/tgui/interfaces/Orbit/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index 85d02bd1e048..05ce4e2539f5 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -17,7 +17,7 @@ export const Orbit = (props, context) => { false ); - function orbitMostRelevant() { + const orbitMostRelevant = () => { const mostRelevant = [ data.antagonists, data.alive, @@ -34,7 +34,7 @@ export const Orbit = (props, context) => { if (mostRelevant !== undefined) { act('orbit', { ref: mostRelevant.ref }); } - } + }; return ( From 32a5652cd8393dcd66bd664ae294689d9278366e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 20:32:11 -0500 Subject: [PATCH 011/212] dont add points of intrest twice please --- .../living/simple_animal/friendly/drone/drones_as_items.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index 4afdf9110e65..76dc1f095009 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -30,11 +30,6 @@ var/area/A = get_area(src) if(A) notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE) - SSpoints_of_interest.make_point_of_interest(src) - -/obj/effect/mob_spawn/drone/Destroy() - SSpoints_of_interest.remove_point_of_interest(src) - . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/effect/mob_spawn/drone/attack_ghost(mob/user) From 3aa25706e6ebae5dadd00b2c5caf1b6305358542 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 21:28:03 -0500 Subject: [PATCH 012/212] fixes player panel --- code/modules/admin/player_panel.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 2e502148871a..99be308aa183 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -218,7 +218,8 @@ var/list/mobs = SSpoints_of_interest.get_mob_pois() var/i = 1 - for(var/mob/M in mobs) + for(var/mob_name in mobs) + var/mob/M = mobs[mob_name] if(M.ckey) var/color = "#e6e6e6" From 13a3ff696cd857a28ead32b623fd8a0bf8dc243f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 10 Aug 2024 21:36:59 -0500 Subject: [PATCH 013/212] some player panel cruft and removes some random helms from centcomm --- _maps/map_files/generic/CentCom.dmm | 12 ++++++------ code/modules/admin/player_panel.dm | 7 +------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 2f531a149ffe..d8a62a9f5cbf 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -26,7 +26,7 @@ /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) "afh" = ( -/obj/machinery/computer/helm{ +/obj/machinery/computer{ dir = 4 }, /obj/effect/turf_decal/industrial/warning{ @@ -1356,7 +1356,7 @@ /turf/open/floor/plasteel, /area/wizard_station) "ara" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /turf/open/floor/plasteel, /area/wizard_station) "ard" = ( @@ -3940,7 +3940,7 @@ /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) "aLP" = ( -/obj/machinery/computer/helm{ +/obj/machinery/computer{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -8846,7 +8846,7 @@ }, /area/centcom) "gFU" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /obj/effect/turf_decal/industrial/warning{ dir = 6 }, @@ -12249,7 +12249,7 @@ /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) "nEL" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /obj/effect/turf_decal/industrial/warning{ dir = 10 }, @@ -15797,7 +15797,7 @@ /turf/open/floor/plasteel/dark, /area/ctf) "vcL" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /obj/effect/turf_decal/corner/transparent/bar, /obj/effect/turf_decal/corner/transparent/bar{ dir = 1 diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 99be308aa183..e5888f8088df 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -255,12 +255,7 @@ M_job = "Silicon-based" else if(isanimal(M)) //simple animals - if(iscorgi(M)) - M_job = "Corgi" - else if(isslime(M)) - M_job = "slime" - else - M_job = "Animal" + M_job = "Animal" else M_job = "Living" From d29a2b2a27153a9ac699c1a77624ac108e47016b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 11 Aug 2024 21:01:52 -0500 Subject: [PATCH 014/212] small tweaks --- code/modules/mob/dead/observer/orbit.dm | 3 ++- tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 958021f7801d..eb1c54df7934 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -74,7 +74,8 @@ var/number_of_orbiters = length(mob_poi.get_all_orbiters()) serialized["ref"] = REF(mob_poi) - serialized["full_name"] = name + serialized["full_name"] = mob_poi.name + serialized["job"] = mob_poi.job if(number_of_orbiters) serialized["orbiters"] = number_of_orbiters diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index 7963b113538b..b81ba27c1f27 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -24,7 +24,7 @@ export const OrbitSection = (props: Props) => { ); if (!filteredSection.length) { - return; + return <>; } return ( diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx index 92f4741cd92b..0a941dcb0fb5 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx @@ -35,11 +35,11 @@ export const OrbitTooltip = (props: Props) => { {name} )} {!!full_name && ( - {full_name} - )} - {!!job && !antag && ( - {job} + + {full_name} + )} + {!!job && {job}} {!!antag && ( {antag} )} From 5e15cdaa3c03448c3ca460dd430a2a8317366169 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 30 Aug 2024 10:18:14 -0500 Subject: [PATCH 015/212] Revert "Revert "orbit menu is less cluttered" (#3218)" This reverts commit 08a4dbfdd5ddd12746bf1904210b5c2dade1ecd5. --- code/__HELPERS/unsorted.dm | 9 +++++++-- code/modules/mob/dead/observer/observer.dm | 1 - code/modules/mob/dead/observer/orbit.dm | 4 +++- tgui/packages/tgui/interfaces/Orbit.js | 2 ++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c8c7b63d0a09..d6b048de4289 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -295,7 +295,7 @@ Turf and target are separate in case you want to teleport some distance from a t return "[pick("!","@","#","$","%","^","&")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" //Returns a list of all items of interest with their name -/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE) +/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE, only_realname = FALSE) var/list/mobs = sortmobs() var/list/namecounts = list() var/list/pois = list() @@ -305,7 +305,11 @@ Turf and target are separate in case you want to teleport some distance from a t continue if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins continue - var/name = avoid_assoc_duplicate_keys(M.name, namecounts) + M.get_realname_string() + var/name = "" + if(only_realname) + name = avoid_assoc_duplicate_keys(M.real_name, namecounts) + else + name = avoid_assoc_duplicate_keys(M.name, namecounts) + M.get_realname_string() if(M.stat == DEAD && specify_dead_role) if(isobserver(M)) @@ -321,6 +325,7 @@ Turf and target are separate in case you want to teleport some distance from a t pois[avoid_assoc_duplicate_keys(A.name, namecounts)] = A return pois + //Orders mobs by type then by name /proc/sortmobs() var/list/moblist = list() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6fffc48e76a1..9d8e063037e6 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -496,7 +496,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(isobserver(usr)) //Make sure they're an observer! - var/list/dest = list() //List of possible destinations (mobs) var/target = null //Chosen target. diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 86d54577538c..da3bc7c2dfb5 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -57,7 +57,7 @@ var/list/misc = list() var/list/npcs = list() - var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE) + var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE, only_realname = TRUE) for (var/name in pois) var/list/serialized = list() serialized["name"] = name @@ -67,6 +67,8 @@ serialized["ref"] = REF(poi) var/mob/M = poi + + serialized["fake_name"] = M.name if (istype(M)) if (isobserver(M)) ghosts += list(serialized) diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js index 91bf9d1f7929..c34dccacf367 100644 --- a/tgui/packages/tgui/interfaces/Orbit.js +++ b/tgui/packages/tgui/interfaces/Orbit.js @@ -54,6 +54,7 @@ const BasicSection = (props, context) => { {things.map((thing) => (
FTW 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 literal 0 HcmV?d00001 diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8a1d7f06e561f2297223e795f8cc807808973fd1 GIT binary patch literal 1782 zcmZXVdsI_b7RGM~FF~51#tK@(Qv^l8zz|AIkOI?K5lRp&BBE3%C~t*Gk((%p6tK0e zyabX~E$jzFh248;yfe%?ZSlZ7k0Md#}Wqrh{F?-Vr-A(kj*0? zF*mQ7O!6o7lMb4ejQ!a0V}L26lIv7Xmbz!>kgOUiw%yLjA=U13bRl$TPt)nW^cu~5 z2In_Encr4)Y9NCr-jX%?V)}8mlcbNuXIEaR^qRV1mHp_pN}re4G0S>sVSY#vovr(E zbFjHco0nfWOSkW}@b+mn+k2#2kC(nzF|Q3gcc}mA)5y9%0YIyY?s*`9S@ODMF!`1P z-qSI{kXbZ=fXNvWN=HTTn~2;VR~{rY3^Dq8YY@jN5ASg`^Rt&b{xoTo_EE2uo*51w z_@qrLqo#2LQIJV)2Re(UQ&%u(Dx-Q2G+i`)m}to>o@lR>KPPfG1XaVoRQ&d+A;ztj zkr?RXZxXr(!x3EG8B(k6v2yrru;Hzfb$m^N)V#Xew@2wBwjhhb^QyP1HvZgy8fx32 zsP8P^0`c?i8ddP3oR8oc)T@r1_);7@kQr zYN=%D2l>znfoC(vZ`hOykA^reU-%|i-YA2Y(-l*BN=-Z@mI!-Otj$D zn?zO4SpLXhx>*L^L)VO&Kli}(RiZNRGbjw&&Jo-XsSC5@T~W3x-N5VjMV2N(KKW^| zIyOC$3bN@GUhy7PT7sS|J(Vg^_Rn2tlIy#1BB3c2W!P6TIk+}GQz(I&JrL(}>2?5XqXxSyo3DN;tPRH-kneA*^bd@O*B7Nd;5%WH5dj z=LfRX*guF|7>JY>v(?x&uNh3D>_eedeNLIAVP!t8?De8ZJSkc4?WI!5iS?FhiBEE_ zi{XzDyDYn)Vbaq<`Ka6x^*o4{s)GUR55*RAmZ~~6*L44PJsJ2oj|r`W?+fTng12|( zTq5SDP4st;NM@G5+;=*dyh+?Wq_5`3g7?0cKcF0D;J{SJkMtwXVjGS_I>k^6~K*3^tGY&J$5vkp@Y zrkD7KvN|<~x;Ew3v9jR3V<2CnruV5GO9bY2_6z!GdEv@q1(LyL^5}-M7dHI@HHq7}FhAkeK}=?VI}?OxQs?h<4=uKR-nXc)w{ZtF1w(kT z^PB#+z3z+{v@6H$hi+kC#m0A0m>#pCwfp_FAnZAcL9j)KOU0t|pU2e*WL=X)K(P`bemMIY&^E#&# z1(~^hL8ous`iEd{UKMv=y{C6aG|O1ZOamE~rU_zZF>JWO`IrUz^8j?O!=5~kuuK01kS2|L literal 0 HcmV?d00001 diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b6831ec9696a0c76241e0b598fbfcc9bc37a3953 GIT binary patch literal 37047 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 D3ykb8 literal 0 HcmV?d00001 diff --git a/icons/obj/guns/manufacturer/scarborough/righthand.dmi b/icons/obj/guns/manufacturer/scarborough/righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5dbfb0acfc252ca8507627db7bbd38de40eaec04 GIT binary patch literal 2625 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 literal 0 HcmV?d00001 diff --git a/icons/obj/guns/manufacturer/solararmories/48x32.dmi b/icons/obj/guns/manufacturer/solararmories/48x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..690fc5b54bdf359be7fc578383d5a7b3c4b800e1 GIT binary patch literal 8468 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 e5C{an5B~yWPULGY{ev6;00005 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 U_Cizpa{vGU07*qoM6N<$f&es&(*OVf literal 0 HcmV?d00001 diff --git a/icons/obj/guns/manufacturer/solararmories/righthand.dmi b/icons/obj/guns/manufacturer/solararmories/righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ab82dd742a66b47b956bdca22b5ae78382bf53db GIT binary patch literal 2578 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 z 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 NrmU@0s$l)*e*uiTCw>3` diff --git a/shiptest.dme b/shiptest.dme index 17389f325e20..4f6f1e910dc4 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -3043,6 +3043,7 @@ #include "code\modules\projectiles\guns\ballistic\gauss.dm" #include "code\modules\projectiles\guns\ballistic\hmg.dm" #include "code\modules\projectiles\guns\ballistic\launchers.dm" +#include "code\modules\projectiles\guns\ballistic\marksman.dm" #include "code\modules\projectiles\guns\ballistic\pistol.dm" #include "code\modules\projectiles\guns\ballistic\revolver.dm" #include "code\modules\projectiles\guns\ballistic\rifle.dm" @@ -3058,7 +3059,7 @@ #include "code\modules\projectiles\guns\energy\pulse.dm" #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm" +#include "code\modules\projectiles\guns\manufacturer\etherbor\energy_gunsword.dm" #include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" #include "code\modules\projectiles\guns\misc\bow.dm" @@ -3470,7 +3471,6 @@ #include "code\modules\vending\engineering.dm" #include "code\modules\vending\engivend.dm" #include "code\modules\vending\games.dm" -#include "code\modules\vending\liberation.dm" #include "code\modules\vending\liberation_toy.dm" #include "code\modules\vending\medical.dm" #include "code\modules\vending\medical_wall.dm" From 940415b190603569888b6a6c3b5afc80a2959f5f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 5 Jul 2024 00:45:18 -0500 Subject: [PATCH 018/212] Automatic changelog generation for PR #3176 [ci skip] --- html/changelogs/AutoChangeLog-pr-3176.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3176.yml diff --git a/html/changelogs/AutoChangeLog-pr-3176.yml b/html/changelogs/AutoChangeLog-pr-3176.yml new file mode 100644 index 000000000000..5a473427be4d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3176.yml @@ -0,0 +1,6 @@ +author: rye-rice +changes: + - {rscadd: Resprites the E-50 and gives it proper inhands now!} + - {bugfix: The Syndicate sniper rifle fires at a normal rate of fire and has the + correct recoil now.} +delete-after: true From b5f944e08c190f2639220d66eb84bfc16e2e934e Mon Sep 17 00:00:00 2001 From: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Fri, 5 Jul 2024 07:50:21 +0200 Subject: [PATCH 019/212] Makes dog beds anchored. (#3139) ## About The Pull Request Title. ## Why It's Good For The Game Mobs buckled can just. Walk with it. ## Changelog :cl: fix: Dog beds start anchored now. Mobs can no longer move while buckled. /:cl: --- code/game/objects/structures/beds_chairs/bed.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index d81e8b8ba456..6c5f46e94a3b 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -167,7 +167,7 @@ name = "dog bed" icon_state = "dogbed" desc = "A comfy-looking dog bed. You can even strap your pet in, in case the gravity turns off." - anchored = FALSE + anchored = TRUE buildstacktype = /obj/item/stack/sheet/mineral/wood buildstackamount = 10 var/mob/living/owner = null @@ -175,22 +175,18 @@ /obj/structure/bed/dogbed/ian desc = "Ian's bed! Looks comfy." name = "Ian's bed" - anchored = TRUE /obj/structure/bed/dogbed/cayenne desc = "Seems kind of... fishy." name = "Cayenne's bed" - anchored = TRUE /obj/structure/bed/dogbed/renault desc = "Renault's bed! Looks comfy. A foxy person needs a foxy pet." name = "Renault's bed" - anchored = TRUE /obj/structure/bed/dogbed/runtime desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off." name = "Runtime's bed" - anchored = TRUE /obj/structure/bed/dogbed/proc/update_owner(mob/living/M) if(owner) From 0f44b7a04de7a0348a3272c657efca5e79eac46e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 5 Jul 2024 01:09:05 -0500 Subject: [PATCH 020/212] Automatic changelog generation for PR #3139 [ci skip] --- html/changelogs/AutoChangeLog-pr-3139.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3139.yml diff --git a/html/changelogs/AutoChangeLog-pr-3139.yml b/html/changelogs/AutoChangeLog-pr-3139.yml new file mode 100644 index 000000000000..905ae3b86b6c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3139.yml @@ -0,0 +1,4 @@ +author: Sadhorizon +changes: + - {bugfix: Dog beds start anchored now. Mobs can no longer move while buckled.} +delete-after: true From b2f1473c5865cfc636c2690a9bc91ef0e251b641 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 6 Jul 2024 00:52:29 +0000 Subject: [PATCH 021/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3139.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3176.yml | 6 ------ html/changelogs/archive/2024-07.yml | 7 +++++++ 3 files changed, 7 insertions(+), 10 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3139.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3176.yml diff --git a/html/changelogs/AutoChangeLog-pr-3139.yml b/html/changelogs/AutoChangeLog-pr-3139.yml deleted file mode 100644 index 905ae3b86b6c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3139.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Sadhorizon -changes: - - {bugfix: Dog beds start anchored now. Mobs can no longer move while buckled.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3176.yml b/html/changelogs/AutoChangeLog-pr-3176.yml deleted file mode 100644 index 5a473427be4d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3176.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: rye-rice -changes: - - {rscadd: Resprites the E-50 and gives it proper inhands now!} - - {bugfix: The Syndicate sniper rifle fires at a normal rate of fire and has the - correct recoil now.} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 1eca6d179826..9f6fd5a203ad 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -13,3 +13,10 @@ - rscdel: Removed the Aegis-class generalthrax: - bugfix: Fixed Comet Trail, Molten Bubbles, and Sunset Sarsaparilla glass sprites +2024-07-06: + Sadhorizon: + - bugfix: Dog beds start anchored now. Mobs can no longer move while buckled. + rye-rice: + - rscadd: Resprites the E-50 and gives it proper inhands now! + - bugfix: The Syndicate sniper rifle fires at a normal rate of fire and has the + correct recoil now. From d3e0168a8cee548ee38d543d57bda617b67b2a7d Mon Sep 17 00:00:00 2001 From: SapphicOverload <93578146+SapphicOverload@users.noreply.github.com> Date: Mon, 8 Jul 2024 13:32:13 -0400 Subject: [PATCH 022/212] Fixes a few ships' TEG setups (#3075) ## About The Pull Request Removes the disposals chutes some TEG setups have for you to throw lit welding tools into, and replaces them with proper igniters. ## Why It's Good For The Game Having a disposals chute to throw lit welding tools into was a stop-gap solution to igniters not working, which was fixed over a year ago in #1675. ## Changelog :cl: add: Adds an igniter and button to the TEG of every ship that was missing one del: Removed the welding tool TEG chute some ships had /:cl: --- .../independent/independent_lagoon.dmm | 39 ++++++------------- .../independent/independent_shetland.dmm | 23 +---------- _maps/shuttles/inteq/inteq_talos.dmm | 11 ++++-- .../shuttles/nanotrasen/nanotrasen_gecko.dmm | 21 ++++------ 4 files changed, 28 insertions(+), 66 deletions(-) diff --git a/_maps/shuttles/independent/independent_lagoon.dmm b/_maps/shuttles/independent/independent_lagoon.dmm index 7e96d8f93b53..14823f92db63 100644 --- a/_maps/shuttles/independent/independent_lagoon.dmm +++ b/_maps/shuttles/independent/independent_lagoon.dmm @@ -930,12 +930,6 @@ }, /turf/open/floor/carpet/nanoweave/red, /area/ship/crew/canteen) -"fZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/ship/engineering) "gb" = ( /turf/open/floor/plasteel, /area/ship/hallway/fore) @@ -1150,9 +1144,6 @@ /turf/open/floor/wood, /area/ship/crew/library) "hK" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 }, @@ -2507,12 +2498,6 @@ /obj/effect/turf_decal/corner/opaque/white/diagonal, /turf/open/floor/plasteel, /area/ship/crew/canteen/kitchen) -"qq" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/ship/engineering) "qu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 @@ -3147,7 +3132,6 @@ /turf/open/floor/plasteel, /area/ship/crew/canteen/kitchen) "uV" = ( -/obj/structure/closet/radiation, /obj/machinery/firealarm/directional/west, /turf/open/floor/plating, /area/ship/engineering) @@ -5503,6 +5487,11 @@ /obj/effect/turf_decal/industrial/radiation{ dir = 10 }, +/obj/machinery/button/ignition/incinerator/atmos{ + dir = 4; + pixel_x = -27; + pixel_y = 8 + }, /turf/open/floor/plating, /area/ship/engineering) "LB" = ( @@ -5560,12 +5549,6 @@ /turf/open/floor/light, /area/ship/engineering) "Me" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/item/weldingtool, -/obj/item/weldingtool, /obj/machinery/button/door/incinerator_vent_atmos_aux{ dir = 4; pixel_x = -28; @@ -5581,6 +5564,9 @@ pixel_x = -28; pixel_y = -8 }, +/obj/machinery/computer/atmos_control/incinerator{ + dir = 4 + }, /turf/open/floor/plating, /area/ship/engineering) "Mf" = ( @@ -5610,13 +5596,11 @@ /turf/open/floor/wood, /area/ship/crew/library) "Mr" = ( -/obj/machinery/computer/atmos_control/incinerator{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, /obj/effect/turf_decal/trimline/opaque/green/arrow_ccw, +/obj/structure/closet/radiation, /turf/open/floor/plating, /area/ship/engineering) "Mx" = ( @@ -5888,6 +5872,7 @@ /area/ship/hallway/fore) "Pc" = ( /obj/machinery/air_sensor/atmos/incinerator_tank, +/obj/machinery/igniter/incinerator_atmos, /turf/open/floor/engine, /area/ship/engineering) "Pe" = ( @@ -7664,7 +7649,7 @@ Pn Bz Pn Nr -qq +Pn hK Pc FA @@ -7705,7 +7690,7 @@ eS Vc Pn VS -fZ +Pn NB cT RC diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm index 13599cc298cf..e269c70cfefa 100644 --- a/_maps/shuttles/independent/independent_shetland.dmm +++ b/_maps/shuttles/independent/independent_shetland.dmm @@ -1895,7 +1895,6 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, -/obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ship/engineering/engine) @@ -2215,12 +2214,6 @@ /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, /area/ship/hallway/fore) -"sV" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/ship/engineering/engine) "sX" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -2299,9 +2292,6 @@ "tU" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, /turf/open/floor/plating, /area/ship/engineering/engine) "tX" = ( @@ -2935,9 +2925,6 @@ pixel_x = -23; pixel_y = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /turf/open/floor/plating, /area/ship/engineering/engine) "yU" = ( @@ -4406,9 +4393,6 @@ pixel_x = -4; pixel_y = 10 }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, /turf/open/floor/engine/vacuum, /area/ship/engineering/engine) "LQ" = ( @@ -5912,11 +5896,6 @@ /turf/open/floor/plasteel/dark, /area/ship/engineering) "Zn" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/item/weldingtool/mini, /turf/open/floor/plating, /area/ship/engineering/engine) "Zr" = ( @@ -6109,7 +6088,7 @@ pr NK yP qk -sV +Zn CZ vz on diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm index 1e08e3912dc6..f5f113f79e4a 100644 --- a/_maps/shuttles/inteq/inteq_talos.dmm +++ b/_maps/shuttles/inteq/inteq_talos.dmm @@ -2961,6 +2961,11 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/dark/hidden/layer1, +/obj/machinery/button/ignition/incinerator/atmos{ + dir = 4; + pixel_x = -30; + pixel_y = 12 + }, /turf/open/floor/plasteel/tech, /area/ship/engineering/engine) "sa" = ( @@ -3419,10 +3424,10 @@ }, /obj/item/gun/ballistic/shotgun/bulldog/inteq/no_mag{ pixel_x = -8; - pixel_y = 8; + pixel_y = 8 }, /obj/item/gun/ballistic/shotgun/bulldog/inteq/no_mag{ - pixel_x = -12; + pixel_x = -12 }, /turf/open/floor/plasteel/tech/grid, /area/ship/security/armory) @@ -6310,6 +6315,7 @@ /obj/machinery/atmospherics/pipe/simple/purple/hidden{ dir = 4 }, +/obj/machinery/igniter/incinerator_atmos, /turf/open/floor/engine/vacuum, /area/ship/engineering/engine) "Ps" = ( @@ -7253,7 +7259,6 @@ }, /obj/machinery/button/door{ id = "talos_tank_burn"; - name = "Access Door Control"; pixel_x = 4; pixel_y = 21; req_access = null; diff --git a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm index 8314f17e288c..b05fd520c158 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm @@ -263,9 +263,6 @@ }, /area/ship/maintenance/starboard) "cv" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, /obj/machinery/igniter/incinerator_atmos, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -426,7 +423,6 @@ /turf/open/floor/plasteel/tech/techmaint, /area/ship/crew) "dZ" = ( -/obj/effect/spawner/lootdrop/maintenance, /obj/effect/turf_decal/ntspaceworks_big/one{ dir = 4 }, @@ -2843,9 +2839,6 @@ /turf/open/floor/plating, /area/ship/maintenance/fore) "CF" = ( -/obj/structure/disposalpipe/segment{ - dir = 8 - }, /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/engine, /area/ship/engineering/engine) @@ -4360,9 +4353,6 @@ /turf/open/floor/plasteel/tech/techmaint, /area/ship/engineering/engine) "Sv" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/machinery/power/generator{ dir = 4 }, @@ -4906,7 +4896,6 @@ /area/ship/hallway/fore) "WN" = ( /obj/machinery/atmospherics/components/binary/circulator, -/obj/structure/disposalpipe/segment, /turf/open/floor/engine, /area/ship/engineering/engine) "WR" = ( @@ -5257,9 +5246,13 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/fore) "ZS" = ( -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/industrial/hatch/yellow, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/machinery/button/ignition/incinerator/atmos{ + dir = 4; + pixel_x = -23; + pixel_y = -3 + }, /turf/open/floor/plating, /area/ship/engineering/engine) "ZX" = ( From e889628022fb04dbdafc74a3125fe266788492f7 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 12:43:25 -0500 Subject: [PATCH 023/212] Automatic changelog generation for PR #3075 [ci skip] --- html/changelogs/AutoChangeLog-pr-3075.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3075.yml diff --git a/html/changelogs/AutoChangeLog-pr-3075.yml b/html/changelogs/AutoChangeLog-pr-3075.yml new file mode 100644 index 000000000000..554ff3998800 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3075.yml @@ -0,0 +1,6 @@ +author: SapphicOverload +changes: + - {rscadd: Adds an igniter and button to the TEG of every ship that was missing + one} + - {rscdel: Removed the welding tool TEG chute some ships had} +delete-after: true From f773e440edb7b7ada654d0ea2416184c81e38979 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:34:11 -0700 Subject: [PATCH 024/212] Talos QOL Improvements (#3105) ## About The Pull Request ![talos2](https://github.com/shiptest-ss13/Shiptest/assets/60533805/f7fb731c-c2e6-4360-8c32-1375c2fe99f6) Makes some adjustments to address common issues with the Talos. - Areas have been changed so cargo no longer drops in the wings - Artificer Class II is now Honorable Artificer - Gas storage tank access buttons are restricted to Honorable Artificer - Comms and workshop have switched places - Crate shelves have been added to cargobay - Additional shuttle docks have been added on the starboard side - Added an autolathe to cargo - Removed Corpsmen ## Why It's Good For The Game Talos is a decent ship but had a few recurring problems. This fixes them. ## Changelog :cl: fix: Cargo pods no longer land in Talos maint fix: Gas tanks on the Talos have higher security fix: Talos now has an autolathe in cargo /:cl: --- _maps/configs/inteq_talos.json | 6 +- _maps/shuttles/inteq/inteq_talos.dmm | 1369 +++++++++-------- code/game/area/ship_areas.dm | 6 + .../clothing/outfits/factions/inteq.dm | 4 +- 4 files changed, 728 insertions(+), 657 deletions(-) diff --git a/_maps/configs/inteq_talos.json b/_maps/configs/inteq_talos.json index e65253ad3239..207b29eca77b 100644 --- a/_maps/configs/inteq_talos.json +++ b/_maps/configs/inteq_talos.json @@ -27,7 +27,7 @@ "officer": true, "slots": 1 }, - "Artificer Class II": { + "Honorable Artificer": { "outfit": "/datum/outfit/job/inteq/ce", "officer": true, "slots": 1 @@ -36,10 +36,6 @@ "outfit": "/datum/outfit/job/inteq/engineer", "slots": 3 }, - "Corpsman": { - "outfit": "/datum/outfit/job/inteq/paramedic", - "slots": 2 - }, "Enforcer": { "outfit": "/datum/outfit/job/inteq/security", "slots": 1 diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm index f5f113f79e4a..7a4a3bec6618 100644 --- a/_maps/shuttles/inteq/inteq_talos.dmm +++ b/_maps/shuttles/inteq/inteq_talos.dmm @@ -2,7 +2,7 @@ "ab" = ( /obj/structure/sign/number/four, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "ae" = ( /obj/structure/cable{ icon_state = "4-8" @@ -25,14 +25,14 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "ag" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 4 +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 8 }, -/obj/structure/window/reinforced/survival_pod{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/dark, +/area/ship/storage) "ak" = ( /obj/structure/cable{ icon_state = "2-8" @@ -41,25 +41,38 @@ /turf/open/floor/plasteel/tech, /area/ship/engineering) "an" = ( -/obj/machinery/telecomms/processor/preset_four{ - autolinkers = list("processor4","bus"); - network = "irmg_commnet" +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "ao" = ( +/obj/docking_port/mobile{ + dir = 2; + launch_status = 0; + port_direction = 8; + preferred_direction = 4 + }, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering/communications) +/area/ship/storage) "ap" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/industrial/outline/yellow, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/hardsuit/engine/atmos, -/obj/item/tank/jetpack/oxygen, +/obj/effect/turf_decal/trimline/opaque/yellow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/opaque/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, /turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/area/ship/storage) "as" = ( /obj/effect/turf_decal/corner/opaque/yellow, /obj/effect/turf_decal/corner/opaque/brown{ @@ -82,10 +95,19 @@ /area/ship/engineering/engine) "au" = ( /obj/machinery/light/directional/east, -/obj/effect/turf_decal/industrial/outline/yellow, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/obj/machinery/telecomms/server/presets/common{ + autolinkers = list("common","hub"); + freq_listening = list(1459); + network = "irmg_commnet" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) +"aD" = ( +/obj/machinery/computer/telecomms/monitor{ + network = "irmg_commnet" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "aH" = ( /obj/machinery/button/door{ dir = 4; @@ -167,7 +189,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "bb" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/machinery/door/airlock/grunge{ @@ -232,13 +254,11 @@ icon_state = "0-8" }, /obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/telecomms/server/presets/common{ - autolinkers = list("common","hub"); - freq_listening = list(1459); - network = "irmg_commnet" +/obj/machinery/computer/rdconsole/core{ + dir = 8 }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "bI" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -253,7 +273,7 @@ /obj/structure/mopbucket, /obj/item/reagent_containers/glass/bucket, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "bM" = ( /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /obj/machinery/door/poddoor{ @@ -277,14 +297,16 @@ /obj/effect/turf_decal/box/corners{ dir = 8 }, -/obj/structure/rack, /obj/machinery/light/directional/south, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable{ icon_state = "0-4" }, -/obj/item/pickaxe/mini, -/obj/item/pickaxe/mini, +/obj/structure/crate_shelf, +/obj/structure/closet/crate, +/obj/item/roller, +/obj/item/roller, +/obj/item/roller, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "ce" = ( @@ -326,7 +348,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "cn" = ( /obj/machinery/light/directional/south, /obj/structure/railing{ @@ -417,9 +439,6 @@ name = "waste input pump"; on = 0 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 }, @@ -445,19 +464,11 @@ /turf/open/floor/plasteel/dark, /area/ship/security) "cT" = ( -/obj/effect/turf_decal/industrial/warning/fulltile, -/obj/machinery/door/window/northleft{ - req_access_txt = "61" - }, -/obj/machinery/door/window/southright{ - req_access_txt = "61" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 +/obj/machinery/navbeacon/wayfinding{ + location = "talos_workshop" }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plasteel/tech, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/dark, +/area/ship/storage) "cV" = ( /turf/closed/wall/mineral/plastitanium, /area/ship/storage) @@ -525,7 +536,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "dw" = ( /obj/machinery/power/smes/engineering, /obj/structure/cable{ @@ -540,7 +551,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "dE" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -583,7 +594,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "ej" = ( /obj/machinery/power/smes/shuttle/precharged{ dir = 4 @@ -624,9 +635,6 @@ /turf/open/floor/plating, /area/ship/engineering) "em" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/effect/turf_decal/industrial/warning{ dir = 4 }, @@ -641,6 +649,9 @@ piping_layer = 5 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/tech, /area/ship/engineering/engine) "eu" = ( @@ -669,13 +680,16 @@ /turf/open/floor/plasteel/tech/grid, /area/ship/security/armory) "eC" = ( -/obj/structure/table, -/obj/item/mecha_parts/mecha_equipment/rcd, -/obj/item/mecha_parts/mecha_equipment/cable_layer, -/obj/item/radio/intercom/directional/west, -/obj/machinery/cell_charger, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/obj/machinery/telecomms/broadcaster/preset_right{ + autolinkers = list("broadcasterB","hub"); + network = "irmg_commnet" + }, +/obj/structure/window/reinforced/survival_pod, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) "eK" = ( /obj/effect/turf_decal/trimline/opaque/yellow/corner{ dir = 4 @@ -749,7 +763,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "fg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -778,18 +792,27 @@ /obj/structure/grille, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "fo" = ( -/obj/machinery/rnd/production/protolathe/department/engineering, /obj/machinery/camera/autoname{ dir = 9 }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/obj/machinery/telecomms/receiver/preset_right{ + autolinkers = list("receiverB","hub"); + freq_listening = list(1347,1359); + network = "irmg_commnet" + }, +/obj/structure/window/reinforced/survival_pod, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) "fr" = ( /obj/item/cigbutt, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "fC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/opaque/yellow/warning{ @@ -820,17 +843,17 @@ /area/ship/bridge) "fK" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "fN" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "fU" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "fX" = ( /obj/structure/chair/stool{ dir = 1 @@ -913,14 +936,14 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "go" = ( /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "gp" = ( /obj/effect/turf_decal/trimline/opaque/yellow/line, /obj/effect/turf_decal/siding/thinplating, @@ -956,13 +979,6 @@ }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) -"gF" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/cargo) "gG" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1061,18 +1077,7 @@ /obj/effect/turf_decal/box/corners{ dir = 4 }, -/obj/structure/closet/crate{ - name = "sandbags crate" - }, -/obj/item/storage/box/emptysandbags{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/storage/box/emptysandbags, -/obj/item/storage/box/emptysandbags{ - pixel_x = 5; - pixel_y = -5 - }, +/obj/structure/crate_shelf, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "hc" = ( @@ -1115,11 +1120,11 @@ "hm" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "hw" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "hz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/table/wood, @@ -1133,7 +1138,7 @@ pixel_y = 6 }, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "hG" = ( /obj/structure/railing{ dir = 6; @@ -1245,7 +1250,7 @@ /obj/item/cigbutt, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "im" = ( /obj/structure/railing{ dir = 4 @@ -1273,7 +1278,7 @@ dir = 4 }, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "iy" = ( /obj/effect/turf_decal/industrial/traffic{ dir = 1 @@ -1384,19 +1389,25 @@ }, /obj/item/cigbutt, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "iW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 10 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/navbeacon/wayfinding{ + location = "talos_telecomms" + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, /turf/open/floor/plasteel/dark, -/area/ship/storage) +/area/ship/engineering/communications) "iZ" = ( /obj/effect/turf_decal/trimline/opaque/yellow/corner, /obj/effect/turf_decal/siding/thinplating/corner, @@ -1442,7 +1453,7 @@ "jj" = ( /obj/structure/sign/warning/vacuum, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/port) +/area/ship/storage/port) "jl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1472,7 +1483,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "jw" = ( /obj/structure/cable{ icon_state = "1-8" @@ -1486,7 +1497,7 @@ /turf/open/floor/carpet/orange, /area/ship/bridge) "jH" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/door/firedoor/border_only, @@ -1498,17 +1509,36 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/highsecurity{ - name = "Communications"; - req_access_txt = "61" +/obj/machinery/door/airlock/engineering{ + name = "Storage Bay"; + req_access_txt = "10" }, /turf/open/floor/plasteel/tech, -/area/ship/engineering/communications) -"jJ" = ( -/obj/machinery/light/directional/east, -/obj/machinery/rnd/production/circuit_imprinter/department/engi, -/turf/open/floor/plasteel/tech/grid, /area/ship/storage) +"jJ" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/folder/syndicate{ + desc = "A slick black folder stamped 'Property of Inteq Risk Management Group.'"; + name = "folder" + }, +/obj/item/pen, +/obj/item/multitool{ + pixel_x = 12; + pixel_y = 8 + }, +/obj/machinery/light/directional/south, +/obj/item/radio/intercom/directional/north{ + dir = 4; + freerange = 1; + freqlock = 1; + frequency = 1347; + name = "IRMG shortwave intercom"; + pixel_x = 31; + pixel_y = 0 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "jP" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -1571,13 +1601,13 @@ /area/ship/hallway/central) "jW" = ( /obj/machinery/light/directional/east, -/obj/machinery/computer/telecomms/server{ - dir = 1; - network = "irmg_commnet" - }, /obj/machinery/airalarm/directional/south, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/engineering/communications) +/obj/structure/closet/toolcloset/empty, +/obj/item/rcl/pre_loaded, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/dark, +/area/ship/storage) "jX" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -1612,8 +1642,8 @@ }, /obj/item/clothing/glasses/meson, /obj/machinery/light_switch{ - pixel_x = 20; dir = 8; + pixel_x = 20; pixel_y = 11 }, /turf/open/floor/plasteel/tech/grid, @@ -1654,14 +1684,14 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate/secure/loot, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "ks" = ( /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "kD" = ( /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) @@ -1671,7 +1701,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "kM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1732,16 +1762,13 @@ /turf/open/floor/engine/hull/reinforced/interior, /area/ship/engineering/engine) "ls" = ( -/obj/machinery/telecomms/server/presets/inteq{ - autolinkers = list("inteq","hub"); - freq_listening = list(1347); - network = "irmg_commnet" - }, /obj/structure/cable{ icon_state = "1-4" }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/industrial/outline/yellow, +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "lt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, @@ -1751,9 +1778,6 @@ /turf/open/floor/plasteel/dark, /area/ship/security) "lA" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -1772,22 +1796,16 @@ /turf/open/floor/plating, /area/ship/engineering/engine) "lB" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/backpack/satchel/med, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/glasses/hud/health, -/obj/item/storage/belt/medical/webbing, -/obj/item/clothing/suit/armor/inteq/corpsman, -/obj/item/clothing/head/soft/inteq/corpsman, -/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, -/obj/item/clothing/under/syndicate/inteq/corpsman, /obj/structure/railing, /obj/effect/turf_decal/box/corners{ dir = 8 }, /obj/item/radio/intercom/directional/west, -/obj/item/storage/box/bodybags, /obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/pickaxe/mini, +/obj/item/pickaxe/mini, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "lC" = ( @@ -1815,7 +1833,7 @@ "lI" = ( /obj/structure/grille, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "lM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1833,7 +1851,7 @@ dir = 1 }, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/port) +/area/ship/storage/port) "lO" = ( /obj/structure/cable{ icon_state = "2-4" @@ -1884,7 +1902,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "mi" = ( /obj/effect/turf_decal/trimline/opaque/yellow/line{ dir = 4 @@ -1929,15 +1947,18 @@ /area/ship/security) "ms" = ( /obj/machinery/light/directional/west, -/obj/machinery/power/smes/engineering, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/structure/sign/warning/coldtemp{ - pixel_x = -32 +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 10 }, -/turf/open/floor/plating, -/area/ship/engineering/communications) +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10; + layer = 2.030 + }, +/turf/open/floor/plasteel/dark, +/area/ship/storage) "mw" = ( /obj/effect/turf_decal/borderfloor{ dir = 1 @@ -1958,18 +1979,11 @@ /turf/open/floor/plasteel/tech, /area/ship/bridge) "mz" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 9 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "mC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1999,7 +2013,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "mJ" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/machinery/atmospherics/pipe/layer_manifold{ @@ -2091,10 +2105,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/ship/crew/toilet) -"nh" = ( -/obj/structure/bed/roller, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/cargo) "nl" = ( /turf/open/floor/plasteel/grimy, /area/ship/crew) @@ -2163,17 +2173,17 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "nE" = ( /obj/structure/grille, /obj/structure/window/plasma/reinforced/plastitanium, /turf/open/floor/plating, -/area/ship/engineering/communications) +/area/ship/storage) "nF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "nH" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/turf_decal/industrial/warning/fulltile, @@ -2182,7 +2192,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "nJ" = ( /obj/effect/turf_decal/trimline/opaque/yellow/line{ dir = 4 @@ -2266,26 +2276,16 @@ "od" = ( /obj/structure/sign/warning/vacuum/external, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/cargo/port) +/area/ship/maintenance/port) "og" = ( -/obj/structure/catwalk, -/obj/structure/marker_beacon{ - picked_color = "Burgundy" - }, -/turf/open/floor/plating/airless, -/area/ship/external/dark) +/turf/closed/wall/mineral/plastitanium, +/area/ship/engineering/communications) "oi" = ( -/obj/item/storage/firstaid/medical{ - pixel_x = -5 - }, -/obj/item/storage/firstaid/regular{ - pixel_x = 5 - }, /obj/machinery/camera/autoname, /obj/machinery/status_display/shuttle{ pixel_y = 32 }, -/obj/structure/table, +/obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "om" = ( @@ -2298,9 +2298,8 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 8 }, -/obj/effect/turf_decal/trimline/opaque/yellow/warning, /turf/open/floor/plasteel/dark, -/area/ship/storage) +/area/ship/engineering/communications) "on" = ( /obj/structure/cable{ icon_state = "2-4" @@ -2389,7 +2388,7 @@ }, /obj/item/trash/popcorn, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "oG" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -2397,7 +2396,7 @@ /obj/structure/closet/cardboard, /obj/effect/spawner/lootdrop/maintenance/three, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "oR" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -2413,7 +2412,7 @@ icon_state = "1-4" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "oT" = ( /obj/structure/cable{ icon_state = "2-4" @@ -2456,7 +2455,7 @@ "oY" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "pb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/jukebox/boombox{ @@ -2464,7 +2463,7 @@ pixel_y = -11 }, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "pf" = ( /obj/structure/cable{ icon_state = "0-4" @@ -2520,7 +2519,7 @@ valve_open = 1 }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "pu" = ( /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -2561,7 +2560,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "pL" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -2626,11 +2625,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/navbeacon/wayfinding{ - location = "talos_telecomms" - }, -/turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/obj/machinery/rnd/production/protolathe/department/engineering, +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "qe" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2672,8 +2669,8 @@ dir = 4 }, /obj/machinery/light_switch{ - pixel_x = 19; dir = 8; + pixel_x = 19; pixel_y = 11 }, /turf/open/floor/plasteel/patterned/grid, @@ -2692,7 +2689,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "qr" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2707,14 +2704,14 @@ name = "Access Door Control"; pixel_x = 21; pixel_y = -6; - req_access_txt = "24" + req_access_txt = "56" }, /obj/machinery/button/shieldwallgen{ dir = 8; id = "talos_tank_air"; pixel_x = 19; pixel_y = 4; - req_access_txt = "24" + req_access_txt = "56" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -2783,8 +2780,8 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/light_switch{ - pixel_y = 23; - pixel_x = -12 + pixel_x = -12; + pixel_y = 23 }, /obj/structure/cable{ icon_state = "0-8" @@ -2833,8 +2830,8 @@ dir = 9 }, /obj/machinery/light_switch{ - pixel_x = 20; dir = 8; + pixel_x = 20; pixel_y = 11 }, /turf/open/floor/plasteel/tech, @@ -2897,7 +2894,7 @@ "rw" = ( /obj/structure/chair/comfy/grey/directional/north, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "rB" = ( /obj/effect/turf_decal/trimline/opaque/yellow/warning, /turf/open/floor/engine/hull/reinforced, @@ -2921,7 +2918,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "rP" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2963,43 +2960,27 @@ /obj/machinery/atmospherics/pipe/simple/dark/hidden/layer1, /obj/machinery/button/ignition/incinerator/atmos{ dir = 4; - pixel_x = -30; - pixel_y = 12 - }, -/turf/open/floor/plasteel/tech, -/area/ship/engineering/engine) -"sa" = ( -/obj/effect/turf_decal/box/corners, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/cargo) -"sc" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/folder/syndicate{ - desc = "A slick black folder stamped 'Property of Inteq Risk Management Group.'"; - name = "folder" - }, -/obj/item/pen, -/obj/item/multitool{ - pixel_x = 12; - pixel_y = 8 - }, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - freqlock = 1; - frequency = 1347; - name = "IRMG shortwave intercom" + pixel_x = -30; + pixel_y = 12 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering/engine) +"sa" = ( +/obj/effect/turf_decal/box/corners, +/obj/structure/cable{ + icon_state = "2-4" }, +/turf/open/floor/plasteel/patterned/cargo_one, +/area/ship/cargo) +"sc" = ( /obj/machinery/firealarm/directional/east, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/engineering/communications) +/obj/machinery/rnd/server, +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "si" = ( /obj/structure/sign/warning/vacuum, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "sl" = ( /obj/machinery/door/airlock/maintenance_hatch{ dir = 4 @@ -3011,7 +2992,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "sn" = ( /obj/structure/chair/stool{ dir = 1 @@ -3064,7 +3045,7 @@ /area/template_noop) "sy" = ( /turf/closed/wall/mineral/plastitanium, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "sA" = ( /obj/structure/table, /obj/item/folder/yellow, @@ -3081,7 +3062,7 @@ pixel_y = -32 }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "sD" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, @@ -3089,7 +3070,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "sF" = ( /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -3247,11 +3228,11 @@ icon_state = "2-8" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "ti" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "tp" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -3294,7 +3275,7 @@ "ts" = ( /obj/structure/sign/number/one, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "tu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -3306,8 +3287,14 @@ dir = 6 }, /obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 5 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, /turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/area/ship/storage) "tA" = ( /turf/closed/wall/mineral/plastitanium, /area/ship/engineering) @@ -3343,14 +3330,27 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) +"tM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 6 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office, +/turf/open/floor/plasteel/dark, +/area/ship/storage) "tO" = ( -/obj/machinery/computer/telecomms/monitor{ - dir = 1; - network = "irmg_commnet" +/obj/effect/turf_decal/siding/thinplating/dark/end{ + dir = 4 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/dark, +/area/ship/storage) "tT" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3386,13 +3386,13 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "uc" = ( /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, /turf/open/floor/carpet, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "ud" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -3446,7 +3446,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "up" = ( /obj/effect/turf_decal/industrial/traffic{ dir = 1 @@ -3471,10 +3471,10 @@ /obj/effect/turf_decal/box/corners{ dir = 1 }, -/obj/structure/closet/crate/freezer/blood, /obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, +/obj/machinery/autolathe, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "uC" = ( @@ -3501,22 +3501,17 @@ /turf/open/floor/plating, /area/ship/engineering) "uE" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/navbeacon/wayfinding{ - location = "talos_workshop" - }, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/turf/open/floor/plasteel/tech, +/area/ship/engineering/communications) "uI" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "uO" = ( /obj/effect/turf_decal/box/corners{ dir = 1 }, -/obj/machinery/iv_drip, +/obj/structure/table, +/obj/item/storage/box/cups, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "vi" = ( @@ -3524,7 +3519,7 @@ dir = 1 }, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/port) +/area/ship/storage/port) "vn" = ( /obj/effect/turf_decal/corner/opaque/yellow, /obj/effect/turf_decal/corner/opaque/brown{ @@ -3552,7 +3547,7 @@ /turf/open/floor/plasteel/grimy, /area/ship/crew) "vp" = ( -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/engineering/communications) "vv" = ( /obj/structure/cable/yellow{ @@ -3590,36 +3585,15 @@ /turf/open/floor/plasteel/showroomfloor, /area/ship/crew/toilet) "vM" = ( -/obj/structure/closet/secure_closet{ - anchored = 1; - icon_state = "ce"; - name = "artificer class II's locker"; - req_access = null; - req_access_txt = "56" - }, -/obj/item/clothing/under/syndicate/inteq/artificer, -/obj/item/clothing/under/syndicate/inteq/skirt/artificer, -/obj/item/storage/backpack/industrial, -/obj/item/clothing/suit/toggle/industrial, -/obj/item/clothing/head/hardhat/white, -/obj/item/clothing/head/beret/sec/inteq, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/mask/gas/sechailer/balaclava/inteq, -/obj/item/clothing/gloves/combat, -/obj/item/megaphone/cargo{ - name = "engineering megaphone" - }, -/obj/item/stamp/ce{ - name = "artificer class II's rubber stamp" +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 5 }, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/welding, -/obj/item/pipe_dispenser, -/obj/item/storage/belt/utility/chief{ - name = "\improper Artificer Class II's toolbelt" +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, /turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/area/ship/storage) "vP" = ( /obj/item/cigbutt, /turf/open/floor/plasteel/dark, @@ -3677,14 +3651,14 @@ /turf/open/floor/plasteel/tech, /area/ship/engineering/engine) "wb" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 8 +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 4 }, -/obj/structure/window/reinforced/survival_pod{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/dark, +/area/ship/storage) "wc" = ( /obj/structure/cable{ icon_state = "1-8" @@ -3729,10 +3703,16 @@ dir = 1 }, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/port) +/area/ship/storage/port) "wx" = ( +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, /turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/area/ship/storage) "wy" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3809,7 +3789,7 @@ "wU" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "wY" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/opaque/yellow/line{ @@ -3884,13 +3864,22 @@ "xj" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/crew/cryo) +"xk" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 4; + height = 15; + width = 15 + }, +/turf/template_noop, +/area/template_noop) "xl" = ( -/obj/machinery/telecomms/bus/preset_four{ - autolinkers = list("hub","processor4","bus"); - network = "irmg_commnet" +/obj/machinery/mech_bay_recharge_port, +/obj/machinery/status_display/shuttle{ + pixel_y = -32 }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "xn" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3921,18 +3910,17 @@ /turf/open/floor/plasteel/dark, /area/ship/engineering) "xz" = ( -/obj/machinery/telecomms/broadcaster/preset_right{ - autolinkers = list("broadcasterB","hub"); - network = "irmg_commnet" - }, -/obj/structure/window/reinforced/survival_pod{ - dir = 1 - }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/weldingtool/largetank, +/obj/item/clothing/glasses/welding, +/obj/item/multitool, +/obj/item/radio/intercom/directional/west, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "xB" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -3959,14 +3947,11 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "xI" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/crew/canteen) "xK" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -4033,10 +4018,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 }, -/obj/structure/cable/yellow, -/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/opaque/yellow/warning{ + dir = 9 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, /turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/area/ship/storage) "yj" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -4074,7 +4069,7 @@ /area/ship/hallway/central) "yp" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/port) +/area/ship/storage/port) "yq" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -4096,14 +4091,12 @@ /turf/open/floor/plating, /area/ship/engineering/engine) "yr" = ( -/obj/structure/chair/office, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, -/obj/effect/landmark/start/chief_engineer, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/obj/machinery/rnd/production/circuit_imprinter/department/engi, +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "yx" = ( /obj/structure/table/reinforced, /obj/machinery/computer/secure_data/laptop, @@ -4145,7 +4138,7 @@ icon_state = "4-8" }, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "yS" = ( /obj/structure/cable{ icon_state = "1-2" @@ -4171,7 +4164,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "zf" = ( /obj/item/storage/backpack/messenger/inteq, /obj/item/storage/backpack/messenger/inteq, @@ -4196,7 +4189,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "zh" = ( /obj/machinery/holopad/emergency/command, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -4226,8 +4219,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/ship/engineering/communications) +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/mecha_parts/mecha_equipment/rcd, +/obj/item/mecha_parts/mecha_equipment/cable_layer, +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "zu" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -4263,17 +4260,14 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 10 - }, /turf/open/floor/plasteel/dark, -/area/ship/storage) +/area/ship/engineering/communications) "zB" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate/trashcart, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "zE" = ( /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /obj/structure/cable{ @@ -4312,18 +4306,18 @@ icon_state = "2-4" }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "zR" = ( /obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/autoname{ + dir = 8 }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ +/obj/effect/turf_decal/siding/thinplating/dark{ dir = 6 }, -/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/plasteel/dark, -/area/ship/storage) +/area/ship/engineering/communications) "zT" = ( /obj/structure/chair/stool/bar{ dir = 8 @@ -4351,7 +4345,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "Ag" = ( /obj/structure/chair/stool{ dir = 1 @@ -4399,7 +4393,7 @@ /area/ship/crew/toilet) "Ap" = ( /turf/closed/wall/mineral/plastitanium, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Ar" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4; @@ -4436,7 +4430,7 @@ "AB" = ( /obj/docking_port/stationary{ dir = 4; - dwidth = 4; + dwidth = 3; height = 15; width = 6 }, @@ -4491,7 +4485,7 @@ /obj/item/mop, /obj/item/pushbroom, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "AO" = ( /obj/machinery/suit_storage_unit/inherit/industrial, /obj/item/clothing/suit/space/hardsuit/engine, @@ -4591,7 +4585,7 @@ /obj/item/clothing/suit/space/inteq, /obj/item/clothing/head/helmet/space/inteq, /turf/open/floor/plasteel/tech/grid, -/area/ship/maintenance/port) +/area/ship/storage/port) "BJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -4619,26 +4613,30 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "BP" = ( /obj/structure/cable{ icon_state = "1-4" }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "BS" = ( /obj/effect/turf_decal/box/corners{ dir = 1 }, -/obj/machinery/mineral/ore_redemption{ - dir = 4; - input_dir = 4; - output_dir = 0 - }, /obj/machinery/light_switch{ dir = 4; pixel_x = -19 }, +/obj/structure/crate_shelf, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/regular{ + pixel_x = 5 + }, +/obj/item/storage/firstaid/medical{ + pixel_x = -5 + }, +/obj/item/storage/box/bodybags, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "BY" = ( @@ -4711,7 +4709,7 @@ /obj/item/book/random, /obj/item/book/random, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "CK" = ( /obj/effect/turf_decal/industrial/warning{ dir = 8 @@ -4725,13 +4723,9 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "CP" = ( /obj/effect/turf_decal/borderfloor, -/obj/machinery/door/airlock/engineering{ - name = "Storage Bay"; - req_access_txt = "10" - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -4741,13 +4735,16 @@ /obj/machinery/door/firedoor/border_only, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/airlock/highsecurity{ + name = "Communications"; + req_access_txt = "61" + }, /turf/open/floor/plasteel/tech, -/area/ship/storage) +/area/ship/engineering/communications) "CS" = ( /obj/effect/turf_decal/box/corners{ dir = 4 }, -/obj/structure/bed/roller, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) @@ -4818,7 +4815,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/reagent_dispensers/watertank, +/obj/structure/crate_shelf, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "Ds" = ( @@ -4838,7 +4835,7 @@ dir = 1 }, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/port) +/area/ship/storage/port) "DC" = ( /obj/effect/turf_decal/box/corners, /obj/structure/closet/crate{ @@ -4858,11 +4855,12 @@ /obj/item/clothing/ears/earmuffs, /obj/item/clothing/ears/earmuffs, /obj/effect/decal/cleanable/dirt, +/obj/structure/crate_shelf, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "DO" = ( /turf/closed/wall/mineral/plastitanium, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "DQ" = ( /obj/effect/turf_decal/borderfloor{ dir = 1 @@ -4894,9 +4892,12 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "Eg" = ( -/obj/machinery/mech_bay_recharge_port, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/obj/machinery/telecomms/bus/preset_four{ + autolinkers = list("hub","processor4","bus"); + network = "irmg_commnet" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) "Ep" = ( /obj/item/trash/can, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, @@ -4909,22 +4910,23 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/item/cigbutt, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Ex" = ( /obj/structure/cable{ icon_state = "1-4" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "EC" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 +/obj/structure/window/reinforced/survival_pod, +/obj/structure/window/reinforced/survival_pod{ + dir = 4 }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "EL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -4952,7 +4954,7 @@ "Ff" = ( /obj/structure/sign/number/nine, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Fh" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable{ @@ -4960,7 +4962,7 @@ }, /obj/item/cigbutt, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "Fi" = ( /obj/structure/catwalk, /obj/effect/decal/cleanable/dirt, @@ -4970,23 +4972,17 @@ /turf/open/floor/plating/airless, /area/ship/external/dark) "Fk" = ( -/obj/structure/catwalk, -/obj/docking_port/mobile{ - dir = 2; - launch_status = 0; - port_direction = 8; - preferred_direction = 4 - }, /obj/structure/marker_beacon{ picked_color = "Burgundy" }, +/obj/structure/catwalk, /turf/open/floor/plating/airless, /area/ship/external/dark) "Fl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Fm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5100,7 +5096,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/tech/grid, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "FV" = ( /obj/structure/catwalk/over/plated_catwalk, /obj/structure/railing, @@ -5144,7 +5140,7 @@ dir = 4 }, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/port) +/area/ship/storage/port) "Gm" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/machinery/door/airlock/external, @@ -5157,7 +5153,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Gr" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 8 @@ -5195,7 +5191,7 @@ /obj/item/clothing/suit/space/inteq, /obj/item/clothing/head/helmet/space/inteq, /turf/open/floor/plasteel/tech/grid, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Gv" = ( /obj/effect/turf_decal/industrial/traffic{ dir = 1 @@ -5218,13 +5214,12 @@ /area/ship/crew/canteen) "Gz" = ( /obj/machinery/light/directional/south, -/obj/machinery/telecomms/hub{ - autolinkers = list("hub","bus","relay","messaging","inteq","common","broadcasterB","receiverB"); - id = "IRMG Communications Hub"; - network = "irmg_commnet" +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/mecha/working/ripley/cargo{ + name = "\improper APLU 'Big Boss'" }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/storage) "GA" = ( /obj/machinery/porta_turret/ship/weak{ dir = 5 @@ -5258,7 +5253,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "GR" = ( /obj/structure/bed, /obj/item/bedsheet/brown, @@ -5289,7 +5284,7 @@ icon_state = "1-8" }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "He" = ( /obj/effect/turf_decal/techfloor{ dir = 4 @@ -5315,22 +5310,24 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/robot_debris, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "Hl" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/weldingtool/largetank, -/obj/item/clothing/glasses/welding, -/obj/item/multitool, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/obj/machinery/computer/telecomms/server{ + network = "irmg_commnet" + }, +/obj/item/radio/intercom/directional/north{ + dir = 4; + pixel_x = 31; + pixel_y = 0 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "Ho" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Hp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5352,6 +5349,7 @@ /area/ship/engineering) "HD" = ( /obj/machinery/firealarm/directional/south, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "HI" = ( @@ -5384,7 +5382,7 @@ "If" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Io" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -5460,7 +5458,7 @@ /obj/item/circuitboard/machine/telecomms/message_server, /obj/item/circuitboard/machine/pacman, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "ID" = ( /obj/machinery/door/airlock/public/glass{ name = "Cryogenic Storage" @@ -5483,7 +5481,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "IJ" = ( /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -5539,7 +5537,7 @@ "Jk" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Jo" = ( /obj/structure/cable{ icon_state = "2-5" @@ -5561,16 +5559,16 @@ id = "talos_tank_fuel"; pixel_x = 19; pixel_y = 4; - req_access_txt = "24" + req_access_txt = "56" }, /obj/machinery/button/door{ - color = "red"; + color = null; dir = 8; id = "talos_tank_fuel"; - name = "Access Door Control (DANGER) (EXTREMELY DANGEROUS) (DO NOT PRESS)"; + name = "Access Door Control"; pixel_x = 21; pixel_y = -6; - req_access_txt = "24" + req_access_txt = "56" }, /obj/structure/cable{ icon_state = "1-8" @@ -5610,7 +5608,7 @@ /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "JP" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -5687,8 +5685,19 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "Kf" = ( -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/obj/effect/turf_decal/industrial/warning/fulltile, +/obj/machinery/door/window/northleft{ + req_access_txt = "61" + }, +/obj/machinery/door/window/southright{ + req_access_txt = "61" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/tech, +/area/ship/engineering/communications) "Ks" = ( /obj/structure/cable{ icon_state = "4-8" @@ -5732,7 +5741,7 @@ icon_state = "0-2" }, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "KF" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -5755,7 +5764,7 @@ dir = 4 }, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "KR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5774,7 +5783,7 @@ icon_state = "1-8" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "KY" = ( /obj/effect/turf_decal/borderfloor, /obj/machinery/door/airlock/public/glass{ @@ -5852,7 +5861,7 @@ /obj/effect/turf_decal/industrial/warning/fulltile, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "LJ" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -5903,14 +5912,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 8 +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 9 }, /turf/open/floor/plasteel/dark, -/area/ship/storage) +/area/ship/engineering/communications) "LU" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5928,16 +5937,11 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "LV" = ( -/obj/machinery/telecomms/receiver/preset_right{ - autolinkers = list("receiverB","hub"); - freq_listening = list(1347,1359); - network = "irmg_commnet" - }, -/obj/structure/window/reinforced/survival_pod{ - dir = 1 - }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/ship/engineering/communications) +/obj/machinery/autolathe, +/obj/item/stack/sheet/metal/five, +/obj/item/stack/sheet/glass/five, +/turf/open/floor/plasteel/tech/grid, +/area/ship/storage) "Ma" = ( /obj/effect/turf_decal/industrial/fire{ dir = 4 @@ -5948,6 +5952,9 @@ /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /turf/open/floor/plating, /area/ship/engineering/engine) +"Me" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/template_noop) "Mf" = ( /obj/structure/chair{ dir = 4 @@ -5999,7 +6006,7 @@ }, /obj/item/radio/intercom/directional/south, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Mx" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -6017,35 +6024,30 @@ icon_state = "0-2" }, /obj/machinery/light_switch{ - pixel_y = 23; - pixel_x = -12 + pixel_x = -12; + pixel_y = 23 }, /turf/open/floor/plasteel/tech/grid, /area/ship/security/armory) "My" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/obj/machinery/suit_storage_unit/inherit/industrial, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/clothing/suit/space/hardsuit/engine/elite, +/turf/open/floor/plasteel/tech, +/area/ship/engineering/communications) "MC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 +/obj/effect/landmark/start/chief_engineer, +/obj/structure/chair/office{ + dir = 1 }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 4 +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 }, /turf/open/floor/plasteel/dark, -/area/ship/storage) +/area/ship/engineering/communications) "MK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -6057,7 +6059,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/crate/secure/loot, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "MS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6080,7 +6082,19 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/ore_box, +/obj/structure/crate_shelf, +/obj/structure/closet/crate{ + name = "sandbags crate" + }, +/obj/item/storage/box/emptysandbags{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/item/storage/box/emptysandbags, +/obj/item/storage/box/emptysandbags{ + pixel_x = -5; + pixel_y = 5 + }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "MX" = ( @@ -6106,17 +6120,17 @@ icon_state = "2-8" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Ng" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Ni" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Nj" = ( /obj/effect/turf_decal/box/corners, /obj/machinery/button/shieldwallgen{ @@ -6134,6 +6148,7 @@ }, /obj/machinery/light/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "Nk" = ( @@ -6166,7 +6181,7 @@ }, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "NK" = ( /turf/open/floor/engine/air, /area/ship/engineering/engine) @@ -6213,19 +6228,52 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "Oc" = ( -/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "Oi" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/engineering/communications) +/obj/effect/turf_decal/trimline/opaque/yellow/line{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10; + layer = 2.030 + }, +/turf/open/floor/plasteel/dark, +/area/ship/storage) "Ok" = ( -/obj/machinery/rnd/server, +/obj/structure/closet/secure_closet{ + anchored = 1; + icon_state = "ce"; + name = "honorable artificer's locker"; + req_access_txt = "56" + }, +/obj/item/clothing/under/syndicate/inteq/artificer, +/obj/item/clothing/under/syndicate/inteq/skirt/artificer, +/obj/item/storage/backpack/industrial, +/obj/item/clothing/suit/toggle/industrial, +/obj/item/clothing/head/hardhat/white, +/obj/item/clothing/head/beret/sec/inteq, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/mask/gas/sechailer/balaclava/inteq, +/obj/item/clothing/gloves/combat, +/obj/item/megaphone/cargo{ + name = "engineering megaphone" + }, +/obj/item/stamp/ce{ + name = "honorable artificer's rubber stamp" + }, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/welding, +/obj/item/pipe_dispenser, +/obj/item/storage/belt/utility/chief{ + name = "honorable artificer's toolbelt" + }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/area/ship/engineering/communications) "Oq" = ( /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -6283,12 +6331,19 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Pf" = ( /obj/structure/catwalk, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ship/external/dark) +"Pi" = ( +/obj/structure/catwalk, +/obj/structure/marker_beacon{ + picked_color = "Burgundy" + }, +/turf/open/floor/plating/airless, +/area/ship/external/dark) "Pk" = ( /obj/machinery/door/poddoor/shutters{ dir = 4; @@ -6309,7 +6364,7 @@ /area/ship/engineering/engine) "Pp" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Pr" = ( /obj/machinery/air_sensor/atmos/incinerator_tank, /obj/machinery/atmospherics/pipe/simple/purple/hidden{ @@ -6329,7 +6384,7 @@ /obj/effect/spawner/lootdrop/maintenance/three, /obj/structure/closet/crate, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Pw" = ( /obj/machinery/porta_turret/ship/weak{ dir = 10 @@ -6360,7 +6415,7 @@ dir = 1 }, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/port) +/area/ship/storage/port) "PJ" = ( /obj/effect/turf_decal/techfloor{ dir = 1 @@ -6489,7 +6544,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "QC" = ( /obj/structure/chair/stool{ dir = 1 @@ -6518,11 +6573,8 @@ "QS" = ( /obj/structure/sign/number/eight, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "QU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 1; @@ -6542,7 +6594,7 @@ icon_state = "4-8" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "QW" = ( /obj/structure/cable{ icon_state = "2-4" @@ -6550,7 +6602,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "QZ" = ( /obj/machinery/power/shieldwallgen/atmos/roundstart{ dir = 8; @@ -6566,14 +6618,11 @@ /turf/open/floor/engine/hull/reinforced/interior, /area/ship/engineering/engine) "Rc" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 5 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "Rg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6592,14 +6641,14 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Rp" = ( /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Rs" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/structure/cable{ @@ -6612,7 +6661,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Ry" = ( /obj/structure/cable{ icon_state = "0-4" @@ -6665,16 +6714,22 @@ }, /turf/open/floor/carpet/black, /area/ship/crew/dorm) +"RO" = ( +/obj/machinery/porta_turret/ship/weak{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium, +/area/template_noop) "RT" = ( /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "RV" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/plasma, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, -/area/ship/cargo/port) +/area/ship/maintenance/port) "RW" = ( /obj/machinery/turretid/lethal{ pixel_y = 32 @@ -6693,7 +6748,7 @@ dir = 4 }, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/port) +/area/ship/storage/port) "Si" = ( /obj/effect/turf_decal/trimline/opaque/yellow/line{ dir = 1 @@ -6748,9 +6803,12 @@ /turf/open/floor/plating, /area/ship/engineering) "Su" = ( -/obj/machinery/computer/mech_bay_power_console, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/obj/machinery/telecomms/processor/preset_four{ + autolinkers = list("processor4","bus"); + network = "irmg_commnet" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) "SB" = ( /obj/structure/cable{ icon_state = "1-8" @@ -6795,7 +6853,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "SI" = ( /obj/structure/cable{ icon_state = "2-8" @@ -6818,14 +6876,15 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "SK" = ( -/obj/structure/closet/toolcloset/empty, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/electrical, -/obj/item/rcl/pre_loaded, /obj/machinery/light/directional/west, -/obj/effect/turf_decal/industrial/outline/yellow, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, /turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/area/ship/engineering/communications) "SL" = ( /obj/machinery/power/shuttle/engine/fueled/plasma{ dir = 4 @@ -6873,14 +6932,15 @@ /turf/open/floor/plasteel/tech, /area/ship/engineering/engine) "Tg" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 +/obj/structure/window/reinforced/survival_pod, +/obj/structure/window/reinforced/survival_pod{ + dir = 8 }, -/obj/effect/turf_decal/trimline/opaque/yellow/line{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "Tj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6890,7 +6950,6 @@ /area/ship/bridge) "Tq" = ( /obj/effect/turf_decal/box/corners, -/obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "TA" = ( @@ -6921,7 +6980,7 @@ icon_state = "4-8" }, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "TH" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/effect/decal/cleanable/dirt, @@ -6929,7 +6988,7 @@ /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "TK" = ( /obj/structure/window/reinforced{ dir = 4 @@ -6963,12 +7022,12 @@ "TN" = ( /obj/structure/falsewall/plastitanium, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "TO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "TS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7000,7 +7059,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/secure/loot, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Uc" = ( /obj/structure/cable{ icon_state = "1-4" @@ -7100,15 +7159,15 @@ dir = 1 }, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Uy" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "UD" = ( /turf/closed/wall/mineral/plastitanium, -/area/ship/maintenance/port) +/area/ship/storage/port) "UG" = ( /obj/machinery/button/door{ dir = 4; @@ -7139,6 +7198,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4, /turf/open/floor/plasteel/tech, /area/ship/engineering) +"UO" = ( +/obj/machinery/light/directional/south, +/turf/template_noop, +/area/template_noop) "UP" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7162,7 +7225,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "Ve" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -7183,15 +7246,12 @@ /turf/open/floor/plasteel/tech/grid, /area/ship/security/armory) "Vg" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/opaque/yellow/warning{ - dir = 1 - }, /obj/effect/decal/cleanable/oil/streak, -/turf/open/floor/plasteel/dark, -/area/ship/storage) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/engineering/communications) "Vj" = ( /obj/structure/table/reinforced, /obj/structure/sign/poster/contraband/red_rum{ @@ -7219,7 +7279,7 @@ /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "Vr" = ( /obj/item/trash/boritos, /turf/open/floor/plasteel/grimy, @@ -7230,7 +7290,7 @@ }, /obj/structure/grille, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Vz" = ( /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /turf/open/floor/plating, @@ -7310,7 +7370,7 @@ "Wd" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "We" = ( /obj/structure/cable{ icon_state = "1-2" @@ -7339,7 +7399,7 @@ "Wg" = ( /obj/structure/sign/warning/vacuum/external, /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Wh" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7356,7 +7416,7 @@ }, /obj/item/radio/intercom/directional/south, /turf/open/floor/plasteel/tech, -/area/ship/maintenance/port) +/area/ship/storage/port) "Wp" = ( /obj/structure/window/reinforced{ dir = 4 @@ -7373,7 +7433,7 @@ /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Wz" = ( /obj/machinery/computer/helm{ dir = 8 @@ -7542,7 +7602,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Yt" = ( /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -7604,7 +7664,15 @@ "YI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) +"YK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/opaque/yellow/warning, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/storage) "YU" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/structure/cable{ @@ -7615,33 +7683,34 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "YX" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "YZ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Zb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/garbage, /turf/open/floor/plating/airless, -/area/ship/cargo/port) +/area/ship/maintenance/port) "Zc" = ( -/obj/mecha/working/ripley/cargo{ - name = "\improper APLU 'Big Boss'" - }, -/obj/effect/turf_decal/industrial/outline/yellow, /obj/machinery/status_display/shuttle{ pixel_y = 32 }, -/turf/open/floor/plasteel/telecomms_floor, -/area/ship/storage) +/obj/machinery/telecomms/hub{ + autolinkers = list("hub","bus","relay","messaging","inteq","common","broadcasterB","receiverB"); + id = "IRMG Communications Hub"; + network = "irmg_commnet" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) "Zd" = ( /obj/machinery/door/airlock{ dir = 4; @@ -7668,7 +7737,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/firecloset, /turf/open/floor/plating/airless, -/area/ship/cargo/starboard) +/area/ship/maintenance/starboard) "Zj" = ( /obj/effect/turf_decal/trimline/opaque/yellow/line, /obj/effect/turf_decal/siding/thinplating, @@ -7685,7 +7754,7 @@ name = "vanguard's spare bedsheet" }, /turf/open/floor/plating, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) "Zn" = ( /obj/structure/closet/emcloset/empty{ anchored = 1; @@ -7706,7 +7775,7 @@ /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech/grid, -/area/ship/maintenance/port) +/area/ship/storage/port) "Zo" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2{ @@ -7732,15 +7801,13 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "Zu" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/obj/structure/sign/warning/coldtemp{ + pixel_x = -32 }, -/obj/machinery/autolathe, -/obj/item/stack/sheet/metal/five, -/obj/item/stack/sheet/glass/five, /turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/area/ship/engineering/communications) "ZB" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -7782,31 +7849,33 @@ /area/ship/engineering/engine) "ZU" = ( /obj/machinery/light/directional/west, -/obj/machinery/computer/rdconsole/core{ - dir = 4 +/obj/machinery/telecomms/server/presets/inteq{ + autolinkers = list("inteq","hub"); + freq_listening = list(1347); + network = "irmg_commnet" }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/storage) +/turf/open/floor/circuit/telecomms/mainframe, +/area/ship/engineering/communications) "ZV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/cardboard, /obj/effect/spawner/lootdrop/maintenance/three, /turf/open/floor/plating/airless, -/area/ship/maintenance/port) +/area/ship/storage/port) "ZY" = ( /obj/structure/cable{ icon_state = "2-4" }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, -/area/ship/maintenance/starboard) +/area/ship/storage/starboard) (1,1,1) = {" sw sw sw -sw +Pi sw sw tA @@ -7832,15 +7901,15 @@ ie sw sw sw -og +sw sw sw "} (2,1,1) = {" sw +Fk sw -sw -sw +MV sw hL OF @@ -7866,15 +7935,15 @@ pU Ar sw sw -MV +sw sw sw "} (3,1,1) = {" sw +MV sw -sw -sw +MV sw ia bM @@ -7900,15 +7969,15 @@ WH Pm sw sw -MV +sw sw sw "} (4,1,1) = {" sw +MV sw -sw -sw +MV sw vE OF @@ -7934,19 +8003,19 @@ pU pU sw sw -MV +sw sw sw "} (5,1,1) = {" sw Bd -sV -sV -sV -sV -sV -sV +vp +vp +vp +vp +vp +vp AO cj qD @@ -7964,23 +8033,23 @@ lA cF xK QU -ao -ao -ao -ao -ao +sV +sV +sV +sV +sV Pw sw "} (6,1,1) = {" -cV -sV +og +vp ZU eC Zu SK Ok -sV +vp HB MS yL @@ -8003,18 +8072,18 @@ yc ms xz ls -ao -vp +sV +cV "} (7,1,1) = {" -sV +vp Eg mz EC My LT zz -sV +vp Sj Qq ek @@ -8032,16 +8101,16 @@ bA pU lq mJ -ao +sV tu ap ag Oi xl -ao +sV "} (8,1,1) = {" -sV +vp Zc Vg Kf @@ -8070,19 +8139,19 @@ nE qc wx cT -Oi +YK Gz ao "} (9,1,1) = {" -sV +vp Su Rc Tg -Tg +aD MC zR -sV +vp jY gk iE @@ -8104,19 +8173,19 @@ nE zt vM wb -Oi +tM an -ao +sV "} (10,1,1) = {" -cV -sV +og +vp au fo Hl jJ -sV -sV +vp +vp sW sW sW @@ -8134,19 +8203,19 @@ xI pU NK NK -ao +sV yr tO LV bF -ao -vp +sV +cV "} (11,1,1) = {" sw GA -sV -sV +vp +vp sW sW sW @@ -8168,19 +8237,19 @@ xI pU NK NK -ao +sV sc jW -ao -ao +sV +sV Xa -MV +sw "} (12,1,1) = {" sw +MV sw -sw -cV +og sW zf GG @@ -8202,17 +8271,17 @@ xI pU pU pU -ao -ao -ao -vp -MV +sV +sV +sV +cV +sw +sw sw -MV "} (13,1,1) = {" sw -sw +MV sw sw sW @@ -8240,13 +8309,13 @@ An la sw sw -MV sw -MV +sw +sw "} (14,1,1) = {" sw -sw +MV sw JT sW @@ -8274,13 +8343,13 @@ qo la sw sw -MV sw -MV +sw +sw "} (15,1,1) = {" sw -sw +MV sw mU hg @@ -8308,13 +8377,13 @@ hT hT hT sw -MV sw -MV +sw +sw "} (16,1,1) = {" sw -sw +Pi sw mU Ml @@ -8342,9 +8411,9 @@ wD ot hT sw -MV sw -MV +sw +sw "} (17,1,1) = {" sw @@ -8375,10 +8444,10 @@ hT Zo Fe zw +xk +sw sw -MV sw -Fk "} (18,1,1) = {" sw @@ -8410,7 +8479,7 @@ zo NC hT sw -og +sw sw sw "} @@ -8521,7 +8590,7 @@ sw sw sw sw -sw +Me lC Ks IT @@ -8565,7 +8634,7 @@ zh jc Lc uO -gF +Ic nY ua MW @@ -8589,7 +8658,7 @@ sw sw sw sw -sw +UO lC ae bU @@ -8599,7 +8668,7 @@ WR Tj mX oi -nh +Oc iy qB Oc @@ -8657,7 +8726,7 @@ sw sw sw sw -sw +Me lC qF Zj @@ -8690,8 +8759,8 @@ sw sw sw sw -sw -sw +Me +RO lC UP gp @@ -9627,7 +9696,7 @@ sw sw sw sw -sw +jd sw sw sw diff --git a/code/game/area/ship_areas.dm b/code/game/area/ship_areas.dm index 9fab6e35b3c6..9732893523b7 100644 --- a/code/game/area/ship_areas.dm +++ b/code/game/area/ship_areas.dm @@ -464,6 +464,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "storage" sound_environment = SOUND_AREA_STANDARD_STATION +/area/ship/storage/port + name = "Port Storage Bay" + +/area/ship/storage/starboard + name = "Starboard Storage Bay" + /area/ship/storage/eva name = "EVA Storage" icon_state = "eva" diff --git a/code/modules/clothing/outfits/factions/inteq.dm b/code/modules/clothing/outfits/factions/inteq.dm index 75a36b1a3132..ee48b1872854 100644 --- a/code/modules/clothing/outfits/factions/inteq.dm +++ b/code/modules/clothing/outfits/factions/inteq.dm @@ -71,8 +71,8 @@ ///Chief Engineer /datum/outfit/job/inteq/ce - name = "IRMG - Artificer Class II" - id_assignment = "Artificer Class II" + name = "IRMG - Honorable Artificer" + id_assignment = "Honorable Artificer" job_icon = "chiefengineer" jobtype = /datum/job/chief_engineer From 18310967163be114a5cdc7c62e13359b00fd5aa9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 12:59:12 -0500 Subject: [PATCH 025/212] Automatic changelog generation for PR #3105 [ci skip] --- html/changelogs/AutoChangeLog-pr-3105.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3105.yml diff --git a/html/changelogs/AutoChangeLog-pr-3105.yml b/html/changelogs/AutoChangeLog-pr-3105.yml new file mode 100644 index 000000000000..0e792045f197 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3105.yml @@ -0,0 +1,6 @@ +author: Apogee-dev +changes: + - {bugfix: Cargo pods no longer land in Talos maint} + - {bugfix: Gas tanks on the Talos have higher security} + - {bugfix: Talos now has an autolathe in cargo} +delete-after: true From b6a2fcd72568a6acdea2a0d8b780b4eb0836a5ec Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:37:32 -0700 Subject: [PATCH 026/212] Reduces ship spawn limit for everything to 1 (#3166) ## About The Pull Request Reduces the spawn limit for every ship to 1, and makes the default limit for new ships 1. ## Why It's Good For The Game Nearly every ship was already set to a limit of 1. Making it the default just saves time. Most of the handful of ships that still had a cap of 2- mudskipper, li tieguai, and delta, for instance - were ships that would just compete for pop or nudge each other out of their niche if double-spawned, and a greater variety of ships are available to accept players after existing ones fill up than there previously were. ## Changelog :cl: balance: reduced default ship spawn limit to 1. /:cl: --- _maps/configs/independent_beluga.json | 2 +- _maps/configs/independent_mudskipper.json | 2 +- _maps/configs/independent_schmiedeberg.json | 2 +- _maps/configs/nanotrasen_gecko.json | 2 +- _maps/example_ship_config.json | 2 +- _maps/ship_config_schema.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_maps/configs/independent_beluga.json b/_maps/configs/independent_beluga.json index 6d7926a8e845..0449bc3a8cae 100644 --- a/_maps/configs/independent_beluga.json +++ b/_maps/configs/independent_beluga.json @@ -12,7 +12,7 @@ "Service" ], "starting_funds": 4000, - "limit": 2, + "limit": 1, "job_slots": { "Captain": { "outfit": "/datum/outfit/job/independent/captain", diff --git a/_maps/configs/independent_mudskipper.json b/_maps/configs/independent_mudskipper.json index 9f4cf32e0cf8..6119b39865d0 100644 --- a/_maps/configs/independent_mudskipper.json +++ b/_maps/configs/independent_mudskipper.json @@ -14,7 +14,7 @@ "SPACE" ], "map_path": "_maps/shuttles/independent/independent_mudskipper.dmm", - "limit": 2, + "limit": 1, "starting_funds": 1500, "job_slots": { "Salvage Leader": { diff --git a/_maps/configs/independent_schmiedeberg.json b/_maps/configs/independent_schmiedeberg.json index d7dd360bb1e4..e9cffc680320 100644 --- a/_maps/configs/independent_schmiedeberg.json +++ b/_maps/configs/independent_schmiedeberg.json @@ -14,7 +14,7 @@ "SUNS", "GENERAL" ], - "limit": 2, + "limit": 1, "job_slots": { "Chief Pharmacist": { "outfit": "/datum/outfit/job/independent/cmo/pharma", diff --git a/_maps/configs/nanotrasen_gecko.json b/_maps/configs/nanotrasen_gecko.json index 9ba0672f03db..01568c3c1d53 100644 --- a/_maps/configs/nanotrasen_gecko.json +++ b/_maps/configs/nanotrasen_gecko.json @@ -14,7 +14,7 @@ "Mining", "Engineering" ], - "limit": 2, + "limit": 1, "starting_funds": 5000, "job_slots": { "Captain": { diff --git a/_maps/example_ship_config.json b/_maps/example_ship_config.json index 7c34d7bc6841..0f4129fa3d5d 100644 --- a/_maps/example_ship_config.json +++ b/_maps/example_ship_config.json @@ -5,7 +5,7 @@ "prefix": "STSV", "namelists": ["GENERAL", "SPACE", "MYTHOLOGICAL", "WEAPONS"], "map_path": "_maps/shuttles/shiptest/null.dmm", - "limit": 2, + "limit": 1, "spawn_time_coeff": 1.5, "officer_time_coeff": 0.5, "job_slots": { diff --git a/_maps/ship_config_schema.json b/_maps/ship_config_schema.json index 2afd8e065170..4c29f272413d 100644 --- a/_maps/ship_config_schema.json +++ b/_maps/ship_config_schema.json @@ -134,7 +134,7 @@ "description": "The amount of ships that can be spawned in by players in a round at once.", "minimum": 0, "maximum": 100, - "default": 2 + "default": 1 }, "starting_funds":{ "title": "Ship Starting Funds", From 7942781340d8b7ed3e7de9c6756575cd9274afc0 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 13:23:25 -0500 Subject: [PATCH 027/212] Automatic changelog generation for PR #3166 [ci skip] --- html/changelogs/AutoChangeLog-pr-3166.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3166.yml diff --git a/html/changelogs/AutoChangeLog-pr-3166.yml b/html/changelogs/AutoChangeLog-pr-3166.yml new file mode 100644 index 000000000000..bff17cd8eacb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3166.yml @@ -0,0 +1,4 @@ +author: Apogee-dev +changes: + - {balance: reduced default ship spawn limit to 1.} +delete-after: true From cd08b91cd15b19c3d7f03d965705b9e27e98a246 Mon Sep 17 00:00:00 2001 From: Theos Date: Mon, 8 Jul 2024 13:39:30 -0400 Subject: [PATCH 028/212] Should fix the loadout-box-killing runtime (#3164) ## About The Pull Request invalid items in loadout = runtime = no box This should remove any loadout items that don't exist before they can try to exist (they won't) ## Why It's Good For The Game uhm box ## Changelog :cl: fix: loadout boxes will no longer sometimes not spawn /:cl: Signed-off-by: Theos --- code/modules/client/preferences_savefile.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3c3040f03906..71d968d16130 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -448,9 +448,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["equipped_gear"], equipped_gear) if(config) //This should *probably* always be there, but just in case. if(length(equipped_gear) > CONFIG_GET(number/max_loadout_items)) - to_chat(parent, "Loadout maximum items exceeded in loaded slot, Your loadout has been cleared! You had [length(equipped_gear)]/[CONFIG_GET(number/max_loadout_items)] equipped items!") + to_chat(parent, span_userdanger("Loadout maximum items exceeded in loaded slot, Your loadout has been cleared! You had [length(equipped_gear)]/[CONFIG_GET(number/max_loadout_items)] equipped items!")) equipped_gear = list() - WRITE_FILE(S["equipped_gear"] , equipped_gear) + WRITE_FILE(S["equipped_gear"], equipped_gear) + + for(var/gear in equipped_gear) + if(!(gear in GLOB.gear_datums)) + to_chat(parent, span_warning("Removing nonvalid loadout item [gear] from loadout")) + equipped_gear -= gear //be GONE + WRITE_FILE(S["equipped_gear"], equipped_gear) READ_FILE(S["feature_human_tail"], features["tail_human"]) READ_FILE(S["feature_human_ears"], features["ears"]) From 285fc751434c0a8f03332ef8eb0c00788ad411b3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 14:01:33 -0500 Subject: [PATCH 029/212] Automatic changelog generation for PR #3164 [ci skip] --- html/changelogs/AutoChangeLog-pr-3164.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3164.yml diff --git a/html/changelogs/AutoChangeLog-pr-3164.yml b/html/changelogs/AutoChangeLog-pr-3164.yml new file mode 100644 index 000000000000..cc98cad67b9c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3164.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: loadout boxes will no longer sometimes not spawn} +delete-after: true From 7f7f264fa1df1dcf0542b0b83445310218d0c281 Mon Sep 17 00:00:00 2001 From: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:39:45 +0200 Subject: [PATCH 030/212] Adds plastic flowers. (#3168) ## About The Pull Request Adds a new item, a plastic flower. It can be reskinned into all of flowers with an alt+click. Adds that item into loadout, so chars can go and have flowers as part of their drip. ![obraz](https://github.com/shiptest-ss13/Shiptest/assets/108196626/247a8051-3316-446d-9771-79c4d6bece6a) ## Why It's Good For The Game More options for character creation. ## Changelog :cl: add: Added a plastic flower - a selection of flowers to wear. Added it to the loadout too. /:cl: --- code/modules/client/loadout/loadout_hat.dm | 4 ++++ code/modules/clothing/head/misc_special.dm | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/code/modules/client/loadout/loadout_hat.dm b/code/modules/client/loadout/loadout_hat.dm index d4ab1c858f26..3d2905720f0a 100644 --- a/code/modules/client/loadout/loadout_hat.dm +++ b/code/modules/client/loadout/loadout_hat.dm @@ -121,3 +121,7 @@ /datum/gear/hat/trapper display_name = "trapper hat" path = /obj/item/clothing/head/trapper + +/datum/gear/hat/flowers + display_name = "plastic flower, pickable" + path = /obj/item/clothing/head/plastic_flower diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index c04b61563f53..24e2f95f03bd 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -367,3 +367,20 @@ if(!warped) warp_up() +/obj/item/clothing/head/plastic_flower + name = "plastic flower" + desc = "A realistic imitation of a flower. Not edible though." + icon = 'icons/obj/hydroponics/harvest.dmi' + icon_state = "poppy" + body_parts_covered = null + unique_reskin = list( + "Poppy" = "poppy", + "Sunflower" = "sunflower", + "Moonflower" = "moonflower", + "Novaflower" = "novaflower", + "Harebell" = "harebell", + "Geranium" = "geranium", + "Lily" = "lily" + ) + custom_materials = (list(/datum/material/plastic = 1000)) + From 6931783e054450680a6d103b916447eaaf7fdd98 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 14:15:11 -0500 Subject: [PATCH 031/212] Automatic changelog generation for PR #3168 [ci skip] --- html/changelogs/AutoChangeLog-pr-3168.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3168.yml diff --git a/html/changelogs/AutoChangeLog-pr-3168.yml b/html/changelogs/AutoChangeLog-pr-3168.yml new file mode 100644 index 000000000000..1a82f2fbe1e4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3168.yml @@ -0,0 +1,5 @@ +author: Sadhorizon +changes: + - {rscadd: Added a plastic flower - a selection of flowers to wear. Added it to + the loadout too.} +delete-after: true From e306ad20744d4fb1d7d17b25465e9adbab2e4c6b Mon Sep 17 00:00:00 2001 From: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:58:14 -0300 Subject: [PATCH 032/212] Makes .38 speedloaders cheaper. (#3159) ## About The Pull Request Makes .38 speedloaders cheaper 350 - 250 ## Why It's Good For The Game makes speedloaders less expensive than the gun ## Changelog :cl: balance: .38 speedloaders are cheaper /:cl: --- code/modules/cargo/packs/ammo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm index 0b77a0f00afe..a04d62059792 100644 --- a/code/modules/cargo/packs/ammo.dm +++ b/code/modules/cargo/packs/ammo.dm @@ -28,7 +28,7 @@ name = ".38 Speedloader Crate" desc = "Contains a .38 speedloader for revolvers, containing six rounds." contains = list(/obj/item/ammo_box/c38) - cost = 350 + cost = 250 /datum/supply_pack/ammo/m10mm_mag name = "10mm Stechkin Magazine Crate" From 94376b6b5068ad0b2e7b01d2cf29963aad80e160 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Mon, 8 Jul 2024 12:58:43 -0700 Subject: [PATCH 033/212] Fixes N+S Captain loadout (#3165) ## About The Pull Request I forgot to set some slots on the N+S Captain loadout to NULL, causing them to inherit normal Nanotrasen items. This PR nulls them out, making the N+S Captain effectively dressed as a Quartermaster, as he should be. ## Why It's Good For The Game bugfixes good ## Changelog :cl: fix: N+S Captains no longer spawn with Nanotrasen coats. /:cl: --- code/modules/clothing/outfits/factions/nanotrasen.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm index e93c7b4b8e52..f03c91d51a11 100644 --- a/code/modules/clothing/outfits/factions/nanotrasen.dm +++ b/code/modules/clothing/outfits/factions/nanotrasen.dm @@ -53,9 +53,13 @@ head = /obj/item/clothing/head/nanotrasen/cap/supply uniform = /obj/item/clothing/under/nanotrasen/supply/qm + suit = null + alt_suit = null dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo shoes = /obj/item/clothing/shoes/sneakers/brown glasses = /obj/item/clothing/glasses/sunglasses + gloves = null + neck = null l_hand = /obj/item/clipboard chameleon_extras = /obj/item/stamp/qm From d612e3ef64e872d52309475f7831e03db5e35987 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 15:29:50 -0500 Subject: [PATCH 034/212] Automatic changelog generation for PR #3165 [ci skip] --- html/changelogs/AutoChangeLog-pr-3165.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3165.yml diff --git a/html/changelogs/AutoChangeLog-pr-3165.yml b/html/changelogs/AutoChangeLog-pr-3165.yml new file mode 100644 index 000000000000..1578155eeb6f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3165.yml @@ -0,0 +1,4 @@ +author: Apogee-dev +changes: + - {bugfix: N+S Captains no longer spawn with Nanotrasen coats.} +delete-after: true From a36d9f9d1747dea0ec6418cef72d4ffc9746e5aa Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Mon, 8 Jul 2024 12:58:54 -0700 Subject: [PATCH 035/212] The Tip-pening (#3171) ## About The Pull Request Removes a grand majority of the station-based / bad tips from selection, and adds around 80 new ones. ## Why It's Good For The Game A lot of these old tips were no longer relevant to Shiptest's gameplay loop. These new ones are a combination of roleplay, command, combat, survival, and general gameplay tips that come from my own knowledge of in-game mechanics. ## Changelog :cl: del: Removed some irrelevant old tips of the round add: Added 80+ new tips more relevant to Shiptest's gameplay loop /:cl: --- strings/sillytips.txt | 21 +++++---- strings/tips.txt | 104 +++++++++++++++++++++++++++++++----------- 2 files changed, 89 insertions(+), 36 deletions(-) diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 192dbce6362f..165e3cbe54d6 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -5,16 +5,12 @@ When a round ends nearly everything about it is lost forever, leave your salt be Killing the entire sector isn't fun except when it is. You can win a pulse rifle from the arcade machine. Honest. Just like real life the entropy of the game can only increase with time. If things aren't on fire yet, just wait. -Completing your objectives is good practice, but the best antagonists will strive to do more than the bare minimum to really leave an impression. The more obscure and underused a game mechanic is, the less likely your victims are to be able to deal with it. Space is cold and it will quickly freeze you to death if you don't protect yourself. This isn't how thermodynamics really works but just go with it. -Blobs are weak to fire! Use a flame thrower for maximum damage! Cleanbot. -The wizard is supposed to be extremely strong in one on one combat, stop getting mad about it. Sometimes a round will just be a bust. C'est la vie. This is a game that is constantly being developed for. Expect things to be added, removed, fixed, and broken on a daily basis. It's fun to try and predict the round type from the tip of the round message. -The quartermaster is not a head of staff and will never be one. The bird remembers. Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style. Sometimes admins will just do stuff. Roll with it. @@ -23,14 +19,21 @@ Plenty of things that aren't traditionally considered weapons can still be used DEATH IS IMMINENT! This game is older than most of the people playing it. Do not go gentle into that good night. -Flashbangs can weaken blob tiles, allowing for you and the crew to easily destroy them. Just the tip? Some people are unable to read text on a game where half of it is based on text. -As the Captain, you can use a whetstone to sharpen your fancy fountain pen for extra robustness. -As the Lawyer, you are the last bastion of roleplay-focused jobs. Even the curator got a whip to go fight people with, that sellout! There are at least 11 ways to get through plastic flaps. How many can you name? FEED ME A STRAY CAT -Did you know that tossing the clown into a singularity will either increase or decrease its size by a large amount? Most items have names longer than "soap". -Demoman takes skill. Ask and you shall receive. +Top Ten Goliath Moments!!! +Sometimes your ship will randomly disappear or obliterate you or get cleaved in half or any combination of the above. Don't dock to a planet at the same time as someone else or undock as someone is docking. +Go on. Saw off those beautiful Hunter's Pride stocks. The Huntsman is watching. +The Drinkening has put countless shiptester's basic reading compehension to the test. Will you succumb? +No, going really really fast through an electric storm won't render you immune. +None of you would survive the uptime drought. +Innumberable frontiersmen have died valiantly in a subshuttle chokepoint attempting to board. Sometimes, a direct subshuttle dock isn't the best tactical move. +Full-body prosthesis are still biological and have normal blood. Don't pump a full bag of coolant into their veins, you. +The shotgun may never miss, but it has low armour penetration with buckshot. +When your gun gives off a pathetic click, it's out of ammo. Mashing the trigger more in a panic won't restore your ammo. +The Trabuco is a crime against the Huntsman and the universe. There's a possibility it'll kill either yourself, your crew, the target, or all of the above. +Don't be the captain found dead in a pit, legioned, with 600 brute and every bone in their body broken. diff --git a/strings/tips.txt b/strings/tips.txt index 6a8c54086d94..85eda2e01283 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -19,33 +19,26 @@ You can screwdriver any non-chemical grenade to shorten fuses from 5 seconds, to If you find yourself in a fistfight with another player, staying on the offensive is usually the smart move. Running away often won't accomplish much. Different weapons have different strengths. Some weapons, such as spears, floor tiles, and throwing stars, deal more damage when thrown compared to when attacked normally. A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch. -When dealing with security, you can often get your sentence negated entirely through cooperation and deception. -Experiment with different setups of the supermatter engine to maximize output, but don't risk the crew's safety to do so! We were all new once, be patient and guide new players in the right direction. On most clothing items that go in the exosuit slot, you can put certain small items into your suit storage, such as a spraycan, your emergency oxygen tank, or a flashlight. Most job-related exosuit clothing can fit job-related items into it, such as the atmospheric technician's hardsuit/winter coat holding an RPD, or labcoats holding most medicine. If you're using hotkey mode, you can stop pulling things using H. If there's something you need from others, try asking! This game isn't singleplayer and you'd be surprised what you can get accomplished together! You'll quickly lose your interest in the game if you play to win and kill. If you find yourself doing this, take a step back and talk to people - it's a much better experience! -Felinids get temporarily distracted by laser pointers. Use this to your advantage when being pursued by one. Don't be afraid to ask for help, whether from your peers or from mentors. As the Captain, you have absolute access and control over your ship, but this does not mean that being a horrible person won't result in mutiny and a ban. A medical hardsuit can hold an entire medkit in its suit storage! -While both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body, while antitoxin only removes various toxins - but can overdose. -You can surgically implant or extract things from people's chests. This can range from putting in a bomb to pulling out an alien larva. +While both heal toxin damage, the difference between charcoal and dylovene is that charcoal will actively remove all other reagents from one's body, while dylovene only removes various toxins - but can overdose. +You can surgically implant or extract things from people's chests using either organ manipulation or cavity implant surgeries. This can range from putting in a bomb to pulling out an alien larva. Using disarm attempt will intentionally fail a surgery step. Corpses with the "...and their soul has departed" description no longer have a ghost attached to them and aren't revivable or clonable. -Treating plasmamen is not impossible! Salbutamol stops them from suffocating and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower. +Treating plasmamen is not impossible! Salbutamol stops them from suffocating and showers or stasis beds stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower. You can extract implants by holding an empty implant case in your offhand while performing the extraction step. There are dozens of chemicals that can heal, and even more that can cause harm. Experiment! Some chemicals can only be synthesized by heating up the contents with a chemical heater or manually with lighters and similar tools. You can recharge a chemical dispenser with an inducer or by replacing its cell. Water and Potassium mixed together will create an explosion, with power scaling by amount used. Don't do it. -You can eject someone from cloning early by disabling power in the room. Note that they will suffer more genetic damage and may lose vital organs from this. -Being a hulk makes you capable of dealing high melee damage, stunlocking people, and punching through walls. However, you can't fire guns, will lose your hulk status if you go into critical condition. You can take AIs out of their cores by loading them into an intelliCard, which lets you see their laws, It can also be placed into an AI system integrity restorer computer to revive and/or repair them. -You can use the mutation toxin obtained from green slimes to create various mutation toxins by mixing it with various chemicals! -You can maximize the number of uses you get out of a slime by feeding it slime steroid, created from purple slimes, while alive. You can then apply extract enhancer, created from cerulean slimes, on each extract. You can repair your cyborgs with a welding tool if they have brute damage, if they have burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil. You can reset a cyborg's module by cutting and mending the reset wire with a wire cutter. You can augment people with cyborg limbs. Augmented limbs can easily be repaired with cables and welders. @@ -55,45 +48,33 @@ As a AI, you can take pictures with your camera and upload them to newscasters. As a AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys. As a Cyborg, choose your module carefully, as only cutting and mending your reset wire will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs. As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands. -As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world! -As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds. +As a Cyborg, you are impervious to fires and heat. +As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. As a Service Cyborg, your spray can knocks people down. However, it is blocked by masks and glasses. As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. As a Medical Cyborg, you can fully perform surgery and even augment people. You can rename areas or create entirely new ones using your ship expansion permit. The chief engineer’s hardsuit is significantly better than other engineering hardsuits. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions. The supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. So will touching it with telepathy. -You can electrify grilles by placing wire "nodes" beneath them: the big seemingly unconnected bulges from a half completed wiring job. +Wire "nodes" (big, seemingly unconnected bulges from half completed wiring jobs) are able to do several things: link up thrusters to prechargers, hook up PACMAN generators, and shock grilles among other things. You can cool a supermatter crystal by spraying it with a fire extinguisher. Only for the brave! You can repair windows by using a welding tool on them while on any intent other than harm. -Don't underestimate the humble P.A.C.M.A.N. generators. A RCD can be reloaded with metal, glass or plasteel sheets instead of just compressed matter cartridges. You can unwrench a pipe regardless of the pressures of the gases inside, but if they're too high they can burst out and injure you! -ATMOS holofan projector blocks gases while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Or, use it to seal a plasmaman cloning room. +ATMOS holofan projector blocks gases while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Beware, they wear off after an amount of time highlighted by numbers on the fans. You can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer. -As a Clown, if you lose your banana peel, you can still slip people with your PDA! Honk! -As a Clown, eating bananas heals you slightly. Honk! -As a Clown, your Grail is the mineral bananium, which can be used to build you a fun and robust mech beloved by everyone. -As a Clown, you can use your stamp on a sheet of cardboard as the first step of making a honkbot. Fun for the whole crew! -As a Clown, spice your gimmicks up! Nobody likes a one-trick pony. -The null rod has anti magic functions: it makes you immune to magic. Books can be turned into a container that can store small items using wire cutters, bibles have this ability without needing to cut it. You can hack the MegaSeed Vendor to get access to more exotic seeds. These seeds can alternatively be ordered from a express console You can mutate the plants with unstable mutagen or, as an alternative, grow glowshrooms for their radium which also mutates plants to start you up! While growing plants you should look into increasing the potency of your plants. This increases the size, amount of chemicals, points gained from grinding them in the biogenerator, and lets people know you are a proficient botanist. You can create a very wide variety of food with the crafting menu. You can find it by looking for the hammer icon near your intents. You can rename custom food with a pen. -any cooked food will be much healthier than the junk food found in vendors. Having the crew routinely eating cooked will provide minor buffs. +Any cooked food will be much healthier than the junk food found in vendors. Most non-custom foods will have a secondary effect, ranging from healing you to making you move at lightspeed. Experiment! Mousetraps can be used to create bombs or booby-trap containers. -You can order contraband items from a express console without hacking it. -You can earn more cargo points by shipping back crates, liquid containers, plasma sheets, rare seeds from hydroponics, and more! -The express supply console can instantly delivers crates by drop pod. The impact will cause a small explosion as well. Every monster has a pattern you can exploit to minimize damage from the encounters. You can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage. You can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them! -As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. -As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands. As a Drone, you can ping other drones to alert them of areas in need of repair. As a Ghost, you can see the inside of a container on the ground by clicking on it. As a Ghost, you can double click on just about anything to follow it. Or just warp around! @@ -106,3 +87,72 @@ You can light a cigar on a supermatter crystal. Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth! In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity? Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles! +As the Captain of your vessel, do not neglect the responsibilities of your command. You are the anchor the crew is expected to rely upon, and not being present or authoritative will hurt the experience. +As a vessel's second in command, you have the unique position of being able to temper the behaviour of the Captain. Obey their orders, but do not be afraid to offer your own advice or shoulder some of command's responsibilities. +It is highly ill-advised to run off on your own while exploring. Many ruins and planets are perilous and a match for even experienced players, and having someone to watch your back will save you a lot of trouble. +More often that not, most ships will be apply-only. Don't be afraid to read the memo and try for an application, many captains simply want to curate a certain type of behaviour aboard their vessels. +Captaining is one of the best ways to curate a faction. Set standards, distinguish yourself and your crew, and keep them engaged, and they'll be coming back not only to your ship, but also to the faction. +Most improvised ways of providing medical aid or reviving the dead can be slow or dangerous to the person if you or your character are inexperienced with medicine. Don't be afraid to call for a medical ship if the situation is dire. +In the event most or all of your crew is incapacitated or dead, don't be afraid to ahelp to ask for a distress call. They'll be happy to get you back into the round and the medical ships will be happy as well. +Don't be afraid to ahelp if you're unsure about another player's conduct. If they're making you uncomfortable or hurting the experience, the admins would be happy to sort things out. +Many plants on sand and lava worlds are medicinal, and can stretch your supplies. +For higher tier drill contracts, its recommended to bring a toolbox, spare stock parts, and plasteel if you're not confident in your abilities. The drill is prone to running low on power or needing to be repaired if damaged. +Many weapons can get sawed off, hurting their accuracy and occasionally ammo capacity but wildly compacting them. Hunter's Pride shotguns, the Flaming Arrow, the Illestren, among others, are included. +Static anomalies will cause brain damage in close proximity. Minimize contact with them. +Gravitational anomalies (thronglers) can quickly kill if they're intense. Sometimes, a chair can be used to get close to neutralize them, but do so at your own risk. They cause heavy brute damage. +Certain anomalies like heartbeat, vein, jumper, or plasmasoul anomalies can interact with you through walls. Be careful docking to worlds with anomalies. +Safe speed for carp migrations are under 2 GM/s, for asteroids are below 3 GM/s, and for dust is below 7 GM/s. There is no safe speed for electrical storms, you need full grounding rod coverage. +You can sometimes minimize damage from electrical storms by turning off lights and preventing all source of passive light from touching the outside of the vessel. It is notoriously gimmicky, though, do so at your own risk. +Dwarf legions tend to try and run back towards you if you're too far away. Lure them in for an attack by withdrawing before they retreat again. +Brimdemons oftentimes will strike you with a single melee attack before fleeing for another beam. Back away once they're done firing to minimize chip damage. +You can examine someone twice to see which limb they're bleeding from, to administer gauze or sutures. +Vox are allergic to Ephedrine, Atropine, Epinephrine, Mannitol, Antihol, and Stimulants. Not lethal in small amounts, but it is recommended to purge these reagents if you've made a mistake. +Grinded iron or iron pills from oxygen deprivation kits can be used to slowly regenerate blood in living people, if your blood supplies are thin. +Crystal goliaths, elite mobs, and ancient goliaths give research points on dissection, varying from 5000 to 40000 depending on technology and mob. +Crystal legions and crystal goliaths are extremely dangerous up close. Try and eliminate them quickly from range with powerful firearms. +The smaller the vessel, the more throttle will effect your acceleration. If you're piloting a subshuttle, it's recommended to keep low throttle and adjust to your liking. +Plasma thrusters can allow for extreme speed, but it is recommended to conserve them. You can minimize fuel consumption by using them in small bursts with a low throttle before turning them back off. +Jackhammers can be used to quickly break down walls for breaching or salvage. +Blast doors can be taken apart for a fair amount of plasteel, if you're hurting on fuel. +Kepori have an innate ability to tackle. It can take the enemy off guard, but recommend a helmet if you're using it near walls or prone to miss. +Laser and energy weapons have a cell that can be removed with a screwdriver. If you're removing a cell from a weapon that is not in your hand (on a suit storage slot, for example), the cell will go into your hand instead of the ground. +Frontiersmen clothes and Ramzi Clique rusted red hardsuits are established pirate equipment, and you're likely to be fired upon if you wear them. Use at your own risk. +You can access the black market by building an uplink with a handheld radio, analyzer, and scanning module. It tends to have a random selection of unique items at highly varied prices. You can purchase a LTSRBT from the outpost for a more convenient delivery. +Most armour sets outside of hardsuits do not cover the limbs. Give yourself an advantage by firing on someones legs or arms to slow them down or shoot out their weapon. +You can remove prosthetics or IPC / FBP limbs with prosthetic removal surgery, even on yourself. +You can early eject the en bloc of Illestrens by not firing the last round and clicking on the rifle with your empty hand to take it out manually, for a fast and tactical reload. +The HP Shadow cannot reload all rounds at once with a speedloader, it must be reloaded one round at a time. +You can make an emergency landing by docking to an empty space if you've lost control of your speed or are about to crash into hazards. +It is safe to cross over the tile the system sun is on. Trust me, I've tried. +Acid tiles and acid from anomalies can be sprayed off with fire extinguishers. +You can extinguish yourself without walls nearby by clicking the tile you're on with your extinguisher. +It's wise to carry a pocket extinguisher on sand and lava worlds, for acid and lava respectively. +Directional firelocks can quickly minimize pressure loss from holofield failures, if your vessel lacks them. +Holofields rely on extra power being on the wire net. Make sure power load is a fair bit higher than the draw so you don't get launched into vacuum. +Elzuose are able to heal a respectable amount of damage by rooting in soil or grass. It gives a sizable mood increase, as well as charging your battery. +If you're confused about the contents of an alcoholic drink bottle, you can examine to more often than not see what it contains on the label. +If you don't feel like grinding 500 basic power cells to make potassium, you can buy chemicals from the outpost in bulk. +You can synthesize most chems by clicking certain reagents with stock parts. Examples being Iodine to Bromine with a scanning module and water into 2:1 hydrogen / oxygen with a capacitor. +Perfluorodecalin in oxygen deprivation kits convert oxygen damage to toxin damage at a very effective ratio. Just know what you're doing and be prepared to administer anti-tox chems if it is a large amount of damage. +Epi-pens contain a small amount of formaldehyde, that prevents organs from decaying while they're in a body's system. Use it to give yourself more time while reviving. +Anomalies will give two frequencies when you analyze them, a primary and a secondary, unstable frequency. The primary will neutralize, and the unstable will more often than not cause an explosion or a similar negative effect. +Landmines have 4 wires; one disarms the mind, the other deactivates the pressure plate, another blows it up, and another blows it up on a delay. +You can tamper with landmines from range by pulsing the wires with signalers. +Not everyone is from their species' homeworld. It can be common for a human to have a Kalixcian or Teceian name, for example. +It can be fun to brainstorm new characters. Give it a shot, you might like it. +You can create entire new shuttles and subshuttles with a shuttle manipulator either from RND or from the outpost. It's usually resource and money-intensive, so be prepared! +Class 3 drills are incredibly dangerous alone or in small groups, even if you're experienced with mining and combat. Bring along a larger crew or call someone willing to help if you're thinking of taking them on. +Most smaller ships can be easily made immune to electrical storms if grounding rods are spaced out around the hull. You can make some quick money from rarely-taken storm contracts. +Ripleys are able to hold up to ten crates and other miscellaneous items like PACMAN generators using a hydraulic clamp. The scrapper's favourite. +Fights can be heavily in favour of the defenders if you play your cards right. Get good angles, turn off lights to give yourself cover, and be able to fire from multiple areas. More than likely, you'll know your environment better than the attacker. +Crate shelves can be used to maximize storage in your cargo bays. No more messes for you. +You can fashion cloth into a rag to clean up your vessel if you've tracked in some blood. +Some ships might prioritize characters exclusively from a faction in their memos, and that's okay! You can experiment with new characters to join, or join / captain another ship. +Moths, if their wings are intact, have full mobility in zero gravity environments that have an atmosphere. +Vox are near-unmatched in hand-to-hand fighting; their kicks deal extra damage and hurt organs. +IPC posibrains are contained in the chest, not the head. +Shiptest has uptime on Wednesdays, Fridays, and Saturdays. +Exosuits are not as durable as they might feel, and it is still wise to take cover with them. +Turning on strafing mode on a mech for combat is wise, and allows you to keep your firing lines constantly on the enemy. +A Gygax's leg actuators drain the cell very quickly. Use sparingly. +Installing higher tier capacitors on mechs increases power efficiency on mech abilities, weapons, and idling. From ad1a5210525d99f13361b0daece980c3996aad83 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 15:43:19 -0500 Subject: [PATCH 036/212] Automatic changelog generation for PR #3171 [ci skip] --- html/changelogs/AutoChangeLog-pr-3171.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3171.yml diff --git a/html/changelogs/AutoChangeLog-pr-3171.yml b/html/changelogs/AutoChangeLog-pr-3171.yml new file mode 100644 index 000000000000..e0dc11fa2d21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3171.yml @@ -0,0 +1,5 @@ +author: generalthrax +changes: + - {rscdel: Removed some irrelevant old tips of the round} + - {rscadd: Added 80+ new tips more relevant to Shiptest's gameplay loop} +delete-after: true From b5f1f5aabfc16186683480e24891a66843b426b2 Mon Sep 17 00:00:00 2001 From: Theos Date: Mon, 8 Jul 2024 15:59:01 -0400 Subject: [PATCH 037/212] Projectiles are no longer bloodthirsty for stam/softcrit people (#3177) ## About The Pull Request replaces stat == dead check with a generic stat check because any stat above 0 means the target is incapable of doing much of anything Stamcrit now gives TRAIT_HANDS_BLOCKED like other stuns, this shouldn't do much except allow projectiles to fly over them since you can't do hands stuff in stamcrit anyway ## Why It's Good For The Game I don't WANT to fill the poor sod in the front with 500000 rubber bullets I WANT to crowd control!! ## Changelog :cl: code: People who are stunned are now more reliably passed by bullets not aimed directly at them /:cl: --- code/modules/mob/living/carbon/carbon.dm | 1 + code/modules/mob/living/carbon/status_procs.dm | 1 + code/modules/projectiles/projectile.dm | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index dd5b29059085..3ed2b86816ac 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -538,6 +538,7 @@ REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STAMINA) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA) REMOVE_TRAIT(src, TRAIT_FLOORED, STAMINA) + REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, STAMINA) else return update_health_hud() diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index cc15c12d836e..5ab2c57be0f4 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -17,6 +17,7 @@ ADD_TRAIT(src, TRAIT_INCAPACITATED, STAMINA) ADD_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA) ADD_TRAIT(src, TRAIT_FLOORED, STAMINA) + ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, STAMINA) if((maxHealth - health + getStaminaLoss()) > 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems. //WS Edit - Stamina stacks with health damage adjustStaminaLoss(30, FALSE) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0b9bcb8da4f7..66adeb53ac59 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -490,7 +490,7 @@ if(direct_target) return TRUE // If target not able to use items, move and stand - or if they're just dead, pass over. - if(L.stat == DEAD || (!hit_stunned_targets && HAS_TRAIT(L, TRAIT_IMMOBILIZED) && HAS_TRAIT(L, TRAIT_FLOORED) && HAS_TRAIT(L, TRAIT_HANDS_BLOCKED))) + if(L.stat || (!hit_stunned_targets && HAS_TRAIT(L, TRAIT_IMMOBILIZED) && HAS_TRAIT(L, TRAIT_FLOORED) && HAS_TRAIT(L, TRAIT_HANDS_BLOCKED))) return FALSE return TRUE From e9e640cf9f11214762467cc328641b83ce15c8d9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 15:56:31 -0500 Subject: [PATCH 038/212] Automatic changelog generation for PR #3177 [ci skip] --- html/changelogs/AutoChangeLog-pr-3177.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3177.yml diff --git a/html/changelogs/AutoChangeLog-pr-3177.yml b/html/changelogs/AutoChangeLog-pr-3177.yml new file mode 100644 index 000000000000..acab9e74263a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3177.yml @@ -0,0 +1,5 @@ +author: SomeguyManperson +changes: + - {code_imp: People who are stunned are now more reliably passed by bullets not + aimed directly at them} +delete-after: true From 17fe5a15be843f0e0ff6f1691d7180de8b849e74 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 9 Jul 2024 00:54:33 +0000 Subject: [PATCH 039/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3075.yml | 6 ------ html/changelogs/AutoChangeLog-pr-3105.yml | 6 ------ html/changelogs/AutoChangeLog-pr-3164.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3165.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3166.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3168.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3171.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3177.yml | 5 ----- html/changelogs/archive/2024-07.yml | 20 ++++++++++++++++++++ 9 files changed, 20 insertions(+), 39 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3075.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3105.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3164.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3165.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3166.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3168.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3171.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3177.yml diff --git a/html/changelogs/AutoChangeLog-pr-3075.yml b/html/changelogs/AutoChangeLog-pr-3075.yml deleted file mode 100644 index 554ff3998800..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3075.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: SapphicOverload -changes: - - {rscadd: Adds an igniter and button to the TEG of every ship that was missing - one} - - {rscdel: Removed the welding tool TEG chute some ships had} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3105.yml b/html/changelogs/AutoChangeLog-pr-3105.yml deleted file mode 100644 index 0e792045f197..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3105.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Apogee-dev -changes: - - {bugfix: Cargo pods no longer land in Talos maint} - - {bugfix: Gas tanks on the Talos have higher security} - - {bugfix: Talos now has an autolathe in cargo} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3164.yml b/html/changelogs/AutoChangeLog-pr-3164.yml deleted file mode 100644 index cc98cad67b9c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3164.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SomeguyManperson -changes: - - {bugfix: loadout boxes will no longer sometimes not spawn} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3165.yml b/html/changelogs/AutoChangeLog-pr-3165.yml deleted file mode 100644 index 1578155eeb6f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Apogee-dev -changes: - - {bugfix: N+S Captains no longer spawn with Nanotrasen coats.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3166.yml b/html/changelogs/AutoChangeLog-pr-3166.yml deleted file mode 100644 index bff17cd8eacb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3166.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Apogee-dev -changes: - - {balance: reduced default ship spawn limit to 1.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3168.yml b/html/changelogs/AutoChangeLog-pr-3168.yml deleted file mode 100644 index 1a82f2fbe1e4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3168.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Sadhorizon -changes: - - {rscadd: Added a plastic flower - a selection of flowers to wear. Added it to - the loadout too.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3171.yml b/html/changelogs/AutoChangeLog-pr-3171.yml deleted file mode 100644 index e0dc11fa2d21..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3171.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: generalthrax -changes: - - {rscdel: Removed some irrelevant old tips of the round} - - {rscadd: Added 80+ new tips more relevant to Shiptest's gameplay loop} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3177.yml b/html/changelogs/AutoChangeLog-pr-3177.yml deleted file mode 100644 index acab9e74263a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3177.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: SomeguyManperson -changes: - - {code_imp: People who are stunned are now more reliably passed by bullets not - aimed directly at them} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 9f6fd5a203ad..bc62e40c6188 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -20,3 +20,23 @@ - rscadd: Resprites the E-50 and gives it proper inhands now! - bugfix: The Syndicate sniper rifle fires at a normal rate of fire and has the correct recoil now. +2024-07-09: + Apogee-dev: + - bugfix: N+S Captains no longer spawn with Nanotrasen coats. + - balance: reduced default ship spawn limit to 1. + - bugfix: Cargo pods no longer land in Talos maint + - bugfix: Gas tanks on the Talos have higher security + - bugfix: Talos now has an autolathe in cargo + Sadhorizon: + - rscadd: Added a plastic flower - a selection of flowers to wear. Added it to the + loadout too. + SapphicOverload: + - rscadd: Adds an igniter and button to the TEG of every ship that was missing one + - rscdel: Removed the welding tool TEG chute some ships had + SomeguyManperson: + - bugfix: loadout boxes will no longer sometimes not spawn + - code_imp: People who are stunned are now more reliably passed by bullets not aimed + directly at them + generalthrax: + - rscdel: Removed some irrelevant old tips of the round + - rscadd: Added 80+ new tips more relevant to Shiptest's gameplay loop From 27b62fe62aa64e347ae1427ee3dbd293469f9e71 Mon Sep 17 00:00:00 2001 From: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Mon, 8 Jul 2024 22:50:13 -0400 Subject: [PATCH 040/212] Fixes Vox sprites for a few clothing items (#3192) ## About The Pull Request A few items that had Vox variations at some point stopped properly displaying them. This makes them appear as they should again. The Inteq SWAT helmet, standard Inteq helmet and Inteq HUD goggles now properly show their sprite on Vox. ## Why It's Good For The Game Items having sprites is generally a good thing. ## Changelog :cl: Cloudbreak fix: A few clothing items now properly display again for Vox. /:cl: --- code/modules/clothing/glasses/hud.dm | 2 +- code/modules/clothing/head/helmet.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 0698981207bf..559816007b13 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -259,7 +259,7 @@ desc = "A snazzy looking pair of ballistic goggles with an integrated security hud. The opaque visor provides flash protection." icon_state = "inteq_goggles" item_state = "inteq_goggles" - supports_variations = KEPORI_VARIATION + supports_variations = KEPORI_VARIATION | VOX_VARIATION glass_colour_type = /datum/client_colour/glass_colour/orange /obj/item/clothing/glasses/hud/health/prescription diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 352349783bae..a6de8769642a 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -501,7 +501,7 @@ icon_state = "inteq_swat" item_state = "inteq_swat" flags_inv = HIDEHAIR - supports_variations = KEPORI_VARIATION + supports_variations = KEPORI_VARIATION | VOX_VARIATION content_overlays = TRUE /obj/item/clothing/head/helmet/inteq @@ -510,7 +510,7 @@ icon_state = "inteq_helmet" icon_state = "inteq_helmet" can_flashlight = TRUE - supports_variations = KEPORI_VARIATION + supports_variations = KEPORI_VARIATION | VOX_VARIATION content_overlays = TRUE /obj/item/clothing/head/solgov From 70f6b9f4f7852ab595a16ebe546e185f29a76560 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 8 Jul 2024 22:01:39 -0500 Subject: [PATCH 041/212] Automatic changelog generation for PR #3192 [ci skip] --- html/changelogs/AutoChangeLog-pr-3192.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3192.yml diff --git a/html/changelogs/AutoChangeLog-pr-3192.yml b/html/changelogs/AutoChangeLog-pr-3192.yml new file mode 100644 index 000000000000..ec307090ff54 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3192.yml @@ -0,0 +1,4 @@ +author: Cloudbreak +changes: + - {bugfix: A few clothing items now properly display again for Vox.} +delete-after: true From 140a1d04bd97383d496e8a32786844be063ec992 Mon Sep 17 00:00:00 2001 From: meem <75212565+meemofcourse@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:59:14 -0400 Subject: [PATCH 042/212] the tortuga's holofields now work (#3114) ## About The Pull Request * the tortuga, and the brawler's holofields now work. all the shutters on the brawler are now also three wide * minor greeble on the tortuga such as fire extinguishers and emergency closets ## Why It's Good For The Game competent maptainer ## Changelog :cl: add: Minor changes to the Tortuga. fix: The holofields on the Tortuga-class and Brawler-class now work. /:cl: --- _maps/shuttles/pirate/pirate_tortuga.dmm | 235 +++++++++++++++--- .../subshuttles/frontiersmen_brawler.dmm | 132 +++++----- 2 files changed, 270 insertions(+), 97 deletions(-) diff --git a/_maps/shuttles/pirate/pirate_tortuga.dmm b/_maps/shuttles/pirate/pirate_tortuga.dmm index 07bd4710a9b1..4bc354b31b5c 100644 --- a/_maps/shuttles/pirate/pirate_tortuga.dmm +++ b/_maps/shuttles/pirate/pirate_tortuga.dmm @@ -55,8 +55,8 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/power/shieldwallgen/atmos{ - id = "watchdog_holo" +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + id = "tortuga_holo" }, /turf/open/floor/plating, /area/ship/cargo) @@ -173,6 +173,10 @@ pixel_x = -9; dir = 8 }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -6; + pixel_y = -3 + }, /turf/open/floor/plasteel/mono/dark, /area/ship/bridge) "ci" = ( @@ -268,8 +272,9 @@ /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) "dE" = ( -/obj/structure/table, -/obj/item/storage/cans/sixbeer, +/obj/structure/chair/sofa/brown/old/right{ + dir = 1 + }, /turf/open/floor/plasteel/tech, /area/ship/maintenance/port) "dF" = ( @@ -393,7 +398,9 @@ pixel_x = -22; pixel_y = -10 }, -/obj/structure/rack, +/obj/structure/salvageable/computer{ + dir = 4 + }, /turf/open/floor/plasteel/tech, /area/ship/bridge) "ff" = ( @@ -406,6 +413,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 10 }, +/obj/structure/sign/poster/official/moth/hardhats{ + pixel_y = 32 + }, /turf/open/floor/plasteel/tech, /area/ship/maintenance/port) "fj" = ( @@ -755,6 +765,7 @@ icon_state = "0-8" }, /obj/item/stack/sheet/mineral/plasma/twenty, +/obj/effect/turf_decal/industrial/hatch, /turf/open/floor/pod/dark, /area/ship/maintenance/port) "iW" = ( @@ -826,6 +837,7 @@ "jt" = ( /obj/machinery/telecomms/relay/preset/frontiersmen, /obj/machinery/door/window/southleft, +/obj/structure/catwalk/over/plated_catwalk/dark, /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) "jA" = ( @@ -833,7 +845,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/structure/reagent_dispensers/fueltank, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 }, @@ -1026,6 +1037,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/spline/fancy/opaque/black/corner, +/obj/effect/turf_decal/siding/red{ + dir = 4 + }, /turf/open/floor/mineral/titanium, /area/ship/security/armory) "ml" = ( @@ -1303,6 +1317,9 @@ /area/ship/cargo) "oU" = ( /obj/structure/table, +/obj/item/grown/corncob{ + pixel_y = 8 + }, /turf/open/floor/plasteel/grimy, /area/ship/crew/canteen) "oV" = ( @@ -1407,6 +1424,7 @@ icon_state = "0-10" }, /obj/item/stack/sheet/mineral/plasma/twenty, +/obj/effect/turf_decal/industrial/hatch, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) "qD" = ( @@ -1493,6 +1511,14 @@ }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) +"sM" = ( +/obj/structure/table, +/obj/item/desk_flag/trans{ + pixel_x = 9; + pixel_y = -6 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) "sQ" = ( /turf/closed/wall, /area/ship/maintenance/starboard) @@ -1555,6 +1581,7 @@ }, /obj/structure/curtain/cloth, /obj/item/bedsheet/dorms, +/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/carpet, /area/ship/crew) "tI" = ( @@ -1704,6 +1731,7 @@ reagent_id = /datum/reagent/fuel/oil; tank_volume = 3000 }, +/obj/effect/turf_decal/industrial/hatch, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) "va" = ( @@ -1791,6 +1819,10 @@ "wg" = ( /obj/machinery/blackbox_recorder, /obj/machinery/door/window/southright, +/obj/structure/sign/poster/retro/radio{ + pixel_y = 32 + }, +/obj/structure/catwalk/over/plated_catwalk/dark, /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) "wp" = ( @@ -1818,6 +1850,13 @@ /area/ship/cargo) "wH" = ( /obj/machinery/light/directional/north, +/obj/structure/chair/plastic{ + dir = 4 + }, +/obj/effect/decal/cleanable/plasma{ + pixel_x = 18; + pixel_y = -5 + }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) "wL" = ( @@ -1834,11 +1873,15 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, /turf/open/floor/pod/dark, /area/ship/maintenance/port) "wQ" = ( /obj/effect/turf_decal/box/corners, /obj/structure/closet/crate/bin, +/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/plasteel/mono, /area/ship/cargo) "wY" = ( @@ -2014,6 +2057,16 @@ /obj/item/bedsheet/dorms, /turf/open/floor/carpet, /area/ship/crew) +"Av" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/plasteel, +/area/ship/crew/canteen) "Az" = ( /obj/structure/curtain/bounty, /obj/machinery/light_switch{ @@ -2050,9 +2103,9 @@ /turf/open/floor/plasteel/dark, /area/ship/maintenance/starboard) "BF" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/turf_decal/industrial/warning/fulltile, -/turf/open/floor/plasteel/tech/grid, +/obj/effect/turf_decal/borderfloor, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/plasteel/tech/techmaint, /area/ship/cargo) "BG" = ( /obj/structure/cable/yellow{ @@ -2170,8 +2223,8 @@ /obj/structure/cable/yellow{ icon_state = "6-8" }, -/obj/structure/chair/plastic{ - dir = 4 +/obj/structure/chair/sofa/brown/old/left{ + dir = 1 }, /turf/open/floor/plasteel/tech, /area/ship/maintenance/port) @@ -2394,6 +2447,8 @@ /obj/structure/cable/yellow{ icon_state = "5-8" }, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/borderfloorblack/full, /turf/open/floor/plasteel/tech, /area/ship/maintenance/starboard) "Gr" = ( @@ -2428,6 +2483,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/effect/turf_decal/industrial/warning, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) "GM" = ( @@ -2510,6 +2566,7 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel/tech, /area/ship/maintenance/port) "HY" = ( @@ -2725,8 +2782,8 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/power/shieldwallgen/atmos{ - id = "watchdog_holo"; +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + id = "tortuga_holo"; dir = 1 }, /obj/machinery/door/poddoor/shutters{ @@ -2759,6 +2816,9 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/retro/smile{ + pixel_x = -32 + }, /turf/open/floor/plasteel, /area/ship/crew/canteen) "Lb" = ( @@ -2790,17 +2850,29 @@ icon_state = "plating_rust" }, /area/ship/maintenance) +"Lo" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/door_assembly/door_assembly_hatch{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/ship/maintenance) "Lt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/chair/plastic{ - dir = 8 - }, +/obj/structure/table, +/obj/item/storage/cans/sixbeer, +/obj/machinery/cell_charger, /turf/open/floor/plasteel/tech, /area/ship/maintenance/port) "Lz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 }, +/obj/effect/turf_decal/siding/red{ + dir = 4 + }, /turf/open/floor/mineral/titanium, /area/ship/security/armory) "LG" = ( @@ -2830,6 +2902,16 @@ /turf/open/floor/plasteel/elevatorshaft, /area/ship/cargo) "Mb" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 32 + }, +/obj/item/cigbutt{ + pixel_x = -13; + pixel_y = -3 + }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) "Mk" = ( @@ -2852,6 +2934,19 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/ship/crew/canteen) +"Ml" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ship/cargo) "Mn" = ( /obj/structure/catwalk/over/plated_catwalk, /obj/structure/railing{ @@ -2870,9 +2965,6 @@ /area/ship/cargo) "Mo" = ( /obj/structure/catwalk/over/plated_catwalk, -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/industrial/stand_clear, /obj/effect/turf_decal/industrial/warning{ dir = 1 @@ -2939,6 +3031,11 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/item/kirbyplants{ + icon_state = "plant-25"; + pixel_x = 8; + pixel_y = -5 + }, /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "MO" = ( @@ -2984,6 +3081,11 @@ icon_state = "computer-right" }, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit/old{ + icon_state = "vomit_4"; + pixel_x = -9; + pixel_y = -6 + }, /turf/open/floor/plasteel/mono/dark, /area/ship/bridge) "Ol" = ( @@ -3060,6 +3162,20 @@ }, /turf/open/floor/plating/airless, /area/ship/maintenance) +"OH" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/industrial/warning, +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ship/cargo) "OI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -3073,6 +3189,19 @@ }, /turf/open/floor/plasteel/dark, /area/ship/bridge) +"OP" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/item/clothing/head/hardhat{ + pixel_x = 8; + pixel_y = -7 + }, +/turf/open/floor/plasteel/tech, +/area/ship/maintenance/port) "Pa" = ( /obj/structure/table/glass, /obj/effect/turf_decal/corner/opaque/blue/full, @@ -3179,6 +3308,7 @@ /obj/effect/turf_decal/box/corners{ dir = 4 }, +/obj/structure/tank_dispenser/oxygen, /turf/open/floor/plasteel/mono, /area/ship/cargo) "QM" = ( @@ -3215,7 +3345,7 @@ pixel_x = -3 }, /obj/machinery/button/shieldwallgen{ - id = "watchdog_holo"; + id = "tortuga_holo"; pixel_x = 8; pixel_y = 23 }, @@ -3251,6 +3381,7 @@ icon_state = "4-8" }, /obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/borderfloorblack/full, /turf/open/floor/plasteel/tech, /area/ship/maintenance/starboard) "RH" = ( @@ -3387,6 +3518,8 @@ }, /obj/machinery/light/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/hatch, +/obj/structure/closet/firecloset, /turf/open/floor/pod/dark, /area/ship/maintenance/port) "SV" = ( @@ -3472,6 +3605,7 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, +/obj/structure/closet/emcloset, /turf/open/floor/pod/dark, /area/ship/maintenance/port) "UE" = ( @@ -3498,6 +3632,14 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/plating/airless, /area/ship/maintenance) +"Vb" = ( +/obj/machinery/suit_storage_unit/industrial{ + suit_type = /obj/item/clothing/suit/space/hardsuit/security/independent/frontier + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ship/security/armory) "Vd" = ( /obj/structure/curtain/bounty, /turf/open/floor/plasteel, @@ -3587,9 +3729,6 @@ /area/ship/cargo) "VE" = ( /obj/structure/catwalk/over/plated_catwalk, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/industrial/stand_clear{ dir = 1 }, @@ -3694,6 +3833,16 @@ "Wx" = ( /turf/closed/wall/r_wall/rust, /area/ship/crew/canteen) +"WA" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/ripped{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/tech/techmaint, +/area/ship/cargo) "WF" = ( /turf/closed/wall/rust, /area/ship/cargo) @@ -3726,8 +3875,9 @@ /obj/structure/cable/yellow{ icon_state = "4-9" }, -/obj/structure/closet/secure_closet/engineering_welding, /obj/effect/decal/cleanable/dirt, +/obj/machinery/power/ship_gravity, +/obj/effect/turf_decal/borderfloorblack/full, /turf/open/floor/plasteel/tech, /area/ship/maintenance/starboard) "Xs" = ( @@ -3986,6 +4136,13 @@ }, /turf/open/floor/plating/airless, /area/ship/maintenance) +"ZY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/red{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/ship/security/armory) (1,1,1) = {" Ek @@ -4211,15 +4368,15 @@ oH Ek tq lh -Uo -EB +OH +Rn DG DG DG DG DG -uL -ld +Rn +Ml Td WF Ek @@ -4240,7 +4397,7 @@ Ek Ek Ek oH -HX +OP HX oH CG @@ -4253,7 +4410,7 @@ DG DG DG DG -BF +Rn Mo Td WF @@ -4288,7 +4445,7 @@ DG DG DG DG -BF +Rn ID Td Ko @@ -4420,7 +4577,7 @@ yl va Uw CG -VP +WA Uo OF tT @@ -4570,7 +4727,7 @@ wF uh nc nc -Td +BF Ko uQ GA @@ -4692,7 +4849,7 @@ QJ QJ QJ QJ -MI +Lo Ab rU Xc @@ -4745,7 +4902,7 @@ Yu qD jV Lz -dm +ZY mg qD qD @@ -4806,7 +4963,7 @@ Vg Ab jJ QT -oU +sM CE bD ng @@ -4852,7 +5009,7 @@ hU gD yH FP -hz +Vb qD MH Eb @@ -4945,7 +5102,7 @@ PV yd rU Lb -gQ +Av gQ LG YI @@ -5166,7 +5323,7 @@ oq SJ mB mw -MI +Lo QJ QJ QJ diff --git a/_maps/shuttles/subshuttles/frontiersmen_brawler.dmm b/_maps/shuttles/subshuttles/frontiersmen_brawler.dmm index 821918d660f2..d9c361701213 100644 --- a/_maps/shuttles/subshuttles/frontiersmen_brawler.dmm +++ b/_maps/shuttles/subshuttles/frontiersmen_brawler.dmm @@ -3,18 +3,15 @@ /obj/structure/cable/yellow{ icon_state = "4-9" }, -/obj/structure/cable/yellow{ - icon_state = "2-9" - }, /turf/open/floor/plasteel/patterned/ridged, /area/ship/bridge) "c" = ( /obj/machinery/door/poddoor/shutters{ id = "brawler_starboard" }, -/obj/machinery/power/shieldwallgen/atmos{ - id = "brawler_starboard_holo"; - dir = 8 +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 8; + id = "brawler_starboard_holo" }, /obj/structure/cable/yellow, /turf/open/floor/engine/hull/interior, @@ -73,6 +70,55 @@ "k" = ( /turf/template_noop, /area/template_noop) +"l" = ( +/obj/machinery/door/poddoor/shutters{ + id = "brawler_starboard" + }, +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 4; + id = "brawler_starboard_holo" + }, +/obj/structure/cable/yellow, +/obj/machinery/button/door{ + dir = 4; + pixel_y = 7; + pixel_x = -23; + id = "brawler_starboard" + }, +/obj/machinery/button/shieldwallgen{ + pixel_y = -7; + pixel_x = -23; + id = "brawler_starboard_holo"; + dir = 4 + }, +/turf/open/floor/engine/hull/interior, +/area/ship/bridge) +"m" = ( +/obj/machinery/button/door{ + pixel_x = -23; + pixel_y = -7; + id = "brawler_port"; + dir = 4 + }, +/obj/machinery/button/shieldwallgen{ + pixel_y = 7; + pixel_x = -23; + id = "brawler_port_holo"; + dir = 4 + }, +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 4; + id = "brawler_port_holo" + }, +/obj/machinery/door/poddoor/shutters{ + dir = 1; + id = "brawler_port" + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/engine/hull/interior, +/area/ship/bridge) "o" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -91,7 +137,6 @@ pixel_x = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes/engineering, /obj/effect/turf_decal/siding/thinplating/end{ dir = 8 }, @@ -112,10 +157,17 @@ /obj/structure/cable/yellow{ icon_state = "0-5" }, +/obj/structure/cable/yellow{ + icon_state = "1-10" + }, +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow{ + icon_state = "2-10" + }, /turf/open/floor/plasteel, /area/ship/bridge) "r" = ( -/obj/machinery/power/shieldwallgen/atmos{ +/obj/machinery/power/shieldwallgen/atmos/roundstart{ id = "brawler_aft_holo"; dir = 1 }, @@ -151,9 +203,6 @@ /obj/structure/cable/yellow{ icon_state = "4-10" }, -/obj/structure/cable/yellow{ - icon_state = "1-10" - }, /turf/open/floor/plasteel/patterned/ridged, /area/ship/bridge) "v" = ( @@ -186,9 +235,9 @@ dir = 1; id = "brawler_port" }, -/obj/machinery/power/shieldwallgen/atmos{ - id = "brawler_port_holo"; - dir = 8 +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 8; + id = "brawler_port_holo" }, /obj/structure/cable/yellow{ icon_state = "0-2" @@ -219,29 +268,9 @@ dir = 1; id = "brawler_port" }, -/obj/machinery/power/shieldwallgen/atmos{ - id = "brawler_port_holo"; - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/button/door{ - pixel_x = -23; - pixel_y = -7; - id = "brawler_port"; - dir = 4 - }, -/obj/machinery/button/shieldwallgen{ - pixel_y = 7; - pixel_x = -23; - id = "brawler_port_holo"; - dir = 4 - }, /turf/open/floor/engine/hull/interior, /area/ship/bridge) "B" = ( -/obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, /obj/item/trash/can/food{ pixel_x = 7; @@ -263,6 +292,9 @@ pixel_y = 2 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/patterned/ridged, /area/ship/bridge) "D" = ( @@ -291,7 +323,7 @@ dir = 8; id = "brawler_aft" }, -/obj/machinery/power/shieldwallgen/atmos{ +/obj/machinery/power/shieldwallgen/atmos/roundstart{ id = "brawler_aft_holo" }, /obj/structure/cable/yellow{ @@ -323,6 +355,9 @@ /obj/effect/decal/cleanable/wrapping{ pixel_y = 25 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/patterned/ridged, /area/ship/bridge) "I" = ( @@ -336,9 +371,7 @@ dir = 1 }, /obj/machinery/power/smes/shuttle/precharged, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, +/obj/structure/cable, /turf/open/floor/plasteel/tech/grid, /area/ship/bridge) "J" = ( @@ -366,6 +399,7 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/light/floor, /turf/open/floor/plasteel, /area/ship/bridge) "L" = ( @@ -388,23 +422,6 @@ /obj/machinery/door/poddoor/shutters{ id = "brawler_starboard" }, -/obj/machinery/power/shieldwallgen/atmos{ - id = "brawler_starboard_holo"; - dir = 4 - }, -/obj/structure/cable/yellow, -/obj/machinery/button/door{ - dir = 4; - pixel_y = 7; - pixel_x = -23; - id = "brawler_starboard" - }, -/obj/machinery/button/shieldwallgen{ - pixel_y = -7; - pixel_x = -23; - id = "brawler_starboard_holo"; - dir = 4 - }, /turf/open/floor/engine/hull/interior, /area/ship/bridge) "N" = ( @@ -431,7 +448,6 @@ /turf/open/floor/plasteel, /area/ship/bridge) "P" = ( -/obj/machinery/light/directional/south, /obj/structure/cable/yellow{ icon_state = "5-8" }, @@ -524,11 +540,11 @@ k "} (3,1,1) = {" k -W +m C p G -W +l k "} (4,1,1) = {" From 9e8687e832ad76c530c4c32e03cd7b0aa76d978e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 9 Jul 2024 15:11:03 -0500 Subject: [PATCH 043/212] Automatic changelog generation for PR #3114 [ci skip] --- html/changelogs/AutoChangeLog-pr-3114.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3114.yml diff --git a/html/changelogs/AutoChangeLog-pr-3114.yml b/html/changelogs/AutoChangeLog-pr-3114.yml new file mode 100644 index 000000000000..f16a9e33a544 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3114.yml @@ -0,0 +1,5 @@ +author: meemofcourse +changes: + - {rscadd: Minor changes to the Tortuga.} + - {bugfix: The holofields on the Tortuga-class and Brawler-class now work.} +delete-after: true From 19e44b0c19eb8471c8e740752fddd7d86d23f547 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 10 Jul 2024 00:55:15 +0000 Subject: [PATCH 044/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3114.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3192.yml | 4 ---- html/changelogs/archive/2024-07.yml | 6 ++++++ 3 files changed, 6 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3114.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3192.yml diff --git a/html/changelogs/AutoChangeLog-pr-3114.yml b/html/changelogs/AutoChangeLog-pr-3114.yml deleted file mode 100644 index f16a9e33a544..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3114.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: meemofcourse -changes: - - {rscadd: Minor changes to the Tortuga.} - - {bugfix: The holofields on the Tortuga-class and Brawler-class now work.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3192.yml b/html/changelogs/AutoChangeLog-pr-3192.yml deleted file mode 100644 index ec307090ff54..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3192.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Cloudbreak -changes: - - {bugfix: A few clothing items now properly display again for Vox.} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index bc62e40c6188..02670bd6dd87 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -40,3 +40,9 @@ generalthrax: - rscdel: Removed some irrelevant old tips of the round - rscadd: Added 80+ new tips more relevant to Shiptest's gameplay loop +2024-07-10: + Cloudbreak: + - bugfix: A few clothing items now properly display again for Vox. + meemofcourse: + - rscadd: Minor changes to the Tortuga. + - bugfix: The holofields on the Tortuga-class and Brawler-class now work. From 9a5dec0dfaf8081f093f09b9695833c89da8df9c Mon Sep 17 00:00:00 2001 From: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Wed, 10 Jul 2024 01:13:02 -0400 Subject: [PATCH 045/212] Fixes another singular typo within the code (#3188) ## About The Pull Request Fixes another typo within the code ## Why It's Good For The Game You have evaded my gaze for too long, Unqiue. You must perish for the sake of grammatical correctness. ## Changelog :cl: Cloudbreak code: Fixes a singular typo within the code. /:cl: --- code/modules/projectiles/guns/energy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 0341c04f2c06..07eb9a159897 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -331,7 +331,7 @@ . = ..() var/obj/item/ammo_casing/energy/shot = ammo_type[select] if(ammo_type.len > 1) - . += "You can switch firemodes by pressing the unqiue action key. By default, this is space" + . += "You can switch firemodes by pressing the unique action key. By default, this is space" if(cell) . += "\The [name]'s cell has [cell.percent()]% charge remaining." . += "\The [name] has [round(cell.charge/shot.e_cost)] shots remaining on [shot.select_name] mode." From 131c57206f1f3674000e5b1e63648bf2eb3363a8 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 10 Jul 2024 00:24:09 -0500 Subject: [PATCH 046/212] Automatic changelog generation for PR #3188 [ci skip] --- html/changelogs/AutoChangeLog-pr-3188.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3188.yml diff --git a/html/changelogs/AutoChangeLog-pr-3188.yml b/html/changelogs/AutoChangeLog-pr-3188.yml new file mode 100644 index 000000000000..e6394ead8bc6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3188.yml @@ -0,0 +1,4 @@ +author: Cloudbreak +changes: + - {code_imp: Fixes a singular typo within the code.} +delete-after: true From 4044eb8ebbb448d2003e3d8f6bcda046b4d2f357 Mon Sep 17 00:00:00 2001 From: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Wed, 10 Jul 2024 02:13:55 -0300 Subject: [PATCH 047/212] Makes pizza cheaper. (#3163) ## About The Pull Request Makes the cargo pack for pizza cheaper, 6000-3000 ## Why It's Good For The Game a little snack for a reasonable price, still pricier than less tasty options (donks and rations) ## Changelog :cl: balance: Pizzas have become cheaper. (6000 cr - 3000 cr) /:cl: --- code/modules/cargo/packs/food.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm index 7abc0188f9d9..c7d8b77f46a5 100644 --- a/code/modules/cargo/packs/food.dm +++ b/code/modules/cargo/packs/food.dm @@ -25,7 +25,7 @@ /datum/supply_pack/food/pizza name = "Pizza Crate" desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99.5% anomaly-free!" - cost = 6000 // Best prices this side of the galaxy. + cost = 3000// Best prices this side of the galaxy. contains = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, /obj/item/pizzabox/meat, From b7d811aa806b0e986b5fbca76941ee6ab0470fc4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 10 Jul 2024 00:36:52 -0500 Subject: [PATCH 048/212] Automatic changelog generation for PR #3163 [ci skip] --- html/changelogs/AutoChangeLog-pr-3163.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3163.yml diff --git a/html/changelogs/AutoChangeLog-pr-3163.yml b/html/changelogs/AutoChangeLog-pr-3163.yml new file mode 100644 index 000000000000..ff5ef750fe62 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3163.yml @@ -0,0 +1,4 @@ +author: Martinpachu +changes: + - {balance: Pizzas have become cheaper. (6000 cr - 3000 cr)} +delete-after: true From 304fdeb60fd88f0c40178d835ef7a48a4278b3cf Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Tue, 9 Jul 2024 22:14:20 -0700 Subject: [PATCH 049/212] Removes tatortots and fixes recipe issues (#3175) ## About The Pull Request Potatoes no longer turn into tator tots when put into the food processor, instead becoming fries. The potato wedge to fries recipe was removed as well. ## Why It's Good For The Game Fixes: https://github.com/shiptest-ss13/Shiptest/issues/2693, and despite tator tots existing the sprite sucks ass big time, has a flavour profile that references validhunting, and is Straight Up the only use for potato wedges for an item that is never put on the table. This subsequently prevents potato wedges from infinitely being able to be cut into itself, and be used for normal potato recipes. ## Changelog :cl: del: Removed tator tots and raw potato wedges /:cl: --- .../food_and_drinks/food/snacks_other.dm | 13 ------------- .../recipes/processor_recipes.dm | 6 +----- code/modules/hydroponics/grown/potato.dm | 19 ------------------- 3 files changed, 1 insertion(+), 37 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 3d5adf18e6fd..1eca7970a517 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -112,19 +112,6 @@ . = ..() AddElement(/datum/element/dunkable, 10) -/obj/item/reagent_containers/food/snacks/tatortot - name = "tator tot" - desc = "A large fried potato nugget that may or may not try to valid you." - icon_state = "tatortot" - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - filling_color = "FFD700" - tastes = list("potato" = 3, "valids" = 1) - foodtype = FRIED | VEGETABLES - -/obj/item/reagent_containers/food/snacks/tatortot/Initialize() - . = ..() - AddElement(/datum/element/dunkable, 10) - /obj/item/reagent_containers/food/snacks/soydope name = "soy dope" desc = "Dope from a soy." diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index 55db7cf06b84..98c5fa053c8f 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -13,17 +13,13 @@ input = /obj/item/reagent_containers/food/snacks/meat/rawcutlet output = /obj/item/reagent_containers/food/snacks/meat/rawbacon -/datum/food_processor_process/potatowedges - input = /obj/item/reagent_containers/food/snacks/grown/potato/wedges - output = /obj/item/reagent_containers/food/snacks/fries - /datum/food_processor_process/sweetpotato input = /obj/item/reagent_containers/food/snacks/grown/potato/sweet output = /obj/item/reagent_containers/food/snacks/yakiimo /datum/food_processor_process/potato input = /obj/item/reagent_containers/food/snacks/grown/potato - output = /obj/item/reagent_containers/food/snacks/tatortot + output = /obj/item/reagent_containers/food/snacks/fries /datum/food_processor_process/carrot input = /obj/item/reagent_containers/food/snacks/grown/carrot diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 703df831552e..44a987dc86ac 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -29,25 +29,6 @@ juice_results = list(/datum/reagent/consumable/potato_juice = 0) distill_reagent = /datum/reagent/consumable/ethanol/vodka -/obj/item/reagent_containers/food/snacks/grown/potato/wedges - name = "potato wedges" - desc = "Slices of neatly cut potato." - icon_state = "potato_wedges" - filling_color = "#E9967A" - bitesize = 100 - - -/obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params) - if(W.get_sharpness()) - to_chat(user, "You cut the potato into wedges with [W].") - var/obj/item/reagent_containers/food/snacks/grown/potato/wedges/Wedges = new /obj/item/reagent_containers/food/snacks/grown/potato/wedges - remove_item_from_storage(user) - qdel(src) - user.put_in_hands(Wedges) - else - return ..() - - // Sweet Potato /obj/item/seeds/potato/sweet name = "pack of sweet potato seeds" From 0f2e65940b1b0755fb64173c2832c7f9e99d4a8d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 10 Jul 2024 00:49:30 -0500 Subject: [PATCH 050/212] Automatic changelog generation for PR #3175 [ci skip] --- html/changelogs/AutoChangeLog-pr-3175.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3175.yml diff --git a/html/changelogs/AutoChangeLog-pr-3175.yml b/html/changelogs/AutoChangeLog-pr-3175.yml new file mode 100644 index 000000000000..aba432d7ce74 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3175.yml @@ -0,0 +1,4 @@ +author: generalthrax +changes: + - {rscdel: Removed tator tots and raw potato wedges} +delete-after: true From 17e4490136d46b2ee84e9155439d56f8a16175c0 Mon Sep 17 00:00:00 2001 From: Imaginos16 <77556824+Imaginos16@users.noreply.github.com> Date: Tue, 9 Jul 2024 22:25:55 -0700 Subject: [PATCH 051/212] The Ares Poster Now Correctly Calls The Planet Mars (#3193) ## About The Pull Request Does what it says on the title. ![image](https://github.com/shiptest-ss13/Shiptest/assets/77556824/dc713a4f-685f-44d5-a73b-3a4e3cc24da1) ## Why It's Good For The Game It was a weird misconception that for some reason SolCon decided to rename all the planets into their greek counterparts. This is very much not the case, especially since if it *was*, Terra would've been called Gaia and the moon would've been called Selene instead of Luna. This does however mean that Uranus is now called Caelus, though this will be depicted in a poster in another time. ## Changelog :cl: PositiveEntropy fix: Mars and Venus are now referred to by their correct names! /:cl: --- code/game/objects/effects/contraband.dm | 10 +++++----- icons/obj/contraband.dmi | Bin 95677 -> 95682 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index ccfd89363482..4177d8957965 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -875,10 +875,10 @@ desc = "Terra, or Earth as it's called by inhabitants, the third planet in the Sol system. Home to the only life as humans knew it, until contact with the outside universe. This poster in particular is trying to attract tourists to Terra, listing attractions like the Grand Orrery and Neue Waldstätte." icon_state = "poster-solgov-terra" -/obj/structure/sign/poster/solgov/ares - name = "Ares" - desc = "Ares, fourth planet in the Sol system. While evidence suggests that Aphrodite and Ares may have once had life, Terra was the only one that kept it. This poster in particular is trying to attract tourists to Ares, listing attractions like skiing resorts and ancient robot exhibits." - icon_state = "poster-solgov-ares" +/obj/structure/sign/poster/solgov/mars + name = "Mars" + desc = "Mars, fourth planet in the Sol system. While evidence suggests that Venus and Mars may have once had life, Terra was the only one that kept it. This poster in particular is trying to attract tourists to Mars, listing attractions like skiing resorts and ancient robot exhibits." + icon_state = "poster-solgov-mars" /obj/structure/sign/poster/solgov/luna name = "Luna" @@ -892,7 +892,7 @@ /obj/structure/sign/poster/solgov/skiing name = "Lo-Fly Skiing Advert" - desc = "An advertisement for some low-gravity skiing resort on Ares. \"Popular with SUNS groups!\"" + desc = "An advertisement for some low-gravity skiing resort on Mars. \"Popular with SUNS groups!\"" icon_state = "poster-solgov-loskiing" /obj/structure/sign/poster/solgov/recyle diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index b34b3777adace0605e4072c50a1806f989cdd002..20fe8abf2d5c77c5b196f89f073f28ef68db344b 100644 GIT binary patch delta 33187 zcmYgXWlS7xxJ6s6Xo2Dm#apyEw79!F#oe8uXo2GH?y|VUQrumNI~0e-y6D|6xi`5# zHt$HX$(%XwdF)Kr33BfVa;-ZeK>a%#gpNzldh08OnRQ8g<4w-|_O}ous61chC3N^y zkuA>>;BkFCqLs~xO_@>M?!{L#XC>(5$&5n~iGRTGWY(%>kLq>URzy6k&ttr72$-9$ zdc>6YLa~Y=hqAH7xD(FGgkSwstt9C{knPjD@ZyMlk>j8rH=lOZPFYR?pq$TS{}|aa zea2|)MC+?7z&;z53fl}Pb!kGE@r^>%JBPkbI znGFx-%Ef^eU#5PFVi(Nx5rJp;gzJ$m!nyw_e5~#&-G`!BtU922ESN`<`6XB<0}j6^&rz<%A&Bz4d)no_~^^9_wi_Ll&DtmuKMjL`n`P)sFGCJ<-SLqEA`l-|L(^HGFe#i@?t45zwDZS0o zg7-1IL-1b6UY1Y;IenuZLu6zCEf0U>L{!nh1pa`f%+DAEO4wz5R6>eB z5i}ri)?HwAx8fS2A#_Jp(?%PAaj^+RKRs2-{@Dp6mHY5w{-&+%;fEyQ1`l2N$I)?m zxJ#6Tjek**XfkpNzXt|F%aZdk9|Mt*uF$}spT7v;b;*5Ca3O9k!R~cRje@86SWqmGOdVg+Y^u?|5(4hl?SzKA=*i zd;L4I=9)I$D38Si_uTX5x7Ca@ylf#|`pi&&d&(`wTw2JDe`c%O6B(cB3W~nnT#oHA zuDx>Ux*^`-KuQrpdt-c+(^mnWNI&F|gUWa9_2S(@Udi9>P;W~L)C03f(!P4{an^{X0vv+!SZ1>vK4l+1mynG&Ql?FniCh;y) zKsnS8$F_`2y0Ug|?;n@^L^(Yv*pgFcI%41oK;4=do)cq=BdQ7PqSdSTYc;KK4mTaQ zoBtl6*VjQhT-P^yE*i+Z8@w{Icn>yx>AwLbyH$A=6{@-!l~d@|H(7KS=?|CeaG3t= z{=C1aw|oh7?qck8zeLdS3JrPoAa-d`_uA|OwqhVb^3xoXp+=JHeee%_jK8Z#eoW( zQ0;w36Ii3mT|Im`_e*_#%lSjB$D`%IW32HGN*E@?zP4Ok@-MjdItJ&LsNa+r*EQtx z387rP-PIM-J%d7avCRpqbp_VwO+xQmmb@G2v4nt@f3uOWV$idg_OoZSIocSJtAcHb zU&3%&{L-Rr5W#OeDo-&Y^ZH)OaTZ>Z~nqN314Lqn0?yiwKG9$uUR81Q^2 z+ysMGT>B=ljuO~uG~#|Qv=Ch*8YHDpZFq0A9tnDg zHh*fz8Wu_zj1PFFdL6=oH}cx|_VXJDl(R!0T|$w?51}3Gzznw94Lep-X^Hg1{XD0b zk=LWW13S~s+|W%hz5owvftee6v%~VRMvD*%OTApT%ez_*NSo7k7Zc!m(?(!#<^96t ziTswj+r7iY)Q+6_JADk2N#GECVz;LgD|6Tfr=w0!1(@zRZN$0UWbsJmT{f9i$>O$MZGg`;^ zgKC{iTr-MScJOO=v>fB?l;~?my^ipqN`R3`j^G+jmI03jKpl80@&!iwZ$qth*8BLg zC&P4HUL;bO;!bRjSp4ntTP~MsHonAo@h1TT!8R>S-i)d$GfMrEQgvq?_twkJG>3}W zd&jm#J!#E2Dp{jXnlT|f2nIF8@(*Db|NSrPs(T&>XQuEySXzzu&r7m6&td(-ZK1?0 zrV|VP{tghH!MQD`MqhiZTF&Dpl}a2Sou=5bK4;RxMemmD&{5hzWL98*yVd<9v6=&r zp}yA1$QtYIiqf+bqw>4Uvt?%f>H{5WFkN%@z+Ud~qtVm&^p^e+06HgD)O<5tXN?nF zs8_r2;}yQRM6dPIQ2QP?^qZ+kzIV*2E9=T7ywIio8C`_m$tCQKkMW0H8HnNBsRrI% zJ6fUiR$)=(@{7+d8+V_V(=TaenBghq1~v{rB zTUWE%5~%(T0YLn5mvfOf-OS#+tDBcy zN~9l|ghl`+`k<&rxBBN2*{dlx19$2hatRO>&6mqnrHb9b^z6Sub4vyN<>Tt>hhV3H zi$=lQXhEeoP~jgpTROH-Oc3d$uAcX%>nDx$k*g5|2=*^LEh9FA*o}L2b&$&R+t-2*-^^ zLwV0noXv~@djzr~t)o*SW|{A)gwN>}Fx^Q+UP<(sttILBmUUP>lFwbgMx&dY^}-L2 zOj1`Fe8IEP&ohTNm*R~0%m1^1kHHF`K;dBK%$3`-PrN$s=$q#?9&XE`!fMvKBjT_{ zKE;JJrE#U30g$wu#P>2Jqty+9sA< zudvLabu7^D zVh%NpXAL34oswx+yEVpJPiI##Yp=D;?_kt`zgP+*6UmFd%>F&Peox?CL7aj~ooZSm z%ggH(iak0hii0JHhJm|7 zinXsUm3!YUaW+d7Z6_4yS|tEEOtLkl*qpBYvzQ5RJpLS>c@?IrMre zm!?%hj>l0MblCjHyj>=KTbBK-=;JWuuns%_ib@*V`bir^R{i?H%#PLg)53kW(6YbFE5WCaDDE-0A4v2fwDJrQ*!*_T3!diZ41Euq+Pi@F?X9^*agrA_U6!0W5b#>D zAWto;OtxZemLcR?Rx>2ko9%i+%ifdnBX|% zJab;Jt#3DFlBQIOZ+81@bQ|m0u_Ur5CAxM8nv)e@?06zetT{7s3{g>B8bP7xMY;0D zQd1ihtZDM&2pPH`{6#(yvkfp1G|=t%D=#{)6b0nVc{0YgCU_x#HPcPZbP1dOa7{r#Gt#0U@5*Q( zTXhu0(6!??VWkn;2J$}B7#`!**e@?Zxi5e#1&LXK5#%=3-!yG$Vs2>VeWFw3-Vii@ zOUSKT+XbMUEaz^J(ZE${3RHkpXVV1eYhS;YtV8bU&F5yPq8ab8Kyq4~`s58ak$exK zAdM+NFy=6H61?-xxF1f#2u!2O)3UzaUM{U22Z~qL{HCh;71yjUTyDy2Ba0XQi!)b* zr-&Y==%!+}737aLLFdb7xE7>;f6frk{jR^5b^@ovRMzlj=V_v{-tPnjmXAB1u4f_T z^$Afd4+aqK6z&db?G7goyO-$6x;n_>(p0X>$cXrS+uhVb7G=Q+<%|EP@K#OeFDAC) zk0QCPl|BhKk75g&d9BmUqyyCLI_axK;vtRg#0k?$3Nte?TH@_#Kx7oO^f=dw`BZ-B z1pp+v6@<5PJx?n=jX?hAox5^?_~$otjVl-TST`l@HwX;e@S>xEc`U&yz&_ndoSBpR#aLT6*L z#e`>ey1GSS91qL0SIyK_wn4HnE;5Ne-ih{Szqs71!h|4A_3%;lH2YE4Oy)mbnOjyq z7wf~zLF{9K0#0k3D^x?iu0Efx0>u>^A+pt8+gQzye5V8VSZUqEG$npA&Vy_oY({WB zfpz!Wo82OSACF8-jysZ128iZQ*Z50d)&xnjbKjZP?ha}oq*7j zcWvFk8T1&>?|a8mtsCl${PzR-#0bk!s%Vu_M?%`<15q^cvJbuJ0C~6sFdr4Urikme z2?s|BCnGMV&eFlnK(md|+8W$pi>L3j?=peEW?=A=bO`VrVkf1I8}vCi_C8#&XX1cr z?lQ|2g`J^6&+NgbNAW36@H&skUfrYbkDM-o@F6dS;R+79MhK*Om?>Hsa)!yf?8K z*1IJTC{*LNh3p4}v@h&7eu@tCW3XsjFX4hEDZs4`v{nO*({9E;Hn)*(XBYwTkC-J{ zNh2D1VahV?lNq@aC;xO?z*t>6x@nH;!ewjk%@*tSNu8@$hK>LlLhHF=zJ*kFITZud zA4WDOceYF*N|svh(1asSX1VGkIr_iy;d`Z|pa$B1p71~*{C8#+OK{B(ds(>*63SWO zTn`8PjlS3wBe5YX`HWkcnWa>d=Y4P)6%TBO_GbHMHgfTI zU!>|hFAN(hq(=dc5QOW4&XN8hqwTY~6864c#f;g!;yVfPP43ZFeT3Wmf`T9mg)S=` zf+=X0_^2!!?uV{2vm!qUMpj-`QBtkP_S4M|VH{_-VhNZ?e=%#d7=NPR z0m0Z&V{cSWf>f|Mku03q+17sDabDvf z`p%&V_pR2V{u{!NL!p1!KC7o{m|TE+E=U@4%grupd|v`Q$d{VgT29{zWa}x;H>Y~@ z%jr#fw|{O27v8f6fs(|u7i$?b@SwW)7CYCf>sH=M|&_t7Yb`7p| zIPYbFfXm=2O~hL#=Y>s8b#-NZeY?Z#C!suA&P0!6)28*frF=oKYWIfMH!>1Y@=L&Ym0Km z-O3_y6O2PNqD`wRF_LPU?(!B{rRfp zs8o+zHz11Z8Q`uz6gVQxbrOI1cE173WrdD&tA5=3&VBUVc85_RIQ*Z>wqNOtkd1MR!eQE=cJ#T z{cqVjU-tRe4?%K0IXOA)-t50!Hk7(Zvq$}vl$0_7FkDQhHwLDf<;Y4#;pCg|pr?aw z`ztKehDUyu{Pvn)pDabPXhz#1nX->n4?`k=JppCh z;_I0JOTyNPB?^aZ_m}%L;6&?w+4IZ1=^_Qq9`EvJtib$vkm%q$lyjRP~qsq$*zc!}xT+5msns~O9` zf}eiobUjuKVxDix`P~rVDm6O9&HE~NjGI|C80Ro|F7IR=24W#B)mje;8sNT^0%CEX z6m8b{YHnPQ_ppcJD0f9_IIhPH8)6vtU##6rNAqBi2BV?p&Mu83!`P?u-e&gB0$=k} zV{6JkY4*%})n3x_gKdY`8>&iCrxQTDCYml#Cg%UTEz3W)+`SM7yq6O_I zM}Z(;iBQsg2R)3dhcA>-|6O!)dNtJO_*7c^`#bmY=UAD~XVUViEl;bV?6!TGr>t4JB3NA9Jjz}hJ<2#uwX5uWd0&s!=D zpV!q&hZ7PKiU6F-sTlvndQ}uXV%~gLNq&3pr5>MVsOVQjD3kxv2zP!}W~!2`zIl-& zop;_|PJ(xjld3mfB+c$!LkCUyw3k8B8c>@w_f&k;;Qc6~bUEvG)S#p!FqWs%H^NV~ zApPGqlUTI;}EQq3XMvymt~xHUwcam{#rE} zCu-{7E(b`2W`uqFhFgOh)rqECaTYUMsI@!M)oQP?iRqGtmd7(fpgt**|lJR=9-Ah=F1ts-1DMw-A>cLd=&=;DEEEl zghq_@q4nWv@Nbie@!^)`JfwwO)>ghQ{v& z4%#=;mzl4aJv0o_wmcfbd(2+qAR~Ie>?Fu>RDrhX41a$d5|^ zJ*3}9aB;PY-1eL4Se5!B2xLB1HUGdM0B7Ps@H6%%p~*-{tuY}<41$jiuESBr%~Zvd z)-AnroT`pV1W(^J)hDl1Yv#;gTUh?M{D(yE9#gjTbb5mG)yogzF~whQBO+0-&8KYv zif|QgNFUUI_mvr6oY1J$o2>#8H&qGP=>>n0(y!?bvpMpb0fTlpq%yf0ygF&HGcMw6 z9pWBm=OzxG=@{DVSgNJ47%TL`6lO#~;S((;~R>2or z2;cV2U*aRfJqbBpzYM;n)X-kXsy|?n_n&#n?^W{}(lRkcYE)|C;Nj6wBqk&v7?;tr zG;TH(!uwP{&_=glolsPop8lw-YOY?}8H`;}2!ybhrNVQ6q1#(bo8D%sibv>713@P%4O|c2zGZQ02A3q&5(EJgFV&0 zRI^bGY^_^ot68utyT2nT?R-QGWoO|WQQX63;Gk(F>x-U@n>yFy-9=w@d&u81E5)K5 zV^DHpPv9hc~t@w>{JvQ*ZX>Sx!uX=(a6_ zaldRmmYFURdWjeD-N9r-r3b@5{?)8?a%qj8;q5 zK-q+BMpmNNcT7xsdbR4O_czmBUpm^GN|Pyvs4$lB8EX4rz|LneBSQp5zt1(4_gW96 z0BQY;*Uu7@{(de-hmqtX8tM$;cZQI19T^v0*T%qE_7jvO;ugvkBs=t8j-U_`B3{K} zOc~ZKin;tM zv}cBzOkDx%`%EW>qcdqhc%dC}>ibl0wHOi06Dr~!2l#-J`G;9P&5F+yYX!xAImPa) zPuGW(0#UGb9O=Yl!o`@T-Lp1Xhijkuv$;l42#r!%uA|S&GC!mVGYV<#c9JP3;Lvgz z!=45KUAX8Z``w|EH0bYWT_a1o+ry|`6~yJ8Lgp8%9OiX%j&FLi#!cdtcIea|Umx*9 zDnhug>nQzbm4~vXi?SdjM8IpHmowGhhgc1eB`?$qn z@A`fAw>9;7U0QWs2b&gY*j`7l$0C#VNVul#my{R za}?Uf_uN_8pQZ7Q&CwfQwqK3%rFw5!Ra^)X99yue5`wDwAB^hAwP*caNhzEZeKdn} zDCX(+9vY3#NcH6Bn?;jDD{}aPF0%|?(Sgf}U`A)O_@?&~%Fv+Ov3j*PUMl#54opwKi;J|VmRtw$FJtYPCKxZG|o!RKHN7XFy} zo^htpmjWMps6C^5uc1G<+R`T9-M8ATsbsa9VZ^~XJTgxC=~EgE*XhYRJWoX~AlAQ5 zaCU)Ryt_4y7-^9=S>rM8@;MHxcro>3x(8FU-JDNxiKi zr>5goUB|c)Qu1hN+bvsEQUX~AcD&d4ObVFz`MJ3@?%)NYdShJSQ3Rosd0 z^+D{%LHQ?iG;|`~7x)x5=;$eN@)GNR6`zwS-~8&uzJyL{Y z!cE;G5;5FxJJrdO>kU!X#pE}m-h2~OU4)SnqNj~-ort9^Q=|*Q zN3jtJSwSpmF)JL_A_CO+XZoWn#BNr#G>jwwy7)Tc0aZ zd_0p}ZjlP4;UGeH;jtcG*N*)j{=uom4Kx1TmfB7zOnctbE}O&~rYu{R_Eh<3J70NCU#(xyDC$h%E9SihGW0EFv}64w z0B7e2B2?!5B!BB!Jj}NyUC-z8x=juP556}dbGK7%p8yqR;U_O1Zr)$CwCyzB42rX? z4RPdV4s;b}dcc8O*5t0-iyEk^)}t9V3RhBWwyvR^hqc39pH`?yK_?<^P9m)CLA97< zT>Fv#@t37Q$a8}sG5`s2)c?EbI}D72Zu8Jud6NSpO)JT6YMYL#JyU-X6GgGuBy?G3 zcMI8C>7LkM7elj~^BRUM@t{CC5cduE0lw1JF4PdY9}Ex9u}H1x1rZ3>Wpw;PlF=HjNYH z-{+@qL3`3x)d!g=@qHt^$Tw)H9Qw`Nel6M$@Hr310(MXPT74*AF86}np!fPPZ<)t? z`w3ugJa?JMnFg`U5cmt;EwlcDuFgn zpY1ymD&czq-1i@(#qy8B4OTS`b0Nfy_LhDHBtF{4Ok;Q49{ecWe4UOUn`a@X25j7BfPv79;KjIxKq9rpb z3zOUy89c3w@&UPTiXH^-x#iuuX<%SdQBnOO2_ixj2$CAS-#ueL^+hD;ublUR&){*^ zfVvBK{@l{mCBWY|hX{)Grk6q@tSXJ#25>MQ7sPv;cb+%e1g%7sZ#IeqJ#LkNq*dxx z*^ZYMsu^1+?6=JXWhvB*&c?RzU2k{=p^@(0x}CR!QUCo2hR!5RhT1G(HKkTL4i*ZQ zxn+Me2P*T3r=@0%8vS3^T<(Q4@WJOX#|6o+>5sZ{{iCk`oFDiRU zhfYHVh1z##Hr}?(5@$s3{;fFP#Q0A%MIk}Dc~7s z?+aaU!*b(YT{1nFCVXl7vpwd7rdlzI@@*!<03RvSII)k=X3F5($mh5AP!h|`&VrNX{GtV zuiT#5*XIs!9C<%E(*Pb3>FN|AUDH^)kGjd!GSCZ+4Hu|JEaE+z9kqdDOVL^)(|Bk8 zz)@w>6BJS^dEbOyo3P_E?`b&i`HWj!d_Ubt7=l^>)y|l zMGO+Dn6Kz>zT+y64MXP|H^Zvjir$K~%O*BZ9=KK(J+fMD46SWeQkq)EC8ddb>(HSh z`pkWNO_RHjY;AERxf7K7sTjy#|`WK$%6Sy);5O@JXJ>s~S2kCA8P@>&%}Q@RrWp@OnfkTxGn7ZL*S5QYD_<1W z+@t9{xK@Kc1Cg=1GQGNq4XWQ_VsC(g)6gZdNpbFrlKlSmB@WmkSX#EFrmz2XCKSDM z-$TV+!Ds2O74~AS7Unl&Qn>1%SSQzuJHP2>Au96-(z3rjS%<}&+e4eL@PX?($m4!W z?O_yJFFohIyOhnhlq+XwtbR{_ob!`lV^LVPsH&k65iX^+kg-8VD0}1smB5uc86OMM z4~^hu5QvgURfu?Pf@ZVkSM}eJy4E**ujYk?Tkw2*xh4%8%eYqji7y*I%oNH=^-cFJ z#$}Bhs+x_z_fqN_H9Qf+)O(|Z`;%Y|yvEqrSRG&tlm69KbI_)DH8ufenk|bzbR*gu z8th6XrGY00t}K@jG!rggWA{$lUB4K-JV#Z*Gb7f89ISS`lW!!u0k0!-9;&;5)HijI80Rb~LF`46RJn zEl5uU28l)57f!1ac-~Cz)hf)|z=Wi1)S!%3hr}v)fO8`$pyh8b^4+6hk*AC+-(v!K z7FsXbFSBRY*|G5_3DsnfVywX!#r_Y`c=^sIETM?8)ZEeVbyyt}pbtfSMi4-pX0PR3 zt?l|4jO#C$Sqtl<{kQCXWkh_YRs8D%#r5JbQAuWO8?>{Lk#9LaX+kPa*Qq+gCkFA1 zgaIz=7a_kmJC#plVAP1ZqW;|V>t6p;dhPS^aM$@h;lpfV)0G@v+CcoYo3rfiLiL#lw6g|?4nAV$oKd_4b z0}k@@+0#J9GYsjT=oSpKlalIsk52bF%{N$N<5MCvZ+pf%7!xDR#w@Xc%x8{j;n%QK$nf#Nq@TSrrRy^0{)iwrgwj46BsS=oCRNAumt(*Dd40^Cks#X@X{eW>f{-BMsOJcP{!n92_!||*x=&g zT2oA!5#NP)Fpu$2s4CyE?DE^%!U|P-BUbTtX|aA?BhYlfE=?C@SDM1h0YO4efMMgM z3L&ayLT$ZL1S|}1FazV^ztGZu_Sxvo+(PJ%w84~oqRhgx=*{QmsdC5@{1ev4s|BjMgnC)qbb@NAWdnUIshM1NiI)q^g{DWKh!SE4Q z$W+V|(+ELvQD~9UvhqP49bae#sw%}z?gY)`a?!uMJRv8EDXb&}8lRtVQ{(a%L@=L> z*=X1w<30m#DTcMIdlsK&vLR?>JU-buVas_vptlKz`X%2OGAC`?W{LMaD1lJ+7<%3eWrRp zsuKXxE9>PqMyPk!W|k0@70C_J)nSr9>3&JZA|i^#uN4`#??cjcM9bj;0pRoIq>(%< z#!4VdK(Ye!;J$rdx)(XP(so>*lJfqA1DkHNWZ0D-I384@ z^!?_X;wXMP>U=+EZH_4+1$t*`kQa*pz5e2r7RZnJi!yhwLP=T4b{!R#mAQqr{*RP#L?8ZnR>M@t;3-~mXXUHCB7Mt~QwTfU z-%WY0RY~p74t=sP&_dUMPC4$y*52tiXQ^GJ-JaMU?TNl{O6{Fw@4hnqYV|a6Aee^b z@RTM$c*NkD8X6mv*#HTqkHeNQVXexgOHX|(TyL1uVp$q+M=6!>S6A(rvoUs=i&_o* z(Sa2#)53!C3vaAZ6To25+M;2w$7Z@u&q=Q9_SL;Y3R13uh-lH?yok<%Cb#FG%gTQ~ z8(5@w6?s^3o;$QUhPQYM&d#6zJ?_HlTj%^6-?JUG@}_2dpk5`FASp)X77>k!Zqu{c zM=?|?nO2QvQ`1{=tOYs93z^b)SoW@gpYW=50M$MxgOv7<|vS(;Z14bR72tKc7KAX~Lxx|QWunzEV&B_cB0rS%W2iINcpALNBR&Fw> zT2^l|e;=*0H+b#8p$CIEO~EuvfbrP#5Hel*Egimg&PCbNT!&GK0+JSvHAWroH+dbLTJ06O+2DPBd}ck31;W;Zeqxb-HqY}ucU6;2 zy|umnZx;Ih>>LkpfXE>ICsg7V%n}GweiehztULuc&)Wj zxFKYHL1H`@DeG46!nN(-vmradQa`}N$=infVT+}LNSYvE2t)$&#Hxd-g+yM?gt%h$DXJO?A2EX-DX2{egpVXU%D1HQ<` zcCp9{l;bo&wuBVQSx-~x8r z4j;N|dR>9)0)fa&fzk5esa$+5t<{JIln)(Y_R+8ZD(35jaFgDdzg~tTd%vgd*8Zxz z`A+}6k)!-Yj-{|;*T>M(Qikp7u7CeRkKp{Cdfgr*-{{%{Pe89*3b}7~cl?hcQdpO^ ze)}dG1Ic*3C*ia#{t%+-%f%a z^De@)%VZiT+lIWXH6<89e#b-qv#NPy7Y7tl26*ugh0pRCR>-<^I>>kK=WaaLQ>{2b zJZYdyj}hbA@nd`Umct<|lh2#cY(2ypk5`Y|V3O_g8EoG}Vo~Y?m9_CoNBR9|->THb z`mlm0zo0Rb<4AwM2Q0lV*lc>#10a5u`LyuWlBHa}HVQ?uuC;~Jy6;&G z!kc!Rh$}d!Ij`Sw&kD{w=Ml{05T- zr+|N6xv5_MF*{45D#;rkU&!+zACixpPNuNGMW!InvzQF}pBn|?P2i3{|K_{s5lsq86UYHqtaTz=%xA5q`yrhTOydXoNh9MDrodxe}yPH**>uwL^K25k{7 zg~iqAI~c-;Ft9mH#&0=rmPm7Cr>EKXcC&tv$J<0m$vFj4W{G76%*w^m0TXkJXTR{1 zrkxvQsWB?GW4gZ6^PU>L>UFyg6tYe0@N9Pg@>;~FFJ9;e zD5Qy<)uOI%Kba2;%*Kdu>lzB&<1Jl?3@(jvrnflpfQVdmHQoGwS&#)sh;Yowk7+a~ zXOw@4TC%ESCRXnDdlzq53p}|0yy55wlYH_wi4WX;>t;GoIb=@ZH2P#3Q=F>-4Wtoh zGQD2;u9#I#%g>bI|9HQxY48;WCWER{ZCepze6}v1LN9Dr7s0mp4FwI<6A5}u^@(E= z8#cC8H1WYD%qSh3q4s&$w?RntNR-8ZyY- zScPhaIkr?u>L@)gRU>Je(_CPdzE>!C^!z<|MESuh`SH~a#brWaWgyZ~A>-cOGhMi^ zw;pYwwFpP+(s=WA_)ytqFw`6$;@$K-X}r^wzz@#%B&^v4Fao{Nqss%;DH=0MemRtU zULYX7gI{7WYTN~Ay0qP4)(?YT*fR7)Od7ZO7xBf_uSb)6>rgn?>NDCyyrt9?G`zCS z<2y?{10=mevm!7dAs`H$Fy?yee`@*)pg5Z6?E``nT!NEe!3h@J0>Pc&t|7QPi@UpP zaCesg!8HVzgW!6&9rE4#``1U+)ooqv*7o#F_jEt~Of$mUUlg?5#gkFCDY|;5gB<9C zK)wBLZma95=%sgm`x^~|k^0W{mA2K|vmFN52ZANCDA{1b@rAKg2^K8+LHdF6Z`J;s zPQWm$5TEO#duff#;Z;n;DQgm2dXvc~J2U0X+|+M|y5%9y#0Ofp46y1(lNCY#+-~i~ z&fy|Pn(-mu-#hsi2JFF)^3$-9uelL%Brp!A(2xi$rLgL+;LdRlon$L@=So-r*-us)Ot0U6T@32Ai?DMj(rxu$(+o5j34P=? zGS@YNnSp$JHz63*+#+z1lb3x7M^r+OgD3Ef4y02@e(Ce)|VTPG&e@U`A ztbPeVo-}mn$;=wub&EyJS&Ga8e126ymS)(+#l`RcUE!$Hux@2cn|@Ce%owj9%GwG} zwMBhf?u#Jk^+l?3`}KLgo+MF(lJ9qi!Zw`8Wl`m>w1xlcM7P*H;Wm7$$RB+=@J!oF z#T8~ZLuRGd?M}r5fbQv0XY~yQ!ZEVC6iYnZ?x*h%384P zqy8l68cqG~@=?Kw=Gq^p#GDVNDV~Jd02nL4gb@=i{-2dWmIq8Hud0C*DpF0R_UzBo zOw>QOP98yLG`UzQAN4hgQcL+ssSwQ`(XMjH`z}m-KNo z1!d_o7bbXyw=+nws^ESf?8v7fyE*UJWH+A*gNr?5s(mC~rbTFq z#siRKrTL2J^t6n&b#~mIhhZWZ33byr&iT5xHc%MVw~g=s06T`3cJ{M`hHGZD{>t{a zy8L?z!`4Qif7x;Uu0vxvF6@@nzIc?esT34f@RhXG`a}!SkZr6)?Nrm{*?L&3pTa_n zhC{xY)ueNNQ$=S(B1OvYvX={FqNh+6fVq-g@*lKgWdFz6aev2EY`v z^~BTjTR*$1y_2ZlN~akyue-=zF*Qg?!eBK-E9r1|ko90OPm=3r$4Du1+J>ql z8qb^#4G!U{k`Fj!z8)c(h|okYcq<^+FMhRt+jwJCy4A*EqlG5)?@ne%*Zm|@cf(n> zhxU?S@9biZ$)iIJ4i!(FSVSMVwBOs^#lgkxpX-@|7N+c=A0*b|%6@1`3x@l)ncPxM zqfsrQIo(_NSyMO5uo)i!k=~J1xt3J|80ibh>W&uv^vmfkH`i77A)y zr!{gaoO*lz<`b+dV-gj zTSbHd%;Pw1v0bS!9{ou!Q2+PbS$EDar7hVtgm^X=o2B`f+E%xK7Tnb(_!a!)v5;OK z5l8!zuf zLfrSrI`j0VHyO@r;7@C3$62>(thI6RYl?Af{PN1m@fB~`_jAvj0NoRTpvtcpR4nq3 zXZrJ2{<7$PC2eEO=ZCfZv-Ok%m!-t(wDJT5Ii6LbpT>pXw#_0xebz>{VY`-Y&%d75 zuTV+MlCYXmErqYcq>T5;U_GVW@6ldnPJfe>>*WtK))h&Y+4(@k;ALW(OW*w-4Gd!8 z*!9jFZ#hiL=Jcw00M7xgA)yI0$~Yt0u~6u$$E;)d?%_wXA?@g`w|2wV6NN|yZ9CLEm0K{G2vTx#S^iz}T*kUUC) zEi|p0fh(?vJPd<7UK+#7XPux_pJHDbbid=?+jg_SKXDhp3n@fY`V9z?-}#??M{biV z=}x`EF%SE7MCnqKUC{EUvFCsU{q$aECWVuyT~A+$vPdm-G_>^Fq`zz<9xF=i`1ttm z#Ct%!uT4oAwX!OUhCafiM_f~(Xg+_$)AJ)@_oF^rI1h)zJ>_OjwDJk1ohT=JVp}L)Fh6SL_KLRy=3{AmW(cBpXNi&8Q zy{2a^H9L`$uVCdjslOp7PvTUd^{6#cTDHB(WfK@rmv#`V(XOP|BICqGudyERB`yA5 zlG&WKJl=fm?U^0v5r8!7^ULjY5jT1!P$_S6yGTkF@YuV0M->O-2l)uD|3qaR)smT# zWmzWvx%XH$!p*%HR<(vpz$Z`vLnND4YY?87-AF<=T!b`lPONw!cR|R@O?C*jSAgYT z(=WSzkb_(aD4EfXWmfw6g;S$x&Czla7>nYK5oCkqR(~~+rK?~G-k~SFACcY@X{S1! z)B_A~yXAm!dpy37w;Ee-CgDgh%g=nMV%cqV;{1o0eibRvVPgH}{~XzQ@|J?FcVNqAxl$h4NcgZx&9I6ZjC!b+QF%x~PIrnB*Psn|IGMS{c`ZG97CD)=@d$gNF ziHO!F1n$VWXmG;%@{CP#NuDVt`Flq$fek5QXiHP3A$HA@;)6t_EG6fq&W{B<4RY8S zMs#d`OWJii6t^R?!`{6CK$G7U)8A6~E+wdXNJ%rxI0WmR(X@%yC8bg$-;~KfE=i4& zgE{OgKlohPFkhV_=<#`Aq3&~ce8imuu7I+RBG>leHw)(yC0|7U00g8)(|rxVq$YXJ zIE>+_UFJ}XmA=G*hBi)R;6_cnqf^`=qjP;cKKg^Yciol52e^wn1m$GjJpX%&7Gz-- zATzu~EcC}X+O)**;iZ+6-;~U>Uq4qP0PZc~)@@m5lVM zs;TZD9>`gMn*@EVPVPx28m|P7V=F>AOxg5g8diL|zV^NT<4`4J9iXJ*P4_p7KoJy_ zC()kVDsMUi2(%-;S4AF}yrz9bU2E($std}RqIqodT<^WE$4&!0kG>S;{Vv{y%v5oP zyYL4(fPEQrVU3%_(krG{X!<5fKgG6Vj!*geU`PR6Bo3`g3UbD= zg4zH{=vp4rFEP9(mU!-s-|hbyb>ge^%O>rsc7N{g_LdFX>5Y&hG`)mn{P& zMt+#>rYDYF?mXSwKS@H|EMh6OujaKVOZYOK9cv-a*Z;S&8b&CzP?ANr(GVw;^+xMVG zx|>Pii9Alk@f-sw+4LQ`WAe3L8J~dr_`JVj%0r^~+Sm`dDI_f|vWfCDNG1I?!S!Wn{^qu= zxjitZN`}Y(YVa``_B@#ZB#i=b8G56KjMEUM^rP*6o=u$4KpitI{g4?ijSr6mRN8)@t znb2!Gb9dR^rYOvtY>Wk9{qc&@A$=@`WevV?&C{RZBEs*OQ&mDpWiKCak@GS9gB71k0zK) zPiKE-DP`2FLo7BZ`jO|J7WM^>7O+&+g)M>Mu60~gs7KqlPMyjOwW0Ok$;U2VTKaD) zemypRtgvj(=84oa4wVO`0&Q;3|L*(6GX^Oa2YumAT0E&8iT0O-?SawySYzm zjWx27f4f<4z2F-6rc8-DBqjQgRY@*+wr!eTbm;xG!{Z4k4p-U=s34@X=NI4fj*vJ= z{==>Dg?RFv%iafwyxZ$SB{{i*L{@3#UTklL+wL1Sb0zf5>Zb#$X}S_{96;+%e><7R zlkp#ag`UmOpjo~=@9UFESO*atY*^&)C+w(sLvwf+1fxA~ooUDz&wBRTYn!;~NfwSG zS6w6KZOjMo*pl~Bu(UJEEc_7`y_78>4JBMY?TmQdIzk3?P zU7{*E7r9nZt+T2l38_^%k^HoB-6FZO@kiZ{i1lr;a$qgVZ>DkyNgpc7w)_xkEWSbi zhv)i-vy2?hMuA2FZwjN0T1^AKPJzzG{fRT5eF1RT!*w4e;MlKe?-~MWCQ37X=+I}6 zXqe$f$vTY8@$)-5RlCqq`hY2Qtl%wFdfI1k7C_XqL(DQ4-3nO(b3zL(&~1$uX6(IFX8aR~VGYqgT((GZnyKgIFu~bbYjWNz z>f7Hl-k(4RILPw+J+kwj7HA1;2Jwx#X{-^Z5J=CXy*LLtNpSSLqQn!yPYkosCdEEpbnOCLiR!gsuT-5&7 z>UWP3bb!_l_j-Z*_Z!}pmDgS96xBn>F`vy(C>?MCac{9+gZ(uGRMnLd->UfC@vp`< zPsQ{+2+?^XH`~hjKAZd0p)E&_8h^ zwMQ--#v$?w9n}y$qt+zUs9<*5bt+>y_y=_VEP~_uRwctr59Ps{VV0=H5H=2EXgSG9PT8GR$j2p-Ghx*F{7+(oeQw8G$WkVWMx- z3Hm|7{b^mf(?Z=M2CqiFP(DT)BRG#YHAes+P4FvZJI;7TlWnmAI*2DX^LRw34(niI z-}A!%cnb;p0);h~2|$>gbrdao-f$ZDcK^Vpv3Y%{)G6*U_+1Ly&f8S&tLHa<190Hj zqrI6;tNN>eKk9*pFS*=^P%=AL?pZ*zH zcT`JxpUmTL@$Sz?sOvkxLVF0f<;50MsEm{!i99-Yj^@x7LA~?dTnaJIopH%-0bDE) zdWyAso8k5o-lhk$`yz3Ku!#lU-2hm(QiT0gGrQb+z0PGm>X;OQ{#ZzV{RREuhUq5I z4J{>U!v3`84z_&eF$Ndtw^=%}J*~R;qZ?4*R`4IB?zfA$iky!;d)!H}!AlPtf;|*I z=RV|U7L~SvFC6}H%QFvQYoNO|gTv2t*pH2Ne+r@ytf@bmY~9~pKt1M`1M95t}n$?yz$QTwC^FN;cfaGHpk5*YU2L1-L*OB zw&*ZUwu^~MoW`0ibkE~G2|yFP%y3wCvJS<0^gZ*wcexS*ks()gdz0ILO^7>Q*91!T zlc*ga+H2@?XXJ4bBAZQ|ig7>T*k0oZeIPr8%&%CW`%o8XL0q1Lh~|O-u}_ctWwpn_ zwnHU5&Ryx5)I~HVh?L#u$;_ShCuyyW`-@21^s$wh6JI~U93e;;7{_UdZ?O@-$E67l z$W4ib%~;ONPs@unU#sf7PJkC>lWOmld+{&<8)@*OXD|)fXLa7omC#t4F6kb@|Bqks z(o8$@L0I&w=(MG1+bJ|-9hvG|vN%VEdQY$3g`p;xN$*s8=OnrMQRaS}xl(NSTRqPv z*^0kfIsQzmy(lKIzp>P@PxTdZj4S{lc6X|7WV3!7un;bgB3t0ym%@9#7&hapDzb?Fn54u%d)(M+1nI24{}p%U zI1cu`u{`e%eRU-=yq8hn&ZZdSIezJ%udb`{$_f z^f_C2QM;j@*X)_X0KsAdMIEdT$1~ORSc3LfWIb|S%8UQSeXjK2FH0qOa=+_nv1h+y zw~f27XaNjQkJ*HKoU>#Q%BE2)0x9X54m~dQnYx=uz+%l?zrgnU5bmi_)~m^pF+p08 zE?a!wst+L756#@Xv>fN(Lczz?IlR#n3dyL{UZ?ArWUS90w?%;L;zeD71pZ(0&p)>) zSf5Ag@doN~)EZ*IvClk1r6k!;(?Y`r-mM7bc=MbDM^lRFJ$o1Gy%S7j0twQvBuzw5 zRKs(6y!t4_MSh<0A4P2Wqw_O#^|ASQn!Ekw1!(cpeZ6>k(Pk!$`fXCL^}nxomAJaF z3&h>s-F4p{P7c%8p^Dvf4l7*#${amx+8gh>mSx8d{8P(2oG_q;pwsQN;WD&{Y5}1I z_Pm@OL%F-)vdsPEump4iI7jY&nlto#{$uYpV7qOvZZOxO`Oo<-_-Drk9K$d zBd168OFwPk*dJDZ>nu%!yL8cOhyaQv?ZgDtd5-@sXdU7H<#HgS?cU8rw>uK4z&<#vA;B}G0F_ERpdn7{Sd4-)mZOXn?1QFDB@4cEF7gpZ8 zvllhno9Fi-?O~di{8u399Qm(Oiq7>(!`adts@@Gn zL@)ahvpP3eWW40&=3A=%mo6?Y@ZbMdysk{IMJFa*YreG;d4vZUeTP_`0Xt&#s7f^VxQk|~uNr*&*fYAR!|zoX!J%S(R+u=ph=pB5X|E{&(l z<#_w-^;Hle2X6xwJj(M0kT*{JNLDMX&*_*UhLg!JNC1`l5@g$;&sS zyjz1HRp(AaFeMlG!i`a1ccufJX`jg!twmhcRhac z82vHR-S9*JDSIv)%&c}^yzkNT>w(0a$J0SCS$tz`;(R6Sj{>-sZCA+@>;}Ve5?aDA zhzq~o2K$6X;egKSy6u7hSmHYP&QcP(!c7VqSJ%j7RR4Es*Wq)9^;OT}D>M zv=V%qC&WNWyJIMoMc3>b>cbJKoTJlhM6U1nkO$Fn`s{5}XWX;=>Y)A9!t?}>asQj> z-Uk93z>m>C7c%)&Iz3>))1KEVB0>PW@EpU;0+xdpa|I~{+%5J_S>I^=lFKvi|IF<8 zqfKnEJOGh4S-CkRQA4i3xy7$#-yU~wrFVQ$#$1lY++TH992b&6yP);{xTA%p3+4L0r|@6X!pzc7~piL@4k$olyO_cwC406 zuk|*%)CMYiSg$)Iw2AYza>KC97M*+7s2Gh+&)M}Yj+johB40Vk;9@H8(>nxetDX}c zF7CRIJg{mhtJwgp0?$zkYYCU($^tD=Rl+1tGhU`rbbeWe=kO~l@87NpJ@0B0Wvsvc z-EX#k|A-7-#u57XK}Dd=-$X)-GxPotzSJB$8X54TmNQQ6!;_ zO6g&bh)kS9-iGr@5A!-kp@Ikkuz(L6A^tq8i;a=1JNgjga({{Cdq8O(ACwZF| z)W@p#&RhTKn)5jLhW$mx1PYqPvJ%W|mffD=d7_N>yYW{ddyX|?%Bvi_ zghPFC=+n3mFl@fxV17i% zCieTCWx+KbJY>ma6wZ2~>f*_;)h-7LXjoUCb8hk)&sx5a(4{|)%5vp+6xSb*E;Ws6 z_o!Y!1AL`g_r##kNt?0z7nkZfn9O%r(n@!3E>%)e!;jL7m;;DJdj4ahbIN?4Iu2VX z!H#r=&iBq%S*Pct^$frmr3%c*rLsCeymQSbhUzYUVQpk}2P@sBgq?stwaX#f3HKrY z8}Qdc4zW`v{=6C$UC!0@eQN}yLfEouX@<3ZwI;1&fb7@tY&!d0#zgzN3$J3RtGBJn zWlS^6F)^Nxe5T*(xBm*kK(c{SnXcYAoIP~eOehfVO6(sw0Fyx`S*IdwN4S23DFt;u zKf>fc=?@|9cV9meQ0CKCxTn~7#rMDLb7ItU_=T8z3LD5w!xrLn&oOIOfTyNjoH=mM ztE&HZwDG*0P;vz`FI1%^Z$4FGg&@l2buiRgh`3_pY&6x@X3amrR4VKiZ3>y~`w#R6 z2s}H-{F*i(B>lMh$C2vl&T^pczCk^ggh(v~eY+XM%8KSg?1WH%Fv+c7y${-ku zdxzb{aj#6Ra)9G0I@iN)EIs(27oMr@4X#ysLIyi=7?aVnkQ(%r@JrpV*B_lmZ__oI z^1ML>8TdVzgE9ism(=gz_w=`_P=&TBl@@UOD}fDnvX#u(Y{ExB*Mis#e#->W^d$!t zs^#g@Fu|3-AscE@>kVpv2dW+Mo#+m9qJ@Ynj>&@{m=#rI79=YXkFCKnFo0&2(1%p@ zR%`6S4q?ibj9m#ImOF?%Al-^=QBF}0utkRp4W&il`VG$AJ&OEK+%LT^iJjF0+*rWb zpdq0m%D2|M>a<`;Vn|#-O^;PDr;xq)eZwvIKX-EvcIU@Lhfp&nhX-L9;<$E2F&-;_ zvM9SwM{yIWlsR@g5%i&}5I=vJFECvKB^$*-AcH^FpX7t`Y}ag)#wM)He^6_Bpp8lV z9)i=o%-vo;jC=!eu1qU<)XW<_1iJNLj!m%DD?{qOL4K(Pmo)U+wbh$)@^ADv|g za@eUxV*Zkn@Ms>~?7F~W@b7Tb3a#Dl0=KE9*;K_`KQtz#iEGx+j}jEOO(5{x)jV>T zWL2S0aQWBbbpGTH_;iZM5=79?ToWICu2Z+d`k$ed)H(L0cKs)he!=*Mm0>jVB=Pj% zv*I)Z#LdRDmoU5R7}Q1!I8aYu@9#ZwA+uGmeu2A&HYG@Oy%4o52XC^I596w)jl#Xk zixjV=8iQF^!wrWYt1G5;17YmTqtQhs8+192+MYZA0LZRzNI{FYDl_IcJ=zRtI!BqS zUtBOlGwiS+i&d_nvN&sp#e~DC)*r~co2|aL4@5{q)tD=)t~~JPd=G=&E>>9Cf>Bk7 z@doV>=oD5~{L#mevZo#UDrWxP43EnHQJ z{SMuFz--GjmPdvJjA9uOz7w|m`SbuC?De$!t#LWkBj98>p_L^26?%t2kC;ZpXRP9c zobhEkJ5@)C`Qs@9)!HrP)rbkim@{AK zSA`+-WW)A0+x{%W7$2&aXlQ)0G7Uzsdy43CfG8y$WYWq?$i%#d%Y5x8@3T|b6f1kZ z-T*_-SQx)ox%Jy#0}6(Y(8XzdMzDX|r1DW8%xtYuM%i1Lnqbi+0(QTNuQC6l>7#h^_z@Rp@O zPs_2 z(%ZQPsVaIttP8aOR+@nq0S~~Uf5fkkv)WQSc-~0B23t#z*0H8~ME+mQ78xC1h$@vvQR8xw$|6`2LhNZ^&%Q1l^!nv3DRqnLetI&R9 zpP&6f4bL)uk8W#M0BqYq7x31&Z&+<`YIwfRThx<8Ul}KCw+v}zP6iHPF%P?fdiY_d!juV;<$)^s$;KpuaX~WG> z5qMB4S$61uduQT2!1=|{FgbhxXCfAqD|C13vfdk0bJMWnMN6H4eJIqtgr`X|&oja{ zp&Teb$q-pIzp`h+#Z$poUEYuWj^~7d70afhk1PHxz;4&m^AgVQd%}sdxCWAqS(x=_^D+f2% zTR`|Vif#Lf9&U91cTgz%6KvKkQ4FP&z15U5F-0172;C|&?yxP%yPp=0g*4LVRF5my zkCM@w;9!Rhs^7Mq+w_HyAlt~^n~XnzvYX=Qfl4F*#P0n|l{rIXoI2REfyD=IbJv<| z%Nyp*KN};nNE@LwJVb`nX0v6d_4W8#ggDOfeY1 z{?!AkXu^T^Uor2;wADZ$`&W1Rsn>Nq`E)00B(Q6)6#A5#mn?--M`2S6-Ik`nKSVaZ z@4MUA&a-@^Q=jk2+9-PlQd5~x>Cvvs$l8T4l4E=fo_$A%>Sg$tL zWzaUbAN6NqyYSoo+6wPbraXSz&pj+4RY?IgwtWxS$YjBvY&HA*S5_TfAdj0V)`b6H zANcc7yDq22dESe`>0P~p2H1MQn67pc#@b+~Zt)6i+OWa?iP%W7ypPNrl`T)_jYziG z@tIsWDq)t$7Be7LA(fy^%FSmdl=I;%4SeAOO)=p6E7mz z>_{?Col&w#dVV(a{{uZ0FWZR{A7+K_3q5SMIv3sFOmShu@FigV>962#@vA7!kv}Hz zChvXjEp?s$a{!Yu|6x(I?lia&cA^$nm{?Z-R1n!=iI0`IU$=ocA#%1o{1V;2y8rHC zqS|iql#)!%%2;O`CrgdnnUn@Od=>8XVCAguWKL+tm~Alltmj^QIWlbjW+=8|2}jFX zw{sXZU->Iw^blP2jH>gh&a*4A94Ox;0#I_z@9u{%G^&Jj$8E>JWbSUdP&)ILP~DJ9}`}`B4w~HK{|AUiEB#1NXxkVf8jGiS0BG26iE@2~9Z*iy+oGVOfh`xV zf!RGszE;oiOx1^OAiqXQVLI|%R${lU3ETkwlpjEA`?U!!g#hf54e;Xak zm!tEjK8N|@8Grqy+$NG)M-!8QW{US@JbdEV8s`*%GI(mrMGPsM+r2=R1GYg_9(lx00Pf5t$~{g;0> zK*|j1ycJ(m(2;yLKZiroI@YqB{we4wwX4&PJ zVPuJrLh(O+fnW0+WBnvr^o6mriz99ib4ap|tqORpC1i?wpb0)amQ zJz50wO9C=5<&0Hq0TP!7&$b~xZ0cWf2%^M)k;_|r_2zae@B@)pkG!|D50igEsnXBy z7|=)pj-%VYd;-!`Kc$pY`c?elI>C3D`R-vl4;y%YNJYR^;5+3jb)J~A({21W6%pWX z<8Rw^ZJXWZ@ANIPK?lvf&8=BdK=bqV2R^{phD%>jXl~#F zxg#a|dBA4Z`7XjQmJ4d!K}QpQVxO9D4*#i^g&_gWhxbu)KxD0zSU+X5*5j6?+aJnknUH4`Yb)d~}6_g*EKcGI8{sbf^kQz=Z zPG2lWVJiM1$LvPKM2G5%|wHx}Q+kVq?2ZCT6lx!fmiM z$?B%K73Qb0=*kd2mS3O&?|L}@jX$_*JebiL+fG)o*OrYvk!wlZifw#pX=?f_9a@^- zLfe?k2$QVXmWJeHe1#vSgAni&Ztg|>VQo?L#!FloaRF8Hy6YlBM4iDTN5c#Y(=%sQ z0lWF;@Dd-n@{+bcQK@K*7tgVdI7fcK{iskI@r4hCNm*hVPhSowP2%6c4$+GctXrN^ z*HBas9fNymMSTsh(jKd zy?m=PdYIVoB~FAgS6Z8f*FF%l_2!7dL{f#y1zec#<3E|XP;RZ%3Qor2pRf21! z9pZ-+hM5iSc?w&$069NV+3C)_Itwsr&*XzU;kj341BB((pmCb7^6h#39PHIAx3hdK z&41*zh=HbbIVpxqNn=PBQGelGo=|S319gs=|A{`4keb;M&guU4)nU#)G+CU?|0;sl z42Ru6^WTRixJG)Un4afz(uCuDT!fJ{?hq)vhB)u@W?Hx@jm7F&3N2oOXmTFS+c|G38Wvw2FHO!oh%>3Vj3}u8s)2E z#@2LVp6ID2g`*0CD4J|VpX5lB_1=HP2}0s|Bm{x5o&Ia{U%?{F6GKGc)Rj2T@PSnf z$T$T(nxc{$+v4_G29RGPrJ#G2n2C#;W3zh4DtyoD>dvZVnwZE%JG0j^aDN>7YGB#*NLXmFFc6F&=+$Om)qeaSW&EaJ1UzNCOEC zrkF3Hkv6|zTQ}bFCXH@^gUW`&a=VIrkPB-bdS4l~W$J`Ps}Jw9Kh&`W-)D|;iQnA!%kJ7E8D?Wc}W z-80+$(c@^{t2`cDoE4dBip$86PpbEHe#o^<14)n)E6=JE{V5Lqp!B#^C^^5c^N&O(bh0X>#y4D%?+qz zKg7~M`B4iCYZdFMs}r?`JL6!uJtlIPL~t0_?-nY4886ulDrqwxB{|3}`IoRA-0hy= z-i1~|=5Q6$We^)5Tm|(Nt83zLIo;85?k=8$w448{~2N+%HG5ov?+?X-`5|7tVKUP;ctDkMI2E`O0 z?hwa4jg3BWXu&*gXOLt@TD`Y@AjVgla8zj3g|F1oZ&V402(WHr-oK*NtjC9!8j1ZA zn$lf)QuSV>Em7g-@rIPYk@^9*x-W~;14s?L3*0lrSCJA8HvnexuOtspWN&v(8_%#C z61rtvN{!TEwqtMPbdK%9;w7{Fr)zm%oEz!dN_v*=_Ufo8b_Wmk^ zmfg7B%qIhL+Cn2&|5S=$bIuEG-)25*7dBUqR}g8;aFGAC${)xN@5aZ0cQLUnN*~I3 zNAdD zI8qk+RV70&_;aGY{}~l~s=SsX)uSpbg(lSnylfKL+)OuGGT2D!&y0BUEX_Q$pmx|Q z*@VyGB9dq9>rZ&ol|{>L%C^{!oFK%%Ag{ITGy9!SoUoU@ybbUXk;2jssIy+IF;Icf ze^}?M5y5U?X|T<)jnTU0kem;9UVo8eI_`k$hI3&pDL8ab>Grk>BeJ}gPnID2kT_~) z&;-=9ksa|E1yX`$@m<%-KT0b1{xo?7h*a?1-sCFimV9@C8^Lola~3k{ZFs=`LL^bc z?LeU3tgkKTs#ixYOj-!PGyT^EyRpO&SF5C{N&Ue$uG8>bHzxWqh*!X9U4rZ(Ru;NX z+RiSO@)sf|nc{Jq6enI*ok9MNO%Z?B>rIWgFwMXC7?-CpB6wKr{6OcSZ8mKT#Fu|C zRG#gFiO6F|%LRLyjA=&)K{Mprcc*qTV}sJd=qMlQ!2-NcRb9?bBmPbCuQVRp6EYLj z&K*XLMB4wT?S3)IT8{E-M!fO=h)3w{Lx`rdJ;9A1SJOa(8?O(wS4R^EAv`37Q^(%; zvv}1tVjDNqg#_emBsbR*bS(q#7fIMeMl89hpl4Z9!w5o(cxGhygV$eLU`73PInvkU zPrnNUs>Oof-QIM;a;~vCp$LgW@4oeI!Tq@}Wl23rN)2^o4VW;ssIt!~4m0_k)&|)E zQMA1b@7^x`Gx8GqE|&?*;okBpO3@WKP~inCeFi#yn~WM(fi!~M;ejQX!%8RRqSV;_ zn0%P#^YbY06%kg?L;NIosk*JVOneJ8QW}dv@|Jy$BF;_ zleFe3T=^s-7hR|&-+uiRD3>^vOvXdhj*K0XRsnj?pL~^lHWPB|tG)68c47rHd zlmofX)A|XG*_fHAOmZ?6!h&PGMXQGA@fJuDg+RkL^`Y+@A%u3j*FsK37!!g_fCMz- zG6;CjLlf+oc@GYRHfm zx}md^6X@5o>v-pEWmSG$ClP;+>$o>!jAQpF$_^^>a-e@Wt>Es7W%0hY`@5SY*Re@y z0ZZx=K)+8?Cy8Z^F!2^v13dSb)9;btmFB(6)gfE;JvW#!BQ)Ng`nI3|W0tg+mYGZ_ zTk$Zc=twa#3GAh@NW0hxv*?}fKa+A3S@o=J9Qe5sWyYrz@5|5xdkCZ^t{{@Rxt`@A(VRoly~;o2i=?0Q{Q~_K3mz_i*6`%elR^5 zd+)~-vE!72<90&}qF}S!Kt=!9#jE$|=Vyy#wg)CmG0#KDpu!xOEnx+TqBgu@kl7x= zpUp8*mJ(uw&s{A)Z4<)M$v5{qH3Y%y=jK*fka)>Om%C4k=F?WT*6uW!QoZ5ZX_26CSfv2^ucc}8M zK-&7=G*;l^h79R+izOGTKMct@sG>hO&aS}~vxuZ*vPHOK2-=3a6SkgrUEAr%ocFw<{ zo$Lct=+Ms$y+6xgY!ulRkiDTOiy2kwbIIBnx8EWP{W@JbwKD%7@`MlPRi6)wJ5V;76NTjLd~s=dRL!Mp9b67S$G8hGma zTN}NUzxsBmWn;pk3p4jSsF3;a2xgTv!rr#cIy-3|k40m`JPTm(frYf?bikzW8ICm6 zqMl4HI2K{=^n2A;X1snsH50M=sIDL^Hjjo+>wB%(9_cqa15|Tu%iumUva*r-3ha@u zvdS>xR)jb&sl&9YPZiasfR#RJogp$?<3q!K$COHgGh*3_zxf?~CKAu=A@p}qgFzd! zN~zwnO<$L7UO2Fd#M~*>%VQB2vBErp#7zBztPQhdks4-i4-v`;gs55+8*oe&AS2tR z54MTTr|na`^6l)gQv7#A^c2PdW*cyfq?u{*+qYRraq!KxV~t|4-GesE;V(ES4uObI z6t)+Qjy1XI8GnbV6l%8Qzl_s0QZjsYm1T#?zX(YOCXljKC@rI6$C32@NA}@+8-5rp zbKY1Ex82_ir%`;T03$hU+VpqKT{eJa?v^*X`&Rd!|2~tIzD<8!5AuO`2`)Bt!p-5} zPqqbzx#MNPj$i+aH!uHamBKiC1EZszeY_-PxXNM3IthFkPgEb7s@CnI`NNfyHxq}x z$P;L&k)H@rF(Yq^Uj_a4(Rz!1+6c$X7XOTzl!`&v z-BwX(dF|9~ML@my)O+I(_ofzE5c9ju8kIh})~%id3sYeB<^9@B$$1p4O>d7Sq47naiE_Cvdk=uS!zj!w};vwnH1|}tK=G3Rs z@382O+E5}DcA&V!8Wt^lSj@v3+(Kj)cd<>_PN;BTUw#Q|e|GBtI0gU1=oMExgNP zi0BMw{PFE)VoF;WO;chD(c%3j-D%mxsV^wQSlaB^ytLOjhigZRnkZw&trjwZG9THo zUS}XY4qGq{aRhy62X1|-rg1hcOp_=(I#;l8;NtQX4*!RuZn)?B_yQ2@PexKvqDI^( G@c#jz51{G* delta 33203 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 Date: Wed, 10 Jul 2024 01:02:20 -0500 Subject: [PATCH 052/212] Automatic changelog generation for PR #3193 [ci skip] --- html/changelogs/AutoChangeLog-pr-3193.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3193.yml diff --git a/html/changelogs/AutoChangeLog-pr-3193.yml b/html/changelogs/AutoChangeLog-pr-3193.yml new file mode 100644 index 000000000000..8d7f7ad8e9de --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3193.yml @@ -0,0 +1,4 @@ +author: PositiveEntropy +changes: + - {bugfix: Mars and Venus are now referred to by their correct names!} +delete-after: true From d2be8597b9c734fe4a47c57e55c29cc8f1268670 Mon Sep 17 00:00:00 2001 From: Imaginos16 <77556824+Imaginos16@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:11:54 -0700 Subject: [PATCH 053/212] SolCon/SolGov Hardsuits (And Its Subtypes) Can Now Stow Away Guns! (#3187) ## About The Pull Request Does what it says on the tin. You can now holster guns, ammo and such on the armor slot while equipping the hardsuit. ## Why It's Good For The Game I almost got shot because people got terrified at the fact I had a gun on my hand, when I couldn't holster due to this oversight. Amazing. ## Changelog :cl: PositiveEntropy fix: You can now store guns, ammunition, and melee weapons on the armor slot when equipping a SolCon/SolGov hardsuit, and its subtypes! /:cl: --- code/modules/clothing/spacesuits/hardsuit.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 4827186a95c5..02fbb162892b 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -1217,6 +1217,7 @@ item_state = "hardsuit_solgov" armor = list("melee" = 50, "bullet" = 45, "laser" = 40, "energy" = 30, "bomb" = 60, "bio" = 100, "rad" = 60, "fire" = 90, "acid" = 75) //intentionally the fucking strong, this is master chief-tier armor //is this really what you call the strong?? is this the best solgov has to offer?????? helmettype = /obj/item/clothing/head/helmet/space/hardsuit/solgov + allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) slowdown = 0 supports_variations = DIGITIGRADE_VARIATION From b223bba2c743900f7347175ae3736de7ce63064c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 10 Jul 2024 01:22:13 -0500 Subject: [PATCH 054/212] Automatic changelog generation for PR #3187 [ci skip] --- html/changelogs/AutoChangeLog-pr-3187.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3187.yml diff --git a/html/changelogs/AutoChangeLog-pr-3187.yml b/html/changelogs/AutoChangeLog-pr-3187.yml new file mode 100644 index 000000000000..3d686a578daa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3187.yml @@ -0,0 +1,5 @@ +author: PositiveEntropy +changes: + - {bugfix: 'You can now store guns, ammunition, and melee weapons on the armor slot + when equipping a SolCon/SolGov hardsuit, and its subtypes!'} +delete-after: true From 51084524fa530e7e816445abc6bef1adc93bbd88 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 00:55:17 +0000 Subject: [PATCH 055/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3163.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3175.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3187.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3188.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3193.yml | 4 ---- html/changelogs/archive/2024-07.yml | 11 +++++++++++ 6 files changed, 11 insertions(+), 21 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3163.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3175.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3187.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3188.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3193.yml diff --git a/html/changelogs/AutoChangeLog-pr-3163.yml b/html/changelogs/AutoChangeLog-pr-3163.yml deleted file mode 100644 index ff5ef750fe62..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3163.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Martinpachu -changes: - - {balance: Pizzas have become cheaper. (6000 cr - 3000 cr)} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3175.yml b/html/changelogs/AutoChangeLog-pr-3175.yml deleted file mode 100644 index aba432d7ce74..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3175.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: generalthrax -changes: - - {rscdel: Removed tator tots and raw potato wedges} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3187.yml b/html/changelogs/AutoChangeLog-pr-3187.yml deleted file mode 100644 index 3d686a578daa..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3187.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: PositiveEntropy -changes: - - {bugfix: 'You can now store guns, ammunition, and melee weapons on the armor slot - when equipping a SolCon/SolGov hardsuit, and its subtypes!'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3188.yml b/html/changelogs/AutoChangeLog-pr-3188.yml deleted file mode 100644 index e6394ead8bc6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3188.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Cloudbreak -changes: - - {code_imp: Fixes a singular typo within the code.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3193.yml b/html/changelogs/AutoChangeLog-pr-3193.yml deleted file mode 100644 index 8d7f7ad8e9de..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3193.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: PositiveEntropy -changes: - - {bugfix: Mars and Venus are now referred to by their correct names!} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 02670bd6dd87..92ee91ee5671 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -46,3 +46,14 @@ meemofcourse: - rscadd: Minor changes to the Tortuga. - bugfix: The holofields on the Tortuga-class and Brawler-class now work. +2024-07-11: + Cloudbreak: + - code_imp: Fixes a singular typo within the code. + Martinpachu: + - balance: Pizzas have become cheaper. (6000 cr - 3000 cr) + PositiveEntropy: + - bugfix: Mars and Venus are now referred to by their correct names! + - bugfix: You can now store guns, ammunition, and melee weapons on the armor slot + when equipping a SolCon/SolGov hardsuit, and its subtypes! + generalthrax: + - rscdel: Removed tator tots and raw potato wedges From 11343eef2cba66156c244e0388f38c28af647658 Mon Sep 17 00:00:00 2001 From: meem <75212565+meemofcourse@users.noreply.github.com> Date: Thu, 11 Jul 2024 18:44:16 -0400 Subject: [PATCH 056/212] Valor Remap, Minor Inteq Code Tweaks (#3115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About The Pull Request ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/67b0dbfa-3b5a-45fa-b6ee-2dab27b8c755) ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/8a62c180-cc96-449c-95cb-194685a789fa) * Remaps certain parts of the Valor. The Haste has not been touched apart from a single handrail. * The Valor now has a Shuttle Pilot, and a Shuttle Corpsman. The Shuttle Pilot gets an office and an outfit. * The Vanguard basetype was changed to be consistent with the other outfits (e.g. empty subtype instead of being empty by default) ## Why It's Good For The Game * there was complaints that the valor sucked * born to map dmm is a fuck 地图 strongdmm 2019 i am maptainer 410,757,864,350 mapping sins ## Changelog :cl: balance: Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle Pilot). code: The Vanguard base outfit starts with gear. /:cl: --- _maps/configs/inteq_colossus.json | 2 +- _maps/configs/inteq_hound.json | 2 +- _maps/configs/inteq_talos.json | 2 +- _maps/configs/inteq_valor.json | 11 +- _maps/configs/inteq_vaquero.json | 2 +- _maps/shuttles/inteq/inteq_valor.dmm | 1276 ++++++++--------- _maps/shuttles/subshuttles/inteq_haste.dmm | 11 +- code/modules/antagonists/ert/inteq.dm | 2 +- .../clothing/outfits/factions/inteq.dm | 62 +- 9 files changed, 662 insertions(+), 708 deletions(-) diff --git a/_maps/configs/inteq_colossus.json b/_maps/configs/inteq_colossus.json index 29337cb015a2..718ecb9f1295 100644 --- a/_maps/configs/inteq_colossus.json +++ b/_maps/configs/inteq_colossus.json @@ -18,7 +18,7 @@ "limit": 1, "job_slots": { "Vanguard": { - "outfit": "/datum/outfit/job/inteq/captain", + "outfit": "/datum/outfit/job/inteq/captain/empty", "officer": true, "slots": 1 }, diff --git a/_maps/configs/inteq_hound.json b/_maps/configs/inteq_hound.json index cad19884158f..3d3617263f61 100644 --- a/_maps/configs/inteq_hound.json +++ b/_maps/configs/inteq_hound.json @@ -17,7 +17,7 @@ "limit": 2, "job_slots": { "Vanguard": { - "outfit": "/datum/outfit/job/inteq/captain", + "outfit": "/datum/outfit/job/inteq/captain/empty", "officer": true, "slots": 1 }, diff --git a/_maps/configs/inteq_talos.json b/_maps/configs/inteq_talos.json index 207b29eca77b..54f134964470 100644 --- a/_maps/configs/inteq_talos.json +++ b/_maps/configs/inteq_talos.json @@ -18,7 +18,7 @@ "limit": 1, "job_slots": { "Vanguard": { - "outfit": "/datum/outfit/job/inteq/captain", + "outfit": "/datum/outfit/job/inteq/captain/empty", "officer": true, "slots": 1 }, diff --git a/_maps/configs/inteq_valor.json b/_maps/configs/inteq_valor.json index 92162ac1a5da..1a3c957cc7b9 100644 --- a/_maps/configs/inteq_valor.json +++ b/_maps/configs/inteq_valor.json @@ -23,9 +23,18 @@ "officer": true, "slots": 1 }, + "Shuttle Pilot": { + "outfit": "/datum/outfit/job/inteq/warden/pilot", + "officer": true, + "slots": 1 + }, + "Shuttle Corpsman": { + "outfit": "/datum/outfit/job/inteq/paramedic/empty", + "slots": 1 + }, "Corpsman": { "outfit": "/datum/outfit/job/inteq/paramedic/empty", - "slots": 3 + "slots": 2 }, "Enforcer": { "outfit": "/datum/outfit/job/inteq/security/empty", diff --git a/_maps/configs/inteq_vaquero.json b/_maps/configs/inteq_vaquero.json index e8d790a526dc..459b7353d292 100644 --- a/_maps/configs/inteq_vaquero.json +++ b/_maps/configs/inteq_vaquero.json @@ -15,7 +15,7 @@ "limit": 1, "job_slots": { "Vanguard": { - "outfit": "/datum/outfit/job/inteq/captain", + "outfit": "/datum/outfit/job/inteq/captain/empty", "officer": true, "slots": 1 }, diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm index b98d0f2f13cd..1d0c4910e49e 100644 --- a/_maps/shuttles/inteq/inteq_valor.dmm +++ b/_maps/shuttles/inteq/inteq_valor.dmm @@ -81,27 +81,8 @@ /turf/open/floor/plasteel/tech/grid, /area/ship/cargo) "aW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/airlock/grunge{ - name = "Medbay" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/borderfloorblack{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner, -/turf/open/floor/plasteel/dark, -/area/ship/medical) +/turf/open/floor/plasteel/patterned/grid, +/area/ship/hallway/port) "bh" = ( /obj/structure/railing{ dir = 6 @@ -115,34 +96,15 @@ /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "bv" = ( -/obj/effect/turf_decal/box/white/corners, -/obj/effect/turf_decal/box/white/corners{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/closet/secure_closet{ - icon_state = "med_secure"; - name = "corpsman's locker"; - req_access = list(5) - }, -/obj/item/clothing/under/syndicate/inteq/corpsman, -/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, -/obj/item/clothing/suit/armor/inteq/corpsman, -/obj/item/clothing/head/soft/inteq/corpsman, -/obj/item/storage/backpack/messenger/med, -/obj/item/storage/backpack/medic, -/obj/item/pinpointer/crew, -/obj/item/storage/belt/medical/webbing, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/patterned/ridged, +/obj/machinery/suit_storage_unit/inherit, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plasteel, /area/ship/crew/office) "bx" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 - }, -/obj/structure/closet/firecloset/wall/directional/north, -/turf/open/floor/plasteel/patterned, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/mono/dark, /area/ship/cargo) "bB" = ( /turf/closed/wall/mineral/plastitanium, @@ -262,14 +224,10 @@ /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/maintenance/port) "cE" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/plasteel/patterned, +/obj/machinery/autolathe, +/turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "cI" = ( -/obj/structure/catwalk/over/plated_catwalk, /obj/structure/cable{ icon_state = "4-8" }, @@ -279,8 +237,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel/tech/grid, +/obj/machinery/light_switch{ + pixel_y = 20 + }, +/turf/open/floor/plasteel/stairs{ + dir = 8 + }, /area/ship/cargo) "cW" = ( /obj/effect/turf_decal/spline/fancy/opaque/black{ @@ -389,6 +351,7 @@ /obj/effect/turf_decal/trimline/opaque/brown/line{ dir = 1 }, +/obj/structure/chair, /turf/open/floor/plasteel/dark, /area/ship/medical) "dG" = ( @@ -457,6 +420,10 @@ /obj/effect/turf_decal/box/corners{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "ec" = ( @@ -508,7 +475,6 @@ /area/ship/bridge) "el" = ( /obj/docking_port/mobile{ - can_move_docking_ports = 1; dir = 2; name = "valor docking port"; port_direction = 8; @@ -532,10 +498,16 @@ /obj/item/storage/box/zipties, /obj/item/reagent_containers/spray/pepper, /obj/item/megaphone/sec, -/obj/item/clothing/suit/armor/vest/alt, -/obj/item/clothing/suit/armor/vest/alt, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/suit/armor/vest, /obj/item/kitchen/knife/combat/survival, /obj/item/kitchen/knife/combat/survival, +/obj/machinery/recharger{ + pixel_x = -16; + pixel_y = 5 + }, +/obj/item/clothing/mask/gas/sechailer/balaclava/inteq, +/obj/item/clothing/mask/gas/sechailer/balaclava/inteq, /turf/open/floor/plasteel/dark, /area/ship/security) "ey" = ( @@ -558,21 +530,28 @@ "eU" = ( /obj/structure/table, /obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_x = -2; - pixel_y = 7 + pixel_x = -7; + pixel_y = 10 }, /obj/item/reagent_containers/medigel/sterilizine{ - pixel_x = 8; + pixel_x = -1; pixel_y = 3 }, /obj/effect/turf_decal/borderfloorwhite, +/obj/machinery/button/door{ + id = "valor_surgery"; + name = "Privacy Shutters"; + pixel_y = 8; + dir = 1; + pixel_x = 8 + }, /turf/open/floor/plasteel/white, /area/ship/medical) "eV" = ( -/obj/structure/closet/firecloset/wall/directional/south, /obj/structure/cable{ icon_state = "1-4" }, +/obj/structure/closet/firecloset/wall/directional/south, /turf/open/floor/plating, /area/ship/maintenance/port) "eZ" = ( @@ -600,14 +579,19 @@ /obj/effect/spawner/lootdrop/ration, /obj/effect/spawner/lootdrop/ration, /obj/item/storage/ration/crayons, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "fj" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/obj/structure/closet/secure_closet/medical2, /obj/machinery/airalarm/directional/north, +/obj/machinery/vending/medical/syndicate_access{ + name = "\improper InteqMed Plus" + }, /turf/open/floor/plasteel/dark, /area/ship/medical) "fE" = ( @@ -630,7 +614,8 @@ /area/ship/cargo) "fK" = ( /obj/machinery/computer/crew{ - dir = 8 + dir = 8; + icon_state = "computer-middle" }, /obj/effect/turf_decal/corner/opaque/yellow, /obj/effect/turf_decal/corner/opaque/brown{ @@ -642,33 +627,43 @@ /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) "fN" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/inteq, -/obj/item/clothing/head/helmet/space/inteq, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/patterned/grid, +/area/ship/hallway/port) "fO" = ( /obj/structure/closet/secure_closet{ - icon_state = "med_secure"; - name = "corpsman's locker"; - req_access = list(5) + icon_state = "prisoner"; + name = "shuttle pilot locker"; + req_access = list(3); + icon_door = "prisoner" }, -/obj/item/clothing/under/syndicate/inteq/corpsman, -/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, -/obj/item/clothing/suit/armor/inteq/corpsman, -/obj/item/clothing/head/soft/inteq/corpsman, -/obj/effect/turf_decal/siding/thinplating, -/obj/item/storage/backpack/messenger/med, -/obj/item/storage/backpack/medic, -/obj/item/pinpointer/crew, -/obj/item/storage/belt/medical/webbing, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/patterned/ridged, +/obj/item/clothing/head/beret/sec/inteq, +/obj/item/clothing/head/soft/inteq, +/obj/item/clothing/suit/armor/vest/alt, +/obj/item/radio/headset/inteq, +/obj/item/clothing/gloves/fingerless, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/item/clothing/glasses/hud/security/sunglasses/inteq, +/obj/item/clothing/head/helmet/swat/inteq, +/obj/item/clothing/mask/gas/sechailer, +/turf/open/floor/plasteel, /area/ship/crew/office) "gb" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 10 }, +/obj/machinery/light/directional/west, +/obj/structure/chair/sofa/brown/left{ + dir = 1 + }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "gh" = ( @@ -678,14 +673,14 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "2-8" }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) @@ -740,14 +735,7 @@ /turf/open/floor/plasteel/dark, /area/ship/medical) "gq" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 20 - }, -/turf/open/floor/plasteel/patterned/ridged, +/turf/open/floor/plasteel/mono/dark, /area/ship/cargo) "gt" = ( /obj/effect/decal/cleanable/dirt, @@ -767,11 +755,12 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /turf/open/floor/plasteel/dark, /area/ship/medical) "gZ" = ( @@ -796,6 +785,9 @@ "hl" = ( /obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/chair/sofa/brown/right{ + dir = 1 + }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "hm" = ( @@ -870,7 +862,7 @@ dir = 8; pixel_x = 12 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/patterned/brushed, /area/ship/medical) "id" = ( /obj/structure/cable{ @@ -897,6 +889,7 @@ }, /obj/structure/chair/sofa/brown/left/directional/west, /obj/structure/closet/firecloset/wall/directional/south, +/obj/machinery/computer/helm/viewscreen/directional/east, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "ix" = ( @@ -912,13 +905,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) -"iI" = ( -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/obj/effect/turf_decal/industrial/traffic/corner, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) "iN" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 5 @@ -971,7 +957,11 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/plasteel/patterned/cargo_one, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel/patterned, /area/ship/cargo) "jk" = ( /obj/structure/cable{ @@ -1017,15 +1007,9 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "jG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) +/obj/machinery/rnd/server, +/turf/open/floor/plasteel/patterned/ridged, +/area/ship/medical) "jL" = ( /obj/structure/grille, /obj/structure/window/plasma/reinforced/plastitanium, @@ -1036,12 +1020,13 @@ /turf/open/floor/plating, /area/ship/medical) "jN" = ( -/obj/structure/chair/office/light, +/obj/structure/chair/office, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable{ icon_state = "0-4" }, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/half, +/turf/open/floor/plasteel, /area/ship/crew/office) "jQ" = ( /obj/structure/catwalk/over/plated_catwalk, @@ -1068,14 +1053,18 @@ /turf/closed/wall/mineral/plastitanium, /area/ship/bridge) "jT" = ( -/obj/structure/sign/poster/contraband/cardinal_port_starboard{ - pixel_y = 32 +/obj/structure/rack, +/obj/item/roller, +/obj/item/roller{ + pixel_x = -1; + pixel_y = 8 }, -/obj/effect/turf_decal/techfloor{ - dir = 8 +/obj/item/roller{ + pixel_x = 1; + pixel_y = 16 }, -/turf/open/floor/plasteel/tech, -/area/ship/hallway/central) +/turf/open/floor/plasteel/patterned/ridged, +/area/ship/medical) "jU" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 10 @@ -1130,20 +1119,11 @@ }, /turf/open/floor/plasteel/dark, /area/ship/bridge) -"ky" = ( -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/ship/hallway/port) "kG" = ( /obj/effect/turf_decal/techfloor{ dir = 8 }, +/obj/structure/closet/crate/bin, /turf/open/floor/plasteel/tech, /area/ship/hallway/central) "kH" = ( @@ -1186,19 +1166,20 @@ "kL" = ( /obj/machinery/light/directional/south, /obj/structure/rack, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "kW" = ( -/obj/effect/turf_decal/techfloor{ - dir = 4 +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 }, -/obj/structure/closet/crate/bin, -/obj/item/trash/chips, -/obj/item/trash/energybar, -/obj/item/trash/cheesie, -/obj/item/trash/pistachios, -/turf/open/floor/plasteel/tech, -/area/ship/hallway/central) +/obj/machinery/door/airlock/grunge{ + name = "Medbay" + }, +/turf/open/floor/plasteel/dark, +/area/ship/medical) "lc" = ( /obj/structure/catwalk/over/plated_catwalk/dark, /obj/structure/cable{ @@ -1278,10 +1259,6 @@ /area/ship/crew/canteen) "lN" = ( /obj/structure/table, -/obj/machinery/computer/med_data/laptop{ - dir = 1; - pixel_y = 8 - }, /obj/machinery/door/window/southleft, /obj/structure/window/reinforced{ dir = 8 @@ -1290,6 +1267,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/effect/turf_decal/corner/transparent/inteqbrown/full, /turf/open/floor/plasteel/patterned, /area/ship/crew/office) "lW" = ( @@ -1361,8 +1339,11 @@ /turf/open/floor/plasteel/tech, /area/ship/medical) "mt" = ( -/obj/machinery/autolathe, -/turf/open/floor/plasteel/patterned/ridged, +/obj/structure/rack, +/obj/item/tank/internals/plasmaman/full, +/obj/item/tank/internals/plasmaman/full, +/obj/item/tank/internals/plasmaman/full, +/turf/open/floor/plasteel/mono/dark, /area/ship/cargo) "mw" = ( /obj/effect/turf_decal/trimline/opaque/brown/warning{ @@ -1412,30 +1393,19 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/dorm) "mG" = ( -/obj/structure/closet/secure_closet{ - icon_state = "med_secure"; - name = "corpsman's locker"; - req_access = list(5) - }, -/obj/item/clothing/under/syndicate/inteq/corpsman, -/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, -/obj/item/clothing/suit/armor/inteq/corpsman, -/obj/item/clothing/head/soft/inteq/corpsman, -/obj/effect/turf_decal/box/white/corners{ +/obj/effect/turf_decal/corner/transparent/inteqbrown/border{ dir = 1 }, -/obj/effect/turf_decal/box/white/corners{ - dir = 8 +/obj/structure/table, +/obj/item/book/manual/wiki/piloting{ + pixel_x = 7; + pixel_y = 7 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 10 +/obj/item/flashlight/lamp{ + pixel_x = -8; + pixel_y = 11 }, -/obj/item/storage/backpack/messenger/med, -/obj/item/storage/backpack/medic, -/obj/item/pinpointer/crew, -/obj/item/storage/belt/medical/webbing, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/patterned/ridged, +/turf/open/floor/plasteel, /area/ship/crew/office) "mH" = ( /obj/machinery/power/apc/auto_name/directional/east, @@ -1537,7 +1507,7 @@ dir = 1 }, /obj/machinery/door/airlock/medical/glass{ - name = "Surgical Bay #2" + name = "Surgical Bay" }, /turf/open/floor/plasteel/white, /area/ship/medical) @@ -1601,13 +1571,6 @@ /turf/open/floor/plasteel/dark, /area/ship/medical) "oz" = ( -/obj/structure/railing{ - dir = 4; - layer = 2.9 - }, -/obj/effect/turf_decal/borderfloor/corner{ - dir = 4 - }, /obj/structure/cable{ icon_state = "6-8" }, @@ -1615,8 +1578,8 @@ /area/ship/cargo) "oC" = ( /obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/inteq, -/obj/item/clothing/head/helmet/space/inteq, +/obj/item/clothing/suit/space/orange, +/obj/item/clothing/head/helmet/space/orange, /obj/effect/turf_decal/techfloor{ dir = 1 }, @@ -1754,10 +1717,8 @@ /area/ship/crew/cryo) "pC" = ( /obj/structure/table/optable, -/obj/machinery/defibrillator_mount/loaded{ - pixel_x = -28 - }, -/turf/open/floor/plasteel/white, +/obj/structure/curtain, +/turf/open/floor/plasteel/patterned/brushed, /area/ship/medical) "pL" = ( /obj/machinery/power/terminal{ @@ -1801,22 +1762,44 @@ /turf/open/floor/plating, /area/ship/maintenance/starboard) "qe" = ( -/obj/effect/turf_decal/industrial/traffic, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) -"qk" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/techfloor{ +/obj/structure/closet/secure_closet{ + icon_state = "med_secure"; + name = "corpsman's locker"; + req_access = list(5) + }, +/obj/item/storage/firstaid/regular, +/obj/item/storage/belt/medical/webbing, +/obj/item/pinpointer/crew, +/obj/item/storage/backpack/medic, +/obj/item/storage/backpack/messenger/med, +/obj/item/clothing/head/soft/inteq/corpsman, +/obj/item/clothing/suit/armor/inteq/corpsman, +/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, +/obj/item/clothing/under/syndicate/inteq/corpsman, +/obj/effect/turf_decal/siding/thinplating{ dir = 4 }, -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/tech, -/area/ship/hallway/central) +/turf/open/floor/plasteel/patterned/ridged, +/area/ship/medical) +"qk" = ( +/obj/effect/turf_decal/borderfloorblack, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/hatch, +/turf/open/floor/plasteel/patterned, +/area/ship/medical) "qt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/patterned, /area/ship/cargo) "qA" = ( @@ -1859,6 +1842,9 @@ "qR" = ( /obj/structure/grille, /obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "valor_surgery" + }, /turf/open/floor/plating, /area/ship/medical) "qW" = ( @@ -1913,11 +1899,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel/dark, /area/ship/medical) @@ -1971,7 +1956,6 @@ "sc" = ( /obj/structure/rack, /obj/machinery/firealarm/directional/east, -/obj/item/radio/intercom/directional/south, /obj/item/defibrillator/loaded{ pixel_x = 3; pixel_y = 10 @@ -1980,6 +1964,10 @@ pixel_x = -2; pixel_y = 2 }, +/obj/machinery/smartfridge/bloodbank/preloaded{ + density = 0; + pixel_y = -32 + }, /turf/open/floor/plasteel/mono/white, /area/ship/medical) "se" = ( @@ -2004,27 +1992,24 @@ /obj/effect/turf_decal/borderfloorwhite{ dir = 1 }, -/obj/machinery/door/airlock/medical/glass{ - name = "Surgical Bay #1" +/obj/machinery/door/airlock/medical{ + name = "Morgue" }, /turf/open/floor/plasteel/white, /area/ship/medical) "ss" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/plasteel/patterned, +/obj/structure/rack, +/obj/item/pickaxe/emergency, +/obj/item/pickaxe/emergency, +/obj/item/pickaxe/emergency, +/turf/open/floor/plasteel/mono/dark, /area/ship/cargo) "su" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/opaque/brown/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/chair, -/obj/machinery/airalarm/directional/north, /turf/open/floor/plasteel/dark, /area/ship/medical) "sy" = ( @@ -2059,7 +2044,6 @@ /obj/item/ammo_box/magazine/co9mm, /obj/item/ammo_box/magazine/co9mm, /obj/item/ammo_box/magazine/co9mm, -/obj/machinery/recharger, /turf/open/floor/plasteel/dark, /area/ship/security) "sz" = ( @@ -2118,10 +2102,6 @@ /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "te" = ( -/obj/structure/railing{ - dir = 1; - layer = 2.9 - }, /obj/effect/turf_decal/borderfloor{ dir = 1 }, @@ -2137,6 +2117,9 @@ /obj/item/target/syndicate{ pixel_y = 5 }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "tf" = ( @@ -2163,20 +2146,8 @@ /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "tj" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/light_switch{ - pixel_y = 20 - }, -/turf/open/floor/plasteel/tech/grid, +/obj/effect/turf_decal/industrial/traffic, +/turf/open/floor/plasteel/patterned, /area/ship/cargo) "tk" = ( /obj/structure/reagent_dispensers/watertank, @@ -2218,25 +2189,17 @@ "tS" = ( /obj/effect/turf_decal/siding/thinplating, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "tZ" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/crew/office) "ua" = ( -/obj/effect/turf_decal/siding/thinplating/corner, /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "un" = ( @@ -2261,16 +2224,16 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "ux" = ( -/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 +/obj/effect/turf_decal/trimline/opaque/brown/warning{ + dir = 1 }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/cargo) +/turf/open/floor/plasteel/dark, +/area/ship/medical) "uA" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/warning{ dir = 4 @@ -2293,19 +2256,16 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/noticeboard{ pixel_y = 28 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "uS" = ( @@ -2329,12 +2289,10 @@ /turf/open/floor/plating, /area/ship/cargo) "vh" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/inteq, -/obj/item/clothing/head/helmet/space/inteq, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating, +/area/ship/hallway/port) "vi" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/warning{ dir = 8 @@ -2481,7 +2439,8 @@ dir = 10 }, /obj/machinery/airalarm/directional/east, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/half, +/turf/open/floor/plasteel, /area/ship/crew/office) "wS" = ( /obj/machinery/power/terminal{ @@ -2506,18 +2465,12 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "xg" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) +/turf/open/floor/plasteel/dark, +/area/ship/medical) "xj" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/cargo) @@ -2530,6 +2483,9 @@ dir = 1; pixel_y = -20 }, +/obj/structure/chair{ + dir = 8 + }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "xp" = ( @@ -2554,24 +2510,16 @@ "xr" = ( /obj/structure/table, /obj/item/paper_bin, -/obj/item/folder/white{ - pixel_x = -15; - pixel_y = -1 - }, /obj/item/pen, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/toy/figure/paramedic{ - name = "Corpsman action figure"; - pixel_x = -13; - pixel_y = 14 - }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/effect/turf_decal/corner/transparent/inteqbrown/full, /turf/open/floor/plasteel/patterned, /area/ship/crew/office) "xs" = ( @@ -2672,19 +2620,15 @@ dir = 4 }, /obj/structure/rack, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/metal/fifty, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "yK" = ( -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/industrial/traffic{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ship/medical) +/obj/effect/turf_decal/industrial/traffic/corner, +/turf/open/floor/plasteel/patterned, +/area/ship/cargo) "yN" = ( /obj/structure/chair/office/dark, /obj/effect/turf_decal/corner/opaque/brown{ @@ -2717,7 +2661,8 @@ /area/ship/maintenance/port) "zi" = ( /obj/machinery/computer/helm{ - dir = 8 + dir = 8; + icon_state = "computer-middle" }, /obj/effect/turf_decal/corner/opaque/yellow, /obj/effect/turf_decal/corner/opaque/brown{ @@ -2741,15 +2686,17 @@ }, /obj/machinery/airalarm/directional/south, /obj/machinery/fax/inteq{ - pixel_y = 3 + pixel_y = 6 }, /turf/open/floor/plasteel/dark, /area/ship/bridge) "zs" = ( -/obj/effect/turf_decal/siding/thinplating, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "zA" = ( @@ -2767,23 +2714,18 @@ /turf/open/floor/plasteel/dark, /area/ship/medical) "zC" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 }, -/obj/machinery/smartfridge/bloodbank/preloaded{ - density = 0; - pixel_y = 32 +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 }, -/obj/structure/table, -/obj/machinery/cell_charger, -/turf/open/floor/plasteel/mono/dark, +/turf/open/floor/plasteel/dark, /area/ship/medical) "zD" = ( -/obj/machinery/computer/operating{ - dir = 4 - }, -/obj/effect/turf_decal/borderfloorwhite, -/turf/open/floor/plasteel/white, +/obj/effect/turf_decal/borderfloorblack, +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/patterned/brushed, /area/ship/medical) "zE" = ( /obj/effect/turf_decal/siding/thinplating/dark{ @@ -2823,34 +2765,20 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "zI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/airlock/grunge{ - name = "Cargo Bay" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/effect/turf_decal/borderfloorblack, +/obj/machinery/door/airlock/hatch, /turf/open/floor/plasteel/patterned, /area/ship/medical) "zK" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/public/glass{ - name = "Supply Storage" - }, -/obj/effect/turf_decal/corner_techfloor_grid{ - dir = 5 +/obj/docking_port/stationary{ + dir = 4; + dwidth = 15; + height = 15; + name = "valor airlock dock"; + width = 15 }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) +/turf/template_noop, +/area/template_noop) "zL" = ( /obj/structure/chair{ dir = 1 @@ -2868,22 +2796,10 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "zS" = ( -/obj/structure/table, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 9 }, -/obj/item/storage/box/masks{ - pixel_x = -7; - pixel_y = 10 - }, -/obj/item/storage/box/gloves{ - pixel_x = 8; - pixel_y = 10 - }, -/obj/structure/sign/poster/official/walk{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/mono/dark, +/turf/open/floor/plasteel/dark, /area/ship/medical) "zT" = ( /obj/structure/railing, @@ -2932,24 +2848,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "Au" = ( -/obj/structure/rack, -/obj/item/roller, -/obj/item/roller{ - pixel_x = -1; - pixel_y = 8 - }, -/obj/item/roller{ - pixel_x = 1; - pixel_y = 16 - }, +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/universal, +/obj/item/reagent_containers/blood/universal, +/obj/item/reagent_containers/blood/universal, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/area/ship/medical) "Av" = ( /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) @@ -2958,17 +2869,25 @@ /area/ship/maintenance/starboard) "AE" = ( /obj/structure/table, +/obj/machinery/airalarm/directional/east, +/obj/item/storage/box/gloves{ + pixel_x = -6; + pixel_y = 4 + }, /obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_x = -2; - pixel_y = 7 + pixel_x = 4; + pixel_y = 14 }, -/obj/item/reagent_containers/medigel/sterilizine{ - pixel_x = 8; - pixel_y = 3 +/obj/effect/turf_decal/borderfloorblack, +/obj/item/reagent_containers/glass/bottle/formaldehyde{ + pixel_x = 9; + pixel_y = 4 }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/borderfloorwhite, -/turf/open/floor/plasteel/white, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = -7 + }, +/turf/open/floor/plasteel/patterned/brushed, /area/ship/medical) "AG" = ( /obj/structure/bed, @@ -3069,7 +2988,10 @@ /obj/structure/sign/poster/official/help_others{ pixel_y = 32 }, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/border{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/ship/crew/office) "BL" = ( /obj/effect/turf_decal/corner/opaque/brown{ @@ -3090,14 +3012,11 @@ /turf/open/floor/plasteel/dark, /area/ship/security) "BV" = ( -/obj/structure/grille, -/obj/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "valor_external" +/obj/effect/turf_decal/techfloor{ + dir = 8 }, -/obj/structure/closet/crate/bin, -/turf/open/floor/plating, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/tech, /area/ship/hallway/central) "Cb" = ( /obj/effect/turf_decal/industrial/traffic{ @@ -3134,14 +3053,28 @@ /turf/open/floor/plating/airless, /area/ship/external/dark) "CC" = ( -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/closet/secure_closet{ + icon_state = "med_secure"; + name = "corpsman's locker"; + req_access = list(5) }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/ship/hallway/port) +/obj/item/storage/firstaid/regular, +/obj/item/storage/belt/medical/webbing, +/obj/item/pinpointer/crew, +/obj/item/storage/backpack/medic, +/obj/item/storage/backpack/messenger/med, +/obj/item/clothing/head/soft/inteq/corpsman, +/obj/item/clothing/suit/armor/inteq/corpsman, +/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, +/obj/item/clothing/under/syndicate/inteq/corpsman, +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 + }, +/turf/open/floor/plasteel/patterned/ridged, +/area/ship/medical) "CF" = ( /obj/structure/table/optable, /obj/machinery/defibrillator_mount/loaded{ @@ -3309,22 +3242,15 @@ /turf/open/floor/plasteel/dark, /area/ship/security) "DR" = ( -/obj/machinery/door/airlock/hatch{ - name = "Cargo Bay" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/effect/turf_decal/borderfloorblack{ - dir = 1 +/obj/effect/turf_decal/borderfloorblack, +/obj/machinery/door/airlock/hatch{ + name = "Port Hallway" }, -/turf/open/floor/plasteel/tech/grid, +/turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "DT" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -3393,18 +3319,16 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "EE" = ( -/obj/effect/turf_decal/trimline/opaque/brown/line{ - dir = 5 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 5 - }, -/obj/structure/chair, -/obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/light_switch{ dir = 8; pixel_x = 20 }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/opaque/brown/line{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/ship/medical) "EJ" = ( @@ -3467,6 +3391,10 @@ /obj/effect/turf_decal/box/corners{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "Ff" = ( @@ -3490,18 +3418,6 @@ }, /turf/open/floor/plasteel/dark, /area/ship/medical) -"Ft" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) "FF" = ( /obj/structure/bed, /obj/item/bedsheet/brown, @@ -3545,9 +3461,8 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "FY" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/stairs, -/area/ship/cargo) +/turf/open/floor/plasteel/patterned/brushed, +/area/ship/medical) "FZ" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -3571,7 +3486,8 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/half, +/turf/open/floor/plasteel, /area/ship/crew/office) "Go" = ( /obj/effect/turf_decal/corner/opaque/brown{ @@ -3625,8 +3541,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) @@ -3640,18 +3559,14 @@ /turf/open/floor/plasteel/tech/grid, /area/ship/cargo) "Hw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/borderfloorblack{ dir = 1 }, -/obj/machinery/door/airlock/public/glass{ - name = "EVA Storage" - }, -/obj/effect/turf_decal/corner_techfloor_grid{ - dir = 10 +/obj/machinery/door/airlock/hatch{ + name = "Port Hallway" }, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/tech/grid, /area/ship/cargo) "HA" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -3759,10 +3674,8 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) "Io" = ( -/obj/machinery/rnd/server, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/turf/open/floor/plasteel/patterned, +/area/ship/medical) "IA" = ( /obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 1 @@ -3791,15 +3704,12 @@ /turf/open/floor/plasteel/dark, /area/ship/medical) "IL" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 - }, -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -20 +/obj/effect/turf_decal/techfloor{ + dir = 8 }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/tech, +/area/ship/hallway/central) "IM" = ( /obj/effect/turf_decal/corner/opaque/brown{ dir = 4 @@ -3851,6 +3761,15 @@ "Jn" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, +/obj/structure/table, +/obj/item/storage/box/masks{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/storage/box/gloves{ + pixel_x = 8; + pixel_y = 4 + }, /turf/open/floor/plasteel/tech, /area/ship/medical) "Jt" = ( @@ -3875,19 +3794,11 @@ /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/cargo) "JS" = ( -/obj/structure/railing{ - dir = 9; - layer = 2.9 - }, -/obj/effect/turf_decal/borderfloor{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plasteel/patterned/cargo_one, +/turf/open/floor/plasteel/patterned, /area/ship/cargo) "JT" = ( /obj/docking_port/stationary{ @@ -3937,6 +3848,10 @@ /area/ship/crew/canteen) "Kn" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/patterned, /area/ship/cargo) "Ko" = ( @@ -3962,6 +3877,10 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/patterned, /area/ship/cargo) "Kz" = ( @@ -3999,18 +3918,9 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "KU" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, /turf/open/floor/plasteel/patterned, /area/ship/cargo) "KV" = ( @@ -4096,12 +4006,14 @@ /turf/open/floor/plasteel/dark, /area/ship/bridge) "Ls" = ( -/obj/effect/turf_decal/techfloor{ +/obj/effect/turf_decal/industrial/traffic{ + dir = 8 + }, +/obj/effect/turf_decal/industrial/stand_clear{ dir = 4 }, -/obj/structure/closet/crate/bin, -/turf/open/floor/plasteel/tech, -/area/ship/hallway/central) +/turf/open/floor/plasteel/patterned, +/area/ship/cargo) "LH" = ( /obj/machinery/light/floor, /obj/structure/cable{ @@ -4121,20 +4033,38 @@ }, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/borderfloorwhite, +/obj/machinery/button/door{ + id = "valor_surgery"; + name = "Privacy Shutters"; + pixel_y = -23; + dir = 1; + pixel_x = -7 + }, /turf/open/floor/plasteel/white, /area/ship/medical) "LL" = ( -/obj/structure/rack, -/obj/item/pickaxe/emergency, -/obj/item/pickaxe/emergency, -/obj/item/pickaxe/emergency, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -20 +/obj/structure/closet/secure_closet{ + icon_state = "med_secure"; + name = "corpsman's locker"; + req_access = list(5) + }, +/obj/item/storage/firstaid/regular, +/obj/item/storage/belt/medical/webbing, +/obj/item/pinpointer/crew, +/obj/item/storage/backpack/medic, +/obj/item/storage/backpack/messenger/med, +/obj/item/clothing/head/soft/inteq/corpsman, +/obj/item/clothing/suit/armor/inteq/corpsman, +/obj/item/clothing/under/syndicate/inteq/skirt/corpsman, +/obj/item/clothing/under/syndicate/inteq/corpsman, +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 }, /turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/area/ship/medical) "LR" = ( /obj/effect/turf_decal/corner/opaque/brown{ dir = 8 @@ -4189,9 +4119,6 @@ /turf/open/floor/plating/airless, /area/ship/external/dark) "ME" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medical Office" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/door/firedoor/border_only{ @@ -4201,6 +4128,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/door/airlock/grunge{ + req_access = list(3) + }, /turf/open/floor/plasteel/patterned, /area/ship/crew/office) "MK" = ( @@ -4213,13 +4143,16 @@ /turf/open/floor/plating/airless, /area/ship/external/dark) "MR" = ( -/obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/inteq, -/obj/item/clothing/head/helmet/space/inteq, -/obj/structure/sign/poster/official/safety_internals{ - pixel_y = 32 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/patterned/ridged, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel/patterned, /area/ship/cargo) "Nh" = ( /turf/closed/wall/mineral/plastitanium, @@ -4369,11 +4302,13 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "Oj" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 8 +/obj/machinery/suit_storage_unit/inherit, +/obj/item/clothing/suit/space/inteq, +/obj/item/clothing/head/helmet/space/inteq, +/obj/effect/turf_decal/techfloor{ + dir = 4 }, -/obj/structure/closet/emcloset/wall/directional/north, -/turf/open/floor/plasteel/patterned, +/turf/open/floor/plasteel/tech/grid, /area/ship/cargo) "Ok" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -4412,40 +4347,40 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) "OK" = ( -/obj/machinery/iv_drip/saline, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/obj/effect/turf_decal/borderfloorblack, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/patterned/brushed, +/area/ship/medical) "OM" = ( /turf/open/floor/pod, /area/ship/cargo) "OR" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/patterned/grid, +/area/ship/hallway/port) "OT" = ( -/obj/structure/catwalk/over/plated_catwalk, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plasteel/tech/grid, +/turf/open/floor/plasteel/patterned, /area/ship/cargo) "OV" = ( -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ship/medical) +/turf/open/floor/plasteel/patterned/grid, +/area/ship/hallway/port) "Pb" = ( /obj/machinery/power/terminal{ dir = 8 @@ -4505,7 +4440,8 @@ dir = 1; pixel_y = -20 }, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/half, +/turf/open/floor/plasteel, /area/ship/crew/office) "PL" = ( /obj/effect/turf_decal/siding/thinplating/dark{ @@ -4539,19 +4475,6 @@ }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) -"Qd" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/cargo) "Qk" = ( /obj/structure/table, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -4583,7 +4506,8 @@ dir = 4 }, /obj/item/radio/intercom/directional/south, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/half, +/turf/open/floor/plasteel, /area/ship/crew/office) "Qw" = ( /obj/effect/turf_decal/siding/thinplating{ @@ -4605,6 +4529,12 @@ /obj/structure/sign/warning/vacuum{ pixel_x = 32 }, +/obj/structure/table/glass, +/obj/machinery/computer/med_data/laptop{ + dir = 8; + pixel_y = 7; + pixel_x = 3 + }, /turf/open/floor/plasteel/tech, /area/ship/medical) "QG" = ( @@ -4648,20 +4578,11 @@ dir = 10 }, /obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/sign/warning/incident{ - pixel_y = 32 - }, /turf/open/floor/plasteel/tech/grid, /area/ship/cargo) "Re" = ( -/obj/structure/closet/crate/freezer, -/obj/machinery/iv_drip, -/obj/item/reagent_containers/blood/universal, -/obj/item/reagent_containers/blood/universal, -/obj/item/reagent_containers/blood/universal, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/turf/open/floor/plasteel/dark, +/area/ship/medical) "Rh" = ( /turf/closed/wall/mineral/plastitanium, /area/ship/security) @@ -4721,6 +4642,9 @@ "Sd" = ( /obj/effect/turf_decal/siding/thinplating, /obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "Sf" = ( @@ -4736,12 +4660,15 @@ /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "Sh" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/ship/hallway/central) "Sl" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -4870,17 +4797,9 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/opaque/brown/warning{ dir = 1 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/dark, /area/ship/medical) "Uj" = ( @@ -4939,7 +4858,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, -/obj/machinery/light/directional/south, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) "UO" = ( @@ -4955,6 +4873,8 @@ /turf/open/floor/plasteel/patterned, /area/ship/cargo) "Ve" = ( +/obj/structure/table, +/obj/machinery/cell_charger, /turf/open/floor/plasteel/tech, /area/ship/medical) "Vp" = ( @@ -4985,8 +4905,7 @@ /obj/effect/turf_decal/techfloor{ dir = 4 }, -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/tech, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/hallway/central) "VB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -5121,6 +5040,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/firealarm/directional/west, +/obj/structure/chair, /turf/open/floor/plasteel/dark, /area/ship/medical) "WQ" = ( @@ -5148,11 +5068,9 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, -/obj/machinery/vending/medical/syndicate_access{ - name = "\improper InteqMed Plus" - }, /obj/machinery/light/directional/north, -/turf/open/floor/plasteel/mono/dark, +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/plasteel/dark, /area/ship/medical) "Xi" = ( /obj/structure/chair{ @@ -5177,8 +5095,8 @@ /area/ship/crew/dorm) "Xu" = ( /obj/machinery/suit_storage_unit/inherit, -/obj/item/clothing/suit/space/inteq, -/obj/item/clothing/head/helmet/space/inteq, +/obj/item/clothing/suit/space/orange, +/obj/item/clothing/head/helmet/space/orange, /obj/effect/turf_decal/techfloor{ dir = 1 }, @@ -5200,9 +5118,23 @@ /turf/open/floor/plasteel/dark, /area/ship/medical) "Xx" = ( -/obj/structure/closet/secure_closet/medical1, /obj/machinery/light/small/directional/north, -/turf/open/floor/plasteel/patterned, +/obj/effect/turf_decal/corner/transparent/inteqbrown/border{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/toolbox/emergency/shuttle{ + pixel_y = 9; + pixel_x = -1 + }, +/obj/item/gps{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/gps{ + pixel_x = 2 + }, +/turf/open/floor/plasteel, /area/ship/crew/office) "XD" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ @@ -5254,12 +5186,6 @@ }, /turf/open/floor/plasteel/patterned/grid, /area/ship/crew/canteen) -"XU" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) "Yd" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -5297,11 +5223,9 @@ /turf/open/floor/plasteel/patterned/brushed, /area/ship/crew/canteen) "Yt" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/cargo) +/obj/machinery/rnd/production/techfab/department/medical, +/turf/open/floor/plasteel/patterned/ridged, +/area/ship/medical) "Yu" = ( /obj/effect/turf_decal/techfloor, /obj/structure/closet/firecloset, @@ -5314,9 +5238,11 @@ /turf/open/floor/plasteel/tech/grid, /area/ship/medical) "Yx" = ( -/obj/machinery/rnd/production/techfab/department/medical, -/turf/open/floor/plasteel/patterned/ridged, -/area/ship/cargo) +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/patterned, +/area/ship/medical) "YF" = ( /obj/machinery/power/terminal{ dir = 8 @@ -5329,14 +5255,14 @@ /turf/open/floor/plating, /area/ship/maintenance/starboard) "YL" = ( -/obj/structure/grille, -/obj/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "valor_external" +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/ship/hallway/central) +/turf/open/floor/plasteel/dark, +/area/ship/medical) "YM" = ( /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -5403,12 +5329,8 @@ /turf/open/floor/plating, /area/ship/maintenance/port) "Zf" = ( -/obj/structure/railing{ - dir = 4; - layer = 2.9 - }, -/obj/effect/turf_decal/borderfloor{ - dir = 4 +/obj/structure/sign/warning/incident{ + pixel_y = 32 }, /turf/open/floor/plasteel/patterned, /area/ship/cargo) @@ -5556,7 +5478,7 @@ Td Nh xj qG -iI +yK Cb Cb Cb @@ -5589,7 +5511,7 @@ Td xj og FI -qe +tj OM OM OM @@ -5622,7 +5544,7 @@ Td xj rL uS -qe +tj OM OM OM @@ -5655,7 +5577,7 @@ Td xj sZ uS -qe +tj OM OM OM @@ -5669,7 +5591,7 @@ Td bB LI ns -qR +LI pC zD LI @@ -5688,13 +5610,13 @@ Td xj GF uS -qe +tj OM OM OM OM Kz -rL +cE xj Td Td @@ -5702,9 +5624,9 @@ Td WC WO gp -qR -Yi -bI +LI +FY +OK LI "} (9,1,1) = {" @@ -5721,7 +5643,7 @@ Td xj Ch FI -qe +tj OM OM OM @@ -5754,7 +5676,7 @@ DU HC Zf oz -qe +tj OM OM OM @@ -5780,25 +5702,25 @@ Rh Zu uB ua -Wp -CC -ky -CC +OV +aW +aW +aW DR -Qd -FY +ZF +ZF kH Mn Ea -jG +Ls Mn de KU zI -yK -OV -yK -aW +Re +Re +xg +Re Ui gU nK @@ -5813,11 +5735,11 @@ jN lN gh zs -HC -HC -HC -HC -HC +fN +OR +OR +OR +Wp OT JS jj @@ -5826,13 +5748,13 @@ Kp Kn dQ Fa -Ft -LI -LI -LI -LI -LI +MR +qk su +su +YL +su +ux rO qR Yi @@ -5847,11 +5769,11 @@ xr Hg tS HC -MR vh -fN -xj -tj +vh +vh +HC +cI te fe Ok @@ -5859,11 +5781,11 @@ Xf as HL ec -xg -xj -Au -Re -OK +Md +LI +LI +LI +LI LI EE oy @@ -5880,11 +5802,11 @@ tZ An Sd HC -Oj -XU -XU +ss +bx +mt xj -cI +nX Jd qA UQ @@ -5892,11 +5814,11 @@ hm Cc JJ zT -Md -xj -XU -XU -cE +nX +LI +jG +Io +Au LI LI dN @@ -5913,11 +5835,11 @@ tZ Qc AP HC -bx -ss -Sh +gq +gq +gq Hw -ux +nX ct TB AM @@ -5926,10 +5848,10 @@ dO yy bh nX -zK -Yt +LI Yt -IL +Io +jT LI zS pt @@ -5946,10 +5868,10 @@ ME iN xl HC -OR gq -LL -Nh +gq +gq +xj Rc bF Hi @@ -5959,11 +5881,11 @@ tH Ff jQ qX -xj +LI Yx Io -mt -LI +Io +kW zC Ye mw @@ -5979,9 +5901,9 @@ tZ VD Um DT -DT -DT -DT +Oj +Oj +Oj DT DT DT @@ -5990,13 +5912,13 @@ NE DT nz DT -Tw -Tw -DT -DT -DT DT DT +LI +CC +qe +LL +LI Xg Uj dl @@ -6013,8 +5935,8 @@ ty dp DT Vy -qk -Ls +Vy +Vy DT fE sJ @@ -6026,8 +5948,8 @@ zG Qw jU DT -kW -qk +Vy +Vy Vy DT fj @@ -6046,7 +5968,7 @@ ma CH jk lc -lc +Sh lc ht jw @@ -6060,7 +5982,7 @@ GR hj id lc -lc +Sh lc bR XD @@ -6078,8 +6000,8 @@ mI gn qZ DT -kG -kG +IL +BV kG Tw Lb @@ -6092,9 +6014,9 @@ zO lE WX DT -jT -kG kG +BV +IL DT zA mx @@ -6111,9 +6033,9 @@ uA Pk Ei DT -YL -YL -BV +DT +DT +DT DT mZ Yd @@ -6125,9 +6047,9 @@ Ik Od ie DT -YL -YL -YL +DT +DT +DT DT LI zE @@ -6526,7 +6448,7 @@ Td Td Td Td -Td +zK Td Td Td diff --git a/_maps/shuttles/subshuttles/inteq_haste.dmm b/_maps/shuttles/subshuttles/inteq_haste.dmm index 74144c3fe930..25324d952a5e 100644 --- a/_maps/shuttles/subshuttles/inteq_haste.dmm +++ b/_maps/shuttles/subshuttles/inteq_haste.dmm @@ -54,16 +54,15 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/machinery/light_switch{ - pixel_y = 22; - pixel_x = 10 - }, /obj/effect/turf_decal/techfloor{ dir = 1 }, /obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 8 }, +/obj/structure/chair/handrail{ + pixel_y = 7 + }, /turf/open/floor/plasteel/tech, /area/ship/bridge) "F" = ( @@ -221,6 +220,10 @@ /obj/structure/cable/yellow{ icon_state = "4-10" }, +/obj/machinery/light_switch{ + pixel_y = 22; + pixel_x = 10 + }, /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) diff --git a/code/modules/antagonists/ert/inteq.dm b/code/modules/antagonists/ert/inteq.dm index 591ad684cc1d..f4636487da5f 100644 --- a/code/modules/antagonists/ert/inteq.dm +++ b/code/modules/antagonists/ert/inteq.dm @@ -20,5 +20,5 @@ /datum/antagonist/ert/inteq/leader name = "Inteq Mercenary Leader" - outfit = /datum/outfit/job/inteq/captain + outfit = /datum/outfit/job/inteq/captain/empty role = "Vanguard" diff --git a/code/modules/clothing/outfits/factions/inteq.dm b/code/modules/clothing/outfits/factions/inteq.dm index ee48b1872854..6ad58203e2e6 100644 --- a/code/modules/clothing/outfits/factions/inteq.dm +++ b/code/modules/clothing/outfits/factions/inteq.dm @@ -29,31 +29,40 @@ ///captains /datum/outfit/job/inteq/captain - name = "IRMG - Vanguard (Naked)" + name = "IRMG - Vanguard" id_assignment = "Vanguard" jobtype = /datum/job/captain job_icon = "captain" + id = /obj/item/card/id/gold + head = /obj/item/clothing/head/beret/sec/hos/inteq + glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq + mask = /obj/item/clothing/mask/gas/sechailer/balaclava/inteq + suit = /obj/item/clothing/suit/armor/hos/inteq + dcoat = /obj/item/clothing/suit/hooded/wintercoat/security/inteq + belt = /obj/item/storage/belt/security/webbing/inteq + gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/inteq/alt/captain shoes = /obj/item/clothing/shoes/combat + r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - jobtype = /datum/job/captain - id = /obj/item/card/id/gold backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) -/datum/outfit/job/inteq/captain/geared - name = "IRMG - Vanguard" +/datum/outfit/job/inteq/captain/empty + name = "IRMG - Vanguard (Naked)" - head = /obj/item/clothing/head/beret/sec/hos/inteq - glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq - mask = /obj/item/clothing/mask/gas/sechailer/balaclava/inteq - belt = /obj/item/storage/belt/security/webbing/inteq - suit = /obj/item/clothing/suit/armor/hos/inteq - dcoat = /obj/item/clothing/suit/hooded/wintercoat/security/inteq - gloves = /obj/item/clothing/gloves/combat - accessory = null + head = null + glasses = null + mask = null + belt = null + suit = null + dcoat = null + gloves = null + + r_pocket = null + l_pocket = null /datum/outfit/job/inteq/captain/honorable name = "IRMG - Honorable Vanguard" @@ -140,6 +149,14 @@ satchel = /obj/item/storage/backpack/messenger/inteq courierbag = /obj/item/storage/backpack/messenger/inteq +/datum/outfit/job/inteq/security/empty + name = "IRMG - Enforcer (Naked)" + head = null + suit = null + belt = null + mask = null + gloves = null + /datum/outfit/job/inteq/security/beluga name = "IRMG - Enforcer (Beluga)" @@ -156,14 +173,6 @@ satchel = /obj/item/storage/backpack/messenger/inteq courierbag = /obj/item/storage/backpack/messenger/inteq -/datum/outfit/job/inteq/security/empty - name = "IRMG - Enforcer (Naked)" - head = null - suit = null - belt = null - mask = null - gloves = null - ///engineers /datum/outfit/job/inteq/engineer @@ -201,6 +210,17 @@ courierbag = /obj/item/storage/backpack/messenger/inteq backpack_contents = list(/obj/item/melee/classic_baton=1) +/datum/outfit/job/inteq/warden/pilot + name = "IRMG - Shuttle Pilot" + job_icon = "securityofficer" + id_assignment = "Shuttle Pilot" + + head = /obj/item/clothing/head/soft/inteq + suit = /obj/item/clothing/suit/armor/vest/alt + belt = null + mask = /obj/item/clothing/mask/breath + gloves = /obj/item/clothing/gloves/fingerless + // cmo /datum/outfit/job/inteq/cmo From 767795e2f801861d0efe3eb0982dece1834edbda Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 18:02:56 -0500 Subject: [PATCH 057/212] Automatic changelog generation for PR #3115 [ci skip] --- html/changelogs/AutoChangeLog-pr-3115.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3115.yml diff --git a/html/changelogs/AutoChangeLog-pr-3115.yml b/html/changelogs/AutoChangeLog-pr-3115.yml new file mode 100644 index 000000000000..cab3ff1ea29c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3115.yml @@ -0,0 +1,6 @@ +author: meemofcourse +changes: + - {balance: 'Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle + Pilot).'} + - {code_imp: The Vanguard base outfit starts with gear.} +delete-after: true From 4ad8d9e0c9465e948f0d64ebc94ab1e7ee74b86f Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:44:26 -0700 Subject: [PATCH 058/212] broad cringe removal (#3142) ## About The Pull Request - Removes the ability for ghosts to click on mice and take control of them - Removes a vast majority of forcesays from the game (gibbering I've left untouched for now but if theres interest in axing it I will) - Removes char from the game (only made you spout forcesays) - Spraytan overdose no longer exists and will no longer turn you into a surfer - Removes every gibbering line - Removes Chav, Swedish, and Elvis mutations - Misc forcesay removals ## Why It's Good For The Game No more White Sands jank and no more unfunny forcesay leftovers from tg ## Changelog :cl: del: Removed mice possession del: Broad removal of forcesays from most reagents and items del: Removed char reagent and spraytan overdose del: Removed gibbering lines del: Removed Chav, Swedish, Elvis mutations /:cl: --- code/__DEFINES/DNA.dm | 3 - code/__HELPERS/roundend.dm | 19 +- code/datums/brain_damage/mild.dm | 2 - code/datums/mutations/speech.dm | 123 ------------- code/game/objects/items/dna_injector.dm | 24 --- code/modules/clothing/masks/miscellaneous.dm | 7 - .../kitchen_machinery/grill.dm | 1 - code/modules/mob/dead/observer/observer.dm | 70 +------- .../living/simple_animal/friendly/mouse.dm | 3 - .../chemistry/reagents/food_reagents.dm | 16 -- .../chemistry/reagents/medicine_reagents.dm | 3 - .../chemistry/reagents/other_reagents.dm | 50 ------ .../chemistry/reagents/toxin_reagents.dm | 10 +- code/modules/surgery/organs/vocal_cords.dm | 8 - strings/boomer.json | 33 ---- strings/traumas.json | 164 ------------------ 16 files changed, 5 insertions(+), 531 deletions(-) delete mode 100644 strings/boomer.json diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 8b05ccacd1fe..1d08e1ab4868 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -24,9 +24,6 @@ #define MUT_MUTE /datum/mutation/human/mute #define STONER /datum/mutation/human/stoner #define UNINTELLIGIBLE /datum/mutation/human/unintelligible -#define SWEDISH /datum/mutation/human/swedish -#define CHAV /datum/mutation/human/chav -#define ELVIS /datum/mutation/human/elvis #define RADIOACTIVE /datum/mutation/human/radioactive #define GLOWY /datum/mutation/human/glow #define ANTIGLOWY /datum/mutation/human/glow/anti diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5d96dc8af34c..5301f0ec9d3e 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -280,14 +280,9 @@ //Medals parts += medal_report() - //WS Begin - CHECK_TICK - - //Mouse - parts += mouse_report() CHECK_TICK - //WS End + //Station Goals parts += goal_report() @@ -459,17 +454,7 @@ parts += com return "
[parts.Join("
")]
" return "" -//WS Begin -/datum/controller/subsystem/ticker/proc/mouse_report() - if(GLOB.mouse_food_eaten) - var/list/parts = list() - parts += "Mouse stats:" - parts += "Mouse Born: [GLOB.mouse_spawned]" - parts += "Mouse Killed: [GLOB.mouse_killed]" - parts += "Trash Eaten: [GLOB.mouse_food_eaten]" - return "
[parts.Join("
")]
" - return "" -//WS End + /datum/controller/subsystem/ticker/proc/antag_report() var/list/result = list() var/list/all_teams = list() diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 069d89f0e7e7..9c10c6f1fd7d 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -50,8 +50,6 @@ owner.derpspeech = min(owner.derpspeech + 5, 25) if(prob(3)) owner.emote("drool") - else if(owner.stat == CONSCIOUS && prob(3)) - owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage") ..() /datum/brain_trauma/mild/dumbness/on_lose() diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 5545c4efde53..afd4e83cfe34 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -68,129 +68,6 @@ return REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION) -/datum/mutation/human/swedish - name = "Swedish" - desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037." - quality = MINOR_NEGATIVE - text_gain_indication = "You feel Swedish, however that works." - text_lose_indication = "The feeling of Swedishness passes." - -/datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/swedish/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/swedish/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = replacetext(message,"w","v") - message = replacetext(message,"j","y") - message = replacetext(message,"a",pick("å","ä","æ","a")) - message = replacetext(message,"bo","bjo") - message = replacetext(message,"o",pick("ö","ø","o")) - if(prob(30)) - message += " Bork[pick("",", bork",", bork, bork")]!" - speech_args[SPEECH_MESSAGE] = trim(message) - -/datum/mutation/human/chav - name = "Chav" - desc = "Unknown" - quality = MINOR_NEGATIVE - text_gain_indication = "Ye feel like a reet prat like, innit?" - text_lose_indication = "You no longer feel like being rude and sassy." - -/datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/chav/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/chav/proc/handle_speech(datum/source, list/speech_args) - var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = " [message] " - message = replacetext(message," looking at "," gawpin' at ") - message = replacetext(message," great "," bangin' ") - message = replacetext(message," man "," mate ") - message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin ")) - message = replacetext(message," what "," wot ") - message = replacetext(message," drink "," wet ") - message = replacetext(message," get "," giz ") - message = replacetext(message," what "," wot ") - message = replacetext(message," no thanks "," wuddent fukken do one ") - message = replacetext(message," i don't know "," wot mate ") - message = replacetext(message," no "," naw ") - message = replacetext(message," robust "," chin ") - message = replacetext(message," hi "," how what how ") - message = replacetext(message," hello "," sup bruv ") - message = replacetext(message," kill "," bang ") - message = replacetext(message," murder "," bang ") - message = replacetext(message," windows "," windies ") - message = replacetext(message," window "," windy ") - message = replacetext(message," break "," do ") - message = replacetext(message," your "," yer ") - message = replacetext(message," security "," coppers ") - speech_args[SPEECH_MESSAGE] = trim(message) - - -/datum/mutation/human/elvis - name = "Elvis" - desc = "A terrifying mutation named after its 'patient-zero'." - quality = MINOR_NEGATIVE - locked = TRUE - text_gain_indication = "You feel pretty good, honeydoll." - text_lose_indication = "You feel a little less conversation would be great." - -/datum/mutation/human/elvis/on_life() - switch(pick(1,2)) - if(1) - if(prob(15)) - var/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing") - var/dancemoves = pick(dancetypes) - owner.visible_message("[owner] busts out some [dancemoves] moves!") - if(2) - if(prob(15)) - owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!") - -/datum/mutation/human/elvis/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/elvis/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/elvis/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = " [message] " - message = replacetext(message," i'm not "," I aint ") - message = replacetext(message," girl ",pick(" honey "," baby "," baby doll ")) - message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo ")) - message = replacetext(message," out of "," outta ") - message = replacetext(message," thank you "," thank you, thank you very much ") - message = replacetext(message," thanks "," thank you, thank you very much ") - message = replacetext(message," what are you "," whatcha ") - message = replacetext(message," yes ",pick(" sure", "yea ")) - message = replacetext(message," muh valids "," my kicks ") - speech_args[SPEECH_MESSAGE] = trim(message) - - /datum/mutation/human/stoner name = "Stoner" desc = "A common mutation that severely decreases intelligence." diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index a11539595805..113a72fb8d8d 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -247,30 +247,6 @@ name = "\improper DNA injector (Anti-Unintelligible)" remove_mutations = list(UNINTELLIGIBLE) -/obj/item/dnainjector/swedishmut - name = "\improper DNA injector (Swedish)" - add_mutations = list(SWEDISH) - -/obj/item/dnainjector/antiswedish - name = "\improper DNA injector (Anti-Swedish)" - remove_mutations = list(SWEDISH) - -/obj/item/dnainjector/chavmut - name = "\improper DNA injector (Chav)" - add_mutations = list(CHAV) - -/obj/item/dnainjector/antichav - name = "\improper DNA injector (Anti-Chav)" - remove_mutations = list(CHAV) - -/obj/item/dnainjector/elvismut - name = "\improper DNA injector (Elvis)" - add_mutations = list(ELVIS) - -/obj/item/dnainjector/antielvis - name = "\improper DNA injector (Anti-Elvis)" - remove_mutations = list(ELVIS) - /obj/item/dnainjector/lasereyesmut name = "\improper DNA injector (Laser Eyes)" add_mutations = list(LASEREYES) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 725764a10b04..d2b573711051 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -154,13 +154,6 @@ clothing_flags = VOICEBOX_TOGGLABLE modifies_speech = TRUE -/obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak - if(!(clothing_flags & VOICEBOX_DISABLED)) - if(prob(5)) //sometimes, the angry spirit finds others words to speak. - speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!") - else - speech_args[SPEECH_MESSAGE] = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish, - /obj/item/clothing/mask/frog/cursed clothing_flags = NONE diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm index f76bdb462539..c349c7511752 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm @@ -82,7 +82,6 @@ smoke.start() if(grilled_item) grill_time += 1 - grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 1) grill_fuel -= 10 grilled_item.AddComponent(/datum/component/sizzle) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9d8e063037e6..4a768fc1c501 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -68,8 +68,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) add_verb(src, list( /mob/dead/observer/proc/dead_tele, /mob/dead/observer/proc/open_spawners_menu, - /mob/dead/observer/proc/tray_view, - /mob/dead/observer/proc/possess_mouse_verb)) + /mob/dead/observer/proc/tray_view)) if(icon_state in GLOB.ghost_forms_with_directions_list) ghostimage_default = image(src.icon,src,src.icon_state + "_nodir") @@ -961,70 +960,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp client.images += t_ray_images else client.images -= stored_t_ray_images - -//WS Begin -/mob/dead/observer/proc/possess_mouse_verb() - set category = "Ghost" - set name = "Possess a mouse" - set desc = "Possess a mouse to haunt the station.... and their food!" - - var/list/possessible = list() - - for(var/mob/living/simple_animal/mouse/M in GLOB.alive_mob_list) - if(M.stat != CONSCIOUS) - continue - if(M.key) - continue - if(M in GLOB.player_list) - continue - if(M.mind) - continue - - possessible += M - - if(!possessible.len) - to_chat(src, "There are currently no mice able to be possessed!") - return FALSE - - var/mob/living/simple_animal/mouse/M = pick(possessible) - - possess_mouse(M) - - -/mob/dead/observer/proc/possess_mouse(mob/living/simple_animal/mouse/M) - if(!M) - return FALSE - - if(!SSticker.HasRoundStarted()) - to_chat(usr, "The round hasn't started yet!") - return FALSE - - if(is_banned_from(key, ROLE_SENTIENCE)) - to_chat(src, "You are job banned!") - return FALSE - - if(alert("Are you sure you want to become a mouse? (Warning, you can no longer be cloned!)",,"Yes","No") != "Yes") - return FALSE - - if(M.key || (M.stat != CONSCIOUS) || (M in GLOB.player_list) || M.mind || QDELETED(src) || QDELETED(M)) - to_chat(src, "This mouse is unable to be controlled, please try again!") - return FALSE - - log_game("[key_name(src)] has became a mouse") - - M.key = key - M.faction = list("neutral") - M.chew_probability = 0 //so they cant pull off a big brain play by ghosting somewhere or idk - M.layer = BELOW_OPEN_DOOR_LAYER //ENGAGE ADVANCED HIDING BRAIN FUNCTIONS - M.language_holder = new /datum/language_holder/mouse(M) - M.pass_flags |= PASSDOORHATCH - M.sentience_act() - M.maxHealth = 15 - M.health = M.maxHealth - - to_chat(M , "You are now possessing a mouse. \ - You do not remember your previous life. You can eat trash and \ - food on the floor to gain health and help create new mice. Mouse traps will hurt your fragile body \ - and so will any kind of weapons. You can control click food and trash items in order to eat them. Get. That. Cheese.") - return TRUE -//WS End diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index f2fbf6e5b262..7b11d05bcf2c 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -145,9 +145,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) else return ..() -/mob/living/simple_animal/mouse/attack_ghost(mob/dead/observer/user) - user.possess_mouse(src) - /mob/living/simple_animal/mouse/start_pulling(atom/movable/AM, state, force, supress_message) return FALSE diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 09812ef20cf3..6a69ef38e6cd 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -770,22 +770,6 @@ taste_description = "caramel" reagent_state = SOLID -/datum/reagent/consumable/char - name = "Char" - description = "Essence of the grill. Has strange properties when overdosed." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#C8C8C8" - taste_mult = 6 - taste_description = "smoke" - overdose_threshold = 15 - -/datum/reagent/consumable/char/overdose_process(mob/living/M) - if(prob(25)) - M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) - ..() - return - /datum/reagent/consumable/bbqsauce name = "BBQ Sauce" description = "Sweet, smoky, savory, and gets everywhere. Perfect for grilling." diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 6084311b3507..11a930efda30 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1310,8 +1310,6 @@ M.adjustStaminaLoss(-3 * REM, 0) M.jitteriness = min(max(0, M.jitteriness + 3), 30) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) - if(prob(10)) - M.say(pick("Yeah, well, you know, that's just, like, uh, your opinion, man.", "Am I glad he's frozen in there and that we're out here, and that he's the sheriff and that we're frozen out here, and that we're in there, and I just remembered, we're out here. What I wanna know is: Where's the caveman?", "It ain't me, it ain't me...", "Make love, not war!", "Stop, hey, what's that sound? Everybody look what's going down...", "Do you believe in magic in a young girl's heart?"), forced = /datum/reagent/medicine/earthsblood) M.druggy = min(max(0, M.druggy + 10), 15) //See above ..() . = 1 @@ -2073,7 +2071,6 @@ bp.receive_damage(0, 0, 200) else //SUCH A LUST FOR REVENGE!!! to_chat(M, "A phantom limb hurts!") - M.say("Why are we still here, just to suffer?", forced = /datum/reagent/medicine/lavaland_extract) return ..() /datum/reagent/medicine/skeletons_boon diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 9b6243358acb..24db5dd524d8 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -410,7 +410,6 @@ description = "A substance applied to the skin to darken the skin." color = "#FFC080" // rgb: 255, 196, 128 Bright orange metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose - overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle. taste_description = "sour oranges" /datum/reagent/spraytan/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) @@ -470,41 +469,11 @@ N.dna.features["mcolor"] = newcolor N.regenerate_icons() - - if(method == INGEST) if(show_message) to_chat(M, "That tasted horrible.") ..() - -/datum/reagent/spraytan/overdose_process(mob/living/M) - metabolization_rate = 1 * REAGENTS_METABOLISM - - if(ishuman(M)) - var/mob/living/carbon/human/N = M - if(!HAS_TRAIT(N, TRAIT_BALD)) - N.hairstyle = "Spiky" - N.facial_hairstyle = "Shaved" - N.facial_hair_color = "000" - N.hair_color = "000" - if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem! - N.dna.species.species_traits += HAIR - if(N.dna.species.use_skintones) - N.skin_tone = "orange" - else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange - N.dna.features["mcolor"] = "f80" - N.regenerate_icons() - if(prob(7)) - if(N.w_uniform) - M.visible_message(pick("[M]'s collar pops up without warning.", "[M] flexes [M.p_their()] arms.")) - else - M.visible_message("[M] flexes [M.p_their()] arms.") - if(prob(10)) - M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don???t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = /datum/reagent/spraytan) - ..() - return - /datum/reagent/mulligan name = "Mulligan Toxin" description = "This toxin will rapidly change the DNA of human beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change." @@ -1538,20 +1507,6 @@ name = "Royal Carpet?" description = "For those that break the game and need to make an issue report." -/datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/M) - . = ..() - if(!M.mind?.assigned_role) - return - switch(M.mind.assigned_role) - if("Chief Medical Officer", "Captain", "Chief Engineer", "Research Director", "Head of Personnel") - if(prob(10)) - to_chat(M, "You feel like royalty.") - if(prob(5)) - M.say(pick("Peasants..","This carpet is worth more than your contracts!","I could fire you at any time..."), forced = "royal carpet") - if("Quartermaster") - if(prob(15)) - to_chat(M, "You feel like an impostor...") - /datum/reagent/carpet/royal/black name = "Royal Black Carpet" description = "For those that feel the need to show off their timewasting skills." @@ -1865,11 +1820,6 @@ color = "#00ff80" taste_description = "strange honey" -/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M) - if(prob(2)) - M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly") - ..() - //Misc reagents /datum/reagent/romerol diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 498017191179..6045779f6030 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -974,18 +974,13 @@ taste_description = "bone hurting" overdose_threshold = 50 -/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M) - M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) - /datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M) M.adjustStaminaLoss(7.5, 0) if(prob(20)) - switch(rand(1, 3)) + switch(rand(1, 2)) if(1) - M.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice) - if(2) M.manual_emote(pick("oofs silently.", "looks like their bones hurt.", "grimaces, as though their bones hurt.")) - if(3) + if(2) to_chat(M, "Your bones hurt!") return ..() @@ -1000,7 +995,6 @@ bp.receive_damage(0, 0, 200) else //SUCH A LUST FOR REVENGE!!! to_chat(M, "A phantom limb hurts!") - M.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) return ..() /datum/reagent/toxin/bungotoxin diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index c0313adb2539..6a5a344b177e 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -439,14 +439,6 @@ var/mob/living/L = V L.emote("flip") - //SPEAK - else if((findtext(message, speak_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i) - i++ - //GET UP else if((findtext(message, getup_words))) cooldown = COOLDOWN_DAMAGE //because stun removal diff --git a/strings/boomer.json b/strings/boomer.json deleted file mode 100644 index 4fb2f733f795..000000000000 --- a/strings/boomer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "boomer": [ - "@pick(kids) these days have it too easy!", - "Do I look like I know what a @pick(file) is!?", - "Listen here Jack, how do I open @pick(file)?", - "How do I open a @pick(file) again?", - "Unlike you snowflakes, I'm not offended so easily.", - "Back in my day...", - "When I was your age...", - "This generation can't take a joke.", - "Why are @pick(kids) these days so @pick(sad) all the time?", - "These damn @pick(kids) need to get a @pick(impossible) for once!", - "It's simply a matter of showing up, looking the manager in the eye, giving him a firm handshake and telling him you want the job.", - "You'll never get anywhere in life without a degree.", - "@pick(expense) isn't really that expensive.", - "When I was a kid I had to walk to school uphill both ways!", - "I hate my wife.", - "I just want to grill for God's sake.", - "I wish I could just go on my lawnmower and cut the grass.", - "Yep, Quake. That was a good game...", - "Yeah, my PDA has wi-fi. A wife I hate." - ], - - "expense": ["Healthcare", "College", "A car", "A house", "Food"], - - "kids": ["kids", "millenials", "snowflakes"], - - "file": ["JPEG", "PDF", "DMI", "JSON"], - - "sad": ["sad", "depressed", "sad and depressed"], - - "impossible": ["job", "house", "job and a house", "life"] -} diff --git a/strings/traumas.json b/strings/traumas.json index f6bd9b589553..1d1e98581d4f 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -1,168 +1,4 @@ { - "brain_damage": [ - "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH", - "without oxigen blob don't evoluate?", - "@pick(semicolon)CAPTAINS A COMDOM", - "can u give me @pick(mutations)?", - "THe saiyans screwed", - "Bi is THE BEST OF BOTH WORLDS>", - "@pick(semicolon)I WANNA PET TEH monkeyS", - "stop grifing me!!!!", - "SOTP IT#", - "shiggey diggey!!", - "@pick(semicolon)A PIRATE APPEAR", - "FUS RO DAH", - "stat me", - ">my face", - "roll it easy!", - "lol2cat", - "dem dwarfs man, dem dwarfs", - "hwee did eet fhor khayosss", - "lifelike texture ;_;", - "luv can bloooom", - "PACKETS!!!", - "port ba@pick(y_replacements) med!!!!", - "youed call her a toeugh bithc", - "closd for merbegging", - "@pick(semicolon)pray can u @pick(create_verbs) @pick(create_nouns)???", - "GEY AWAY FROM ME U GREIFING PRICK!!!!", - "@pick(semicolon)HELP INTEG MURDERIN MEE!!!", - "hwat dose tha @pick(random_gibberish) mean?????", - "@pick(semicolon)DO A BLUP SPEaS JUMP!!!!!", - "wearnig siNGUARLTY is.... FINE haHAAA", - "@pick(semicolon)AI laW 22 Open door", - "@pick(semicolon)this SI mY sHip......", - "who the HELL do u thenk u r?!!!!", - "geT THE FUCK OUTTTT", - "@pick(semicolon)CRASHING THIS SHIMP WITH NIO SURVIVROS", - "PSHOOOM", - "REMOVE SINGULARITY", - "INSTLL TEG", - "TURBIN IS BEST ENGIENE", - "SOLIRS CAN POWER THE HOLE FLEEHT ANEWAY @pick(bug)", - "parasteng was best", - "@pick(semicolon)I'VE GOT BALLS OF STEEL", - "NO I'M ONNA KILL YOU MOTHERFUCKER OLD STYLE", - "i will snatch erry motherfucker birthday", - "u just did the world a little bit more sad place for someone", - "@pick(semicolon)N-NYAAAAAA~", - "@pick(bug)", - "@pick(semicolon)wtf??????????? @pick(bug)", - "@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)", - "DON'T EVER TUCH ME", - "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????", - "AMOGN US IS FUNNY!!", - "DID YOU FUCKING.", - "i DEMAND!!! APOGEE-DEV BE DEOMTED!!!", - "@pick(semicolon)I don't ndED tEARPAHY.", - "@pick(semicolon)an,d CIOCK.", - "TUWN ME INoT A CAT!!", - "WHY WAES THE PEILL REMOVED???", - "work on the wiki please", - "ahelp SPAWN @pick(aspawnships) PLS", - "Am i allowd to kil l people if thye piss me off", - "IS THIS LIEK VOIDCREW???", - "UNiT PANICKING.", - "HIII!! HI!! <3 <3 <3", - "I LOOK LKIE BEAN,S,,, CRINGE!!!", - "SEET TH shIP TO kOS!!!!!", - "IM SynDCIATe, I ANTag, I CAN KOS......", - "ahelp ADMIN CAN I BE PIRTA", - "DOCTOR YUO DO DISCETIONS!!!", - "RESERCH NANIYES", - "REVSRSE A NY WALLS!!!", - "*monch", - "Amonger", - "Live mas", - "top ten goliath funny moments", - "put me... in a stew... then buryy mee...", - "@pick(semicolon)GTT AWYA FROM HER YOU BITHC!!", - "@pick(semicolon)IS TATH A FUCKIGN,, MOTH.", - "@pick(semicolon)BRAZIL NUMEOR UNO...!!!!", - "@pick(semicolon)blbue hair??? I'M GOIgN TO KILL THDT FUIKNG COW!", - "@pick(semicolon)HOW DO I @pick(ghetto)?????", - "ough", - "ourgh", - "ouughghnnnn", - "hrrnggg", - "HE IS BALD!!!", - "I AM NORMAL. I CAN BE TRUSTED WITH INDUSTRIAL CHEMICALS", - "Welcome to the bathroom", - "THE AMOUNGS BROKE ALL MY BONES", - "HOLY SHIT IT'S @pick(john) @pick(factions)!!", - "BLrobo BLEEBUS.....", - "drugs are funny because they add new rp elements", - "ANOTHER SHIP... STERALIZED...", - "HOpeLes WAsN'T ALwAYS NaMeD HoPelESs BeFORE THe incIDENST...", - "@pick(semicolon)HopeLSS WAS ACTUAL. Ly a LIVIng WaePON....", - "@pick(semicolon)WHEN SHIPQUEST????? PANEL NEW??????", - "WHER.E SHIPQUEST???,???", - "ei,,ither wAy... It Is WHt ti is", - "butT ShIPPtSt nEVER was a WrAZnOe liKE thaEt!!", - "A deEoP-setED dISEuire... fuR pERfECTiOsM...", - "HUMORER IS A DECLIAT THINGE!!", - "who's the asshole flying the pill class", - "IVOR@pick(y_replacements) WHAT THE FOUCKE ARE U DUING!!!??", - "RESIEST BIG MOETH", - "WE MUSTE RIASE UOP AGANST BEEG MOTNH", - "Luckily, I passed high school physics", - "I WANT NOTHING MORE IN THIS LIFE THAN TO CUDDLE UP WITH A CUTE MOTH WAIFU!!", - "GO TO HORNY JAIL!!" - ], - - "mutations": [ - "telikesis", - "halk", - "eppilapse", - "kamelien", - "eksrey", - "glowey skin", - "fungal tb", - "stun gloves" - ], - - "john": ["joehn", "jonn", "jouhn", "jeeoun"], - - "factions": ["SYNDICT", "NATOSASEN", "EEMTEQ", "MIENUTMEN", "SOMLGOVM"], - - "random_gibberish": ["g", "squid", "r", "carbon dioxide"], - - "y_replacements": ["y", "i", "e"], - - "create_verbs": ["spawn", "MAke me", "creat", "tc trade me", "gib"], - - "create_nouns": [ - "zenomorfs", - "ayleins", - "treaitors", - "sheadow lings", - "abdoocters", - "revinent", - "deval", - "deth squads", - "bleb", - "cock cult", - "anteg" - ], - - "aspawnships": [ - "BUblBUE", - "RoUBE", - "PeEL", - "TWInkLRE", - "MAYONEISE", - "raEDIO", - "joUPITR", - "HAELR TROCK", - "BEYOO", - "TID" - ], - - "bug": ["", "IS TIS A BUG??", "SI IST A BUGG/", "BUG!!!"], - - "semicolon": ["", ";", ".h"], - - "ghetto": ["ghetcheom", "ghettoghemc", "gahttochem"], "god_foe": [ "MORTALS", From 5ad0f9a3795557feaa284f684091e39826f6827d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 18:15:57 -0500 Subject: [PATCH 059/212] Automatic changelog generation for PR #3142 [ci skip] --- html/changelogs/AutoChangeLog-pr-3142.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3142.yml diff --git a/html/changelogs/AutoChangeLog-pr-3142.yml b/html/changelogs/AutoChangeLog-pr-3142.yml new file mode 100644 index 000000000000..fbb642293eca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3142.yml @@ -0,0 +1,8 @@ +author: generalthrax +changes: + - {rscdel: Removed mice possession} + - {rscdel: Broad removal of forcesays from most reagents and items} + - {rscdel: Removed char reagent and spraytan overdose} + - {rscdel: Removed gibbering lines} + - {rscdel: 'Removed Chav, Swedish, Elvis mutations'} +delete-after: true From b77d484239993a827820e9157d39fe9d1061e458 Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:55:22 -0700 Subject: [PATCH 060/212] Mine Defusal Outpost Missions (#3147) ## About The Pull Request There's now an outpost mission to deliver defused landmines for money. Descriptions subject to change ## Why It's Good For The Game I imagine several organizations would definitely offer bounties to collect leftover landmines. Cute little flavour and some more variety in outpost missions (with some danger). ## Changelog :cl: add: The outpost is now offering bounties to defuse landmines to Frontier vessels. /:cl: --------- Signed-off-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: Theos --- code/game/objects/items/storage/toolbox.dm | 12 ++++++++++++ code/modules/overmap/missions/acquire_mission.dm | 15 +++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 88eb493626d2..c68252845c83 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -312,6 +312,18 @@ new /obj/item/clothing/mask/infiltrator(src) new /obj/item/clothing/shoes/combat/sneakboots(src) +/obj/item/storage/toolbox/bounty + name = "defused explosives case" + desc = "Store defused landmines in here." + icon_state = "infiltrator_case" + item_state = "infiltrator_case" + +/obj/item/storage/toolbox/bounty/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_combined_w_class = 8 + STR.max_items = 4 + //floorbot assembly /obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/overmap/missions/acquire_mission.dm index de60174081db..7a389fa1655a 100644 --- a/code/modules/overmap/missions/acquire_mission.dm +++ b/code/modules/overmap/missions/acquire_mission.dm @@ -211,6 +211,21 @@ Acquire: Anomaly weight = 1 objective_type = /mob/living/simple_animal/bot/firebot/rockplanet +/* + Acquire: Landmines +*/ + +/datum/mission/acquire/landmine/rusted + name = "Defuse rusted landmines" + desc = "We've been issued a bounty to make the Frontier a safer place by disarming dated landmines. Mind your fingers." + weight = 6 + value = 2000 + duration = 80 MINUTES + dur_mod_range = 0.4 + container_type = /obj/item/storage/toolbox/bounty + objective_type = /obj/item/mine/pressure/explosive + num_wanted = 4 + /* Acquire: Fishing */ From 7e8e780004fdc35f22fbb56df7f7579ae9d6ee67 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 18:28:44 -0500 Subject: [PATCH 061/212] Automatic changelog generation for PR #3147 [ci skip] --- html/changelogs/AutoChangeLog-pr-3147.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3147.yml diff --git a/html/changelogs/AutoChangeLog-pr-3147.yml b/html/changelogs/AutoChangeLog-pr-3147.yml new file mode 100644 index 000000000000..12d00c85473f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3147.yml @@ -0,0 +1,5 @@ +author: generalthrax +changes: + - {rscadd: The outpost is now offering bounties to defuse landmines to Frontier + vessels.} +delete-after: true From 7248012c86f2114b905d1b33b842da9764c71cc5 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 00:54:11 +0000 Subject: [PATCH 062/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3115.yml | 6 ------ html/changelogs/AutoChangeLog-pr-3142.yml | 8 -------- html/changelogs/AutoChangeLog-pr-3147.yml | 5 ----- html/changelogs/archive/2024-07.yml | 11 +++++++++++ 4 files changed, 11 insertions(+), 19 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3115.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3142.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3147.yml diff --git a/html/changelogs/AutoChangeLog-pr-3115.yml b/html/changelogs/AutoChangeLog-pr-3115.yml deleted file mode 100644 index cab3ff1ea29c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3115.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: meemofcourse -changes: - - {balance: 'Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle - Pilot).'} - - {code_imp: The Vanguard base outfit starts with gear.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3142.yml b/html/changelogs/AutoChangeLog-pr-3142.yml deleted file mode 100644 index fbb642293eca..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3142.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: generalthrax -changes: - - {rscdel: Removed mice possession} - - {rscdel: Broad removal of forcesays from most reagents and items} - - {rscdel: Removed char reagent and spraytan overdose} - - {rscdel: Removed gibbering lines} - - {rscdel: 'Removed Chav, Swedish, Elvis mutations'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3147.yml b/html/changelogs/AutoChangeLog-pr-3147.yml deleted file mode 100644 index 12d00c85473f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3147.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: generalthrax -changes: - - {rscadd: The outpost is now offering bounties to defuse landmines to Frontier - vessels.} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 92ee91ee5671..b29e8aedd9e0 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -57,3 +57,14 @@ when equipping a SolCon/SolGov hardsuit, and its subtypes! generalthrax: - rscdel: Removed tator tots and raw potato wedges +2024-07-12: + generalthrax: + - rscdel: Removed mice possession + - rscdel: Broad removal of forcesays from most reagents and items + - rscdel: Removed char reagent and spraytan overdose + - rscdel: Removed gibbering lines + - rscdel: Removed Chav, Swedish, Elvis mutations + - rscadd: The outpost is now offering bounties to defuse landmines to Frontier vessels. + meemofcourse: + - balance: Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle Pilot). + - code_imp: The Vanguard base outfit starts with gear. From c0252119d0ee60c64b33d0b239bbe51fb05cd5da Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:10:23 -0500 Subject: [PATCH 063/212] Two fixes relating to IDs (#3196) ## About The Pull Request Fixes runtimes caused by mobs without ids trying to open doors and wallets not having there access untill you reinsert your wallet IDs now send a signal that there access has been changed which wallets listen for. ## Why It's Good For The Game Fixes two bugs I caused! Fixes #3137 ## Changelog :cl: fix: pets no longer cause run times trying to open ship doors fix: no longer have to reinsert your id into your wallet for access /:cl: --- code/__DEFINES/dcs/signals.dm | 3 +++ code/game/objects/items/cards_ids.dm | 3 +++ code/game/objects/items/storage/wallets.dm | 8 +++++--- code/modules/jobs/access.dm | 2 ++ code/modules/jobs/job_types/_job.dm | 1 + 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 97049254cc10..d0038cf5277e 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -789,3 +789,6 @@ ///called when an elzu should unroot #define COMSIG_DIGOUT "dig_out" + +///sent when the access on an id is changed/updated, ensures wallets get updated once ids generate there access +#define COSMIG_ACCESS_UPDATED "acces_updated" diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index ae7aa27cdc3f..fb79cc447ab9 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -165,6 +165,7 @@ . = ..() if(mapload && access_txt) access = text2access(access_txt) + SEND_SIGNAL(src, COSMIG_ACCESS_UPDATED) update_label() update_appearance() RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, PROC_REF(update_in_wallet)) @@ -259,11 +260,13 @@ /obj/item/card/id/proc/add_ship_access(datum/overmap/ship/controlled/ship) if (ship) ship_access += ship + SEND_SIGNAL(src, COSMIG_ACCESS_UPDATED) // Removes the referenced ship from the card /obj/item/card/id/proc/remove_ship_access(datum/overmap/ship/controlled/ship) if (ship) ship_access -= ship + SEND_SIGNAL(src, COSMIG_ACCESS_UPDATED) // Finds the referenced ship in the list /obj/item/card/id/proc/has_ship_access(datum/overmap/ship/controlled/ship) diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index c031e998cdcc..002b72633294 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -42,9 +42,10 @@ /obj/item/storage/wallet/Exited(atom/movable/AM) . = ..() - refreshID() + UnregisterSignal(AM, COSMIG_ACCESS_UPDATED) + refresh_id() -/obj/item/storage/wallet/proc/refreshID() +/obj/item/storage/wallet/proc/refresh_id() LAZYCLEARLIST(combined_access) if(!(front_id in src)) front_id = null @@ -61,7 +62,8 @@ /obj/item/storage/wallet/Entered(atom/movable/AM) . = ..() - refreshID() + RegisterSignal(AM, COSMIG_ACCESS_UPDATED, PROC_REF(refresh_id)) + refresh_id() /obj/item/storage/wallet/update_overlays() . = ..() diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 550e413f1a59..39eb08749872 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -117,6 +117,8 @@ if (gen_ship_access(ship)) return TRUE + if(!item) + return FALSE var/obj/item/card/id/id = item?.GetID() if (id?.has_ship_access(ship)) return TRUE diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index f850eded96d4..ee953b0fb74d 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -273,6 +273,7 @@ var/obj/item/card/id/C = H.get_idcard(TRUE) if(istype(C)) C.access = J.get_access() + SEND_SIGNAL(C, COSMIG_ACCESS_UPDATED) shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable C.registered_name = H.real_name if(H.job) From bef91117720474c9a3c72faa1d25be71105ee01d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 23:20:44 -0500 Subject: [PATCH 064/212] Automatic changelog generation for PR #3196 [ci skip] --- html/changelogs/AutoChangeLog-pr-3196.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3196.yml diff --git a/html/changelogs/AutoChangeLog-pr-3196.yml b/html/changelogs/AutoChangeLog-pr-3196.yml new file mode 100644 index 000000000000..aa923171f4dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3196.yml @@ -0,0 +1,5 @@ +author: FalloutFalcon +changes: + - {bugfix: pets no longer cause run times trying to open ship doors} + - {bugfix: no longer have to reinsert your id into your wallet for access} +delete-after: true From deb0d73fc634dca19f1049ec08cab6fbd0617d28 Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu, 11 Jul 2024 21:39:34 -0700 Subject: [PATCH 065/212] Landmine Bounty Changes (#3201) ## About The Pull Request Fancies up the mission description a tiny bit and correctly says the mission is for all (pressure) landmines instead of just rusted mines. Prox mines can't really be disarmed so they're not included. Also decreases the amount of landmines required (and by extension, increasing the amount of credits rewarded per mine) to allow people to actually reliably complete the missions with the flat 25% chance you get to disarm mines. ## Why It's Good For The Game Fine tuning the mission after my own testing and observing other people completing them. ## Changelog :cl: fix: Fixed the Landmine mission description and flavoured it a little balance: Decreased the amount of landmines required for its mission and increased the value per mine slightly /:cl: --- code/game/objects/items/storage/toolbox.dm | 4 ++-- code/modules/overmap/missions/acquire_mission.dm | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index c68252845c83..987aaa9933d5 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -321,8 +321,8 @@ /obj/item/storage/toolbox/bounty/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_combined_w_class = 8 - STR.max_items = 4 + STR.max_combined_w_class = 4 + STR.max_items = 2 //floorbot assembly /obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/overmap/missions/acquire_mission.dm index 7a389fa1655a..1c9b9974ed1b 100644 --- a/code/modules/overmap/missions/acquire_mission.dm +++ b/code/modules/overmap/missions/acquire_mission.dm @@ -215,16 +215,16 @@ Acquire: Anomaly Acquire: Landmines */ -/datum/mission/acquire/landmine/rusted - name = "Defuse rusted landmines" - desc = "We've been issued a bounty to make the Frontier a safer place by disarming dated landmines. Mind your fingers." +/datum/mission/acquire/landmine + name = "Defuse landmines" + desc = "CLIP and Gezena have assigned us to offer a bounty to turn in disarmed ordnance for future ventures. We'll pay you well, but we're not responsible for any accidents." weight = 6 - value = 2000 + value = 1500 duration = 80 MINUTES dur_mod_range = 0.4 container_type = /obj/item/storage/toolbox/bounty objective_type = /obj/item/mine/pressure/explosive - num_wanted = 4 + num_wanted = 2 /* Acquire: Fishing From 28d89bc731cfccf7347a58a7d5fe3a055b1d69f2 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 23:50:25 -0500 Subject: [PATCH 066/212] Automatic changelog generation for PR #3201 [ci skip] --- html/changelogs/AutoChangeLog-pr-3201.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3201.yml diff --git a/html/changelogs/AutoChangeLog-pr-3201.yml b/html/changelogs/AutoChangeLog-pr-3201.yml new file mode 100644 index 000000000000..ea229d14b59a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3201.yml @@ -0,0 +1,6 @@ +author: generalthrax +changes: + - {bugfix: Fixed the Landmine mission description and flavoured it a little} + - {balance: Decreased the amount of landmines required for its mission and increased + the value per mine slightly} +delete-after: true From 0a8f4e3dd80dc2853d9ce33c63501fe1d780dda3 Mon Sep 17 00:00:00 2001 From: Euan <46800751+TiberianEuan@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:40:10 +1000 Subject: [PATCH 067/212] Black and White Hoodie (#3179) ## About The Pull Request Adds a black hoodie with grey hood to the game. Very stylish. Much wow. ![image](https://github.com/shiptest-ss13/Shiptest/assets/46800751/f3878729-4657-468e-afe2-5ac780dc5bd9) ## Why It's Good For The Game It's rather a simple addition, and won't affect the game very much, but it would help increase the diversity of hoodies available for characters to wear. Such a simple design really, don't know why it wouldn't already be here. Due to thgvr's request, the hoodie now also fits kepori crew. ## Changelog :cl: TiberianEuan add: Black hoodie with grey hood. imageadd: New hoodie icons. /:cl: **Do note:** A bunch of other commits are in there because last time I tried to publish Lethal Company 13 commits to this repo they were shot down, (which made me rather upset at the time but whatever) They have been reverted. Those commits will not be added to the game upon merging this PR. Please ignore them. I don't know how to get rid of them from the PR itself. --- code/modules/client/loadout/loadout_suit.dm | 4 ++++ code/modules/clothing/suits/hoodies.dm | 6 ++++++ icons/mob/clothing/suits/hooded.dmi | Bin 63970 -> 65925 bytes .../mob/species/kepori/onmob_suit_kepori.dmi | Bin 2350 -> 2769 bytes icons/obj/clothing/suits/hooded.dmi | Bin 20648 -> 22808 bytes 5 files changed, 10 insertions(+) diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm index 8c758145f71e..dbed1feb8ee8 100644 --- a/code/modules/client/loadout/loadout_suit.dm +++ b/code/modules/client/loadout/loadout_suit.dm @@ -81,6 +81,10 @@ display_name = "hoodie, T4L1" path = /obj/item/clothing/suit/hooded/hoodie/rilena +/datum/gear/suit/jacket/hoodie_baw + display_name = "hoodie, black w grey hood" + path = /obj/item/clothing/suit/hooded/hoodie/blackwa + /datum/gear/suit/jacket/highvis display_name = "industrial jacket" path = /obj/item/clothing/suit/toggle/industrial diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm index f58d445c53f0..1667c9b7860d 100644 --- a/code/modules/clothing/suits/hoodies.dm +++ b/code/modules/clothing/suits/hoodies.dm @@ -115,3 +115,9 @@ icon_state = "hoodie_rilena" item_state = "hoodie_rilena" +/obj/item/clothing/suit/hooded/hoodie/blackwa + name = "black and white hoodie" + desc = "A hoodie that is black, with a white hood. It has a comfy pocket for keeping your hands warm." + icon_state = "hoodie_bwa" + item_state = "hoodie_bwa" + hoodtype = /obj/item/clothing/head/hooded/hood/gray diff --git a/icons/mob/clothing/suits/hooded.dmi b/icons/mob/clothing/suits/hooded.dmi index a4be6f11f793d79c203913bb0600e357902079b0..e1f98d991357eb80dcc992af4d3ba9f77aa9c636 100644 GIT binary patch literal 65925 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 z
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
  • Z5TJkBKCXTZDmw!n6R-&=T*?;Ge*-p_yUW~uW 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 literal 63970 zcmbrm1yq#n`z|_kN~0i13n&drNDQf z%$#TZzTbcEz0Tfyt@A%?iSy12%=^S0*LB_ZLzJfaqie)Bi6IckH5FyWXAlTB3+9Uu zAKYn<8fAn)us-{0>$@vjx>>l|I=kCCIYJ=bSt%()>K%fl5kos#iq1-r=sJ^OifJs9 zTvx;LFW;Aw@s9+2q)DF2{mkf{H8x40>fJELiZsuhk)(QG%^i+_UG(`C z=@-kbpx`Vrg+n#b@zpxw)pI4e@`-R9^)>w;YwbaPP2^9Xm#Z~?7K!%$)#A`x>m(kP z75a?k#>FiztnH;!vw8OGf?5`LdgBd0;+r6jwL>cN_|mUFBAJy_?`!P`0IP$ zFY+#*3`^dY?K0o2NO<+bVv8QHIlItg4Cf$-wY+=X<`;WHw^-zHthh_dG#M9`UHX-} z=hys8ti*WRpF*NgYnn}`LyNg*>EG8XoD(MEZkuu3>ZqS_YjhTQSG{&eIx9hccGhot zy@KAFHTBl-k@|qKSo)2svstN@vi>bg<3OxPMQQuWX;P&{)~#M)_YcBGPO4$+yQ4NJxp9#A{~U0y8&E1E{LbQA3m_f z%Y;Z}NE@9>-<@IpWF68rEFl&oOoq+QHmHwlp3q)NpccC89-+vfsvK#&je6R0_gA+1 zsM;%?h*hMN#(Q-=oh{=pttro)N>9qXRQyi=V98P7%29--Oja2~f>{WIS-P24gD|&n z%_aUD7q*p)jobR1GmkO@z8Uc=pM5pFf%ftoAh%ww>LcF&86%00Er}U`VjAEk0B}DTeBP~wA>y@di+rfI-4c^MkesWG; zOL4#J5a)tBq3j}`8&G%?#y#^FE6lf7ymgp;4;@OP!)a?~w9QBliY{U(bm%xHbU_SSEo39>uBQ{FT7wec8H3(3#KF(2h3mws1 zdU_;Z5{r=JZ3y99nO=b-V!n>bjy-byb!bE5O@SrIDOx4gVH9S+Z3+h7tugUOhw*5O z9C{z-KW&Rp9 zRWo$qsvzc0Km&2D{s41#szf1GwFn>KPBo%Yms3BBw6Gvt>RGZ{TGaFYM`}o4r^ZcA zT@w?s6`=$u%KQ0AVj@n`>^Wpu21c}4_jMPCnT=c`BkQo)>MVl!w1k{Tx$LNqzp0(7 zDIdmWp@L?(!S}*p?^Hr^mQooNXfeQ6i!7~Eh0$5h$XK^uUGQ>QGX|9p&&-sx1x)XV zRfX@&@Y#m?i_L$3QAr1(>lGwxX*tUHRCi!M0ju3{>wbs&G1!AbUb6NHi~jm4sHDR> zW1qfzV1`B^>(}1d33_a4t7bo-JzIc5pY#y@5XXPHbr=Q-Dokj7xBsIq!OHQf=i{?S z2bP#G-!9IH2-^H&H*)W zIhAPMz6JT?>G!QwpBH~2PK=nDSWr}^sP_f$2ZNVQsA>ne$n_K0)j`k4fXh?!h1LMN zvvvY*9v%e~6Q+1?sqZP4j0fIt($XTTs)S=N7jgD2)b_A8e{6RF`+z`fqSU)x?|9#-H{&Ot^6p@MEA0-qc?qF1R!o2G(?SDDGG?Jk6_T z#t9~FPFh-e z|H2<3bnV(TZhroUh9JRwB8zyseo}SKFPw?&NfQA_ITu&1i*1zpI85B);{jGscxkzE z(U!u!qOE50ZJuvUC}p%F*vPE$8?9Ya^YekwQUQO-yE_Y*@kZZLr;*H3V76CMeRxyU z+lRm{YcNIV6WU_E5{2_XJwx-33V0kAWWvOc53;yf2v8Pv0c8>do%;)T8a41YF%*!{=z&veZ$SnnqvBNK!v-<10atJQr)Z+!zxZx;m%yl7%jSuH!n-NdR<}Qg4A*3W(d)!P)*ZyY$7j(Hs9F| z4-Z2M$D%a3Lz|nWvgX^EA(}MMc|H}wd>2$KBL&18{o{T*a)^9M1N!)nBPP6Nynm%F zxSbbsP>2H?-&Q#0ee(tS9BwxA3T)ZKCY1Fxa$}SvY?9pFsCaL^Bw#SUZUI%XEF$oD zcN81d*wlm-8%r0oyXzPr`fyuIh%uwG@7_B5%n2MUF~*)`yR7Fghp3TiE;6o`^u|@O z*OlZ@?IDfSR8fkWMn@UuTpABKsM@`41_>ZF-csC2maBJr--r(0q29XGC~G%{ zwqPAu4Sf3?!_Oo#w>yJABO!W!BCvP)5!a@JteU@ZGO2E4^})I&-KSVK7UcczXp~g? zUUg6FEqBuQUavE0uf(4H;ToHniShE>NkXXk^vjb%1R}oI9sP|kTq3&1Xhg}_}$t&2|uT55mm$NwX6rGc1IRp~S zZep%$`Y-D0>EmQ;ceu1%(^^c&pR9;C&pAHo@T@N7T-Ns{?zT;roFA9*X?VOgWWD!C zxJS2k8#;5EOmBy1nj3RIwxJ%r)%EUC;J~2|`6Dl}=$IInt)F*V2wuM9U^PvuSW7gm zc52=Hi4Nrcj>SsI##g3a>JdOLgAeuHN${vLMo-m3$HjeXh?JDN2qO$f=I6--OWi#D zSs*eObxlnSD>zuPNfef(J3BiYf26KOd{A^V2@hg?Lz+Q#@%BJbyDeb3&cGD1S*LN8 zdf<3|CsCu?d1S)IHkDOa|-YL+;qo{7)Lz}X(iy9bg_>4C&OWqN*@0O=_78as^By15JY!Z3KYT=rmJuBemerkznN#w7NJ3d?pkH$3%}LNw z1xfV8Z_c0=oiXq5a;fj2tpruwWIun$RLX$_cQ6?>V~TZm!;~}6R2WJ%rUcXrjC9o`kl`a9fXF~7VGPX zGvNg!FWlkP2JU!&W>2h$RX7_v!RnaC%mEcyz7Z92G9XiM=~<=me#lf^u>H(BW0R9s z?~Xu#GXx$u&EL;)>UiX}Omzm6y%ME(3K&$|xnX@#mGbAXug~S;_ivjRNrs)l zqIXA2S;fFi(tr2q7GzT-GE)3S!p~gSRJr1r97eTDj^2|o+4r^`S$I3CJkX@L`xi8) zDoFn`Bz-c8|L%p*w}VTht@U+AqR6{W4i0=JrKOgEZSaEy=Ihqc7w* ze-DULP9fgiv@!|}PZm(Aznt?56TsO$yUZBd#D#>)PbYmnIXN*f2+Y!}sg#90E z6=jLlxwUt8IaPm+xN-aC&xwgAnXg_=4n6yMBs();#eytUp$a_RZAx0$vn~nzY_`)^ zMPd9f8ujJNm;Uvm+}vEO-=(FHpa{>s>#i;NFy?&p#we7JU=?+_XRTGJ{;Lfx?t-nR zrl#NEdRx?SHuCV$m17Tso5JS&`O|pJoAS8R$0u!6a0qSKKn{3gDPis>NJleDNWTrA zKxR6%7R}Ue7G$PB#i`zgA8T|zM#iCsXS=^S({)D-6ui4x@aeAlgKU6P^s8P*ZJt#4 z99dcUPjZfFKg-)*c7G5iVKFrh3sAd8(z!kT+f^>r^4`6Bi?zzQ5jww)A4VSUg&Z>n zAjlIMrF%!E(U_e-jYPeWT5Qfe+4i@xr_AZzLc-=)p@o*(wUQ&>DKJve0EGLW zg*MZPul)!vBz5I;Gy>skyVEDEi`0M3+xNzjUh-BvE|OL!%zg}&LaQX_;80q0qG@Q@ zN27!VF|w}vFlyCtPes0!!~7jbuCU|Grn`KqWo}$T9=DB+&G7d8V`RhW(T?ZmSVam_ z{9JBge;Ha<6Lx+R$*RI5fL1Qk^qVRDdLwNLjJzh{t+CVm6Dc*1G#zgCPWr?sZE1dr&QDB zoF`)a&eByDykJL=ErGQy?^Ig)z4-gCfI!a>4CQv}gg$lZC=2Ofh8Zo3Y5Umm^!D~* zpfNiWxhobU*8hZ(|M1+wg4j=0b-n#(iC}}wP{XKgEBnrv_AciJBj-nKK?C@89IQ8C z5MI)V$}!#$72FUx?TC&@Wvb{E=tIXCMdyK82XB|X7v`rS?JUGAbGyy0r9a_ztKy}Dj-Cv`T5CZqDvHa}tCS<^u_NSU&qOok@}2V>LRxPb#v&wdaFmL--!j0|8D ze25|&Wh^-Sjl@Mlw5#Ytj*$kKUiiDJ&$A zfonhufJ6EC_=vZ_punsF{#7f1jY1RcH(=Fs@eVpVi%vnmmIR+mF(K1!>P@-L}#YQHGb9*FazZ6G$X4 zUE<;4=@`?1IyCOQd>@FgeVdZPN)^Sz{2WJrewuj7O2MGnXr()@W4zQ*t=iy!!2VJ| zMY$GCZjpU>7IZ@$VfRu2ZPk6eJD-wB2v*?SUj|v&wIcVC1MG_Y7IV<9Hum()LT&Ng zKknicrNzX0SDfJ!X)~0XI_780uxcqrC;#VkW6bVXufO~CD7Fv5$u~T*Vf!pb{5OD0 z1M?;J!Qn)zpht?)IUj#Jwe6mF#W9GfFX#cdT54Fg<QZDEH_Lc@E_wIGf=FIx6XM69poZ-*HN(TzW20OwgU^K&B>$MkO4mDb(bBZIe z3w}a37vT0AVUc48fA8DdLe{+oiBK3J%qOp zggA^<|B3E8j(BTu#@zGUH8-yEEuv49VLq}8!jh|}iFe#qZVK5^YoEMtg`baJ6jj`Ulkddg zD1*o=nbRHd;@$;EML_ZG(dRF#;QA`DtYEFp<{|3mP3v5BCpdA1egv%YeN<&-;TPT!gZA z94`$X#;__oiSL{Bbi^)gm#bSCc6i3NeGju8zT31sDFng_91iWw=m(aT1Kt~Nln+hT z2*<%AJ7PEEj+}p_Sh{y@3!xX~Fg$8`U4Wmz`-Z9i>mSKnc9l0awhQbJyfr!czTdJ! zCZmcfpP`LR5)K-hryL)-S+L(67Mm;0tE6;nGWNQ9rba1q>>&${9 zOq+1RO(^1+`6t#7xId+g)cy^i%W%D)tA6y{RI3A`MksT-FgKUINa-*MZnfIqzTE$6 zs;Q~@=En&cq0>fQ?2_aSwQm_B+4cLuPL$b(A+~-CN;K1kg^{z=KQO5sBbIbjT6`xM z7Oum;QCqh{8nkD0k7#5lV_sa~d5w*JZETzaa(9jjzI-2;y5e%;f)vHuqv74T(K+-A zQ#V8Bk}Tq^=P~j^yY}{zRLHO^#eM`S>|8usJ*Sd#AeNPw12^!XO{6anB$!y^p}nh# zU-d7>9wYr+7pI(e+<>3;-X?n5O_41@{Unt)@w`C{NIScPj>auF=Sit~tiFx^DtXGG z(zs&VF9}juO!op!W>SGQoF~5xe-r9^!t6>|P^xCPkt$&L1G3|g-1hniuFMe(fb?y~ z9`qpTd!IG>C^7GgWP#B>k7JwUKvJhSrC)8fH%2&-&wZvqIy>kW86s^Ga&IcMZF7HA ziJ@5jD)NaOxqvTqb#(#O#|UWH$lP39-g)z%`w3U?0*=(Imlw!!fOYC_LMft)*{plW zRPF2)2jg#PE+5F{EgdNP$NIH1>*9p($8_l9 zOsJ?R9~ZpkzI#{QyNO&+Z>5)~{NBL0rjgI@6hb|{?S-BMcw}DQi+f^qIdMW`H{l;1 zWol|`#|{pT**G~7XuOt`p^)XE0+G5-=7biK7n|GCaw|K#@TsC~3BQuN$vScX$%k$Z z(eoh+e^=GdjqU&7f+>Nx_{6CJkEFxAU&51=wkO_vu+l=Gj%;NVqzdp&4VjCQJ5KXO z7$xaK39{r2vZ#iIt~joe4qw3KZ?Fv9#nA>!6yPp9qodOA8(3Nk*xg`$AUBIM-o~)p zZn}4mA3GO(CdKedlpDBEyM5cnf)sofV>}fN4GpOuVYmV?Q(|P?IWjO+K*c5s`Vu6h zFLsy0EVY6=OWd!P?zSxq_1cR{H4xni8Gb*T-+~oYvFF;5!%fU&ROq2_w6ncpz#`Eu zTFuAxLaHsV7}UM8jhQ5Mn6Xb z|4g!ay*=UG<7$|Wfe zLn~U<972o1s&_oUDM`Erpr+xJI% zcxy8|gx3kenteDsm}@}>UG1J}x>aKDvXfzALg}dj8->+u!aZS?LPg4lFMF=A;;Hdq z!>|qKZ@Qc9C0)1k)J|7^EmKY2l|CO{QsqwOJ||5FzC}Yz%XKWf@6f%{AO4qy0Ew_$ zFW3LrWJeC?7!URfjDE!Li$$NIq1r^w;I^d{wLng(givWErSVLi#d8bx>o-qzB0A)E zU$54T`XiXVASE43flgLd9TOdpnz})45~_D8!83#yn5Bypxmh8KpOH@-OnEExt$>Pe zaI(ch8`VFQbtA4kh0cNbvh_M-Gk!>sGOTno1b9b)FOSplxv1es>qV$2)@WOT{RVSn zxv$UHrD2@*EOjn2amF{-ijtJ3HBfVRkrNX?1jWs zp&CME3aAjdU|A_3l2ISj(5w+=v2UmB&mYJvh-Z}3Kly$`AiASC`ZT&Y)b_pqbWw_P zrmsXR>~`KGG9tU6X*z`ovF!7;O!X{@u_%M^fJX_Un^=X#U+HlFj%sLZ`9`?BCXLb_ zikCEOv37=%Rv#@z>n3_q{+6SeGR9WH(FJTGk%GByg%%B(#4NjfId+JTh(AfEr=E(2 zAkep~o2gcC^EuVMty0~5i@YjOId0Jk$(6!3*OhOR^Cc7-}#n@XZ* zX=BXwc*FC~UqoS4#~M6en={8K$@W>#V%Lmoo8@wd1R3PmE|$cm`?ue&tQ32vOY(F* z!LF7D-YgV_EiKZy46R_ksgu7PvN!MDpIO(;lK9|paWsi@|NUuQoKQ`V1*KwY#PJ?G z1L6olP-7W3Yv zTwj-+w%G)ySASQ2pu29kLOrQS$<(mt@Jc>&L7N)9FtPO%*ajAH5Rh} zXexlJ^Eb0Z=PlMo*0Siiul1|iTdTUSsV)w)?s!1}p!lP>K-CEXI*rPUT{JYXmTF>P zGV(@9%#v%vV!R?G^BSOKKMT4J4-X?*=t%PbCs$0;WJC+O8gc~NtvPnY_}w6>#;oSQ z189>#6y7H(sI5%}VlcOpL)U<(C`=0v_XD>A3i5iu+sg{BCt#!mv@IYo zcT{{c6#vmJATw6x3YtCv6&gDf6h2=mKw?jN;L#>g?r zZisdx@P1_R06}*}Oxv9M?P3_dUOA}S0nSVt7gyljK6}}6I?Re(o2QLot+1g464gtC z@S%0g-dO1I7A)jHwGsPlVB*|}u=xF0r2m@g)fKxOy31wmMlz}q#elcn=7PJafkxl7 zI6d9K~MS~$l zwbzf=ubPdTv)G<$(@IEsngOum>iH*#ikyr}&A^{bih0FoKjK%=Qqw00chIqzJfblC z_y!3kpNk?z?jD$}I9w!!-XDs&m0)-zrGR3&amQC`I2}9f5eEUOm}xOhgB6vg4lp4p z+TBOY0l2c;#M;Z3it@mdapeASXZRi4q2Q-9c;sbcjk)KiCkHe&S!Raary}3H1C?|x zQ+~I5Jbyt`otN`pgdm1x#{QFW$yPg*PxW$r{}L&`EB`-Hf;WH?_cnq=VSkiJpD_s)d>UuT6ctO*O)PYPh^7~ z2&3KZzHij9zmbEMD6R6*ODiEHTDS;&`m;>u0O8v7{vv^z6dznkzM6>s@^65`yjX3* z$9dC%N*pz0TV`rCMwQ@Q6Ob@Z(qA`2$xB9jAeFq7(!z6H!STx1>vL6Cp^Q*VGuxl> z{}YZ@E6L1Z7eD?nID$&m5v^a*E8r%MZMeWP>$@uiVEEq+#sdF~>7iqFJB&q~nEKK< zR&gdbogokqCF)n)63E3F}Au6R;l-vVXO2_ zIJ<+@y(%Hrc*CUQu*kdvM`$YxB^>`c1Uvj>77#agL(yEXh3D6(dlwXBm@F3 z6}BmHa(6+0w>K&%mo&Qg+pRXaSPN|{YJg_FF=+Pnf1z1d44RexB}(~kJ^|a+mVvN- z8~OQJ(*8r<@QZL&cOZ#NU;C`{=VlHm@IT)&-)dV6QcF>Xla6nigwc5$bEaXr6tkX^ zdDu?!yXJ0tVj1Ntzo~twlm1Cj7z?njM-(FUx=H#XJgGU7<9rsIUR1Vrys97wg}YSBy}*vn3}BCd&Aa)1Y65u466v>|d;x>62m-SXWQCVr(0| z55RYKa*DZ=IOZ@AZy;RSFJH8qLh~1v1AxJ-InjOi-`9i4&(eYDl8oxs7;Pi}`+*`8 z&<`xyWTqdj~VV`Z{r zo<4&jl79vSOB9U*MWYXLXt#fBVl3ey9*GKnffI$xzty&HuKzzTgr8p%GXxCW%CdN2 ziLJO9m<=i9AGH-?h8U+{lC(oj7*3TBTf;zIh$JlVgc@{Omf3p^22 zqN4NCcT)~CHKNMHzdIZt^y#A(rQ4sp_@APg0m7OFhYHAW;_k|qx4wc0NMZ#@y#oA$ zO{M3$;Gag7@+Z97ikO+>)ZMmDfY-V=z!}(0-g`!bu5! z2!JNY&cg+OqQItO@Lu#n=RSzuK>gTqrc1%z3YyqnI;VR{VgVivst>C@2}_8`V1Tf( zMq&9|32_W+b(ykPSNZ7gKVcuukb1E5 z^Kcg-Jce6K|sDW<0Ct)qi6gPZDM}j1QM`PRqU*H#=x?mMWk?e zmE^9h_S2y5hXJOE9IQ0NOI3aRBEJeKF<}SD0Dp-Ov$z;i51!Ur5I_cwS`5vE-vP@#*ff!Wlf#fx4~;5qZ-Wx) zv8_47X*xWm3=oWimja-uLS5jEVSWpV9E`d;HA0-7G7 zjCac-VuCS~(iph-1bcYD_ODb+%!{t76`H#ml&%h#b|QoJ#ziffcM6G?H(I?>ks!9J|z%h z;sQ`;|Drc^!zMftr|Q&_o{xzfw3CGsOxU)Ig0QWGTDC;3YfE{+C;3^>ZqF@`%J}st zsalVac>uXBpZxZeK4RdaBgI_(ETgqU7hQ6k!?h?cV$v>hq1;dXIi1z7P)RG z6EC(^BJ+UkU^52Iw*K({Gl<&W-o7nU*bHs_asOhCT zCiJ(}#vMGC1oZqf;zBd`-qssMDe*^2r)7RWIBEK>?wSH@Uza} z@1D$~>3$nC3wg#mj!hCurIoore>papYrHJnH+=`1ePU;3=*ur(N-HYD-Tsr_0GkK1 zycsNHl}GaFE~YRJg0hm%Qv3o7TN)l&r=GObqVvXUSx^ZiU?lqU3Z5oOc|8I27|8INkZA-(qL3>Y1kx4|%r$bB!00f{8Li`X& z(59h+_n*%fcH|VD%K7>Ep+iX1)N?(LoC_z7mDmrn|lJoPQez{3zf%>4GtwcWT7d)@7%d#4toC1w@uN- zGmXp9Jo9bK?$CB9?w1EIZA=B7Lg$$5kwzIL> zu(rNm0r!>x7tDv_9wEbAHWmC)#d(63Vy?H^*_Iz8rK(f?pIIK}hn$ z%WdDQn!L7*6NHqK`rv&Zf)hjfUvYIVIak#0{5&xiHYrb2dw0)v*aCnA$pFN?Q$qc? z@$HkXv&@+te28kgAeOPQF(hbh%?e3Jc?#AmQ`nOD!Gi~amc4HSEve1j1e<{(bMke` zl6r~Mx5WfB`NyyHB;b6V0}FvBUsyl7KoJC;eEj&)=GCj-PpF7ktfKPrwDDG6i(d(} z->XOsQY*)nzJit1T|W`t_5UuqqYapo06`~a=reX9lRy}z0v`r5Wtn^~Nf9sk*MAl^1 z(;v=#N%Xt^{8GX$cB2PfoMGnzsJsTl+_I@r=*0(0y#z|k6f|lahZ#agVcz@>Nwh7o6nZ+3DA{mT$c-eBmXYl9};7Q?emb5iNp zC8y$IbRej2+8bDo_32sX-7o@%3%a4+*3~XsHQlNj2oGBlq*0Rd5GRFzPX!%O1Hu_p z2B{|qM=KyfaFPJBZVoAq%p7(Rf*#_q|AArK7YQq zb1mykCUj-Uz#?QQ!ZdcKW2s_O8p1eF5z%3Oe0s`8LAas*R8&0hN*wz&#MjS{k}M)j z99DEJM%G5x29H76o&?CKSLa(5Hx{^UF`6zo6d=WI!yN_`&~O ze-!AS`}DS-Ii4pPe&j5L|1nGm+yMab@IsD3?46_7>+_2vtd_DPa;BfwzZIDw94 zoP7ax>wkC1$#{af{R0%HGLEpM# zouSvDqJ#q53G+|GPk`Wiai0(4aMk;IeBOZ+>P#{(61o` z03Oiw^`j-gKP!2zk7d8*z8BH;*@Oc0)rodHI}oowuASP)XGZ8ZjFP(HP(#rSmFY}w z$*K$%zUAMYmz>}`69GY|r>CJyd@GrPXlW4YFjc~d0JC1hPa~*x=p^xGNr7BKTI;KC z;LWRd$Xs!cyW(aELA1xm$BRGjxU?67eyUhcWLzcrrsvMlO8-WfAb#NC(II{r2qI(= z3d}bJ@ju)Q5sI*YgIWMf#*TIraJG)O8G^bS(3f6HGBr#DER~fWUAM?lw)Qk11k*sz zoS5H~)mUMht9y=;^CP)G&HSq1k)60rBeMN`z8!9M zXlSzJiT?t;`0p)hgif;{39NWGhOFP^&wPQ}j&itrcx=k$SKy|qmaDzO&uQ=?hvff52Xh7<5QWKuT@0OZ zd?dpBe&1WwHrAN`2B;=rvw(_7fF#_<^?#$Ii}%xk_Lo2Lk`y{LIh9Wr^f*)q!{qD# zRQ0KTvE`s4K4EzABW_3)I|xJn8CifG4#GYyDS+wf(5d4j?1nhQCoqQcW0jpeH~dR+k}2?=m|mvwlSwHpk>I= z>#)4mR+*i)CgkbNNgK5}T&!kxQ`wWSzY40I@g9cq85@G}XO*bu4Q8q!$+v>`i#~%! zDXg5|Ig9G}UNS)W9G;A{>ZZV}Xcr_%N6$4R*|&kn*qs~Uh1z~)R9WOS2?|98)0mEm zw?MIpWqshrnaXRxcHrg&xMy>Z_4d}UeX_(!2XTAQbfuJ(ekm5K8`2+L*gkoDpyAyzAIf27R6b$X7$6&S zL}x?%IpcKf&R8@p&oj=4)Ys~4Ra@6id_jTKY32~n65$xE-K^R(82pa4tOf<4wp zR`D4qctyA3nvtL?Zpz_)*;}fpfapWgomb*ErdtDsuh`hIWyhpp0Rb&F0APqNbu*mI z7cU7H6)IZD) zuK!cSXhGc{5?Li*4vmZ_SXy-$qk0x_6gPgZ8n}-C!H=IZn zSDog&#hfW6xRZ9o#Kb<-)!hKS=Lm8*70g*xq@6Z{Utz} znNQV@5qaRgVYLEUdj3PVw~{k!n5ZaEfhz#n5Y!;dxmyDQq)2$VCar3JE5@$tX@4;_ z04+|IdH3zEt3Fw*|gGJu~C-YJ>?B zv`O#ua*~e1RJVqz%|-9qiX@_bo1((#p_%XAg}#(is~s9kI9f<V^F!AkX~BOD(8 zNQB!T-}nSB%Q9Rpm6uczg%LUEKskh|u|?phs6=@N)V4r>Bq*uW`zdf*_s33uxocvI z;mqk2t2h5s73l`WaFpHmTWlKBLRICI7a+Ln-67KLOvG4kq!kTE)&Z!A| zY}5n1i5e_B)6*b<)^!+}_l74CH>I`d`V4>81KQ588;!&B^YK3xJU_y@dr6a;miS&p z#t#HO`gTb&`HOn@OF_vUHE;HxH_4t?Unj<#dl_Quo}&Fx%@-T>L-B?E@gr>ZQmKqL zp5)2^ks*Z{c75gD?g54Jd|*4qrE}#qT7uR~x*f;_ocCxEsX75&zwJ7>!@VQ;N;)US zx&uIylX*lgBPikw+@W%x`{8W8J>qv+yQ6QZfUIg2jxx&D+lscShAdlR)e!m@@v!y2 zge}{_LZQ(7`!d(@v6wQE@ieHbH&!B!6I&@}7lwk67RIF^a)Z(HHz*53*!+q!fKZ_t zJexZ^zp~@X%F04HEOp-`CyV4QYkuZUm;$|eK|g(3Vg)Wx8!f{OlJmbz+xiQ{B0;lu zL4n-*X~{LM((BA2QriNsHowKVTJ?`KNOM#w7Crq;SL4^>1 zr+uU2rk#HhNIWA2YQ*{5sq948az;*nFvJtqLA52SUZ+f`BgjqS?afZUkcUo1wGG~= z@|j~V8XWqp*CL0R$ zk3?@#EYGUgUGK+Koq&G%MM%`Fcu$PhrhaiE1`$}JVBFvR5pSzW+B63^w z5Htc~j*dhxOAFzo#87Ccs}Dtb@1LEn#es9%mEZJ#!q=A|HL)K6VLccE&BhB zK#y-(T3>LpG|1#*XQ3F|FxszzOrNYZ8cnh|uc^370A)s!o|N-v!^YxRQWBM}W{z5b z>Iwe4x zd&hez>;^aOF*gvVtA4PPL%%Wwt_s=a>{)!_UFWg2mOt@ru?GPLLZ!F7qOGfo4Vj0b z19D@qL5Gnj5F0`r0L@M1ReagGeNwfWLNEE?K`5W*>WQy`k55DEVcrOtY3wI}V?mCS z-wGDMJ{fNtY&UMZq=E>Vf5Qd95DW4i(bc8zJ|qKKz8-e-&a~U-W&&k&Whpf0zBA~s zTNcx}DqFZ<_BqGGhp;hxeZ&+PG*I6ebsLIosJZBZS@2u42InRt&W2D-Rh=kn*q$Mw z$8Hw!pE)nw(I`PC-!=LtyCL^^bOl9!<<6|_S49_>kN!K!%k_}7E`0*FE!e#+xGpIn?0mm2`;Jz@M*Jgn^>`Fy zYimp1((*Q^+Pk+0N(DGDiX#F|FvZ7Do`g+4jsQ~uQpMu=!AiQcUoC21Y-TWDC0P@& zulRVf=Ek+&w>{wh#~8H<=p6+U&sH9i7j(?rgn%CI+tz#}qI4}pVwy>5I_&34d&)})i3x>J_d2jLmLVow+um2|X_z%0LYYWU?Qe7#Z zls=p7fGocE+cmeo3F`_(K2Z2ev~N7aBO;4I@qNKjp)U{@#T>=5M!mBAjhxCda82f!}VQFAYvPuCnHu^JSFp~&6T;n`Ih%s!^mHsDeEiUooP0@F}<^4Pqf@R z@jf;30cHqw(kw!Mn^%ESBFm@lX~lKJM7IQiDyJ*oU!lUd<@1#Yf};u^t|1 z2t;4+jQo5=fqDD#+{NlA+6*yKDjC_tgr@M=CW|LTlD8f~ONA{n_(q`t4>M6$O9Kq| zAQdw^km0>+A{UZQpX1gg^e(Ubn<-Znt~IwW!J8iiiv<=9iZJrm%(NFgIA)#~9L(0r zJyWLht7=nh3X2BbtowvQ#toPWY$6bC& zD1ShEa`%L@oXm>Wb|ZtF@mlvjQe0xLg@}+GFJT zcxNS&h=#1LPwA0lcwkR06RnHZ;ok|Cj?ed}a$=Uyv(DO6zi_=L%KWEaUY+mME|;r9 zLy;(Ll)Xd?>UcSHEtAo8_w{|fPi9YF^P(HkoR@MPgI2(fzUyf^pqB@q;Or|QTj%_ z4B3INGVj+|=q#%SS@mFDgRG5u$ofh#)AL^WiyrHE@p*j6r6zdG-_0BGtn5~b6qS3? zdM3!vQq)lDfZo2K3xL7qz-*FajvHLF?#1&EG$^u=Cx1G2ajv(zu)H+L!qJ^R@uzrOSRNV-7Z2U=Qa_(tPn(BOxg%yRcBh4rBWm7g*&k%O>k{Qucg?wePW! z5pZHSOe-j!#Ry|g+r7`+BVD#5Ng)fFPO0I_;W3;0B)!%sMdX_Y79OMGr(;i&D|MV- zc`o-kGT8<)#gK(*rKZxg%Ti4me$zwW|FZ}=n+)9d8t5mw#c((%OYi-o^?QgR$Umin z6NTjG)JH~=(>W0MwsYI?UuWF`kyP(LlVsQbcJke1 z#yL^O({%#n7dp!%a=q_lOjM*xRHlYtfd&zIzQfr27*WS0cj_eM{|uV(!=J$`XW;DE z7Mc+}|GmzeQ@_dS1fdRrz`btVd0g(_P{FzC_UIV0k=bK7gedsydT&OHkEdw{h{&4= z+*1tGGOGZT90-NEg!F5j_e0NEWon;0P<}+lp1R0uDe`n}e1RNh4TTq$&{@ThG_iQI zypJRgB}PQMT?WW6z6mP=9 zdWUy?Zf4kh!0mAdIwY(uMRqpt@Kvs7_yRY%@+JZt^l%p4uvSS$vlaH;KZ_B%mneA3 z<>avKrAJRUJgEsALZ-Zc2FzoeKiqvKN1^%d4%2()WZ5f}pYMsi(RHRgWv!>DXjK3+ zX58;J1^zX ztzHS;{%H3Hop$56bT(QoX@VBWx)Et5$W*rD?UK>5&dzffQNp7_)KJL|kL6T+JG*R#Gz3c__M_U!cVG1!?gJ+8D zWYVfRSmy2k;Bx=A?K<%1u<=Wh0ONBBR_6eMr&|CZ2)%1%esN~2?49FySvGiFc{V&o z0dn=Rqq$w}a#~VWGh5SlnZ0M{K76F+0h(35+!w_rCUnF}d|VRoro@%Y@DCphFq*vt zw}zD8(RM#R9#lWMHeiCgP0})ScCbuZ4n`A2v)HHd{lz`KX&WI$=@iTg(d38K#q)d9 zYkMaY%~*2t6cJW&PEdua%}f`L*w(J6#XUq;A$bA6x>$!6+ry8L?9|Zb)}!8kVvqZX>UxZT?4JEjCg5m4xMzqrh=&KM z8=p%+ZVV;6n)DGpI>yzISE~ZzqKQNQ^-s2kGCJ50ndZd5Ar~}c_JmRBdIcxs)RN&U z>E2uQ_(_fOtAc%E#z%uU=^z`3>A(qGUk6bQw{RWIU*bq`?ij54ZqFk zukFTu##2+f-O2iy;v15yNT~Oex5)IIo4w)@Y{Y*>Y@|<>mOJhP`+syB5sR+#gF*ke zK$b3o|A&J^DE$A>0e?>CI%FX(9BR=;WE+n#c_96>VtVVjhHeo;9IT3;;u_7+n(ucQ z@lW7FWw+*=JP4WQo1NC%C=!3SR4 z#Y>=J914_c2QC+4LoN>BI0=G)?Ck4R)zwF{&U4t6kJ{0<&(rgo%%lZg%)T(hE!6&C z`@c!4@ODnS{k8q}A5{BRO>5UYPaKHTP5O_@X!cgS4G75wglQi%(jfs&=g~l;lWQd3 z*K&h-7=e zI%f?pdeu7)uB&u*O#9)CK!FH#SfmGOfhGwpcKA=Dz5U&jg^mNKGw;}@sxo)~T&;io z&6ABkj|O7?=e=V|y++0sx-+$5cc~E-E(-k`a+s{@kLU_0gTUQ?NiJfDK3*+%N0JE{ zrwDF!N@V!i)7RQriU26iHH9m0)S^|HyUk611>$F}8w3(r2`^R4(WH3{u(3!>w@MKl zmlya!zB)2Fp{2owFA)RiBha273<^6zUitI#!8%m)xop}%Sc8VTMdfsCV&dwfJ;5s> zDO3!kl@%47=m*qLHUA8Yagf?z;8Ii;#X%RiVU!>7K(p(z%vQP|#T5kUhpkTUb#ZZ* zme*=TmC1>Tp`Zb*Has)2Iz|GXwAV47LHhnKdw7t?KIya$#-<_=ADvsB-DKVUpCvRa zTw@bGDH+~~re**MWakw|OUmS$*bd#k5h4K7A`O6;W8e2#f3qYw29^k27 z!ZL#I94qDHOg?2SLLXa?oh3Fm|KxOH@OU6+kPUAK*Zgk-DKwYbY~7g4%P`CPTf>hgT5zV7aT1z997OZ@@dTHS z`@!E9i1n0-0`5UCANbpw1%v+D(m4@)oDnIq7o|{H@>M6tYFza()%~OMET?&VONk6-qa7xkXf!S#8^qX$$^B zr3ZFFwrHcW_^WPaE_>E)p#7(|GJ1NmL+h0W%;m2H65SK9rrj9iPR0g1;axFjqWk>Z zcnMETeJGPg7Ym_#{aW0nllZ`^Bs#Nby*f&& zonZa-Twp1RiU^hZwT>*K8WP#Sb#|7K5YcT`hL@!tOYf|L)D1omYEF*~^pp{JXWKG1Aw_{zTUFkDtep?BSfY~QWV}#p1hVMR(+9ZQx>+dc zoa^qoo*Nk%sXbJKKzR5MjvUaQlO<2%XBe$3r_T-r#Kj-&bB>LS1pWAN`;vBN*-M*| z!L@&K@qff?)1+()7t8eke#&>rgq?@h8U$SP1R3xa=JXG>!VyXj`%SA zMA##1rd%&w-t+3)qa#SbroErtv!}kkh{uv&Ibkr4^K&~_5LjL|`<26MTE?w`ojAC4 ztr;UA5D^oTJRl7kcDMjh>UvL}!2;Dx*Az6Uh=i8-{t2$THTA^tNwn+Gq+I7qr5l0A zGf>L>(&R(voLqPg0;y3RDc;%bIR{C)0((0w)h_3l8BwVffOrK2Q}%%W>guYWV{&Sw zx_T^WR!J_Q3q(gZ=*0pF^k+ToXryTK_rFq2`!c+|C;n?lL2-Hsaq%l)js-b7A9^X6 z`Rw1HzN#~V{Ae+nNyIUM%JjRNszZ@fFx>?25FRSh&Tyn5Ec#P8Zhx(EdTyk|E;5n{ zJiG{4xZ2lK?oJ#hCNS|=J-i`D`gXX@l!v#=^RT=3G{=V*780cCFI+ovW&>qpr ztN&i87dtk(r3Vg`1S4wUuCx4@uj5D*Lo5X!Z+1-yGY}kY7CI9b*<&<-px3}9N^>A+ z2Njb{-YgKuZ2m|$h!U~`$!;lyb9R&Zm`B*kcnrGTc-%u$pXYuSIf9MFwif$y?o-2- zcGRoMBZ76zu{ZAOTCv%0rP4o;S0T^Q^hcN|`YBIqcn%pqqH<3m22D8CfFcAJDSF~pxbbSV!gSG7#;oef zXXiGuXEgOh_a0_t5Q)Xd+Arp3vIZ8B#pD{x0>&4|+RqB%%lv}iJyC{H#9EMY78ofz z+$gZ7@~?YG`P&%chNmL<(`T)Fflp6JHMWC$hiC`$Y%X+W|^wx4Jz+zYMfk{@KOXaSZA732Yo>g!_%>W zY^wd`(m5fAsZ#~;;L~hCWv3+j45{F&V)u&if1D1o<(gnBL=BH?-DT=VK7>rr5SxVE zeRnq{7ao&vM&rp&i(a|In-L(Z>+@Y%8{vQbBq$SuQRh0xNZk=skTCo7wbtjg;bAkX z`oY)G!(*P5L;uZ9pyWb$J7@uYRYJ67>$B{c` zuCJ%ZGu;~$CFAN^hoq+$IBTaZJ)p%KoGG1a_9zwqa#($QKkMQ;CfLM3h%=0Y_dk-o z8__(K7XQfpI4=UP{%1Q}3;+Lpuw)xtx!CRph06{3fkGCgC$00X(DElTX=ziiQAd;RR6jT`{W)Gz7`qWbYy)m%F-DA&?*S zVr<9;hPW%Y-=tSspUsVvK9U2J^O|eV$nafUTug0j_?&aTd`ZTXTc4gkGBp+QrUmRd z%a9h`YG#N|lNSx*=@-tiMk^u`Nbk#1dM7SEWv}6TQT#fpa0&|zr74;(=T`N&pjqA~BqPDPz=;v3PPRb$^d2<~T(I7qtFM^i$9SewL0u304sNOxV8KU$5X^%S zyWLdUHkCC=Q}FFJ+c}0S+_wvRaX(!pC$Lu3IEt7hN=3TC%7+LVfN+XZS$-s#G{Uz5 zzkLM#%M{!7EyExNNZ9KF;?&o+S2|NIU$+B zzCI2-JbqTSfpW)hi(-ugc9tbjz@Q7VV?kUs$sKYR&;^Lk>l6kjF;Ov!%A;~)3ESnMSB$E@3}M!+d}L!#UR#(wf0^fqeE6 zgiLEL0xqTPyh4ueOT<;kV3Pw5H$^%rv z5LiqAd0&ga0*U8?ww%It^OC+?^c1!!!o?|^o<^+Xx^T?eN1BK8Dv`)nf50_kpS1s7 zOw;Bdg3z2N6%2?u%|w=4cV~N!ntc(?n2z}{w3t?4`Durd0Wuw+wr?0vcj0qN8SHFt zE49D@UCHSSX^td4!FwhE)D0D^{ThHWMZM@&z4*GHwWnjAr3J zWDYv~-saL>pt`dn=-UQQw zgp~mQ@J;)Lp&5T4r`~=ML74mA##Y_p@Ja^L5NYjwbCj~PW3B5v0tp31pf2-%l zjexKA5<>cEM43KBw)K|M+}v-1;LJosN;(NFBXEx+nf0THXqM5J4W%>YZ^ly00$<$N zHf~V-u29*QIMA|Ja#TL(fG{0cTw2JZk0K(yCu}(Po2z*qi+`vC3@4Qwtg^ZyOIqsX zNU_`#fW#Py>9&!-HV<`p>!?}k$iB9%G{htVCSX_k=R2VXUd!x09o+-d^>pA8M-5H0 zL&eK&S=(g!g)@RQqBfuXx9~8E4dkqi*oOII^T^aQ5eRg%t61 zQXoCY#wM3)eC8S55MK)bJya8O)TNmJ1e_s*`y9INO%aT@Zwd<^$sT`uV%}yuiwn~% zZC=@D-*=g(;607>cpBPTQZAN&q8#V9IGL1XYjo7`1*ERHH4>Ft>{92q4is~9Y6i*K zFAMPyRt5Y|qpNKxJ>tITh6YoSj_$5@`$|tjGUYm#?;lW zK1<_;@z8ZWRBNgG@Qz7>>+&pnluylGRsPj}*W3FA-;((51n}-50p;GAfg+qY3}ta)la^79oY+I%3s;3mNN9S zNH1g3@0Pm*R`~S?1PxxjcH4c1WR`k0T+8YDm3=!yFCFnmk?J0pM5>*`jKhsyG%~hp zT5RT?%ysJ~kZ|RAkW-jJ_z`ggZ1_9!v^vdFou;m4rQ4@YI+wh&)u92fo%eM9|$(p zNN3D0z=iBVe2M1WGw)k0M^Ih-zn9`cSF|2R`zwq_4%If{&0+(fT+Nzg8Ga4i@Kr3u z&XkG1(0Uo;^2K$%ipi7ZzXu97$q~LAKveBmKD+#uX6~Avs53??t~wXdf1~(cNiW;j zNXXVw(rZGbGY7}ochf>LI=h9(x$ za!qIdm0UO`IMiYc5$XK=*wFT_DecX2Y@1r^6d+>Grf>&uES?vk_g8MXpqYHUTmYUz|1$8d=`m&R7qqS*G6R=OTg#mHfqhg$Xa)4r$p z2B{Vy;$yLa?F})WJn}TbI@Ex>SbUrC-i85f*ZXrQ?OAGq@p&LoMv^`~N2J(Wc?7h4 zYbuXt8nX`2^X+??1k;2laSp}S`{lrh2)getM{+{d0eYFETHd_cY~VC7!c`*P9zj{G z!tH%a@$BFOA4dQF{re-{667w@K0TK&j1v?+kQ;K!!swo5by&2283GuVf9;6m>WIGu z*kpq6t{Tn%+8V#gY+CG0z z-5`bogT|>XBbtW4&_(;L&xRFP`soaU*6riababsenv(=FkM{jd!8@IZi|B^?IyTWk zp4HO?PGpkGqa{>je|LOplH7gSz=qajG@ET2FgqFkbM(*FdvA_!f+y5I;Oy4!PSPX_zyTD25#4!wJF5t-XeWQda=J0$X6MfLKQ6>&Bd(IEnVDtmnatKWrdbHu&ignyJbY8S6Kpvo%-Q{t z1uq4Xu4H3yo1+<1JEwudXddnDAXYidT&s0x54s-=?x(73zxZ%(F79`okM5gNjCpeH z7bCiNvQNTeoM~bE4LUVGP=`uO;K`aRg#L#VPb&a4!z`=9-u2w$h3cJtz>E26- zV&Ql+Q!w>oy0%BYHIH@Enh#^d*N5z@mB}zr@XMx-wJa*uJhyMpTw!MB-QHTa3m;~B zS4%U#G4l)bS^q4+fQ~3a5;>*uUH?w;AQ1`!m4G1J*c5 zqS5O30U2PSVSpfh7I%VSSChDp|HM3MCiSx#OETy7K{KOz+wPrUUXE^eR9JmE0nO8W z(fDZ=vNL1?%R9-(JpEDZwEWk5af$F_V(n zHS_P5KIVz}rjtRyf4$r%9ZYXLPS8m88Mf|iq%0R9@Tj4fO{dpb`9pfFGP$VtKzq5o zLOyD&dM?^(R zp5;n=&8icN%g62u-}Hq4`c>Z3g{ENOh(eO+OqY>pg$!wI%wxkna63x-E%Pu zik=_dNv;aQ)QcyGn-s1V*SeH=chx?_lVGc`T+l`O5^ zaZ73M=j8rY#D`cP(S~-+Hp9I#L(S zctL74W8&JzvW%*aAal|r9F3I(y~)4sAl@<>WD`64e*GwP1tajuvHLJNP5s*w4t!rHy`EBmlqc+18 zj15`s4$hGojbWV4%%BYh{nOjdu)MrXpOQh#UGHmN2EnZ*%W$cbDi=oKgq@J}Pth~4 zK))n`7eWYU#l5h{qSPI_;_-(vGH#@k>s!Xt*x?eKFohFdRxH-jbFN=Q^a>1_#t=M7 z@ppJ)f*4X(&o;!cvOHhK#3m>g3fg|LY>N2z)ms+8iyfOd=6?OwE%N(O43=fw6tK9s zM>q0O*T_2%h_Y!^}uo)5r%&)DacwUR~?&-Radfr z0O39Q3~ppazgKzoEa4SAAq&iwo}L@ubFy6y3t9A_bD^8T4X?nVsZXcu1IMF09Q%`p zx~Bd~9v;@UvjhdWv~$5{wS6A1{X?zJ+-HO#CrXoZQ=?7w`<+pSZU+N%U5qm1vmM=K zs0S|)Kib1K$izuNf_V~dVT{u7d?5<%` zDVh?+nwNK7PFIwW%N+ZlRc#ajUl~Cre+Dxu!45sKOcMhW@$vgT2b8h#qDw!9W?z_- zHN%7ea$~BQAhii*zYSZL!Mk$o?(dV$fvhzS!5(WDrs6>|4Wzh11G2O4oHUOIQI+ly zEt!~qrEZY(_^qH(?+e$uf7JSPYEPZYit=_yn7u+gZITc8Z0+Jn7<0F>$2X_oi1zKe z6y2Q;@93Z^4h}-mGs@SPBkG=E1PgM|v>jc4tAip-nZg_Of7hXysWNbqc&dnkyM^P_ z0$uorc{up5u}j$m9_>6Vb$xT>?UR_J!GK}*1*~sCDq~%~8K}R8opygRW{OgfVmCk2 zxIgcl^vc~V{rWX*_m&ABWY*p3*oaQS40)3<5KLBPx5st07=yH@c7CP1Wn`igl!N3} z`P&lnr|aDMg#*!AvvQDFp*otxojbM1GhIHLRiBl?Wp~(_TKq(K+&6#!p0DubwQPjm z%Id1iOpuRIOkY=Zy(B%f63H_ zgrN`H%Wa%p4&3d&Gu-JP?lBoxNExN>+4$z>^K?E8w8E5SbXPAm|C`(FAG*|J+uI(^ z7Kcd)v4OgROImKSp`4c!TT7-|V~GU9mY+|97qDf+XFXkEwYC6m{CnWXr(Tc49J|&h`FmgCkZV$26Sr0-;F5Y<``&apqx-%2re|v_ zE8p>uXOZ1sZhV2W5{xEe<>ci2G)qx2r9U@a8k^}wn;P`#b0%BorUHYyp=eo~^Itn+ zGH#qIrR^FhCw=x(=gue3gA4Jf2q|FwuojXgK|X#`Q3k?KzAl=EH#_h?zdefBr@yw+ zc8(>;fIW!w5mU*=`f}xAtyF$sbt_!(G9O;sIWtZ4X$$lowc4BMJ8ko8;-f5W>UVGD z$$XV%H@SAx@h(hSq=#ed^!%Zs+bX>69Yu}s9XC?Ay-T1V2Q4YY#BE#W9mNaO+ndCF zB^Ro7wkVT;@MP29eK1JMLu>K3o1tQ#y1aa1rfu=8zN4ESY4Wt#}{LlWlojAz`V>91r>G6o#rY*~8KZL%hzAMt_$D zZ}d>TJhBWt#XyaDnruc8weZ$lIOJkEQel0j1`m=Y+|w=iL}(|`)WI}1>Pd+qxg%a? zilIz#H@taD;`_m|(c>kGiO1Q;3K4mVn{RG^A@dVMvI{l;8U{{?-_%?ib}wFBxp?8= zpa|j>2T{~eEm>p+)cXW z5mLNm9^S5aW+KEMgoa!jH+M*$u9@Az8$!Ciwq*tdNahbBZzRY7)N!ziPx4IY%@fmZE-zdHS$TzjoZ<0>(f0K z$tBv(kzE?`?YW2HB_jOu$M(#IZ?=lluhF#;k3a*u19W(gjyb|v z?w!3{T3#|G*g&~yJSO!l72qs!EN{!e&<_%?Z=JVS4|Xv{yquvlwf1eW=A(_AmX|{Nv_TrQoqEKmJDEJO>GXA6pwX0&9!kVm2 zs{Ejd6%tFI-#Hc{=JV7^xl%c`8P}Xb%dq+S$}LVx#X&=&`XTq@=H^JN4=Jg%B|Y1b zty71qIeHOCxF7P@#EFF=Sofh#SCS@dvB90xXGZ}D5(nX{UyuCPa$-X8qoZ0#yvY3p zx;ZGHAz691&sl<7f;d?7IP-i1oUeGCM9<2WJBkxTePp7}^?$WR1KBe7CXo2{ZF$#G zp>hYzwyyFjCV4j;>H?N&PNtR)qZB9pT!zJKp}F>q;!Uq+$kOLN<@j-fAJP(i*gQGamXnCI<&HT>lse;;@e6Ln-hM zuN?}VltFr;KaP^Lytb4y7xe$R8eIF!7el@BjAsk!@VckipYgyFf;rDDeMn2V$Pa{e z0^(7~2jpst=~G^Z!JZz)Q`Y+zoMWdFnA>ZyP?aY>f3N*1_IOk+h`XZI=qL&MAR;59 z+Vp1Pa2LBRc%)MixJz(geXzL96&gB1q-^dMshzQT^yv`FeCB+L4goX?O6vDWgJMI{ zJrC;N#lR@mmgv7{Fob14%`9~NGq4t~efWVuVCpbho+ifxScCMqB8tIjqIn7Gm74)g zJLgIw=b@qZcMD5?jtiZxN)S~tcfYgFfHQ=5m27%EO%P{p*N+zplxDM4M5kp=#-eZfPTI3f{xf+=wJuBY z$1EudB$7y0)sP8uT3ctw#l;0Sozq-OSwDTqSEKTXOHSs9N1A{igww-5C7EjQLW&emv3`M48Y@8|U;|e8=lqrbs?MFSX41~a=b@_M6nf#>3UbNsMAj?->o!kNN zq-d8;=2TSZp3K1nOkAlt&>%8}^0OBI_Uqf90pZAD>~`V%_wR|{S^xvi))32-9{FSe zj=+^oV&Ud*1plWax8Qd{B9M%wF3bGPUk(E}T8u%sfkY5hPq)nfE!$%B&iiLsk;$UV zezzY7t|5I`p^XQ86D9s+?xOYV`l~k66$_wpyNlI>cn~w0+O~QRqWNNE;SX+0kvyPs znqG)Q0+J2jB7GRJ_V|y=7D+c^4#VX9qwWUYO3+g>EI;n|>$rth36GuUBT!Om%myygR&r}F2w_&L>h3NBf?7e?UTSJ8 z1OnC!+seUKFOYzf6OZ*HFD?)Y?x4IIz0ud)Y7t;o%J{?5kRoEhCV1TbXx0xAtYd^g zW-^vST5xp*1@;gK{rH7BTG_OAQ+(0ezyE|DG;+^uRmR5(_|U~Rw;G-AF2GuK2WI(N zaGoDEjsXUT)8Kl`h0=px1G~7toq{?F!jurP{b5@?2*^HbiY_fEXa$HLsHWHzEFd-h z#}Ep(8;I5Qhk#B1j9#FCLtCei&}_j9}F17#Wc@nbD*T5LX*hC90>+ z?mA{J%YN6p`9(0SX-(Ei?Xusd>o{3~iuzv^yh29}xu8LvF6%2qV-G0fwPkgxwq7TK zUSef@MzbG(z6OlnOMJ*m^^^nl1LsK$X1I~V`}~_S?U+Fcj#($kH z8yg#>6cox}dV?)_z=U~URwkC4m#188kR#+;@zbij$HqKo7*NA#s67NkL9)@P7tHT5 zcyzJ;KIJ46np=2#0~(-CVD>9L-t)afL(#`07(LB_;2OK7S%N6_OiO!9u z3rXE&@**Z>#f1N3U6Iu88R5DobS^C|;6~|n!~lS-bdU|2pwzUyY7&0jMKtZP`u=Oh z91eR3_2%E8AuI({;Ltfx5yZvWc@QsDEAO$IQbJI507zOT>m}WK&rBYi5k|3hFn~PC zJf9a-GcYG2(@BMD?r)6!Kd*t+b6 zg;m3npQe^dm%-jf&b%|JA9&o`~H_; zE|k&i1`jJ}U6q_G#>H+egIru(CyU|GFe&!QWX$@yT?}Ew^kw!ZAge{9!xL)W%zz1; zILc3&IlXTCwO&S;_)_%D*m4;3+vwLbX9@#&7XNrED@8v;LR3ER9YnqF)J9R7JYzgQ zAprdNC7~-nX0>?>#I4vlI1skb+@j}ag~-QKL&VZfoo;;W<%#r#!04`rA<*H6LQE*A ziTz($OP%=ivSvPU;3?pK2!9-J&6`&S1X)wf`QJzC69_c%B`gdfQ((CqeIy+Ix&{qa zfOimiF0nDFeAcHbwmIm+_K=Sb{DFxaVnC8JObX!;<^)+gZRNVBi;kI^IP|yTVn;PJ zMqLpM?6dwik3V*k5hScwwdG32gqn3lYqk)?zy*Xzb9gRm9N3-NF;!01COsj~&-f2C zHl&rGB!#xs6cn%sH9zOVp6=RAqrh%$0I`$(V=5fkL;^)SJ~l=e+{#&X%TR~`IJdaS zhV83CYM@eNgh63ws|DCoeYEU}^3ij1pq#6#=|R_kLY5f{0X7|aoAr~I$Wjp|(49%5 zW?Vw@?RCy;c(Q}e-4~zyp60@@Ie4kQz4WjS-w~zr3lS~$V}l^nG~b5Z8pKx@SuOJr z!L_G}y~r-Jn`Vjs-&g>Mma9NGK67R$u<=v@`s_J*O5H!Mz&#{!>y{2yC2kuGnsAHA ze|-n##H>yrcifbV|ICtqP~q;VeE45fGdKnf3shL>{kD~|LG0#{SJ~?H^q5Hv5_;~( z%Lyi)C4|=GkPB_F_h~+c-lhZJP7VP*s6BnHju>WG$pKmmFb@hkUz-ta)68*fNda`F9{b30JIS;#qNBp&`(@@a!vEW zgDXjjBqz2dfVz-WBfIiQaq8HQ8jaxyVF5pH?CNxX{50PPVgUe+RU|BA9Qlz7Z{JE% zmD-P>{S-RSOhm%<+4GO(!^6ekvB;s5AbNbODdnujOkDwze;^7FS^7IeS4I%Nx;5{G zUxF~ck>9_Cw`~jK-pAnTr=TN3OhBBdWy-NW8XmTDe%YR{xi$Q?B_=b@$dfX>`2@&s z>=uFm@+$zvosdTMaYRSoiD5e_2m!4ut!MZv8r&{ZoAe%g>N4*K){N1+@S*P7+|d7f z+8X#58_YW6b7n;SeO-<^7D}Pe^^DVImkUug_X&HfN{tuLZNXM=35P*$2n*}?m&jPn zT4k=(e2R-(EEneHRxUpW+pt}df>VNtn4A_H8*8}(eTT+4;ejB*a3)r|olkgBxsdko z7z>Aos5LsZfs=RnY8rn?6w9G4$>x4!il6+0%B=yRuu~T}73hC!LliWpnf3o5?~oTB zbbKG^>|yG2|GV+Ph`A?b-2N?M)THw_C!F!zuQ-JK5SQ{?04hHQ{U3D5<--9N*GK1Z zM&EKcI-jDb8M=Q!`*pZadCxGgsn4!lT)h z9O}%ZQhar12Gip~NX8fK^9e1%_u7noR^|?U*Iot{j}k`?+;T7hK@g8tN$LO+Vv16+ zt2PF_Uic6o1g=r|^pij$-n|PP-3aNliW>+AiiXX56KMh1>JlzodipQH((DdM3SqD31^z8V&=9@*PGJFM z41uw&nhLVC-@)6v3tIm^IM27daLE~lajUnVKl)XD{qENwykRj;7Dbez07*Y_r64uz z5zA?b!oLbIw-)#tyRx`ezP5ZXwK!C+Y-j%>Xx!%hV+}fL_B(`+i^%Gy>(w;0K6d*3 zNqCscn@5JG@*>F2c_X$?6@;l;k$k4ro6rg4zOByB0|oUA5||*&nJ3M1&z58&{*B*8 z?gxNhu>l33XD=LopTY!VO>SVgi4G)Ega9Q2bWi|@F9dxzVDqt`#AT0$j4Tj9TC-Br zfkzDj>~%;TZapP@rFmQR-o1sn`qu!B1z(bh)|rY}HYA{%e95FSc+D-5WJF5JCvBQE z*o-F;8Csvcup6V&k6_64R~ou>6qmh8e6O8$BKjWH(5@?mlqH0t+ET9JZa{{yC?sa# z@fvhGd<*DSt&taaJUio&S~Wk9{Ri zF>Miu_M}`ShV5@uWtV@w^3Cw$-XyJ)qK|`o(Px8Jc)p3HA)}6~mC(%0j?&eu>|fiP z+f~EHgz0Wyv;FboM~jP31>M!F_@HSbJ8!kr=C)gvTlA-h57|jVAkoW1h;bQTyXN`>QX zR^_D2y18XYXloWCWkLk<)G4KHtn4n8!kp5V$=xLae8CG=_T5LenU?oi7a~;HXX3s; zvJNAbwRypQ5_#+7kzaF(RC|wkt?Y@K=09N}0kWcAS2KgUt8S@)(Qr?7V`#z&mFS^H zrQv2Xm=bj|<&nGjIL=<0g}2b~Avc|#j$!At%ELuq&=#zYex&x={FxEGs7gdF1O+c zfCLy9Uj_<;z?%N6p}k#hUuxd=kKC!ZKA+mp>1}2L!X+yDp!%Vz&ui!oY0b%8GJGWwnjUFASDSoGUS#K*^5-1-D|V*`^P6d!aYIWSOW9}-GK zhM(Qyl9ap#^aES>p}3%^=$@Jysg;%0tGI@YN<*Pb!0~r+ z>)`&bmk4MvU}v?n5Y8lD_P-^=2e97)uxOQ(m9JdAdOaW0Ov-@id?*bl5?&@9pOC^J zuLf12`G$*w(aG&#B`eLELFT8>qc-n-zx`7g5lx7{XKV>w~FB}JAFz6|S z112RU^}xQgzMeTx>+{v1G=oC=cq)j})i#^wDFZg?x8ITjgRf$WWI+PYO3l&yq1dMA zx6%cPDU5O`m1I>m6f1LyU@%@jZeM*}P*B4)jX3zO-6F6J zFYU*x+2i(>wX>lNSBeb;$2!8jp+3`-TSu2>%1h`zR_)ZL z2S5XK`_%C&Jhb)uyr^;=-g)x{Kk$-KdJ)|8D~RnUaRzeK(9z%v?=x9pII#Z!i8P2~ z`d(6^Vr0ZzQBkq*N|yG@6+A`kYMl`+en3P7DR3k{d;a`OQ4!_%_&9hLY-kfZS2DZ9 z@PiQ;m*CyN&;)Y#pShVPMx3{=@1s3W3_ojX{?(qE zJ{{0ea6mv=$mYYj_cqPI7XXC& zZ4xwAi<%l&psb>ey4`tRK4u=Hx{Z7N!LmNvVr~~Gn+N|FX@40M*YmxBgM&K*!5sp@ zEd+u)2}uaSAvgq=;BJEji699Q+}$;}TOdeq9|-R5GTVHx=Lr#)I{_{ z=j`G7py0(^*%`PvR~U=;Dp;jGotftTiUy%Sz4NAH{B#GF$-UI95TvV%f)QvxrII`Q$cgu#+Ve6mjw+5ktoL9KKmUTewKAP| zhv|xdc))NeJ?v;lt1FN|H@FB8>7Y3@G&G%VU4{=kMmg07Tjc|jKDiD%PaTvZ>`d+b zw{!W|$k1mI7%ZM^-OYkG9ibm+s_H)ZGxlgnB7%AEJ=pfVOB6vwMgX@u>6rw@ucR!$nf%$Q9|QqMqSU0ArePX&#oZ6yDUqeDMoo>SA@Wz1FMU=Nn4LU&FzH%)2!JY z^FN;$Q9oyaT67=Kh1b$n=5#0>D()qA=EGa)ba)f1&KT8h!E}}W;GdpJ+kNOfW3L^0 zwHzR0e8{38QT*J`RlW9Ic=GSiUxuCHy-}JnYeMf>FGCwpi->_P0uV9y)2EE8Dm6E6 z>zW3*6w8GO`9ppd^BvuFzVgHg@le2WP=JflW0EzXf98MRxb9@co{|)h8q!UI% z>>V6v{yt;%_%BHX2D~*5k93ET4RdJe4@NAb4KbHpWgb|}8xe9EF1+v4Y9u5iS7)Cd z$i6zqm4`{!xPV_YQRo2|Jz)fCvgkobA}RPALn*R~ir+Z>%45Yreh=6jTb$NC?fdsY zfN70Csh$H*`wp|(*WNHt5oD%e%6Ns0Baco@p#7S|E2^Yd`d;R}!jct5%RWi+g&bu_q|FZ-a|Nnd8 zsa&ddz3QaA{rIFNVmGZ?kg_y`=M^G=0&hyH59ADXg=J^eXn#Lb4Dq5h@p#_~_cmX9 zgYR#hPR~E$dCkbirak9ZduGwtWpgt#2`H&m2Jy^fit_>%u4f)8@4*CrGVA|=!i zYQ(zHkqu81Z+@Up=d)p_xkbMu6#pnYEv>CcGug`4JWHM)@-u2ku+#qjlz~TvR{HNm z0UU^!rtiYxpDI0tk9Zi6is+YiN`DuP#Y=ds-@eTsup%qfpV<4SzQAn z-(CM{Xqz-(wUOD=g=>`|>wo$%%;g;Df6JJ1r98ip1@$Kpb9KMq3$p|74CmIC25)PqA@fxq&cav`p)14XL{Wf&u^6YyfKFvq#CS7o&()nXB`Y6sb zk$uU}@$f@wL>J-cCZ%e|k$xZEECH4xz+{-OtU-xO%lf`c!g8lC@? zJX5q#IZ`VrK1W(og0}V}NuBddQ?sof;>c0A3SnPh9G4Kv!|4zK4 z&3smU!nCeM=Scd70mHe)}0)Pt2DiV8GNanj*?#pQmd^k z4=x1HX03}9oxKxcIlNakE3e$`ZDsHk0yDJ5p0(mgC>8i$j?ye>6LI}N^mef?X=;}k>B>*!O5#Cd&n6J>P6 z+t#4;*7KdDp~nnWDdh4MwhdcB%_}oy;gW9yM3un4E$;n1;)|uV+3?mks#^nXVD;U zcVd+A6Cx5xjW)fHabifn0n-Q~k-#1O#`UdlaOj0g4E{$D_o4;+w@jh}cnMCPsnvX# zknSh0Q&}Yo-18^@#=2!}Fw^w}erT-5e_2q2x*>eQXbZySMB>6`W1XQFS|Qyg;0m~(s{ov2N`&gj-8phM;B0uuFP)tusxH% z3+^U!h$fcW;TLkfxHe4_Gd<|;>cP?zf34(ybp`~LH3uG0w{f}8hrCwfZgYnDJgR3F zUl(h639_=qFPOBZEjw3+i>0r&=qm0ON-kfJJ8a!SA2V^{MlXw0r&T$byfq2+0U34n zfv;iq5;rD<@ws2RCeO>F`AcbX)+We_tccIk_R8r^RQarJG97fs*Lded9rm6He_z0; z@SQwXhP!A^rx8fLv_y;Qlvp`U%$nD&MW8_RvQodGL=e$(F%+!)pm!G>e^8PD!+)w< zV-&TeY;ib1gUpv81aieZE5xwE>gs)miW6u9ctzfX0*>T&Bg6Y+0F|Ns_O1|r&?OyD z6V&*Sq%6M~y$&aqC|^Z+AmjLJ__1Dxu}w1F3ItPuQ2@2c(>PR$VCn+{iPtqJG8&a`4nsPxQ9PFSpB=Klwc zlnl9eekVw&JNv+}*f={!N$kW6sc8p5;l6b58c}qb@vncfb|t>8yWh5XYIhqfaaVX% zPzjjmRu#$2x4BmChOh2-7h=9o1gCPGZ)BRclhjYdNL{oP1aqY*yE!-y^P zUN4>rqQwCb8s?v;7u`1Y_t5ybxX<!$-itf-s>WniD&e@MfIuJalZAaBvx5)tIPcGl-pIT zG&w1V=Ylk&p@9-V2}S=MhF|j`^DX>5lHf-iZi%#HzPSg_&E@^HyU{tF_o?Hpx^}qx zFJhy!F<78ZNr+BP$1^1a1y9R08MTN9K@xm%^&{MOv1K;R4)RnU-?vk`WIgloSM~^$ z*+Q6%_Y7O|bpgIJcPp{?Ih~Bm8+N}0U#y{-y{N*O#&|klHXpl)_;@c-jcaKx6%Lr2 zz^5>xB_s${evA>Oh|#i>jQ9<8wC`ySCj0)5YA}2SE4!hUyY@cWTv2kiB4X+AS;y5W zR5E_6&QzN6tYpeDZBI0yYL6yN@g0V!!Dm!|G~cRvWVqiI7D(UpWTN|OACUxXC6}M) z+Sw}wg;*}6*GWQzAZM62iDSf8Vv>WR@!SxhKZ&|pb%9{-l8w9U&KV@|IlgFt7T|=q zNNz&;z3J!P2jl6!xXqT%$Qho~GJmOCpZo9p^upF~A`sMO?c~zyF@@w6C z3#@nRGxndKzOOCb%rZ68oj1BSwQA7J`H|9m!waiTCfd~s7 zu(qM-NzK6k9ax4M|MW#2-PCZSjOLx>%oz#B;f2_^s_-tV>8n8#VCT{+ayAh4l?{&| z1aw3PPgzyj0YMp+nEV-pqaY7`6d8vP>5wQI1bbOw|F%WI&KJd63al3p2-|d&oR5z- zUs+ft^eeMw`KQyfXX-V}OB1)#7C1F~sRzTQp;ey^NeJo<@IM7Trj@IghqAK}WQGd%iL)lq z{*_RJ`?qeCNC{?r39o#10T!~S;@+<~k(vq%AZlJV}FBEq}vm_5X6n(7*kJl>g z^|WqJ5A4gW&e)rp4!JnJSIRJP_rl8iFfY;2qg#>_e|(WP>7jonPJ`zvAx(p;L?`O# z|A14U6n~uC$2kUe zG3*)78BANcur~aFF#O0`Lz57Lhqp8}QNPgoOh7`LgUVjfMH~(I>0-M~J~LcW?|$B$eRdZc}~V zpP}}$BDKS|tVrXzMtg-6124Rfv(?hS7P0WQ32__UtE;WrsR8ea>q#}b_B!b~qX^%l zELuvOgWARSynDl+?{}ebOUG*im&*f+5dV({EnJ3Qwm3;rg~KHWtuC|MItIGaE)+I{ z?l7Q>mQQLL%nRxw$PJZHuWy#+!tt7ePJy>WD5!cLp)zLJbtHZupk6o>W2Pqs@1^Tj z;*ji#{^#^{cb+g0d+^oa#Y>fNl7!lwzPCz^I#0Ab@hSN8+lS<*Tg~Ru=zGy2UMZ3h zx5q(zNZ;2WKNuYE#cNKH==WAzbe{2A?^ID=tzoQf4E*u7H4hQYcIFmWVpAd|x-=NN zL3x#`w{cM94jIiTiB$KfSB}7n42X<`Hn@G3tLR2=bNrB>IR9*wc6YY5XwsKir1~rx zKShjbY@^DlO8u|h#@IWG4~IubD#$pALCDip+;7?(bFMEuqP!$Xq-6t@Z7YmHzaPoJ z#P1&%(4gCQ42?VI;i#JOerd!zL?=OScy``V2KW0$-zSghm? zOLXJe^CV09NDX1)zGQ*ON2ay4waZc#OY&Wz*=pCKQUtV*?*H28-%JRjYrU782YUzO zU%$Azx`aKmpf_G+-Tir0nM_Fj)d3QHA<#kwT6gJOHB%{3tHyFL1&2W;{i-NJHd!xs z=b&uaD5qpRj3rHvF4U)$eQ1Q5Z1TjGQvd4RWKetzA0N?de6j|iPHBJLw>L%n526}fqc4kIF^TbOw|{bDfg5oCK0 z?VmL(L+!9~cFH`4+WK$nyYH$`P_lAco|S6WGl`48ey;n*fm=K>)D-Vkuf9G{@|{<+ z+vdj+)dKvFzS)18-iB67njw2QabOG#AXRA-xP506HfWQ$;uqyfvN;bj+R+(U3L5FZ zFCyh?qeEPveK+tVp`e;v{#!7d>8e4}g6OsWN-d5}bI=TRJX$#Fl+?^p1c~Je*Uu`S z7k8??emz}(ls0`o!}4vSm3yZD>BtmSLH*UC)f7I9`$5O3mO)PzQL0q0_dzG@tq1i0 z*gfH6Vd2Qo0M$l`8TtGWm1j=Qw@H>qH_)h2K0b#T(+)CI46Nz;EYB`vHgeMI{p7#}x>ORd1rk^x>Ass@aCo zJmbpY0W|(!DjO_Be$MUkJkNJ?Tsm~5E8rEigzDMHa-z^kTcSiEf)tU>!#$;&rN6Z_ z`w7Puw>OG6PnUE*oM z`i2c7hak?L&+LQF^@h!4zJ2NHS8X$g56XeZ$4=E?q0cNq6bI1CY-jlVg9*Gk(+GP+ z(qrGV-#WqX5%Qh)dL_8Tg?9z`x0F`h=2&eTeHx&zNO#ZbU~%cMtHv)CKw!{bDEM zwivA%uW=Dh7Ub2-3TNx=hP+9AhDEx`aDPd5d2! z`U(ymToRJKvBf+(lB+J|qD}qvUgUbmPS~;Tx{(*zjU`6NC;M~(Sp2v(cI^H#h9NkW z{=PS)7j}h~%VGZK<`PzCiE}e&Rd9~sKV{$}ookFfd-cO@4RyEKIrW{#^6r$`EK0CG znk>-=XlnnsDU0fL!Z}3PgPn*Wz)SJh2Od^F4yyEu#*WF0d#Yyr{fr->)a%IkTRxkO z{~Eg(nZ5U|_Ivn~>|DcSrIq2xAqrUxCGMHsC2#B8)InETn~I_a;p}_(j_YjCbFA3CZUo zQh;2@vfO2J2}#4-zu0eTQmS#XgwUt?5k&bBL9mac_;InO-8CoDn)y$Kf%26igsi3+ zhl}DSUbBUbnAmU&3Nz0}r{6{A38{kD@Z@IV2$gnh$wR%M`f6OHwRK(J7eNH)Ww}pg z(+)2pin?5GiyF$7>-umXOYJjgMv({hkTX+J^ z?DeZ54pG)=-p!_1j2nse6A+@x-_dQadTY$UAmnoBucx9OrU*c-X}l2XSL#my%_u-6 z1@XSi+uXt}(lQ6T#lYZ7=jUXS)3|FyhjwHHVc4k?lRUP7mxZzN$R1!R8IR@;j;0yh z+6V945t`J?Tnp|~ioMeCjU$u1(mRfWK<(|-4Y=el430KM_9g4K>a%w05K`bazexul zJoHdFuRI!g^gpSP|C_)entRvLu9ncxR{mfoLFwnT+oKSViFtyu_115lA40!!=|~Qx3pO-HV&>Kj05$fGaj?}V5PNOX zxD@>56C+k*0aSv@+MbGk;Z-K0cB^a1kcXNKLFl#DppwQ}O1|0p(7<#nO$4@;?w@}fh9k2-h6l5 z=LQS@cO-cNV|iD!)dG#A*QkT7m{{XBg#$9K(rcERxA8BB<65?Y>vE`*P*yFi(gB?jL)e}sU^`zW0km$_tTOAj|33V* zhIYPan$7UR@M~cRny;Sq$IEoT`XGnBk?|MF;q>fXO4JzU9rplHNBXy;& zRkQ|1?8nLXuY=u_G&jjsL;WI^q~Ot=(dQ@lmTNu``U-?UgOwyWb|kv<@4*oksDg3u zyztw4!;5M7JB1p_!C&cVGZu;Q8L=((+2hOFIKIH8`H&SNKAxN2w_8qS?W_E;Sx9L^ zcWysVCpLr4B{9kEqooSBzKkUCj4f;5Ta*+b71xqSS1gfPhlO~1BE3gbt$rwzfA~E# z^tDb;#Kaxh7=s!mo|?XbZ8B!5{EQ1h361FZ^|v>9A}#Y6+xF_%kX($HFasnY*9vRT z3w*lUt5&}unmbR`JYN77`@`JgSmMVQi`1u9XHZ4CkJgn=JkJ*hzDlK|A*y^5Y}qRw z*ST^CS9mw^trAV-l^rMG(!p+rkIjx@h&7FgAcmK8;R{6;b2d4{->VRU)RGRU-DX;U ztJH-2hWomUh9y{dZcM*1w{JZZsl;?Lyz?-3?_4Eud*7u8`QZILhGaQ2&t!(@@K_!vb zkC6$atMUr}QFa6d{T-U4(h#(xf6R%ive1a)e{9RaCS5&5=MJR|E5vrq>-uaMyy-FjhdHpF+7#Eql2luT z(dgu42gdVLl+nOhUi1W*l!1Nzn5Yls5o&N|>;FF`JC5&$o+|JB)?Rq-e-|``{A^ss zOIRE$#8qQavUkgq6zt_YlA4AK3|72FZZFAqhg3S8?{FhV7MjbRzqUJ1alep&s>ZcE z$>a1bnz;>~subI&^eUm2dKHW>?j8JiL+wIZDB;t=Gpu-4c*kx7{;poF8*}hU;qQXW)d7Fn~{$&~H^u6!C1JPB4-h!n%1n zkydK>TM-5Xvl^&}<8_Yt>9u78$4)dLe`Sr)c^ zQ?KLSPW1jAvst``MBTorq^6@ohw$pNqd@i(_v!QK2F;F!-j+-fANP?uv zC%q2}FMbUz3pwm^K0s5wtf`IBlcfWi;cl$TYk(?3v%BGZ`drC!N-oXWH*A#^Er&5SOi>l!0;a*dG&6tTBeR;a+J; zFaQ{gMeMG-fMCl1_3gZOTy=HfbLr53sz&fASB)BJP+{r!{1bcDAr_{$p^YDM(|=_A zP~~=#vwr-a%L-dNUOVpJ&ss8$A|#l9_giQrh`J(Fx~DHnyAT@s$I~WGjL$SK$Zrwt z%dyd!mK)ut*nxQGip~MQil1~p!>$6tfBK2z$Gjokn< z;do~)F&~bWpyh1-0nsES02Bh5|?QBJ-6|@KgJ{=&h*TH208nxdjfqAEr|3f{d|* z5F`aREl zy1qYs5J-%tUVFSS+sMu>O|qnsdkC13hdEEsXgV4nKYONdC0>KMUDzAnnoTc~X@Ykr z-E86j@O{gl*V2eaI(3bygg<{cySn5UbJbX=|J)i-V1Gd2ODz`xLz|lOn)YeRHLKZ* zv~&v^^TMyoz4uSWM5~=%!8p=>*DRe3oGgKX>$N`RqWrC!6l~UpNQ~@5mBquDuF_?F zkTBS2!44nqa3`F2RTqp=S)in~8hpZ2F<(fxd`e2?@XfUNr3}6vvtV?hF1I%Kfkd!` zJ**eu{2I-GDb4yJuz|7a(0xtkt+Kn`P=QRTD+c?Qt4lbT>GdHrZ?@B@CB#wM1VdC; zX*r~RwRG0SAVGix`-b^CEE@tNi_suVE?==^-$z};PD;bDw(%i{oPv*ma-f(FU)Faa zCkF|-VQbapvGI2{TwHT2t;rXmeB5t^A zlW$p=n=b?AS*q+r{#Clc@8<+FJs*Nmw=+Q92SOT%o#d{e15iQ9JIO5LH>mzVhrcOo zt{Eg!VIb_!0#|==0oY!pFQ4tOUB{VVMG=T(_qwF2?p^N3N@2;DGXO|+naL*CX6Ms_mb-HFn7b0c%4oL=O76szvPLn4F zq32I;{^#>HzMt3FLCaRVIbY?h)$HuCXU9@$zp2vo{m=CM%>`HL{bp}u@P|-vi-|wN zD3}Lh-9*K$Haioo(sB5qA9x+ZW1mH}ML_7YprE_M5%}Vd2Y|t;QQaNQSRiovq#DgA&A;C1$|)hl zc$`UcAdGi9$bSTq_2{sCt$t%)PD3C?*xiQ*(klYRKbBX2D-UVQ>3B3zU0n`K2{nSS zQlKY7emgChhjdIF2%v8qycVs8R``ZIW@c`b{vV=F#nX8NOQ4Igi z&^-|bLJ{IsofwNoH7A6(wUmM)68(l#g{-I7`3N(bf(QU6vEFVP+%^9r9O&}hcnQJ$ z#j`Zr`)T*c&G~&Gy~V3xyzVRSS9Ja>yaS4Pf8u`WX2s~6@as#zcgcT*N^p16YxDgM zQg|R*EJPz8ku9RP5{(9e>8+EHE>FI!|4%ZT)cZ7NvW2{qS*_=s;&b(n8>4zIiD8 z{O(<|a?M%5Ha`q$w|Nd=FF{`|p@S=4*JGC}P>&mbm?V3p&@Nxh+6wDtD*MTdq~rkR zO0+tsUbPf*`spPS{hur6T#o)TS&U)hrF6T#p{B6ZZzIFtlK(RTkRQ}u5v7w*AP~mJ z_H7>UFL1f83uiPXm1CL;dz&g;KpC@MMyQDiO@@ew~w6|06kpDNaM*9)8?r?UqSW{%^kFI0nm{)I8^#&z=Y$ybif2A6s4}DtpKku zbUqn5^mRs)1BortgsbaPtZ6Ax*+eZYXmWSc^&VKjr*($VH4CovkJD%OE#%{(FFnE6 z5kAVF>SCy}DCJDPYk1q>1vBKlyF8djU_4yDFT%A7aNPP{6rC6WjT>kYs<|mB_V!8} z$8zpr#`nD24fuQE+BqFAPQADh4jx~!<}^fXaC^!!FGOLc6yEUEF|Kt+=76%(@a~() z2Ygyn{^`M#nZsto*u~yqK!bJ<-%_a@b#>B%1;n`RNM6M6ztvd|$_Gq@EkVTpt#sDy zpq$f4Z*8m!)%Z4B#N zWs<_19ew}nMiO-)B)EGxs>-Hr7dC~w?nfA-9W!MEtEX17&o@ezJ!M7PN9By3 zV>+g0WinUe@}-CRnjz-|Sn2Ku;@@7#Vgj6rDsr<(Ea={zos*gCyrx&9CUN^d^M}?} zi)@DrZwiNdy&yV|CCf+@FHMx8?@OH6==jod*g$P-Cd~N&&yA6{Bt1p`g!{b%mbp5q z0%n+f9_Pf`>;6zS)nks|e8OH0?i(e)!FNQD+U46WwV!a3%P8JVap;|2L}*dNftwT+ z>#d?qsHSYHS!=!VVxoqXS}Zo)*5oPBSTii0xf={~@4o`RQpJ_)bCHCR`=NF{S*(AM zON|Hydig=^8&{-hl<&ZR=mkOBS|-kc7i4y0RZD0N?fUnkZjEqv-Vq<|iZmI_6jeAV zJlrqG$=7Y8oTI0@He?q~2-8CjosQv5g*cGUTwn*3|Ao>{B-y{@P=Gj^%@B*;r!nj0Vm9Box}x|@0}c)bf^P+D>v;AUhjt3g6;;=m=A)| zo|kDs__~V7m}^slK{I02jG)w_UqI<;#U2wt$QlR8{Bmi0JT{VWdcbr5m~4|dEVD6U zS)x$x+Aew``vCV9?j#=&X-qRk#9d-!is;aC&OKfF59wy{SJq>BsTX-WT5qb6rEz>o zXQ47S`hg`lCF^vUH(Fzl_F%tFUs_vB08F5)&AI%bWB`uJRWLi`;Ot&9k}SP``u*$s zYE^3Ptsg5UDH)^>Kwm(>&{@CDfXwex&b*t1D;o4>$_CRM)@?-{Q}s08{p)w6blkok zH7aFSF6;{v(`KB%1ipc_=2J3h6WKTL_t`1jI1``ZWF;xODK6Q)#b3gw6lVgWz1le3 zn*6FTsI$W*QV`O*&NdlJBbTC(Vxi23KcJO-=GDH!mn={0xaS(X_ci%PNJ{hhz1SnjFm&ns>2p3izIC%?&2Pw8l&%(1=V<>J(`e3i#1P0H; z#6f!1%ZrmKW1?qZ0ySNEp|xd|VcND)Q%yE^&cv50&>aV#5AigF2Z`s_f|a z8GQVD@bxdYU6|N2lHO-(d(H$#?roiomyAMvbfNgOp+Q~|>v^!vC1F&I88WdEzcE^L z?ce^?!*5+rlD1{!M|*oi7hHN~oeRoQogn;+C)6>@lSz|tC$tit(sE&%+sv&3^;se&2>E|%NYQlQT#fxs`O{^S|X=3$@#A_ z)xBYSccEtv%7Wb#$AJq@$y`KcjMWAqHVx{z#r=O1m*`=*)Z-<88wV#bXwU6OAfvU- zc^MZMXh!gO6F}|ZT_vKAjbH2Rd8%pwX3x5TrSD->J!1iYsNb|McXG;_bG}NphZizCLz<{UM)S6X;tyS&SJyX<2D1u;{LKT8#NAor0a5rYdX44FSPP3DWSr5xu>R%WsRu#7~ z>37`KdRPB&Cu(Lf5EJOo8$niEgPSY#a6Sl75%np}qk3maGF8u~uSWuvrpjXSF@8E{ zz90KomJ}pW(l(-6_1sb*EY1rIwyAqS4LpfHX;yz9m@Np8_rRd*k{w%r_1eCLN2N>@ zOz?2(EX{16pO3954##^Q9_d(Qj90f-dtcaT;II(Ye7=a6nye(q$T655BfrBhwDniqA}7HCG&g%orBH;y7?DWH z_4~f`=h-%8Jp5qaw??=^ROY$6oj*TQiM2(E5CHr$ERR;Q5s7ARQ!mr2^ z23)<}8sNYO4)uQb_H9f7r`VaNa#_jrMw5U-izy$Ykko<0HGMNa{)n?=I?Gk8sW33& zQfIG&6&s_aKmhf~!Kh&vIMq&2wBrX?8t7Z%kr)1e?^JK#UIDa6-QQHQwvD zg(yon53leDG;j`G0~t7iFUQ%c_pp4+V>{zV>6pS8bJ6HB8ANF&aGIihw*T1k&t1jm ztQ--n1NCt5UOj&8e2HT|G3yv(AR{q^mg{gA!T;hrYhC-8R~sDiDu+A2JnUzjKMxga zP4zK!(zQ455!H)GJ5}#vTGIVqz(Q#oDlIaH-84Uut9V;{2Zf@3L)vkuA*Z1vb_w>J|z<( ziOfSM-Vo>QfP-we=7YH?jd^xlz-jAiNfNAlDD8?reLw~I<=v{bXPC$E6R^AAes=e3NvG1*#M$@D?t``u*fW z`>zr=H!%@;G0z0Lw5^!Ckw!e~is1H~tB_X%^;0Dz>d@j9HScNZX}D{G&gVPr>7G`b zdWc8YRt$#@SxM^P&Sa;;WInZGMa~7K-tE!zmz4M}0wMBcNmRc5W zW4A;4nt8BWT_U@A7EB!JhsGE%kqSd)JY*<|edIhALKn~u9@so4+?_B`6wnEx)OjPA zrX-kE-Igho0Or|r3m2aEFRfPjmD3!wiRLPe1McrsqpaUsPN;*6`H3LomL674OtGOK zzwT6eWtEoy;M{r`#^ldmh8FYxIHu)!74L;GrP|;VcyIx#iEpZe1n={dgFibphQvpT z@93!5^{^4MrKyZzP1I}*WX2LzYrNN=#867!nb$OStt&lmhHsshoiL3*a6lxYF&XIn z!R7A|RI+SfuMgd_j!7~bN0A{KI8N3UwnSxaM&)}M`BvU8R9AVxA(hTTh*Ki`jPp6; zqEyO>f>2z^Nr)m;o-UKq(PezbKVvHRJ6w|(J2k`s=@8Xm7ni!GZnoRBMzVfumD>L4 zR1c^hj&BlkD7jPof^8EAMeWN(1$}Rx1*D)zMR*LHk3C2yR4KbKcjL{29s|>QwtYsG zAS%{eRnc&|l^LifRDt_dTP!D;Q{1+8hRG?b@fWS!`6bXgsKk)>Ow5$6_+iL|$bs1k zW$-*`rvPN8(kogFP&iLIm9=f@X2Y?zBNp|0mlqpZ(%q*V0jCuKTnHy;YzU;$&F9N4 zCu4jDxumQ`@QYCPGRDWU1f(?B;1*CfMO+)IY5fF*6q!wFDV{0<-@IvIulvEro8QKh zz8?|iezWzllI;NKX#8)+7j>+mi%zo4D2peT3XhUT;gxs%eUx#_OYBk)M9f)yyr>JoDcl$^krapw1#mK=QELIF_Ft;Yb=q|eKO^{pLi0< zXEsGpE{B|95u=(N#Jg%(3Lib-RARzoRbS{*3xEIY+6hg`o1J5)rsQt7zGr%r{Bx8gShk|lB0j}-ldxNM@9>3e)3~RWM zXNEUu5bDu(!`n+DKb}4m|CbjM1s5M{pGY@AFF`y;RMWhQ{lq@FEfSkp9_e`s^pufC&js zW*3*23jx%gIBQ!vMzcHxQr1>K*C#4u-!kX)zpbz)Rno<%cZhodZxL$?X`pR856E^E zIMRHKVr2V0Pa;_em-Bkp>6AoH{lRa(UUT4JwF(LtpW8`)S&8XU_%~O$%zB|BYtxFkJtp1q#a)y$Y6ce^CLjD~Mu2(9&vf!0|Yj+V}lYd3y8e@vVa;(3k!pZ|A? zB!sW)5$L_ie=ecJl!{t0J2+%qQR_nqELGarH9}5IBoFrxqyOjG1a?L3f6>3nql^A>u%DJvJ{MIYZzV*K#s^tD_L{fWF>mA%5Q$0qPw~b|T*%`&> zgJYeTq9deCoHYB*$VRb}G8EB%9?kuX$a)K9BBCj?3DrPCB=>Eb5YvaF4KmY>>k;Ha z=h|KYAfzZG}Q~|bf zO8xz(9ULqFu(8G74*~$I6&Qu`f|RKs`)pZqQfPh$=&QCjH^Z%leVSfv8)I29JHznX zV#h+>F8SwR9`dVb{aU)Ae^u z$yF#Wt=8O~{}<{eS@n6V=1K5#6Uj9Mu@_J#kzCpIO3=<0h zEV-|_93U`IoTKpVLyGad|DX7 zKNH2Wk1z6NhdLu0(X8BEg9};u#BRp=xYT)&M9G?4)b-`V;$=FiZ)p$tM&k;p}a zWF=Ru<&+?}D(~a-lUe!|pgTVI9Z%qx&PD>x$N6`IP!*tw!%sU_T;8{M1*p>2+FHwQ zxhInG(lgL5tn9uE?YZflryIEA#HK`sP{(^QD@OifD=Nkg{?xT0J0OY9w)TnytPrXi)0m=qa|TQ(;S3<_9gp|0>qsM>zgk|$z(q+SHa%0Im0GA$+Ezm^bY9#@BLHsI+&us=F*61=zNOM6IWz|AnHyE^J`~l zGfzoB@xe9tqa<7y6VMFvHylCY_q{tADbqp^cD*F_0m3$OS3mb5H+b;8G)NWjlhUmy zd?4qY2g!n_MVxVU=yVVM&x|j*W$c5U4)rDX$bq>77fSLhO_oG|_S6cP;~Z+GyA9=i zlcj2rV49!@%=T=fGY$!a*$z2_{U(l ztT*^KbKhbs5bCzF+Y-CXds+pEW9KZ|Sp}fkXqh`pLQSU0Y5s}Gr&qTH0&n1bm1C9* zgE(0Z8flkn#K^8#L??@?Blsa>?-pF*i&k9G&`@kCJoejOWB!Md4X<4@Y^$^#1kQp- zH-C(ku=2D|j1!g5aLy0Of|WA0)Y;mx2}ntUfkj$1@UOeu8aTGkzsM4FoGd0a+f8o7hp5)M>m{VdztI)NsMRw+ zW^|BE67DRXa}CO-_1rIPg}N86dXZw_Y>oEgmSi-uOgAirm$xzkykooF_)(Xpknb6F zsg{{}`bS-F8ugf>gWyCRcs(_-Pn5Zu%$bUcLC4;IpR+y10TBjt`Gbw7UX5JV-!+j0 zm>qCvs2H1$Vn1L!1pZFjAANktTi`Wn&-CLIK0V>y2_mb0Iu0PY&7YRMSctX#?P{^o zhC|&Lym6t!6(9L2m}Nm;XTdW%9eV`jvql1glaFw>Cw|;u6F;mlO1%5MRT)L(;D)}6 zdBEhm;Ur}99AlbZ?qed5&-Ro(K4#ULkcu`Zn=HMH=2uO?im??rRfq7=51q9W&AL_s z$8~h+@90~RkQ5gFqoI_RIQh(8x4&#=>3DV3qki{g&N0FefR700UL>XdEQbj^IH}2{ zgXWGN%*h*1=CQ7a)*L2n@r9th`LETcB>!KfeRo(>&9`n4Bp_Wxq@$pKhzL@p7ezse zq97dvM0)Qfbg)pACcR1Ty_WzYg7n@3NRt|*1WX9I6aDV*o^$VW?sH21$;{q6lbP9T zt$EiwYp<=2B~~@A2L!}o#wIxlQ}Am!M95}xZqR*@w}_JaCf1=Q715-V`_=2WR?FqnP_xHGa}}(+@hKX8^!wR!3-r zk&l*w>5rJf9z#RKVgYVMKRV?QecWyKL(_-4@#qrS^BcmoO6TgzTcTnEh*KhniAvqu$ zIBUQM2xRm*ui@k0-Z7^zjM(q<;u$3%#>VD@Z+0=ekwQ$Ik_L>inr0f%72+8!SSp9k zHP4fcgg7y;!~EO_>VT(FnwMgU>E?$(K9#N*ADUj&UPmI=!!8z$=ft#)y9ys+v8S?; z^yN^3Lur0rCsa;O4n#x2$U1M3nC%(yP5QEZ4Tx4U)^n0@qrOsRaIq@quKfs+c+aGN z$H>bBwKJ{B@iD4>VSi?RW2$pMeGSno+p5|-EYudhC8^R(J{k=9`pvxx1TSn+>jqSx zmwV47gVYU$JV?4-zOXum0#`nJH!Tv7N~$Ovv@j?tdMQdQHiV0gPUKSJ+eOe(9?ck* z-MAF_4+SLPpdH#@>Y)7|Tl=mH4+mVOt;^~;vjI3oAMpT8@)KR%3r0pp&4(l8{o8}Y z3eO_1X?{>(@YJBk9IWIdyy~f$Hd0}#7OJ!nVHRYdS+Q;h_kwvdF{R^b42_P6G!FOE z+neaYJ+XhaUtayf(IxEhgA~4A_;eQYr&3*-p$RHBuC|Qn1y&~VC*qWe?hk4;jvY3Y{ zQxxJRX15c#hx+=MSQHc-hhHmx9nyI0v(MnUOrQRUHr?kz5?WXB%fP!x#nwNy@)&>>a_SAf`tC7tiq+x z>Zsruxt`d9Z%#_x8y{(VzxNVt#ZGNmiFDgUwe>tB;^((N!92&&l*6IOt0Zn$LVL4T zeW=$x*=&ZsY$1|ku-0VqKO4*28qGh6S_VF5Acnl9ok{X$E!KQlR$Z&_g8)VPOy&NQ8K(R+3)!-k=4KYds>yNXF!jWwVj=W( zE#7m4=i(Yz5BH7_6pUpv1c{cmw)9LtWmEvl%7*>3Ft7)E`}^p;gl=elZAh7cOqgezC53%?&_C`FeM5E9DAT@44f zKsc0?@twqaC$YRP?TWQ*bzPm{A>33fzhQd8WxVhw^&w*CHSQh-yq*kjC(olqwPKTn zNo60t6GNISBwT2pefQ{*;Wzl3`45HUUo{%jE6E}HD0vO=gVqtNps; zlM3D4{W|VIqW-XRzC3ECQ?7sfthCotVg?t_KrM3OFdzclKaD4L1$Ftl^&@$Lg&#;w zw9}#wGP_Hvt1khK&ry1a1QLIVYi!CepVv1dm(a|pr~r8(DOfrBZu4uQYj=4yZ5tTP zUYXy!)o{J%chQ@2n5yna>~tKLP(uu(KCqrZ-SMpeL#wQnRnelMjh0n~_OxngF3<^) z#<5#?)N(`hoCk~ew1Y|-)>-1`E((!8R}IEmXVqe@DP*S>mmNHHBenp*6;0ofYu7*y z9Nm`ny-G3iS+HC~hlwe;oLA*Fk^&|pbA5bkb+zQZgr;fzuXlr-ZeNs5GmtJ5Wjj^H ztw|e>6BQM-1_i@;E@Jjm)iPTSQ<*$9TIWdrY&s5>-pXtd4fLTEUD+mUa-zyKW+oZY*3>`&m$(Sy2|`gN13Q-!}j`rFd5`>5ax z$XkV#noBXvO#KqS_V?X-F62+|O%m%7d+n^Q?r0EeGt~$a{f#)Eu0VOl+~~3C+?pdK z-d2m=alIEcE*gqAg#T|_Z%`Cgck-7Z&yVm8i(8mcKhL|MzhSc;}GK`OR5VKOXc438vH3YpoN)8@-3G?X7As%HR;=;lSRk%?AYq+Hj)JF z^;%xE0&Y84Vg22dR#go|Sc|yp+WV9yU-Mbb-H`tMo_s1*{;>-=guCy~hK1E>3QUO) zdrgxDn232)@wcV?0_1yV5M| zq!A0nz}Y9g?B8EbRuR1`K!_+V;CjmCJb&S#7lX3dN%1__5^HvzVwle zft-}N@KLH`!b^+3E@y?x#-I7(!D_@!%v*AJe*pf0ekwc9F@RiGRIf4+@_j?Kvo>=bYUHZ9F|#d$_h2DtC+$SaW6~S|xlZrpqG(@>&l}JO+;Bc)SeFGYF4USgz`^ zra|{ffyKhw-7MaN2EU7DA!7-dFN~*f0y%-^56WGzt zLdK{AJ#-0w-8U4=YZQT##c+g+l?*5$hCN!>yr;nq)Y8u_Y zri-h!b2XsAemPihE2!`|n-#S8HC2mjK1%N2pRgC{o4l#KYE73@DZrKY?W~Q#*(ugZ zqamqMGH^C(_7z8E;zH_2Uj@P^R<}AZRL7-`h`y3iu-Y*(k|^Yft?D{n832sU-_G@t7N^FTb+C z3ZRC632*+!gLY&xc$a73EbruPqsFY}L6wD1F&yqBc2Ru^r4U&P>`>1`@amF$Nt-_a z-t_yo5BBCT#F6a1((S>{UH5x+s>EGBXSeoI+X42kjUygI#Y38$D z_-}|?9+SY~?XbZD)q;wLjxL_wD0cS+`=0q@rnh%*w-519>b_!~G7j(kP-hYK4@@_M z(`4%>WACHF*g(o>c%JoSw*AWm#zab|3+bf>Q88SD4x>>2VN)gXKOkKxie+_Ayhhyb zu>QwSX@e$KiMq4kR6SV7s*3i|)q1Jw?~>(k>bT|6nk|;zo}k95bgu3c<^~bWyKQx> zr3SGX;xnlez)}RZSZ0K%LCudZv2D(8&RO`mD@R`OqIWvRhK6UlFCB7OmwR<9TF!io za4NG%*F+40G1QSOBGROW+&7j)2wzIWE-!IBaM%iI+VrhL>mIcyXEFD~&jyaSE+D44 zwO3!Oq1IiIdTrCUqF5y^;Cl(iVDjz9>L)3js^zcKx>bfMTvl_N^OpLYAT@rd(!O4e z{r=z$6U3S^H=O@}4VNKXCM6)hfpeI6E~@Ijcu(c@ojdH8Ak;$>Q7Y8(17XIg)LTCP zK-9cm1qOgIYF4LmD2bo8G_fwJ*NoZ&@Y*s@Y^GKkfe7W2|-#LS!|OToeW z|FjAYXQ`*B^$tO!mNM2};ehya|H0u#Fic%R8MnF2W9<^|TYROC^Ya*rkTqHjz=ZZ0 za+`Baean!|ziDn9_5$LaJ&3ALEjwtRZ@%EQFvPR_swLKGm@9vGzW*rS&nUIgz7*yD zTn%sE2i11Xs>s1Q%@xTe6$!NLd2c&q1>_ILZfYzQc}BI1KvK`OP9Pd|qeGj31JSDM zx}d*Z zr)ey!MIe9zIqa`6;DK|xq~`<6Sf*Jr*Bq+$RZc~DRbTBP&S!xsBjD!aW!S23+!%aK zH5_q4Z6Up!&p`A`*|*eJe_~(}2<1gMF*ER1fWs|oVkuB*Q|m?FMYrAias2KLW&f7p z>}O@IDpclkiHx22BinD|x@8wOij8J1bbN(Jmy1oa1>7@cem%XHB5E^}?kcuD6syY{ z5R5GXu@4s7@!!*MxkOV;Qp!iDjZsYo_uOs=)T!wI1)QZ!CMt$MNoeeN@URRpiR=vC zV|IJ3ToNbSaRx$iP-Vx|@1^Rw-8@)!c1nmibVQgY0K|)Xa|gg>AfDfBI#r~MYd=u2 z33Oym>VRo}U8Z)^1K6s^lu@n8^R!*SnB{a|vr`eU`~uB6IWq8S2gdQxz)S4#EC3<7 zLYET8pdS~I;%W+J2LG%%i}eD!|5c)`M*;M^$Ue|;iNkw4v_E{txi7pI7Z((lMBA+& zx~EG^HSm4;OviTE2xL^ubDtc2xUn&WVZ;3NVBNnkF!1F$LywN=WdO%P?D8Zpp&;O9 zJZ%)|&8BU7O#!;d0Yp=*|E94bA9smL1fK+(|HzQdW`dW|7`up@5s6khD#KWG?&ZIM z&V^8j2W|;*@u+rVcx!sSewSF{0EDvxt4CPW0BqnJtrU&N#lvHzRYhYEb-E zC(*X)=-7!kE>ahbUs!y)!WoO$Nu0#+_;aqwO!LRK1`$;cf#!`sRroBjp>C5><1g;d zb&Mfs()=WV;iv4oLx7nQ680Nt%Z@(-YmKSZ$jX1*N|dilvk+K73ngStU`o3}_zCYI zX5PJ#QYefg%%7gRSiSvZAt$WQ{6ifY8@gFl@X8`TuNY*F+3lW~7W_36QeAq_YL|%j zf8*!deBRrmd3pbd>w8jPB=wQUFg;YqhDoUJos=^q>zC=oWhCZzx8(ODvQ%4?86 zFjO`}{C`q9y7yk~56Fb4!h1e&BtJ7U`)|Y*{)MyuCK6Gt_F+8}d71|H-$gUYi=zHkSR^mVC8 zV$Fq5IIJUN{Ah0uad$t-wdxuFAo!=1Y$nkx5e#y=D$H6+Qgl`7cSjUmxOaO|w=nDR zEs&+=+lNk5(+>&pH!$}fOysZY8Gx{?7j2mByFVqRR)eo9#9DKqkYB?y6@KmA9fbHd zgMiNQBiFRF{n%_z4>5tcv+lctvhn7eq#N(tm&5Q$HJUE=Ki44Yhfy$ zE@^2_hPsSaRexZr1*VBN0q>rqYGC*g@1F|@r%IlOx}?%KuE&_@#68_|UA!rZJs9R^ zAJ}M#K&o|jwUt64x78NtVmGEqqHAxAeK}Lv9dRB_|CQV@ftY{4@O}Sd(_t3PkM=ZQ z%-*2;Wp*J>qKT2Go=4EWIIlDm+Q>}C$mj~$g}t%x;VbkE1&wE0gECQ6S|uHwgOWi! zN(bcw-!@9U*KV&mOZKR!bn;fTHzqT3gi?Mv-kRi)6uDg1T19<5N6T~Lv`+Z@ zP`1-U0+9CZWY?_MOH2%B*Xi}+$kJ5!_cG4-NGq`)Bn*0^#Ll^GAJ#7^tb{q}?b2~} zT5*iw%I@UG`wLCGPfJ;FJEAK&IVOXxz8+S+m+V>`))B{2R5BzGZl0Q#aw7*xN9`rz;`_}t zMT^KSC}iqro(gjE>RifBI%s>7DqdyO5clqJnddBS-2L*+vW>I=D+x$@rRbVde@A&@ z-r8#%8iBE`pld1{=4MNjYVF39uIV!;N*NwCun(ZO_sERxPdztj$A$b%k`~>0;#$F^%-<1@@ z!3BgeFZVGVh(&ZleCTo;HWy^3;xGXTW1XL@l^BF*FX)7Kd511_one2nT@GPTf7~%_ z;4NUcZ}wV%O>upLCn{NzLCJmR%X_XHnP4K-wilxC*Mo7rM9e%dv~H|~y?Dr-5=7-+ zhD~S@&~~gnmORba2cb3|(@f3{Gq{@H_Pzb{XJ!4cgW4oQ7eIU2x)6ww2e>dz(9-)A z=l^O=qR8aMBG25OIm*t59(4f)uit38`E@vgiH05iw}hRaN*yXi`n3Zst=MW}yR@z_3C_sXghr1K0&&*V%w1g5r(LCC zWqJpuL(Wh)X%lTDe(HA_U9QH$1X!&&PNFQ30I+G3O!>K_0d4L|{Oc zK`|3ZZfvZs33&0KL3$;de@mV!6-4>6qOC7p`d*;A^-q^mk6930c_i&7FFE-i2D#RE z$sj!0KnLHQf3(>jWC`&1gQ@f=tf!_mWFHZ(w*Nx>t4X{t*%r}_mb!}Wqi$4}K32MD zxtEmYBj-{JP3p4dfR2B5wAo5*TyDLLfWsuitB4 z6DA$dNl%4lg-9P2Cvyx)8M2zwq3k_TdD|T)U2q)C+k%SmKJ}MhxFge&NiKcU%tv%j znP0r&=p+wA$xN_>@4#jtuNE6N;C(m|U@u3iN z+jC*w)6-JU$2hp-bpLK^gC|IE+3aaApm}rE-(d)Iw8L~;RaK7Xx@ErCofMup@EWj{ zv(amV)vL#i6R}7qPyJ?l(qj_ApM6dqGoSj-a^V6Bnuy6VH8a;OTs>NS1~&$i(AktB z^Lhn;xQmUl60Te}`f(=v+W*Fy*3mD-tMlp>x3}a39vOtcthfRhs<~|={)1vb>&7q- zFMC2C+*}p%ybM}-%1R{1Nh^=;lJJY&RQvhk_d3DQ1@BKxrUYXB!5L@S?~~51$NS_s zRPZ5uVOR#rC@b#w5zDK+roM*6?fhYx(jPzHpV<$X`1~L~qrdplFLHx#bv%3nP-Pz9 zZHzRcRC4$$*_L&Ft7k&tnaaC^0KQSXm?9Ak+>_8JxS)Z+4IL;aNeA7n(QGUJb2U*x zsZ1<)FX~s->Abm;Io-=ytL0u%(>VJo*uNZ`wk{q6TVC=$&DY8#vs*oY7}IroebAMP zzO%&{%OQyMkzV&qyM1xuai{CGD0Gyd6*@r-y*`hG_+OJ(N1|Jr_L6ZDl7&m4baJ>^ zBO>kO`*gDnrofYv?tXx>-SO>HqUJyC><(>3xHnTR?)1`1Evm4*ANkR2xW@lJBD=Zy zQo)C%kNf*iHLfsy?La3362`CL{@fe&lVj?B!# zMN{YUsxs4kHn!^b(d2In4XKiX4h!zA63TG=YJSu3eA`y*+JlFCk@G#s;8PJf@_=bB z%WF>EWxLt6SSZ5L10fV%YW4)T^Zw%*!Os9Kq)FX-z*Hl^5Eh*4nIVr+Z+fW*O>TLMVk=E(Tcd+ z=ybHb00}lvbx?{O^|X}1T~z7`tusWe@sbUKe{g=bxVpxqR)Ff;5tUZ)qvMtZ&lXB>KQ?77ahf=6 zpSTJ}#$Wno=DAcd_36(#k*BZ^{DN=S)1f-8F`q|~R4t1R3jy=3w^n8~aGgasF;?>= z0SC=img52W)?3c+$eUzhpQ;@jPxY`8NmLuxekG^+d=+Ojse!Xl!37}*M~;aUFTh+e zYO@gXr+z6SpA91QdL5!(;;3{%jlAkCf_@-#);(!8AIc}A#x&x`klajdcL@U<+F!0- zD&D|7R+S~W8cZ$7Ozw5=ViP64EFaD*Mu7i*xaM$99vq4OzC;A7Bv%tVN&j3R7)Fb) o2AffGvExsCV^;gq%13b+K>$zK(C*^I5(Io6-B(jAl{XIjUqei=NdN!< diff --git a/icons/mob/species/kepori/onmob_suit_kepori.dmi b/icons/mob/species/kepori/onmob_suit_kepori.dmi index 6182a9612547e1bf8fe1fb2796c330fb06fbd1dc..649853ea728038086df4958aedb0aabe5065b318 100644 GIT binary patch delta 2577 zcmYk8dpMK*AIG97gdt=9FPbA&2Iil0!K?4H=u{7zyPWaz0jK6_4{w zlH@6j=8zaq#ca48#>_T;Q@?)K@2~s*Uf1_~eXr|tzh3Y6U3ZuS%~SxN$vUY6?cpEX z0)ar_TMl-PAd}fKKi(oQ>sB%r5&GwCc_Hht$2HHVX>)rrLP0S(Ig{$r7TzF`P&LBb z^iov8qFY+{U0spxo`Ysl+?~-P1wOgLco+A{uEIt~oxHk_ec3mY&fn|u);K02aQC%$ zvq1rjz}EaseE2Fr4pXA2CSGPgUu%;_r#;W&9(UVJr&cD6N?u zF!sj87i3a}M`*AsSw&kLP>gAvH(I z5s(42yg4oo_^_*-zKYR%VSL>|~mDq1+>avEWKP!uIa(HsgYflmjw}#g9 z&5`#-eN+w()S9kg5um4RF)ve|$~JGSG$_=~GM!OkXKeM($t!;5+&jE~89&Q(=kZk9Jb%Bak1vho24X_sGCST@GVqy!ibl>uqIO`&9ND3u}gYkiw2%Av*(yw=coU!8nP(C$RAzo?mM3hSz5OB+tOusNEag*Qw-Iq;AH zp3G}KYaUM9)z{hIwvMS?6a*>FQElj}Y51asI&`n;nxZcCUnZ@h;ntmux_FDuRxg;x z%*wS^=V%oBkzJCay#6c?IkZuLbMY^Q`PHEI6VifTgoJ)u#THOha;kb=#U07Yd{zFs z#MC&%2f6QJ)tsqQ|6{8-3eg={74}J+z#|xVyhl30( z>%Alx_)%-~?t&HcuEzr|6A@PZR`1&YNP2UQiNBxQ5O>V83} zBjs|%-<#5Ahb}}@M;wA7gJFYrOuc%WR3x6t3!! znXfJ$JfO3I=I82)a5d8X5tK0i$~dwhOLXn7p+K|*^uRpKU+TYeQBAvIUC{ILG2(v|T0eMbf`un(iO z>yvl8V%^lw+#jM(kB=*yvve~#6V5=}w<346aMGMlAtbUWS65olPza$@Hv%}(i?2Le zepm1hO0hpg-aCJLw=1w)1SD6hlym!zr%$QPkE#$Y*wbG3HwN!)jJO<~vD*?Ee`>MM z*z8C;%eSW0VSp4C@64MXp90yCs%a6MC%z58lug3031`1C1J^HnZD22fvIT;(V`drt zjSLJPxigm>yZm4~{b7vjzT9Gjk$pm)cP#~5GXlGEG@$(719HCvKJH9s($+&p-|t;Y zvzMfeYKj`C>R^C`O+qwRiro6}SR?&bN6`pywsuGVBAXDI%p&|>_G?__-?*qw%y888 zF)!y`+sB)r1eZ2oR6?n7EZe~V%EZsNftbtsaB&_j2rLOhWL9`B^1XG777z82;CkYQ zfx;P&`It_=eqMT4+IMO(WsN^zU`5ZyKJxd&j)XcBM_XPkcwG1glBTO`Nhdi%ELF+2 zD_tiGhXK^PT|F^b zwM6}{)Uty$v6whMrw74K4N$TD4qH>z-+xw(+t6LMQ_X>Gy*E!h;b zg|XW$xo7XFy#CGEYDwNqr*hl}0P;Mn>;!$9)lx*M8HVYP4J3?@uAxy|@Q1Yi)o4se jgx3(qb2ra92e-lOf(IF*d962j|9Kz;+|Int%sc)+)o3?D delta 2155 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 literal 20648 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 Date: Fri, 12 Jul 2024 00:03:09 -0500 Subject: [PATCH 068/212] Automatic changelog generation for PR #3179 [ci skip] --- html/changelogs/AutoChangeLog-pr-3179.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3179.yml diff --git a/html/changelogs/AutoChangeLog-pr-3179.yml b/html/changelogs/AutoChangeLog-pr-3179.yml new file mode 100644 index 000000000000..6454eaea4d0c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3179.yml @@ -0,0 +1,5 @@ +author: TiberianEuan +changes: + - {rscadd: Black hoodie with grey hood.} + - {imageadd: New hoodie icons.} +delete-after: true From 6cc191e0c3a0bb601dc4434d548625ad84cda5c5 Mon Sep 17 00:00:00 2001 From: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Thu, 11 Jul 2024 21:41:00 -0700 Subject: [PATCH 069/212] Hoodie/Winter Coat Storage Parity (#3191) ## About The Pull Request Winter coats lost their innate storage due to an oversight in https://github.com/shiptest-ss13/Shiptest/pull/2121. This fixes that! Additionally, this PR matches the items you can fit in the suit storage slot across hoodies and coats. As an added bonus, you can now fit pill bottles in both! ## Why It's Good For The Game Things working as intended is good, and one should reasonably be able to fit a pill bottle in your coat pocket. ## Changelog :cl: balance: you can now fit radios and pill bottles in both hoodies and winter coats fix: the innate storage on winter coats has been restored, alt click to access! /:cl: --- code/modules/clothing/suits/hoodies.dm | 1 + code/modules/clothing/suits/wintercoats.dm | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm index 1667c9b7860d..b69061cffbd1 100644 --- a/code/modules/clothing/suits/hoodies.dm +++ b/code/modules/clothing/suits/hoodies.dm @@ -11,6 +11,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio, + /obj/item/storage/pill_bottle ) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //it's just a hoodie. supports_variations = KEPORI_VARIATION diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 9b141148e5a2..5c1bfb47be66 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -12,14 +12,16 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - allowed = list( - /obj/item/flashlight, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/plasmaman, - /obj/item/toy, - /obj/item/storage/fancy/cigarettes, - /obj/item/lighter, - ) + pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo/large + allowed = list( /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/radio, + /obj/item/storage/pill_bottle + ) /obj/item/clothing/head/hooded/winterhood name = "winter hood" From 6fe4e56bc7777c27f091e4287412e34a2c151bdd Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 00:16:24 -0500 Subject: [PATCH 070/212] Automatic changelog generation for PR #3191 [ci skip] --- html/changelogs/AutoChangeLog-pr-3191.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3191.yml diff --git a/html/changelogs/AutoChangeLog-pr-3191.yml b/html/changelogs/AutoChangeLog-pr-3191.yml new file mode 100644 index 000000000000..4fe7934e29d7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3191.yml @@ -0,0 +1,5 @@ +author: Skies-Of-Blue +changes: + - {balance: you can now fit radios and pill bottles in both hoodies and winter coats} + - {bugfix: 'the innate storage on winter coats has been restored, alt click to access!'} +delete-after: true From 68edb786e4ee325c8ca1b539fc1ff40e4fee5559 Mon Sep 17 00:00:00 2001 From: Theos Date: Fri, 12 Jul 2024 00:41:36 -0400 Subject: [PATCH 071/212] Bone crits are now only rolled for brute damage (#3181) ## About The Pull Request ![image](https://github.com/shiptest-ss13/Shiptest/assets/24857008/b6659939-8c1e-4ef0-9c5b-a5bc6399d9ac) ## Why It's Good For The Game Life or random damage ticks for disabler cat ## Changelog :cl: fix: brute damage is now required to break bones /:cl: Signed-off-by: Theos --- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 92cb95a9c605..f8d8a9a49384 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -244,7 +244,7 @@ burn *= 2 // Is the damage greater than the threshold, and if so, probability of damage + item force - if((brute_dam > bone_break_threshold) && prob(brute_dam + break_modifier)) + if(brute && (brute_dam > bone_break_threshold) && prob(brute_dam + break_modifier)) break_bone() // Bleeding is applied here From a6c3432656342ece7bbe3836a82e2d30a4705733 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 00:39:57 -0500 Subject: [PATCH 072/212] Automatic changelog generation for PR #3181 [ci skip] --- html/changelogs/AutoChangeLog-pr-3181.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3181.yml diff --git a/html/changelogs/AutoChangeLog-pr-3181.yml b/html/changelogs/AutoChangeLog-pr-3181.yml new file mode 100644 index 000000000000..6b6c7eebd1f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3181.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: brute damage is now required to break bones} +delete-after: true From 7c65b3f0ba9ae69a952354fce574500e8a14a8d3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:32:07 -0500 Subject: [PATCH 073/212] Mob Spawner Rework (#2848) ## About The Pull Request reworks most mob spawners to fall under a much simpler spawner/burrow each planet has one simple nest instead of the old system with difficultly levels i never even noticed were there despite the fact i used to basically just kill nests and powergame when i first played this has the byproduct of killing off all the awful magic item spawns attacking a bunch of other cruft, mostly lavaland ## Why It's Good For The Game ## Changelog :cl: add: A new generic nest used across all planets del: Old portal and tendrils and other cruft refactor: refactorted mob spawners to have one for each planet /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Signed-off-by: Theos Co-authored-by: Mark Suckerberg Co-authored-by: Theos --- .../lavaland_surface_biodome_winter.dmm | 12 +- .../lavaland_surface_buried_shrine.dmm | 10 +- .../SpaceRuins/corporate_mining.dmm | 4 +- .../WasteRuins/wasteplanet_unhonorable.dmm | 2 +- code/__DEFINES/achievements.dm | 10 +- code/datums/achievements/boss_achievements.dm | 29 +- code/datums/achievements/boss_scores.dm | 11 +- code/datums/components/chasm.dm | 2 - .../mapgen/planetary/AsteroidGenerator.dm | 6 +- .../mapgen/planetary/JungleGenerator.dm | 2 +- code/datums/mapgen/planetary/LavaGenerator.dm | 9 +- code/datums/mapgen/planetary/RockGenerator.dm | 2 +- code/datums/mapgen/planetary/SandGenerator.dm | 4 +- code/datums/mapgen/planetary/SnowGenerator.dm | 29 +- .../datums/mapgen/planetary/WasteGenerator.dm | 18 +- code/game/objects/items/weaponry.dm | 29 - .../structures/{lavaland => }/geyser.dm | 0 code/game/objects/structures/hivebot.dm | 112 -- .../structures/icemoon/cave_entrance.dm | 1014 ----------------- .../structures/lavaland/necropolis_tendril.dm | 187 --- code/game/objects/structures/spawner.dm | 153 --- code/modules/mining/equipment/trophies.dm | 2 +- code/modules/mining/ore_veins.dm | 18 +- .../hostile/megafauna/demonic_frost_miner.dm | 1 - .../hostile/megafauna/swarmer.dm | 3 - .../hostile/mining_mobs/basilisk.dm | 6 +- .../mining_mobs/elites/goliath_broodmother.dm | 1 - .../hostile/mining_mobs/goliath.dm | 7 +- .../hostile/mining_mobs/hivelord.dm | 45 +- .../{ice demon.dm => ice_demon.dm} | 0 .../{ice whelp.dm => ice_whelp.dm} | 0 .../hostile/mining_mobs/mining_mobs.dm | 4 +- .../simple_animal/hostile/netherworld.dm | 45 - code/modules/mob_spawner/burrow.dm | 109 ++ code/modules/mob_spawner/hivebot.dm | 50 + code/modules/mob_spawner/spawner.dm | 40 + .../mob_spawner/spawner_componet.dm} | 1 - .../ruins/objects_and_mobs/ash_walker_den.dm | 1 - code/modules/spells/spell_types/conjure.dm | 12 - shiptest.dme | 15 +- tools/HubMigrator/HubMigrator.dm | 16 +- 41 files changed, 289 insertions(+), 1732 deletions(-) rename code/game/objects/structures/{lavaland => }/geyser.dm (100%) delete mode 100644 code/game/objects/structures/hivebot.dm delete mode 100644 code/game/objects/structures/icemoon/cave_entrance.dm delete mode 100644 code/game/objects/structures/lavaland/necropolis_tendril.dm delete mode 100644 code/game/objects/structures/spawner.dm rename code/modules/mob/living/simple_animal/hostile/mining_mobs/{ice demon.dm => ice_demon.dm} (100%) rename code/modules/mob/living/simple_animal/hostile/mining_mobs/{ice whelp.dm => ice_whelp.dm} (100%) create mode 100644 code/modules/mob_spawner/burrow.dm create mode 100644 code/modules/mob_spawner/hivebot.dm create mode 100644 code/modules/mob_spawner/spawner.dm rename code/{datums/components/spawner.dm => modules/mob_spawner/spawner_componet.dm} (99%) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index 15c3d93cb826..a4b07632face 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -608,7 +608,7 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plasteel/white, /area/ruin/unpowered/winter_biodome/living_quarters) "fs" = ( @@ -896,7 +896,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plasteel/white, /area/ruin/unpowered/winter_biodome/living_quarters) "lq" = ( @@ -952,7 +952,7 @@ "mD" = ( /obj/effect/turf_decal/solgov/wood/center, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/wood, /area/ruin/unpowered/winter_biodome/living_quarters) "mX" = ( @@ -1081,7 +1081,7 @@ }, /obj/effect/turf_decal/corner/opaque/solgovgold/diagonal, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plasteel/white, /area/ruin/unpowered/winter_biodome/engineering) "qt" = ( @@ -1467,7 +1467,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/blood/gibs/up, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 }, @@ -1925,7 +1925,7 @@ /turf/open/floor/wood, /area/ruin/unpowered/winter_biodome/sauna) "Lf" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/grass/snow, /area/ruin/unpowered/winter_biodome) "Lt" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm index e5756e7dbdf5..b71bfb250aee 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm @@ -542,7 +542,7 @@ /area/ruin/unpowered/buried_shrine) "nq" = ( /obj/structure/stone_tile/surrounding, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/buried_shrine) "nz" = ( @@ -664,7 +664,7 @@ dir = 5 }, /obj/structure/chair/wood, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/buried_shrine) "qT" = ( @@ -931,7 +931,7 @@ /area/ruin/unpowered/buried_shrine) "wM" = ( /obj/structure/stone_tile/slab, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/buried_shrine) "wS" = ( @@ -1647,7 +1647,7 @@ /obj/structure/stone_tile/cracked{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/buried_shrine) "QR" = ( @@ -1864,7 +1864,7 @@ /obj/structure/stone_tile{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/obj/structure/spawner/burrow/lava_planet, /turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, /area/ruin/unpowered/buried_shrine) "Xr" = ( diff --git a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm index d728c3de53f5..1c1d689c267a 100644 --- a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm +++ b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm @@ -1577,7 +1577,7 @@ /turf/open/floor/plating/asteroid/airless, /area/ruin/space) "Iv" = ( -/obj/structure/spawner/mining/hivelord, +/obj/structure/spawner/burrow/asteroid, /turf/open/floor/plating/asteroid/airless, /area/ruin/space) "IE" = ( @@ -2036,7 +2036,7 @@ /turf/open/floor/plating/asteroid/airless, /area/ruin/space) "TO" = ( -/obj/structure/spawner/mining/goliath, +/obj/structure/spawner/burrow/asteroid, /turf/open/floor/plating/asteroid/airless, /area/ruin/space) "TR" = ( diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm index ddbaaf262714..b97069f886ba 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm @@ -137,7 +137,7 @@ /turf/open/floor/plating, /area/ruin/wasteplanet/wasteplanet_radiation/containment) "iT" = ( -/obj/structure/spawner/wasteplanet/hivebot/low_threat, +/obj/structure/spawner/hivebot, /turf/open/floor/plating/asteroid/wasteplanet, /area/ruin/wasteplanet/wasteplanet_radiation) "jh" = ( diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 31dd5523fef9..c55604dcebdd 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -28,7 +28,6 @@ //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" - //Boss medals // Medal hub IDs for boss medals (Pre-fixes) @@ -40,10 +39,8 @@ #define BOSS_MEDAL_DRAKE "Drake Killer" #define BOSS_MEDAL_HIEROPHANT "Hierophant Killer" #define BOSS_MEDAL_LEGION "Legion Killer" -#define BOSS_MEDAL_TENDRIL "Tendril Exterminator" -#define BOSS_MEDAL_SWARMERS "Swarmer Beacon Killer" +#define BOSS_MEDAL_NEST "Nest Exterminator" #define BOSS_MEDAL_WENDIGO "Wendigo Killer" -#define BOSS_MEDAL_KINGGOAT "King Goat Killer" #define BOSS_MEDAL_MINER_CRUSHER "Blood-drunk Miner Crusher" #define BOSS_MEDAL_FROSTMINER_CRUSHER "Demonic-frost Miner Crusher" @@ -52,9 +49,7 @@ #define BOSS_MEDAL_DRAKE_CRUSHER "Drake Crusher" #define BOSS_MEDAL_HIEROPHANT_CRUSHER "Hierophant Crusher" #define BOSS_MEDAL_LEGION_CRUSHER "Legion Crusher" -#define BOSS_MEDAL_SWARMERS_CRUSHER "Swarmer Beacon Crusher" #define BOSS_MEDAL_WENDIGO_CRUSHER "Wendigo Crusher" -#define BOSS_MEDAL_KINGGOAT_CRUSHER "King Goat Crusher" // Medal hub IDs for boss-kill scores #define BOSS_SCORE "Bosses Killed" @@ -65,6 +60,5 @@ #define DRAKE_SCORE "Drakes Killed" #define HIEROPHANT_SCORE "Hierophants Killed" #define LEGION_SCORE "Legion Killed" -#define SWARMER_BEACON_SCORE "Swarmer Beacs Killed" #define WENDIGO_SCORE "Wendigos Killed" -#define TENDRIL_CLEAR_SCORE "Tendrils Killed" +#define NEST_CLEAR_SCORE "Nests Destroyed" diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm index ca45d5939eec..39b355318f0c 100644 --- a/code/datums/achievements/boss_achievements.dm +++ b/code/datums/achievements/boss_achievements.dm @@ -2,10 +2,10 @@ category = "Bosses" icon = "baseboss" -/datum/award/achievement/boss/tendril_exterminator - name = "Tendril Exterminator" +/datum/award/achievement/boss/nest_exterminator + name = "Nest Exterminator" desc = "Watch your step" - database_id = BOSS_MEDAL_TENDRIL + database_id = BOSS_MEDAL_NEST icon = "tendril" /datum/award/achievement/boss/boss_killer @@ -55,23 +55,11 @@ database_id = BOSS_MEDAL_LEGION icon = "legion" -/datum/award/achievement/boss/swarmer_beacon_kill - name = "Swarm Beacon Killer" - desc = "GET THEM OFF OF ME!" - database_id = BOSS_MEDAL_SWARMERS - icon = "swarmer" - /datum/award/achievement/boss/wendigo_kill name = "Wendigo Killer" desc = "You've now ruined years of mythical storytelling." database_id = BOSS_MEDAL_WENDIGO -/datum/award/achievement/boss/king_goat_kill - name = "King Goat Killer" - desc = "The king is dead, long live the king!" - database_id = BOSS_MEDAL_KINGGOAT - icon = "goatboss" - /datum/award/achievement/boss/blood_miner_crusher name = "Blood-drunk Miner Crusher" desc = "I guess he couldn't handle his drink that well." @@ -112,18 +100,7 @@ desc = "We were many... now we are none." database_id = BOSS_MEDAL_LEGION_CRUSHER -/datum/award/achievement/boss/swarmer_beacon_crusher - name = "Swarm Beacon Crusher" - desc = "GET THEM OFF OF ME!" - database_id = BOSS_MEDAL_SWARMERS_CRUSHER - /datum/award/achievement/boss/wendigo_crusher name = "Wendigo Crusher" desc = "You've now ruined years of mythical storytelling." database_id = BOSS_MEDAL_WENDIGO_CRUSHER - -/datum/award/achievement/boss/king_goat_crusher - name = "King Goat Crusher" - desc = "The king is dead, long live the king!" - database_id = BOSS_MEDAL_KINGGOAT_CRUSHER - icon = "goatboss" diff --git a/code/datums/achievements/boss_scores.dm b/code/datums/achievements/boss_scores.dm index 7cf2fa886183..c0135e6c68a1 100644 --- a/code/datums/achievements/boss_scores.dm +++ b/code/datums/achievements/boss_scores.dm @@ -1,7 +1,7 @@ -/datum/award/score/tendril_score - name = "Tendril Score" +/datum/award/score/nest_score + name = "Nest Score" desc = "Watch your step" - database_id = TENDRIL_CLEAR_SCORE + database_id = NEST_CLEAR_SCORE /datum/award/score/boss_score name = "Bosses Killed" @@ -43,11 +43,6 @@ desc = "You've killed HOW many?" database_id = LEGION_SCORE -/datum/award/score/swarmer_beacon_score - name = "Swarmer Beacons Killed" - desc = "You've killed HOW many?" - database_id = SWARMER_BEACON_SCORE - /datum/award/score/wendigo_score name = "Wendigos Killed" desc = "You've killed HOW many?" diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index f18002a05bd3..728a3bd44b86 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -18,8 +18,6 @@ /obj/effect/hotspot, /obj/effect/landmark, /obj/effect/temp_visual, - /obj/effect/light_emitter/tendril, - /obj/effect/collapse, /obj/effect/particle_effect/ion_trails, /obj/effect/dummy/phased_mob, /obj/effect/mapping_helpers, diff --git a/code/datums/mapgen/planetary/AsteroidGenerator.dm b/code/datums/mapgen/planetary/AsteroidGenerator.dm index 737194b5ee28..dc5c27ac79e7 100644 --- a/code/datums/mapgen/planetary/AsteroidGenerator.dm +++ b/code/datums/mapgen/planetary/AsteroidGenerator.dm @@ -111,10 +111,8 @@ ) feature_spawn_list = list( + /obj/structure/spawner/burrow/asteroid = 3, /obj/structure/geyser/random = 1, - /obj/structure/spawner/mining/goliath = 1, - /obj/structure/spawner/mining = 1, - /obj/structure/spawner/mining/hivelord = 1, /obj/structure/vein/asteroid = 5, /obj/structure/vein/classtwo/asteroid = 10, /obj/structure/vein/classthree/asteroid = 5 @@ -161,7 +159,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 5, - /obj/structure/spawner/mining/carp = 5, + /obj/structure/spawner/carp = 5, /obj/structure/vein/asteroid = 10, /obj/structure/vein/classtwo/asteroid = 15, /obj/structure/vein/classthree/asteroid = 12 diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index 45ae4a7120cc..077065c8e44e 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -180,7 +180,7 @@ feature_spawn_chance = 0.5 feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, - /obj/structure/spawner/ice_moon = 1, + /obj/structure/spawner/burrow/jungle_planet = 1, /obj/effect/spawner/lootdrop/anomaly/jungle = 1 ) diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index ef66cca1103f..bca54d019397 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -120,9 +120,7 @@ /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/crystal = 1, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/forgotten = 1, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/crystal = 1, - /obj/structure/spawner/lavaland/low_threat = 8, - /obj/structure/spawner/lavaland/medium_threat = 3, - /obj/structure/spawner/lavaland/high_threat = 1, + /obj/structure/spawner/burrow/lava_planet = 10 ) /datum/biome/lavaland/forest @@ -242,10 +240,7 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, - /obj/structure/spawner/lavaland/low_threat = 8, - /obj/structure/spawner/lavaland/medium_threat = 3, - /obj/structure/spawner/lavaland/high_threat = 2, - /obj/structure/spawner/lavaland/extreme_threat = 1 + /obj/structure/spawner/burrow/lava_planet = 10 ) flora_spawn_chance = 1 flora_spawn_list = list( diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index c675c87714f5..30349a2ea53b 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -160,8 +160,8 @@ /obj/structure/vein/classtwo = 2, /obj/structure/elite_tumor = 1, /obj/structure/vein/classthree = 1, + /obj/structure/spawner/burrow/rock_plant = 4, /obj/effect/spawner/minefield = 1, - /obj/structure/spawner/ice_moon/rockplanet = 4, /obj/effect/spawner/lootdrop/anomaly/rock/cave = 1, ) mob_spawn_chance = 6 diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index 91fad1430a47..1431ab53c6b9 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -217,9 +217,7 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/asteroid/goldgrub = 20, - /obj/structure/spawner/lavaland/sand_world/low_threat = 14, - /obj/structure/spawner/lavaland/sand_world/medium_threat = 8, - /obj/structure/spawner/lavaland/sand_world/high_threat = 2, + /obj/structure/spawner/burrow/sand_planet = 25 ) /datum/biome/cave/sand/volcanic diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index 8489cbb970ba..7fddcd176c66 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -102,8 +102,7 @@ mob_spawn_chance = 1 mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/wolf/random = 30, - /obj/structure/spawner/ice_moon = 2, - /obj/structure/spawner/ice_moon/polarbear = 2, + /obj/structure/spawner/burrow/ice_planet = 4, /mob/living/simple_animal/hostile/asteroid/polarbear/random = 30, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, @@ -115,9 +114,7 @@ feature_spawn_list = list( /obj/effect/spawner/lootdrop/anomaly/ice = 12, /obj/effect/spawner/lootdrop/anomaly/big = 1, - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13, + /obj/structure/spawner/burrow/ice_planet = 80, /obj/structure/vein/ice = 25, /obj/effect/spawner/minefield = 2, /obj/structure/vein/ice/classtwo = 50, @@ -171,8 +168,7 @@ ) feature_spawn_chance = 0.1 feature_spawn_list = list( - /obj/structure/spawner/ice_moon = 2, - /obj/structure/spawner/ice_moon/polarbear = 2, + /obj/structure/spawner/burrow/ice_planet = 4, /obj/structure/statue/snow/snowman = 3, /obj/structure/statue/snow/snowlegion = 1, /obj/structure/vein/ice = 3, @@ -181,8 +177,7 @@ ) mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/wolf/random = 30, - /obj/structure/spawner/ice_moon = 2, - /obj/structure/spawner/ice_moon/polarbear = 2, + /obj/structure/spawner/burrow/ice_planet = 2, /mob/living/simple_animal/hostile/asteroid/polarbear/random = 30, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, @@ -219,10 +214,7 @@ feature_spawn_list = list( /obj/effect/spawner/lootdrop/anomaly/ice = 100, /obj/effect/spawner/lootdrop/anomaly/big = 1, - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 200, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 400, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 40, - /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 1, + /obj/structure/spawner/burrow/ice_planet/hard = 600, /obj/structure/vein/ice = 300, /obj/structure/vein/ice/classtwo = 500, /obj/structure/vein/ice/classthree = 50, @@ -264,8 +256,7 @@ mob_spawn_chance = 2 mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/wolf/random = 30, - /obj/structure/spawner/ice_moon = 2, - /obj/structure/spawner/ice_moon/polarbear = 2, + /obj/structure/spawner/burrow/ice_planet = 4, /mob/living/simple_animal/hostile/asteroid/polarbear/random = 30, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, @@ -275,12 +266,8 @@ ) feature_spawn_chance = 0.2 feature_spawn_list = list( - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 20, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 40, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 5, - /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 1, - /obj/structure/spawner/ice_moon = 20, - /obj/structure/spawner/ice_moon/polarbear = 20, + /obj/structure/spawner/burrow/ice_planet = 60, + /obj/structure/spawner/burrow/ice_planet = 40, /obj/effect/spawner/lootdrop/anomaly/ice/cave = 10, /obj/structure/vein/ice = 30, /obj/structure/vein/ice/classtwo = 50, diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index c6e1244be129..9b100412a391 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -263,10 +263,7 @@ /mob/living/simple_animal/bot/secbot/ed209/rockplanet = 3, /mob/living/simple_animal/hostile/abandoned_minebot = 15, /mob/living/simple_animal/bot/floorbot/rockplanet = 15, - /obj/structure/spawner/wasteplanet/hivebot/low_threat = 20, - /obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10, - /obj/structure/spawner/wasteplanet/hivebot/high_threat = 5, - /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2 + /obj/structure/spawner/hivebot = 35 ) /datum/biome/waste/metal/rust @@ -421,10 +418,7 @@ /mob/living/simple_animal/bot/secbot/ed209/rockplanet = 3, /mob/living/simple_animal/hostile/abandoned_minebot = 15, /mob/living/simple_animal/bot/floorbot/rockplanet = 15, - /obj/structure/spawner/wasteplanet/hivebot/low_threat = 20, - /obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10, - /obj/structure/spawner/wasteplanet/hivebot/high_threat = 5, - /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2 + /obj/structure/spawner/hivebot = 20 ) /datum/biome/cave/waste/metal/hivebot @@ -448,15 +442,11 @@ mob_spawn_list = list( //Whoops! All hivebots! /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80, /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged = 50, - /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 50, - + /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 50 ) mob_spawn_chance = 30 feature_spawn_list = list( - /obj/structure/spawner/wasteplanet/hivebot/low_threat = 20, - /obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10, - /obj/structure/spawner/wasteplanet/hivebot/high_threat = 5, - /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2, + /obj/structure/spawner/hivebot = 1, /obj/effect/spawner/minefield/manhack = 2 ) feature_spawn_chance = 2 //hivebot biomes should have their dongles diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 865ca17e7d50..a76334a0b7ea 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -737,35 +737,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return 1 return 0 -/obj/item/legion_staff - icon_state = "legion_staff" - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - name = "legionnaire staff" - desc = "The remnants of a legionnaire, reconstructed around a pole of bone. The skulls it produces are loyal to the wielder, seeming to recognize them as their host body." - icon = 'icons/obj/guns/magic.dmi' - block_chance = 20 - force = 20 - throwforce = 10 - throw_speed = 4 - attack_verb = list("bit", "gnawed", "chomped") - w_class = WEIGHT_CLASS_NORMAL - slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT - hitsound = 'sound/weapons/bite.ogg' - var/next_use_time - -/obj/item/legion_staff/attack_self(mob/user) - if(next_use_time > world.time) - user.visible_message("[src] rattles in [user]'s hands, but nothing happens...") - to_chat(user, "You need to wait longer to use this again.") - return - user.visible_message("[user] raises the [src] and summons a legion skull!") - for(var/i in 1 to 3) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff/LegionSkull = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff(user.loc) - LegionSkull.faction = user.faction.Copy() - LegionSkull.friends += user - next_use_time = world.time + 6 SECONDS - /obj/item/claymore/bone name = "Bone Sword" desc = "Jagged pieces of bone are tied to what looks like a goliaths femur." diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/geyser.dm similarity index 100% rename from code/game/objects/structures/lavaland/geyser.dm rename to code/game/objects/structures/geyser.dm diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm deleted file mode 100644 index 00124d781d80..000000000000 --- a/code/game/objects/structures/hivebot.dm +++ /dev/null @@ -1,112 +0,0 @@ -/obj/structure/hivebot_beacon - name = "beacon" - desc = "Some odd beacon thing." - icon = 'icons/mob/hivebot.dmi' - icon_state = "def_radar-off" - anchored = TRUE - density = TRUE - var/bot_type = "norm" - var/bot_amt = 10 - var/spawn_time_min - var/spawn_time_max - -/obj/structure/hivebot_beacon/Initialize() - . = ..() - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, loc) - smoke.start() - visible_message("[src] warps in!") - playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE) - addtimer(CALLBACK(src, PROC_REF(warpbots)), rand(spawn_time_min, spawn_time_max)) - -/obj/structure/hivebot_beacon/proc/warpbots() - icon_state = "def_radar" - visible_message("[src] turns on!") - while(bot_amt > 0) - bot_amt-- - switch(bot_type) - if("norm") - new /mob/living/simple_animal/hostile/hivebot(get_turf(src)) - if("range") - new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src)) - if("rapid") - new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src)) - - sleep(100) - visible_message("[src] warps out!") - playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE) - qdel(src) - return - -/obj/structure/spawner/wasteplanet/hivebot - name = "hivebot fabricator" - desc = "An active fabricator, creating hivebots out of resources from below the surface." - - icon = 'icons/obj/machines/bsm.dmi' - icon_state = "bsm_on" - - faction = list("mining") - max_mobs = 5 - max_integrity = 250 - mob_types = list( - /mob/living/simple_animal/hostile/hivebot/wasteplanet = 40, - /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged = 40, - /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 10, - /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 5, - /mob/living/simple_animal/hostile/hivebot/mechanic = 5 - ) - spawn_text = "crawls out of" - spawn_sound = list('sound/effects/suitstep2.ogg') - move_resist = INFINITY - anchored = TRUE - resistance_flags = FIRE_PROOF | LAVA_PROOF - var/obj/effect/light_emitter/hivespawner/emitted_light - -/obj/structure/spawner/wasteplanet/hivebot/Initialize() - . = ..() - emitted_light = new(loc) - -/obj/structure/spawner/wasteplanet/hivebot/deconstruct(disassembled) - destroy_effect() - drop_loot() - return ..() - -/obj/structure/spawner/wasteplanet/hivebot/Destroy() - QDEL_NULL(emitted_light) - return ..() - -/obj/structure/spawner/wasteplanet/hivebot/proc/destroy_effect() - playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) - visible_message("[src] begins to rattle and shake, sparks flying off of it!") - - -/obj/structure/spawner/wasteplanet/hivebot/proc/drop_loot() - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, loc) - smoke.start() - new /obj/effect/particle_effect/sparks(loc) - new /obj/effect/spawner/lootdrop/waste/hivebot/beacon(loc) - -/obj/effect/light_emitter/hivespawner - set_luminosity = 4 - set_cap = 2.5 - light_color = COLOR_RED_LIGHT - - -/obj/structure/spawner/wasteplanet/hivebot/low_threat - max_mobs = 4 - spawn_time = 300 - -/obj/structure/spawner/wasteplanet/hivebot/medium_threat - max_mobs = 5 - spawn_time = 250 - -/obj/structure/spawner/wasteplanet/hivebot/high_threat - max_mobs = 7 - spawn_time = 200 - -/obj/structure/spawner/wasteplanet/hivebot/extreme_threat - max_mobs = 10 - spawn_time = 150 - - diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm deleted file mode 100644 index 4bb23877462b..000000000000 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ /dev/null @@ -1,1014 +0,0 @@ -GLOBAL_LIST_INIT(ore_probability, list( - /obj/item/stack/ore/uranium = 50, - /obj/item/stack/ore/iron = 50, - /obj/item/stack/ore/plasma = 75, - /obj/item/stack/ore/silver = 50, - /obj/item/stack/ore/gold = 50, - /obj/item/stack/ore/diamond = 25, - /obj/item/stack/ore/titanium = 75, - /obj/item/pickaxe/diamond = 15, - /obj/item/borg/upgrade/modkit/cooldown = 5, - /obj/item/borg/upgrade/modkit/damage = 5, - /obj/item/borg/upgrade/modkit/range = 5, - /obj/item/t_scanner/adv_mining_scanner/lesser = 15, - /obj/item/kinetic_crusher = 15, - /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, - /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, - /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, - /obj/item/tank/jetpack/suit = 10, - /obj/item/survivalcapsule = 15, - /obj/item/reagent_containers/hypospray/medipen/survival = 15, - /obj/item/gps/mining = 10, - /obj/item/extraction_pack = 10, - /obj/item/reagent_containers/food/drinks/beer = 15, - )) - -/obj/structure/spawner/ice_moon - name = "cave entrance" - desc = "A hole in the ground, filled with monsters ready to defend it." - faction = list("mining") - max_mobs = 3 - max_integrity = 250 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf) - move_resist = INFINITY - anchored = TRUE - -/obj/structure/spawner/ice_moon/Initialize() - . = ..() - clear_rock() - -/** - * Clears rocks around the spawner when it is created - * - */ -/obj/structure/spawner/ice_moon/proc/clear_rock() - for(var/turf/F in RANGE_TURFS(2, src)) - if(abs(src.x - F.x) + abs(src.y - F.y) > 3) - continue - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/structure/spawner/ice_moon/deconstruct(disassembled) - destroy_effect() - drop_loot() - return ..() - -/** - * Effects and messages created when the spawner is destroyed - * - */ -/obj/structure/spawner/ice_moon/proc/destroy_effect() - playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) - visible_message("[src] collapses, sealing everything inside!\nOres fall out of the cave as it is destroyed!") - -/** - * Drops items after the spawner is destroyed - * - */ -/obj/structure/spawner/ice_moon/proc/drop_loot() - for(var/type in GLOB.ore_probability) - var/chance = GLOB.ore_probability[type] - if(!prob(chance)) - continue - new type(loc, rand(5, 10)) - -/obj/structure/spawner/ice_moon/polarbear - max_mobs = 1 - spawn_time = 60 SECONDS - mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear) - -/obj/structure/spawner/ice_moon/polarbear/clear_rock() - for(var/turf/F in RANGE_TURFS(1, src)) - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/structure/spawner/ice_moon/demonic_portal - name = "demonic portal" - desc = "A portal that goes to another world, normal creatures couldn't survive there. When it collapses, who knows where it will go?" - icon_state = "nether" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon) - light_range = 1 - light_color = COLOR_SOFT_RED - spawn_time = 300 - -/obj/structure/spawner/ice_moon/demonic_portal/clear_rock() - for(var/turf/F in RANGE_TURFS(3, src)) - if(abs(src.x - F.x) + abs(src.y - F.y) > 5) - continue - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/structure/spawner/ice_moon/demonic_portal/Initialize() - . = ..() - -/obj/structure/spawner/ice_moon/demonic_portal/destroy_effect() - new /obj/effect/collapsing_demonic_portal(loc) - -/obj/structure/spawner/ice_moon/demonic_portal/drop_loot() - return - -/obj/structure/spawner/ice_moon/rockplanet - name = "gruboid den" - desc = "Though gruboid are typically nomadic creatures, they gather in small surface caves to reproduce. They're unlikely to be happy about being disturbed." - max_mobs = 3 - spawn_time = 60 SECONDS - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/rockplanet, /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/rockplanet) - -/obj/structure/spawner/ice_moon/rockplanet/clear_rock() - for(var/turf/F in RANGE_TURFS(1, src)) - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/effect/collapsing_demonic_portal - name = "collapsing demonic portal" - desc = "It's slowly fading! Get ready to fight whatever comes through!" - layer = TABLE_LAYER - icon = 'icons/mob/nest.dmi' - icon_state = "nether" - anchored = TRUE - density = TRUE - -/obj/effect/collapsing_demonic_portal/Initialize() - . = ..() - playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) - visible_message("[src] begins to collapse! As it fails, it connects to a random dimensional point and pulls through what it finds!") - animate(src, transform = matrix().Scale(0, 1), alpha = 50, time = 5 SECONDS) - addtimer(CALLBACK(src, PROC_REF(collapse)), 5 SECONDS) - -/** - * Handles portal deletion - * - */ -/obj/effect/collapsing_demonic_portal/proc/collapse() - drop_loot() - qdel(src) - -//portal types go here - -/obj/structure/spawner/ice_moon/demonic_portal/brimdemon - mob_types = list(/mob/living/simple_animal/hostile/asteroid/brimdemon) - -/obj/structure/spawner/ice_moon/demonic_portal/ice_whelp - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp) - -/obj/structure/spawner/ice_moon/demonic_portal/snowlegion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril) - -/obj/structure/spawner/ice_moon/demonic_portal/low_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/brimdemon = 35, - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 15, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 35, - /mob/living/simple_animal/hostile/asteroid/ice_demon = 15 - ) - max_mobs = 5 - spawn_time = 300 - -/obj/structure/spawner/ice_moon/demonic_portal/medium_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/brimdemon = 25, - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 25, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 25, - /mob/living/simple_animal/hostile/asteroid/ice_demon = 25 - ) - max_mobs = 7 - spawn_time = 300 -/obj/structure/spawner/ice_moon/demonic_portal/high_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/brimdemon = 15, - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 35, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 15, - /mob/living/simple_animal/hostile/asteroid/ice_demon = 35 - ) - max_mobs = 7 - spawn_time = 200 - -/obj/structure/spawner/ice_moon/demonic_portal/extreme_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/brimdemon = 10, - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 25, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 15, - /mob/living/simple_animal/hostile/asteroid/ice_demon = 50 - ) - max_mobs = 10 - spawn_time = 200 - -//I think there's room to make portal types drop loot/spawn monsters based on the loot list but that's out of scope for what I'm doing - -/** - * Drops loot from the portal. Uses variable difficulty based on drops- more valulable rewards will also add additional enemies to the attack wave. - * If you manage to win big and get a bunch of major rich loot, you will also be faced with a big mob of angries. - * Absolutely deranged use of probability code below, trigger warning - */ -/obj/effect/collapsing_demonic_portal/proc/drop_loot() - visible_message("Something slips out of [src]!") - var/loot = rand(1, 21) - switch(loot) - if(1)//Clown hell. God help you if you roll this. - visible_message("You can hear screaming and joyful honking.")//now THIS is what we call a critical failure - playsound(loc,'sound/spookoween/ghosty_wind.ogg', 100, FALSE, 50, TRUE, TRUE) - playsound(loc,'sound/spookoween/scary_horn3.ogg', 100, FALSE, 50, TRUE, TRUE) - if(prob(15)) - new /mob/living/simple_animal/hostile/clown/clownhulk(loc) - new /mob/living/simple_animal/hostile/clown/longface(loc) - new /mob/living/simple_animal/hostile/clown/clownhulk/chlown(loc) - new /obj/item/shield/energy/bananium(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/clown/banana(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - new /mob/living/simple_animal/hostile/clown/clownhulk/chlown - new /mob/living/simple_animal/hostile/clown/honkling(loc) - if(prob(25)) - new /obj/item/grenade/spawnergrenade/clown(loc) - new /obj/item/grenade/spawnergrenade/clown(loc) - new /mob/living/simple_animal/hostile/clown/clownhulk(loc) - if(prob(10)) - new /mob/living/simple_animal/hostile/clown/mutant/blob(loc)//oh god oh fuck - new /obj/machinery/syndicatebomb/badmin/clown(loc) - if(prob(35)) - new /obj/item/storage/backpack/duffelbag/clown/syndie(loc) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - new /mob/living/simple_animal/hostile/clown/honkling(loc) - else - new /obj/item/storage/backpack/duffelbag/clown/cream_pie(loc) - new /mob/living/simple_animal/hostile/clown/honkling(loc) - if(prob(25)) - new /obj/item/borg/upgrade/transform/clown(loc) - new /mob/living/simple_animal/hostile/clown/stacked(loc) - if(prob(35)) - new /obj/item/megaphone/clown(loc) - new /mob/living/simple_animal/hostile/clown/stacked(loc) - if(prob(25)) - new /obj/item/reagent_containers/spray/waterflower/lube(loc) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - if(prob(35)) - new /obj/item/clothing/suit/space/hardsuit/clown(loc) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - if(prob(25)) - new /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat(loc) - new /mob/living/simple_animal/hostile/clown/fleshclown(loc) - if(prob(25))//you lost - new /obj/item/circlegame(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone(loc) - if(2)//basic demonic incursion - visible_message("You glimpse an indescribable abyss in the portal. Horrifying monsters appear in a gout of flame.") - playsound(loc,'sound/hallucinations/wail.ogg', 200, FALSE, 50, TRUE, TRUE) - if(prob(35)) - new /obj/item/clothing/glasses/godeye(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - if(prob(45)) - new /obj/item/pickaxe/drill/jackhammer/demonic(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - if(prob(45)) - new /obj/item/wisp_lantern(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - new /mob/living/simple_animal/hostile/netherworld(loc) - if(prob(25)) - new /mob/living/simple_animal/hostile/netherworld(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - if(prob(5)) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - if(prob(45)) - new /obj/item/nullrod/staff(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - if(prob(30)) - new /obj/item/clothing/suit/space/hardsuit/quixote/dimensional(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - else - new /obj/item/immortality_talisman(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - if(prob(30)) - new /obj/item/shared_storage/red(loc) - new /mob/living/simple_animal/hostile/netherworld(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - if(prob(30)) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - if(prob(30)) - new /obj/item/book/granter/spell/traps(loc) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - if(prob(30)) - new /mob/living/simple_animal/hostile/netherworld/blankbody(loc) - new /mob/living/simple_animal/hostile/netherworld(loc) - new /mob/living/simple_animal/hostile/netherworld/migo(loc) - new /mob/living/simple_animal/hostile/netherworld(loc) - new /turf/open/indestructible/necropolis(loc) - if(3)//skeleton/religion association, now accepting YOUR BONES - visible_message("Bones rattle and strained voices chant a forgotten god's name.") - playsound(loc,'sound/ambience/ambiholy.ogg', 100, FALSE, 50, TRUE, TRUE) - if(prob(30)) - new /obj/item/reagent_containers/glass/bottle/potion/flight(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - else - new /obj/item/clothing/neck/memento_mori(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - if(prob(35)) - new /obj/item/storage/box/holy_grenades(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - if(prob(40)) - new /obj/item/claymore(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - if(prob(45)) - new /obj/item/gun/ballistic/bow(loc) - new /obj/item/storage/bag/quiver(loc) - new /obj/item/ammo_casing/caseless/arrow/bronze(loc) - new /obj/item/ammo_casing/caseless/arrow/bronze(loc) - new /obj/item/ammo_casing/caseless/arrow/bronze(loc) - new /obj/item/ammo_casing/caseless/arrow/bronze(loc) - new /obj/item/ammo_casing/caseless/arrow/bronze(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - if(prob(30)) - new /obj/item/stack/sheet/mineral/wood/fifty(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - if(prob(35)) - new /obj/item/staff/bostaff(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - if(prob(25)) - new /obj/item/shield/riot/roman(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - if(prob(55)) - new /obj/item/clothing/suit/armor/riot/knight/blue(loc) - new /obj/item/clothing/head/helmet/knight/blue(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - new /mob/living/simple_animal/hostile/human/skeleton(loc) - new /obj/item/instrument/trombone(loc) - new /obj/item/stack/sheet/bone(loc) - new /obj/item/stack/sheet/bone(loc) - new /obj/item/stack/sheet/bone(loc) - new /obj/item/stack/sheet/bone(loc) - new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) - new /turf/open/floor/mineral/silver(loc) - if(4)//syndicate incursion. Again, high-quality loot at low chances, this time with excessive levels of danger - visible_message("Radio chatter echoes out from the portal. Red-garbed figures step through, weapons raised.") - playsound(loc,'sound/effects/radiohiss.ogg', 200, FALSE, 50, TRUE, TRUE) - playsound(loc,'sound/ambience/antag/tatoralert.ogg', 75, FALSE, 50, TRUE, TRUE) - if(prob(35)) - if(prob(15)) - new /obj/item/clothing/suit/space/hardsuit/syndi/elite(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - else - if(prob(50)) - new /obj/item/clothing/suit/space/hardsuit/syndi(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - else - new /obj/item/clothing/suit/space/hardsuit/syndi(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - if(prob(25))//the real prize - new /obj/effect/spawner/lootdrop/donkpockets(loc) - new /obj/effect/spawner/lootdrop/donkpockets(loc) - new /obj/effect/spawner/lootdrop/donkpockets(loc) - if(prob(35)) - new /obj/item/clothing/shoes/magboots/syndie(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - if(prob(25)) - new /obj/item/gun/ballistic/automatic/pistol/syndicate(loc) - new /obj/item/ammo_box/magazine/ - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) - if(prob(25)) - new /obj/item/gun/ballistic/automatic/pistol/tec9(loc) - new /obj/item/ammo_box/magazine/tec9(loc) - new /obj/item/ammo_box/magazine/tec9(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) - if(prob(35)) - new /obj/item/clothing/gloves/rapid(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - if(prob(35)) - new /obj/item/wrench/combat(loc) - new /obj/item/storage/toolbox/syndicate(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) - if(prob(35)) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(loc) - if(prob(35)) - new /obj/item/borg/upgrade/transform/assault(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) - if(prob(25)) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - if(prob(25)) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - if(prob(25)) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) - new /obj/item/storage/backpack/duffelbag/syndie/c4(loc) - if(prob(35)) - new /obj/item/storage/belt/military(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) - if(prob(35)) - new /obj/item/kinetic_crusher/syndie_crusher(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - if(prob(25)) - new /obj/item/card/id/syndicate/anyone(loc) - if(prob(35)) - new /obj/item/clothing/glasses/thermal/syndi(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) - if(prob(35)) - new /obj/item/reagent_containers/hypospray(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) - if(prob(25)) - new /obj/item/card/emag(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) - new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) - new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) - new /turf/open/floor/mineral/plastitanium/red(loc) - if(5)//;HELP BLOB IN MEDICAL - visible_message("You hear a robotic voice saying something about a \"Delta-level biohazard\".") - playsound(loc,'sound/ai/outbreak5.ogg', 100, FALSE, 50, TRUE, TRUE) - playsound(loc,'sound/misc/bloblarm.ogg', 50, FALSE, 50, TRUE, TRUE) - if(prob(35)) - new /obj/item/circuitboard/machine/chem_dispenser(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(35)) - new /obj/item/storage/box/hypospray/CMO(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(15)) - new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(loc) - if(prob(45)) - new /obj/item/defibrillator(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(45)) - new /obj/item/circuitboard/machine/stasis(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(45)) - new /obj/item/stack/medical/suture/medicated(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(45)) - new /obj/item/stack/medical/mesh/advanced(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(35)) - new /obj/item/gun/syringe/syndicate(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(25)) - new /obj/item/healthanalyzer/advanced(loc) - if(prob(35)) - new /obj/item/storage/firstaid/advanced(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(35)) - new /obj/item/storage/firstaid/tactical(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(loc) - else - new /obj/item/storage/firstaid/regular(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(prob(35)) - new /obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - else - new /obj/effect/mob_spawn/human/doctor(loc) - if(prob(35)) - new /obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - else - new /obj/effect/mob_spawn/human/doctor(loc) - if(prob(35)) - new /obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - else - new /obj/effect/mob_spawn/human/doctor(loc) - new /obj/item/healthanalyzer(loc) - new /turf/open/floor/carpet/nanoweave/beige(loc) - new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc) - if(6)//teleporty ice world. Incomplete. - visible_message("You glimpse a frozen, empty plane. Something stirs in the fractal abyss.") - playsound(loc,'sound/ambience/ambisin3.ogg', 150, FALSE, 50, TRUE, TRUE) - if(prob(45)) - new /obj/item/warp_cube/red(loc) - new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc) - if(prob(45)) - new /obj/item/clothing/suit/drfreeze_coat(loc) - new /obj/item/clothing/under/costume/drfreeze(loc) - new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc) - new /mob/living/simple_animal/hostile/bear/snow(loc) - if(prob(45)) - new /obj/item/freeze_cube(loc) - new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc) - if(prob(55)) - new /obj/item/clothing/shoes/winterboots/ice_boots(loc) - new /mob/living/simple_animal/hostile/bear/snow(loc) - new /obj/effect/decal/remains/human(loc) - new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc) - new /turf/open/floor/plating/ice/smooth(loc) - if(7)//FUCK FUCK HELP SWARMERS IN VAULT - visible_message("Something beeps. Small, glowing forms spill out of the portal en masse!") - playsound(loc,'sound/ambience/ambitech.ogg', 150, FALSE, 50, TRUE, TRUE) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(45)) - new /obj/item/construction/rcd/loaded(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(35)) - new /obj/item/holosign_creator/atmos(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/vendor(loc) - new /obj/item/vending_refill/engivend(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(45)) - new /obj/item/tank/jetpack/oxygen(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(25)) - new /obj/item/stack/sheet/metal/fifty(loc) - new /obj/item/grenade/chem_grenade/smart_metal_foam(loc) - new /obj/item/grenade/chem_grenade/smart_metal_foam(loc) - new /obj/item/grenade/chem_grenade/smart_metal_foam(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(35)) - new /obj/item/stack/sheet/metal/fifty(loc) - new /obj/item/clothing/glasses/meson/engine(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(25)) - new /obj/item/stack/sheet/metal/twenty(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(25)) - new /obj/item/storage/toolbox/infiltrator(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(25)) - new /obj/machinery/portable_atmospherics/canister/oxygen(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /obj/item/clothing/gloves/color/latex/engineering(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/swarmer/ai(loc) - new /obj/item/clothing/gloves/color/latex/engineering(loc) - new /obj/effect/mob_spawn/human/engineer(loc) - new /turf/open/floor/circuit/telecomms(loc) - if(8)//Literally blood-drunk. - visible_message("Blood sprays from the portal. An ichor-drenched figure steps through!") - playsound(loc,'sound/magic/enter_blood.ogg', 150, FALSE, 50, TRUE, TRUE) - new /obj/effect/gibspawner/human(loc) - new /obj/effect/gibspawner/human(loc) - new /obj/effect/gibspawner/human(loc) - new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc) - if(prob(50)) - new /obj/item/gem/bloodstone(loc) - if(prob(25)) - new /obj/item/seeds/tomato/blood(loc) - new /turf/open/floor/plating/asteroid/basalt(loc) - if(9)//Now's your chance to be a [[BIG SHOT]] - visible_message("You hear the sound of big money and bigger avarice.") - playsound(loc,'sound/lavaland/cursed_slot_machine_jackpot.ogg', 150, FALSE, 50, TRUE, TRUE) - new /obj/structure/cursed_slot_machine(loc) - if(prob(35)) - new /obj/item/spacecash/bundle/mediumrand(loc) - new /obj/item/spacecash/bundle/mediumrand(loc) - new /obj/item/coin/gold(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - if(prob(35)) - new /obj/item/clothing/mask/spamton(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - if(prob(35)) - new /obj/item/gem/fdiamond(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - else - new /obj/item/gem/rupee(loc) - if(prob(35)) - new /obj/item/coin/gold(loc) - new /obj/item/coin/gold(loc) - new /obj/item/stack/sheet/mineral/gold/twenty(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - if(prob(35)) - new /obj/item/storage/fancy/cigarettes/cigpack_robustgold(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - if(prob(35)) - new /obj/item/clothing/head/collectable/petehat(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - new /mob/living/simple_animal/hostile/faithless(loc) - new /turf/open/floor/mineral/gold(loc) - if(10)//hivebot factory - visible_message("You catch a brief glimpse of a vast production complex. One of the assembly lines outputs through the portal!") - playsound(loc,'sound/ambience/antag/clockcultalr.ogg', 100, FALSE, 50, TRUE, TRUE) - if(prob(45)) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /mob/living/simple_animal/hostile/hivebot(loc) - if(prob(35)) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /mob/living/simple_animal/hostile/hivebot(loc) - if(prob(25)) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /mob/living/simple_animal/hostile/hivebot/strong(loc) - if(prob(35)) - new /obj/item/stack/sheet/mineral/silver/twenty(loc) - new /obj/item/stack/sheet/mineral/titanium/twenty(loc) - new /obj/item/stack/sheet/mineral/gold/twenty(loc) - new /mob/living/simple_animal/hostile/hivebot/strong(loc) - if(prob(35)) - new /obj/item/circuitboard/computer/solar_control(loc) - new /obj/item/electronics/tracker(loc) - new /obj/item/solar_assembly(loc) - new /obj/item/solar_assembly(loc) - new /obj/item/solar_assembly(loc) - new /obj/item/solar_assembly(loc) - if(prob(45)) - new /obj/item/stack/circuit_stack(loc) - new /mob/living/simple_animal/hostile/hivebot/mechanic(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/hivebot/range(loc) - if(prob(45)) - new /obj/item/circuitboard/machine/dna_vault(loc) - new /mob/living/simple_animal/hostile/hivebot/mechanic(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/recycler(loc) - new /mob/living/simple_animal/hostile/hivebot/mechanic(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/recharger(loc) - new /mob/living/simple_animal/hostile/hivebot/mechanic(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/smoke_machine(loc) - new /mob/living/simple_animal/hostile/hivebot/mechanic(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/ore_silo(loc) - new /mob/living/simple_animal/hostile/hivebot/mechanic(loc) - if(prob(35)) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc) - new /mob/living/simple_animal/hostile/hivebot/strong(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/medipen_refiller(loc) - new /mob/living/simple_animal/hostile/hivebot(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/stasis(loc) - new /mob/living/simple_animal/hostile/hivebot(loc) - if(prob(50)) - new /obj/item/stack/sheet/metal/fifty(loc) - new /obj/item/stack/sheet/glass/fifty(loc) - new /obj/item/stack/cable_coil/yellow(loc) - new /obj/item/storage/box/lights/bulbs(loc) - new /mob/living/simple_animal/hostile/hivebot(loc) - new /mob/living/simple_animal/hostile/hivebot(loc) - new /mob/living/simple_animal/hostile/hivebot/strong(loc) - new /obj/machinery/conveyor(loc) - new /turf/open/floor/circuit/red(loc) - if(11)//miner's last moments - visible_message("The familiar sound of an ash storm greets you. A miner steps through the portal, stumbles, and collapses.") - playsound(loc,'sound/weather/ashstorm/outside/weak_end.ogg', 150, FALSE, 50, TRUE, TRUE) - if(prob(35)) - new /obj/item/disk/design_disk/modkit_disc/resonator_blast(loc) - if(prob(25)) - new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(loc) - if(prob(25)) - new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(loc) - if(prob(25)) - new /obj/item/disk/design_disk/modkit_disc/bounty(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/vending/mining_equipment(loc) - if(prob(45)) - new /obj/item/vending_refill/mining_equipment(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - if(prob(35)) - new /obj/item/reagent_containers/hypospray/medipen/survival(loc) - if(prob(35)) - new /obj/item/fulton_core(loc) - new /obj/item/extraction_pack(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - if(prob(45)) - new /obj/item/t_scanner/adv_mining_scanner/lesser(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - if(prob(45)) - new /obj/item/gibtonite(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - if(prob(45)) - new /obj/item/clothing/glasses/meson/night(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - if(prob(50)) - new /obj/item/kinetic_crusher(loc) - else - new /obj/item/gun/energy/kinetic_accelerator(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc) - new /obj/effect/mob_spawn/human/miner(loc) - new /turf/open/floor/plating/asteroid/basalt(loc) - if(12)//sailing the ocean blue - visible_message("Water pours out of the portal, followed by a strange vessel. It's occupied.") - playsound(loc,'sound/ambience/shore.ogg', 150, FALSE, 50, TRUE, TRUE) - new /obj/vehicle/ridden/lavaboat/dragon(loc) - new /obj/item/oar(loc) - if(prob(50)) - new /obj/item/clothing/under/costume/sailor(loc) - if(prob(50)) - new /obj/item/pneumatic_cannon/speargun(loc) - new /obj/item/storage/backpack/magspear_quiver(loc) - new /obj/item/throwing_star/magspear(loc) - new /obj/item/throwing_star/magspear(loc) - new /obj/item/throwing_star/magspear(loc) - new /obj/item/throwing_star/magspear(loc) - new /obj/item/throwing_star/magspear(loc) - new /mob/living/simple_animal/hostile/carp(loc) - if(prob(45)) - new /obj/item/clothing/suit/space/hardsuit/carp(loc) - new /mob/living/simple_animal/hostile/carp(loc) - if(prob(45)) - new /mob/living/simple_animal/hostile/carp(loc) - if(prob(45)) - new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc) - new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/carp/megacarp(loc) - if(prob(25)) - new /obj/item/book/granter/martial/carp(loc) - new /mob/living/simple_animal/hostile/carp/megacarp(loc) - if(prob(35)) - new /obj/item/grenade/spawnergrenade/spesscarp(loc) - new /mob/living/simple_animal/hostile/carp/megacarp(loc) - new /mob/living/simple_animal/hostile/carp/megacarp(loc) - new /mob/living/simple_animal/hostile/carp(loc) - new /turf/open/water(loc) - if(13)//hydroponics forest - visible_message("You catch a glimpse of a strange forest. Smells like weed and bad choices.") - playsound(loc,'sound/ambience/shore.ogg', 150, FALSE, 50, TRUE, TRUE) - if(prob(45)) - new /obj/item/circuitboard/machine/biogenerator(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(35)) - new /obj/item/gun/energy/floragun(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/seed_extractor(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(45)) - new /obj/item/circuitboard/machine/plantgenes(loc) - else - new /obj/item/circuitboard/machine/hydroponics(loc) - if(prob(15)) - new /obj/item/circuitboard/machine/hydroponics(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(15)) - new /obj/item/circuitboard/machine/hydroponics(loc) - if(prob(5)) - new /obj/item/seeds/gatfruit(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(45)) - new /obj/item/seeds/random(loc) - if(prob(45)) - new /obj/item/seeds/random(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(45)) - new /obj/item/seeds/random(loc) - if(prob(45)) - new /obj/item/seeds/random(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - if(prob(50)) - new /obj/item/seeds/random(loc) - if(prob(45)) - new /obj/item/seeds/cannabis(loc) - new /obj/item/clothing/gloves/botanic_leather(loc) - new /obj/item/cultivator/rake(loc) - new /obj/structure/spacevine(loc) - new /mob/living/simple_animal/hostile/venus_human_trap(loc) - new /turf/open/floor/plating/grass(loc) - if(14)//fallout ss13 - visible_message("You hear a geiger counter click and smell ash.") - playsound(loc,'sound/items/radiostatic.ogg', 100, FALSE, 50, TRUE, TRUE) - if(prob(50)) - new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola(loc) - new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola(loc) - new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola(loc) - new /mob/living/simple_animal/hostile/cockroach/glockroach(loc) - if(prob(50)) - new /obj/structure/radioactive/stack(loc) - new /mob/living/simple_animal/hostile/cockroach/glockroach(loc) - if(prob(45)) - new /obj/item/stack/sheet/mineral/uranium/twenty(loc) - new /mob/living/simple_animal/hostile/cockroach/glockroach(loc) - if(prob(35)) - new /obj/item/clothing/head/radiation(loc) - new /obj/item/clothing/suit/radiation(loc) - if(prob(45)) - new /obj/item/gun/energy/decloner(loc) - new /mob/living/simple_animal/hostile/cockroach/glockroach(loc) - new /obj/item/geiger_counter(loc) - new /mob/living/simple_animal/hostile/cockroach/glockroach(loc) - new /turf/open/floor/plating/dirt(loc) - if(15)//the backroom freezer - visible_message("The faint hallogen glow of a faraway kitchen greets you.") - if(prob(45)) - new /obj/item/kitchen/knife/bloodletter(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(55)) - new /obj/item/clothing/gloves/butchering(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(45)) - new /obj/item/reagent_containers/food/snacks/store/bread/meat(loc) - new /obj/item/reagent_containers/food/snacks/store/bread/meat(loc) - new /obj/item/reagent_containers/food/snacks/store/bread/meat(loc) - if(prob(55)) - new /obj/item/reagent_containers/food/snacks/store/cake/trumpet(loc) - if(prob(35)) - new /obj/item/reagent_containers/food/snacks/pizza/dank(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(25)) - new /obj/item/reagent_containers/food/snacks/meat/steak/gondola(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(35)) - new /obj/item/reagent_containers/food/snacks/burger/roburgerbig(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(35)) - new /obj/item/kitchen/knife/butcher(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(35)) - new /obj/item/flamethrower/full(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(45)) - new /obj/item/sharpener(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(25)) - new /obj/item/sharpener/super(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/gibber(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/chem_master/condi(loc) - new /mob/living/simple_animal/hostile/killertomato(loc) - new /mob/living/simple_animal/hostile/alien/maid(loc) - new /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor(loc) - if(16)//legion miniboss - visible_message("The ground quakes. An immense figure reaches through the portal, crouching to squeeze through.") - playsound(loc,'sound/magic/knock.ogg', 100, FALSE, 50, TRUE, TRUE) - new /mob/living/simple_animal/hostile/big_legion(loc) - if(prob(75)) - new /obj/structure/closet/crate/necropolis/tendril/greater(loc) - new /turf/open/indestructible/necropolis(loc) - if(17)//xenobiologist's hubris - visible_message("You catch a glimpse of a wobbling sea of slimy friends. An abused-looking keeper slips through the portal.") - playsound(loc,'sound/effects/footstep/slime1.ogg', 100, FALSE, 50, TRUE, TRUE) - if(prob(25)) - new /obj/item/slime_extract/adamantine(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(35)) - new /obj/item/slime_extract/gold(loc) - if(prob(25)) - new /mob/living/simple_animal/slime/random(loc) - if(prob(45)) - new /obj/item/extinguisher/advanced(loc) - if(prob(25)) - new /obj/item/slimepotion/slime/renaming(loc) - new /mob/living/simple_animal/slime/random(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(25)) - new /obj/item/slimepotion/slime/sentience(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(25)) - new /mob/living/simple_animal/slime/random(loc) - if(prob(45)) - new /obj/item/circuitboard/computer/xenobiology(loc) - new /obj/item/slime_extract/grey(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(45)) - new /obj/item/circuitboard/machine/processor/slime(loc) - new /mob/living/simple_animal/slime/random(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(25)) - new /obj/item/shield/adamantineshield(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(45)) - new /obj/item/slime_cookie/purple(loc) - new /obj/item/slime_cookie/purple(loc) - new /obj/item/slime_cookie/purple(loc) - if(prob(45)) - new /obj/item/storage/box/monkeycubes(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(35)) - new /obj/item/slimepotion/speed(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(45)) - new /obj/item/slimepotion/slime/slimeradio(loc) - new /mob/living/simple_animal/slime/random(loc) - if(prob(35)) - new /mob/living/simple_animal/pet/dog/corgi/puppy/slime(loc) - new /obj/effect/mob_spawn/human/scientist(loc) - new /turf/open/floor/mineral/titanium/purple(loc) - new /mob/living/simple_animal/slime/random(loc) - if(18)//hey, free elite tumor! - visible_message("A large, pulsating structure falls through the portal and crashes to the floor.") - playsound(loc,'sound/effects/break_stone.ogg', 100, FALSE, 50, TRUE, TRUE) - new /obj/structure/elite_tumor(loc) - new /turf/open/floor/plating/asteroid/basalt(loc) - if(19)//*you flush the toilet.* - visible_message("You hear the faint noise of a long flush.") - new /obj/structure/toilet(loc) - new /obj/effect/decal/remains(loc) - new /obj/item/newspaper(loc) - new /turf/open/floor/plastic(loc) - new /obj/item/clothing/head/papersack/smiley(loc) //welcome to the bathroom - if(20)//Research & Zombies - visible_message("Flashing lights and quarantine alarms echo through the portal. You smell rotting flesh and plasma.") - playsound(loc,'sound/misc/bloblarm.ogg', 120, FALSE, 50, TRUE, TRUE) - if(prob(35)) - new /obj/item/storage/box/rndboards(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(35)) - new /obj/item/storage/box/stockparts/deluxe(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(15)) - new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(15)) - new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(15)) - new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(15)) - new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(30)) - new /obj/item/circuitboard/machine/rdserver(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(35)) - new /obj/item/research_notes/loot/big(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - else - new /obj/item/research_notes/loot/medium(loc) - if(prob(35)) - new /obj/item/research_notes/loot/medium(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - else - new /obj/item/research_notes/loot/small(loc) - if(prob(35)) - new /obj/item/pneumatic_cannon(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(prob(45)) - new /obj/item/research_notes/loot/medium(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - else - new /obj/item/research_notes/loot/small(loc) - new/turf/open/floor/mineral/titanium/purple(loc) - new /mob/living/simple_animal/hostile/human/zombie(loc) - if(21)//Silverback's locker room - visible_message("You catch a glimpse of verdant green. Smells like a locker room.") - playsound(loc,'sound/creatures/gorilla.ogg', 75, FALSE, 50, TRUE, TRUE) - new /mob/living/simple_animal/hostile/gorilla(loc) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /obj/item/circuitboard/machine/dnascanner(loc) - if(prob(35)) - new /obj/item/circuitboard/computer/scan_consolenew(loc) - if(prob(25)) - new /obj/item/reagent_containers/hypospray/medipen/magillitis(loc) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /obj/item/dnainjector/thermal(loc) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /obj/item/storage/box/gorillacubes(loc) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /obj/item/dnainjector/hulkmut(loc) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /obj/item/dnainjector/gigantism(loc) - if(prob(45)) - new /obj/item/dnainjector/dwarf(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/gorilla(loc) - if(prob(35)) - new /mob/living/simple_animal/hostile/gorilla(loc) - new /obj/item/dnainjector/telemut/darkbundle(loc) - if(prob(35)) - new /obj/item/dnainjector/insulated(loc) - new /mob/living/simple_animal/hostile/gorilla(loc) - new /obj/item/sequence_scanner(loc) - new /obj/structure/flora/grass/jungle(loc) - new /turf/open/floor/plating/grass/jungle(loc) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm deleted file mode 100644 index b3c9a8cbf230..000000000000 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ /dev/null @@ -1,187 +0,0 @@ -//Necropolis Tendrils, which spawn lavaland monsters and break into a chasm when killed -/obj/structure/spawner/lavaland - name = "necropolis tendril" - desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." - - icon_state = "tendril" - - faction = list("mining") - max_mobs = 5 - max_integrity = 450 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) - - move_resist = INFINITY // just killing it tears a massive hole in the ground, let's not move it - anchored = TRUE - resistance_flags = FIRE_PROOF | LAVA_PROOF - - hitsound_type = PROJECTILE_HITSOUND_FLESH - - var/gps = null - var/obj/effect/light_emitter/tendril/emitted_light - -GLOBAL_LIST_INIT(tendrils, list()) -/obj/structure/spawner/lavaland/Initialize() - . = ..() - emitted_light = new(loc) - for(var/F in RANGE_TURFS(1, src)) - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - GLOB.tendrils += src - -/obj/structure/spawner/lavaland/deconstruct(disassembled) - new /obj/effect/collapse(loc) - new /obj/structure/closet/crate/necropolis/tendril(loc) - return ..() - - -/obj/structure/spawner/lavaland/Destroy() - var/last_tendril = TRUE - if(GLOB.tendrils.len>1) - last_tendril = FALSE - - if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1)) - if(SSachievements.achievements_enabled) - for(var/mob/living/L in view(7,src)) - if(L.stat || !L.client) - continue - L.client.give_award(/datum/award/achievement/boss/tendril_exterminator, L) - L.client.give_award(/datum/award/score/tendril_score, L) //Progresses score by one - GLOB.tendrils -= src - QDEL_NULL(emitted_light) - return ..() - -/obj/effect/light_emitter/tendril - set_luminosity = 4 - set_cap = 2.5 - light_color = LIGHT_COLOR_LAVA - -/obj/effect/collapse - name = "collapsing necropolis tendril" - desc = "Get clear!" - layer = TABLE_LAYER - icon = 'icons/mob/nest.dmi' - icon_state = "tendril" - anchored = TRUE - density = TRUE - var/obj/effect/light_emitter/tendril/emitted_light - -/obj/effect/collapse/Initialize() - . = ..() - emitted_light = new(loc) - visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") - visible_message("Something falls free of the tendril!") - playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) - addtimer(CALLBACK(src, PROC_REF(collapse)), 50) - -/obj/effect/collapse/Destroy() - QDEL_NULL(emitted_light) - return ..() - -/obj/effect/collapse/proc/collapse() - for(var/mob/M in range(7,src)) - shake_camera(M, 15, 1) - playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, TRUE) - visible_message("The tendril falls inward, the ground around it erupting into bubbling lava!") //WS edit. - for(var/turf/T in range(2,src)) - if(!T.density) - T.TerraformTurf(/turf/open/lava/smooth/lava_land_surface, /turf/open/lava/smooth/lava_land_surface, flags = CHANGETURF_INHERIT_AIR) //WS edit, instead of chasms this produces lava instead. - qdel(src) - - //these are good for mappers and already see use in some maps. - -/obj/structure/spawner/lavaland/goliath - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) - -/obj/structure/spawner/lavaland/legion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) - -/obj/structure/spawner/lavaland/icewatcher - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing) - -/obj/structure/spawner/lavaland/whitesandsbasilisk - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands) - - //these are ones that we want to see spawning on worlds. - -/obj/structure/spawner/lavaland/low_threat //this is the most common one, it shouldn't be a huge issue for most players. - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 20 - ) - max_mobs = 4 - spawn_time = 300 - -/obj/structure/spawner/lavaland/medium_threat //this is less common. It starts getting dangerous here. - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 20 - ) - max_mobs = 6 - spawn_time = 200 //they spawn a little faster - -/obj/structure/spawner/lavaland/high_threat //this should be rare. People will have trouble with this. - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 20 - ) - max_mobs = 9 - spawn_time = 200 - -/obj/structure/spawner/lavaland/extreme_threat //extremely rare - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 20 - ) - max_mobs = 12 - spawn_time = 150 //bring a friend and some automatic weapons - -//and sand world ones. More legions, no brimdemons, no icewings. - -/obj/structure/spawner/lavaland/sand_world/low_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40, - /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40 - ) - max_mobs = 5 - spawn_time = 300 - -/obj/structure/spawner/lavaland/sand_world/medium_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40, - /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40 - ) - max_mobs = 7 - spawn_time = 200 - -/obj/structure/spawner/lavaland/sand_world/high_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40, - /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40 - ) - max_mobs = 10 - spawn_time = 200 - -/obj/structure/spawner/lavaland/sand_world/extreme_threat - mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40, - /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40 - ) - max_mobs = 12 - spawn_time = 150 diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm deleted file mode 100644 index d44606a1a57b..000000000000 --- a/code/game/objects/structures/spawner.dm +++ /dev/null @@ -1,153 +0,0 @@ -GLOBAL_LIST_INIT(astroloot, list( - /obj/item/stack/ore/uranium = 50, - /obj/item/stack/ore/iron = 50, - /obj/item/stack/ore/plasma = 75, - /obj/item/stack/ore/silver = 50, - /obj/item/stack/ore/gold = 50, - /obj/item/stack/ore/diamond = 25, - /obj/item/stack/ore/hellstone = 5, - /obj/item/stack/ore/titanium = 75, - /obj/item/pickaxe/diamond = 15, - /obj/item/borg/upgrade/modkit/cooldown = 5, - /obj/item/borg/upgrade/modkit/damage = 5, - /obj/item/borg/upgrade/modkit/range = 5, - /obj/item/t_scanner/adv_mining_scanner/lesser = 15, - /obj/item/kinetic_crusher = 15, - /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, - /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, - /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, - /obj/item/tank/jetpack/suit = 10, - /obj/item/survivalcapsule = 15, - /obj/item/reagent_containers/hypospray/medipen/survival = 15, - /obj/item/gps/mining = 10, - /obj/item/extraction_pack = 10, - /obj/item/reagent_containers/food/drinks/beer = 15, - )) - -/obj/structure/spawner - name = "monster nest" - icon = 'icons/mob/nest.dmi' - icon_state = "hole" - max_integrity = 100 - - move_resist = MOVE_FORCE_EXTREMELY_STRONG - anchored = TRUE - density = TRUE - - var/max_mobs = 5 - var/spawn_time = 300 //30 seconds default - var/mob_types = list(/mob/living/simple_animal/hostile/carp) - var/spawn_text = "emerges from" - var/faction = list("hostile") - var/spawn_sound = list('sound/effects/break_stone.ogg') - var/spawner_type = /datum/component/spawner - var/spawn_distance_min = 1 - var/spawn_distance_max = 1 - -/obj/structure/spawner/Initialize() - . = ..() - AddComponent(spawner_type, mob_types, spawn_time, faction, spawn_text, max_mobs, spawn_sound, spawn_distance_min, spawn_distance_max) - -/obj/structure/spawner/attack_animal(mob/living/simple_animal/M) - if(faction_check(faction, M.faction, FALSE)&&!M.client) - return - ..() - - -/obj/structure/spawner/syndicate - name = "warp beacon" - icon = 'icons/obj/device.dmi' - icon_state = "syndbeacon" - spawn_text = "warps in from" - mob_types = list(/mob/living/simple_animal/hostile/human/syndicate/ranged) - faction = list(ROLE_SYNDICATE) - -/obj/structure/spawner/skeleton - name = "bone pit" - desc = "A pit full of bones, and some still seem to be moving..." - max_integrity = 150 - max_mobs = 15 - spawn_time = 150 - mob_types = list(/mob/living/simple_animal/hostile/human/skeleton) - spawn_text = "climbs out of" - faction = list("skeleton") - -/obj/structure/spawner/clown - name = "Laughing Larry" - desc = "A laughing, jovial figure. Something seems stuck in his throat." - icon_state = "clownbeacon" - icon = 'icons/obj/device.dmi' - max_integrity = 200 - max_mobs = 15 - spawn_time = 150 - mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) - spawn_text = "climbs out of" - faction = list("clown") - -/obj/structure/spawner/carp - name = "carp spawn" //the non game spawn meaning - desc = "A puddle, which appears to be full of carp" - icon_state = "puddle" - icon = 'icons/obj/watercloset.dmi' - max_integrity = 150 - max_mobs = 5 - spawn_time = 1200 - mob_types = list(/mob/living/simple_animal/hostile/carp) - spawn_text = "climbs out of" - faction = list("carp") - -/obj/structure/spawner/mining/proc/adestroy_effect() - playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) - visible_message("[src] collapses, sealing everything inside!\nOres fall out of the cave as it is destroyed!") - -/obj/structure/spawner/mining - name = "monster den" - desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." - max_mobs = 3 - spawn_text = "crawls out of" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) - faction = list("mining") - density = 0 - -/obj/structure/spawner/mining/deconstruct(disassembled) - adestroy_effect() - drop_astroloot() - return ..() - -/obj/structure/spawner/mining/proc/drop_astroloot() - for(var/type in GLOB.astroloot) - var/chance = GLOB.astroloot[type] - if(!prob(chance)) - continue - new type(loc, rand(5, 17)) - -/obj/structure/spawner/mining/goldgrub - name = "goldgrub den" - desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) - -/obj/structure/spawner/mining/goliath - name = "goliath den" - desc = "A den housing a nest of goliaths, oh god why?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) - -/obj/structure/spawner/mining/hivelord - name = "hivelord den" - desc = "A den housing a nest of hivelords." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) - -/obj/structure/spawner/mining/basilisk - name = "basilisk den" - desc = "A den housing a nest of basilisks, bring a coat." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) - -/obj/structure/spawner/mining/wumborian - name = "wumborian fugu den" - desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) - -/obj/structure/spawner/mining/carp - name = "carp den" - desc = "A den housing a nest of space carp, seems fishy!" - mob_types = list(/mob/living/simple_animal/hostile/carp) - spawn_text = "emerges from" diff --git a/code/modules/mining/equipment/trophies.dm b/code/modules/mining/equipment/trophies.dm index a9631c7ffc15..3510a0b59628 100644 --- a/code/modules/mining/equipment/trophies.dm +++ b/code/modules/mining/equipment/trophies.dm @@ -30,7 +30,7 @@ desc = "A sliced-off goliath tentacle." icon_state = "goliath_tentacle" -//ancient goliath0 +//ancient goliath /obj/item/mob_trophy/elder_tentacle name = "elder tentacle" desc = "The barbed tip of a tentacle sliced from an incredibly ancient goliath." diff --git a/code/modules/mining/ore_veins.dm b/code/modules/mining/ore_veins.dm index cfd908c23cbb..32b1ffeab8d5 100644 --- a/code/modules/mining/ore_veins.dm +++ b/code/modules/mining/ore_veins.dm @@ -40,8 +40,8 @@ GLOBAL_LIST_EMPTY(ore_veins) var/max_mobs = 6 var/spawn_time = 150 //15 seconds var/mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 60, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 20, + /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 20, /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, ) var/spawn_text = "emerges from" @@ -126,11 +126,11 @@ GLOBAL_LIST_EMPTY(ore_veins) max_mobs = 6 spawn_time = 100 mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 60, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 30, + /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 30, /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 5, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/tendril = 5, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/nest = 5, ) /obj/structure/vein/classthree @@ -149,18 +149,18 @@ GLOBAL_LIST_EMPTY(ore_veins) max_mobs = 6 //Best not to go past 6 due to balance and lag reasons spawn_time = 80 mob_types = list( - /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 60, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 30, + /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 30, /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/tendril = 10, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/nest = 10, ) /obj/structure/vein/ice mob_types = list( /mob/living/simple_animal/hostile/asteroid/wolf = 30, /mob/living/simple_animal/hostile/asteroid/polarbear = 30, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 20, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/nest = 20, /mob/living/simple_animal/hostile/asteroid/ice_demon = 10, /mob/living/simple_animal/hostile/asteroid/ice_whelp = 5, /mob/living/simple_animal/hostile/asteroid/lobstrosity = 20, diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 00a32a8dc449..03faa787d155 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -322,4 +322,3 @@ Difficulty: Extremely Hard var/turf/T = get_turf(target) mineral_scan_pulse(T, world.view + 1) . = ..() - diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 0c13b9d67f16..04723d80ba5a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -49,9 +49,6 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe mob_biotypes = MOB_ROBOTIC gps_name = "Hungry Signal" - achievement_type = /datum/award/achievement/boss/swarmer_beacon_kill - crusher_achievement_type = /datum/award/achievement/boss/swarmer_beacon_crusher - score_achievement_type = /datum/award/score/swarmer_beacon_score faction = list("mining", "boss", "swarmer") weather_immunities = list("lava","ash") stop_automated_movement = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index d10b9b86fb9b..b03363e956f1 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -1,4 +1,3 @@ -#define LEGIONVIRUS_TYPE /datum/disease/transformation/legionvirus #define BULLET_SHELL_DAMAGE 1 //A beast that fire freezing blasts. @@ -204,7 +203,6 @@ projectiletype = /obj/projectile/temp/basilisk/heated #undef BULLET_SHELL_DAMAGE -#undef LEGIONVIRUS_TYPE //Watcher /mob/living/simple_animal/hostile/asteroid/basilisk/watcher @@ -340,8 +338,8 @@ if(istype(L)) L.apply_status_effect(/datum/status_effect/freon/watcher) -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril - fromtendril = TRUE +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/nest + from_nest = TRUE /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/forgotten name = "forgotten watcher" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index cb7eaad0e988..94dd221945b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -185,7 +185,6 @@ move_to_delay = 5 mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_ICON - butcher_results = list() guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) deathmessage = "falls to the ground." status_flags = CANPUSH diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index bf8552ba5cb0..e4478b705f45 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -250,10 +250,7 @@ health = 180 speed = 4 //mob_trophy = /obj/item/mob_trophy/elder_tentacle - pre_attack_icon = "ancient_goliath_preattack" - throw_message = "does nothing to the rocky hide of the" guaranteed_butcher_results = list() - trophy_drop_mod = 75 wander = FALSE bonus_tame_chance = 10 var/list/cached_tentacle_turfs @@ -280,9 +277,9 @@ else cached_tentacle_turfs -= t -/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril +/mob/living/simple_animal/hostile/asteroid/goliath/beast/nest butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/sinew = 2) - fromtendril = TRUE + from_nest = TRUE //tentacles /obj/effect/temp_visual/goliath_tentacle diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 5158c80d056a..b5d539086ac7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -164,7 +164,7 @@ if(stored_mob) stored_mob.forceMove(get_turf(src)) stored_mob = null - else if(fromtendril) + else if(from_nest) new /obj/effect/mob_spawn/human/corpse/charredskeleton(T) else if(dwarf_mob) new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf(T) @@ -172,11 +172,11 @@ new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T) ..(gibbed) -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril - fromtendril = TRUE +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest + from_nest = TRUE -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/tendril - fromtendril = TRUE +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/nest + from_nest = TRUE /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/death(gibbed) move_force = MOVE_FORCE_DEFAULT @@ -320,7 +320,7 @@ /mob/living/simple_animal/hostile/big_legion/Initialize() .=..() - AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril), 200, faction, "peels itself off from", 3) + AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest), 200, faction, "peels itself off from", 3) // Snow Legion /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow @@ -345,8 +345,8 @@ icon_aggro = "snowlegion_head" icon_dead = "snowlegion_head" -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril - fromtendril = TRUE +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/nest + from_nest = TRUE /mob/living/simple_animal/hostile/asteroid/hivelord/legion/crystal name = "disfigured legion" @@ -376,7 +376,7 @@ P.fire(i*(360/5)) return ..() -//Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into lava or fell into chasms. +//nest-spawned Legion remains, the charred skeletons of those whose bodies sank into lava or fell into chasms. /obj/effect/mob_spawn/human/corpse/charredskeleton name = "charred skeletal remains" burn_damage = 1000 @@ -413,19 +413,16 @@ ) ) - switch(type) - if("Miner") - outfit = /datum/outfit/generic/miner - if("Assistant") - outfit = /datum/outfit/generic - if("Engineer") - outfit = /datum/outfit/generic/engineer - if("Doctor") - outfit = /datum/outfit/generic/doctor - if("Scientist") - outfit = /datum/outfit/generic/science - if("Cargo") - outfit = /datum/outfit/generic/cargo - if("Security") - outfit = /datum/outfit/generic/security + var/outfit_map = list( + "Miner" = /datum/outfit/generic/miner, + "Assistant" = /datum/outfit/generic, + "Engineer" = /datum/outfit/generic/engineer, + "Doctor" = /datum/outfit/generic/doctor, + "Scientist" = /datum/outfit/generic/science, + "Cargo" = /datum/outfit/generic/cargo, + "Security" = /datum/outfit/generic/security + ) + + outfit = outfit_map[type] // Access outfit directly + . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm similarity index 100% rename from code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm rename to code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm similarity index 100% rename from code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm rename to code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index 19334bc84fcd..6beb2f23b9e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -15,7 +15,7 @@ var/mob_trophy var/throw_message = "bounces off of" var/throw_deflection = 20 //WS edit - Whitesands - var/fromtendril = FALSE + var/from_nest = FALSE see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE @@ -70,7 +70,7 @@ /mob/living/simple_animal/hostile/asteroid/death(gibbed) SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type) - if(prob(trophy_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item + if(prob(trophy_drop_mod)) //on average, you'll need to kill 5 creatures before getting the item spawn_mob_trophy() ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 55d873cf036a..25827781b4b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -167,48 +167,3 @@ attack_verb_simple = "punch" deathmessage = "falls apart into a fine dust." phaser = FALSE - -/obj/structure/spawner/nether - name = "netherworld link" - desc = null //see examine() - icon_state = "nether" - max_integrity = 50 - spawn_time = 600 //1 minute - max_mobs = 15 - spawn_text = "crawls through" - mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody) - faction = list("nether") - -/obj/structure/spawner/nether/Initialize() - .=..() - START_PROCESSING(SSprocessing, src) - -/obj/structure/spawner/nether/examine(mob/user) - . = ..() - if(isskeleton(user) || iszombie(user)) - . += "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!" - else - . += "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea." - -/obj/structure/spawner/nether/attack_hand(mob/user) - . = ..() - if(isskeleton(user) || iszombie(user)) - to_chat(user, "You don't feel like going home yet...") - else - user.visible_message("[user] is violently pulled into the link!", \ - "Touching the portal, you are quickly pulled through into a world of unimaginable horror!") - contents.Add(user) - -/obj/structure/spawner/nether/process() - for(var/mob/living/M in contents) - if(M) - playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) - M.adjustBruteLoss(60) - new /obj/effect/gibspawner/generic(get_turf(M), M) - if(M.stat == DEAD) - var/mob/living/simple_animal/hostile/netherworld/blankbody/blank - blank = new(loc) - blank.name = "[M]" - blank.desc = "It's [M], but [M.p_their()] flesh has an ashy texture, and [M.p_their()] face is featureless save an eerie smile." - src.visible_message("[M] reemerges from the link!") - qdel(M) diff --git a/code/modules/mob_spawner/burrow.dm b/code/modules/mob_spawner/burrow.dm new file mode 100644 index 000000000000..f8d4c31bc87f --- /dev/null +++ b/code/modules/mob_spawner/burrow.dm @@ -0,0 +1,109 @@ +GLOBAL_LIST_INIT(ore_probability, list( + /obj/item/stack/ore/plasma = 75, + /obj/item/stack/ore/iron = 75, + /obj/item/stack/ore/titanium = 50, + /obj/item/stack/ore/silver = 50, + /obj/item/stack/ore/gold = 50, + /obj/item/stack/ore/uranium = 50, + /obj/item/stack/ore/diamond = 25, + /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, + /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25, + /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25 + )) + +/obj/structure/spawner/burrow + name = "burrow entrance" + desc = "A hole in the ground, filled with fauna ready to defend it." + max_integrity = 250 + faction = list("mining") + max_mobs = 3 + +/obj/structure/spawner/burrow/Initialize() + . = ..() + clear_rock() + +/** + * Clears rocks around the spawner when it is created + * + */ +/obj/structure/spawner/burrow/proc/clear_rock() + for(var/turf/F in RANGE_TURFS(2, src)) + if(abs(src.x - F.x) + abs(src.y - F.y) > 3) + continue + if(ismineralturf(F)) + var/turf/closed/mineral/M = F + M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) + +/obj/structure/spawner/burrow/deconstruct(disassembled) + destroy_effect() + drop_loot() + return ..() + +/** + * Effects and messages created when the spawner is destroyed + * + */ +/obj/structure/spawner/burrow/proc/destroy_effect() + playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) + visible_message("[src] collapses, sealing everything inside!\nOres fall out of the burrow as it is destroyed!") + +/** + * Drops items after the spawner is destroyed + * + */ +/obj/structure/spawner/burrow/proc/drop_loot() + for(var/type in GLOB.ore_probability) + var/chance = GLOB.ore_probability[type] + if(!prob(chance)) + continue + new type(loc, rand(5, 10)) + +/obj/structure/spawner/burrow/lava_planet + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 27, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 26, + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/nest = 26, + /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1 + ) + +/obj/structure/spawner/burrow/sand_planet + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 40, + /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40, + /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 20 + ) + +/obj/structure/spawner/burrow/ice_planet + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/wolf, + /mob/living/simple_animal/hostile/asteroid/polarbear + ) + +/obj/structure/spawner/burrow/ice_planet/hard + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/brimdemon = 35, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/nest = 35, + /mob/living/simple_animal/hostile/asteroid/ice_whelp = 15, + /mob/living/simple_animal/hostile/asteroid/ice_demon = 15 + ) + +/obj/structure/spawner/burrow/jungle_planet + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/wolf/random, + /mob/living/simple_animal/hostile/retaliate/bat, + /mob/living/simple_animal/hostile/retaliate/poison/snake + ) + +/obj/structure/spawner/burrow/rock_plant + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/goliath/beast/rockplanet, + /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/rockplanet + ) + +/obj/structure/spawner/burrow/asteroid + mob_types = list ( + /mob/living/simple_animal/hostile/asteroid/goliath, + /mob/living/simple_animal/hostile/asteroid/hivelord, + /mob/living/simple_animal/hostile/carp + ) diff --git a/code/modules/mob_spawner/hivebot.dm b/code/modules/mob_spawner/hivebot.dm new file mode 100644 index 000000000000..630ed6f6f3c7 --- /dev/null +++ b/code/modules/mob_spawner/hivebot.dm @@ -0,0 +1,50 @@ +/obj/structure/spawner/hivebot + name = "hivebot fabricator" + desc = "An active fabricator, creating hivebots out of resources from below the surface." + + icon = 'icons/obj/machines/bsm.dmi' + icon_state = "bsm_on" + + faction = list("mining") + max_integrity = 250 + mob_types = list( + /mob/living/simple_animal/hostile/hivebot/wasteplanet = 40, + /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged = 40, + /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 10, + /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 5, + /mob/living/simple_animal/hostile/hivebot/mechanic = 5 + ) + spawn_text = "crawls out of" + spawn_sound = list('sound/effects/suitstep2.ogg') + resistance_flags = FIRE_PROOF | LAVA_PROOF + var/obj/effect/light_emitter/hivespawner/emitted_light + +/obj/structure/spawner/hivebot/Initialize() + . = ..() + emitted_light = new(loc) + +/obj/structure/spawner/hivebot/deconstruct(disassembled) + destroy_effect() + drop_loot() + return ..() + +/obj/structure/spawner/hivebot/Destroy() + QDEL_NULL(emitted_light) + return ..() + +/obj/structure/spawner/hivebot/proc/destroy_effect() + playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) + visible_message("[src] begins to rattle and shake, sparks flying off of it!") + + +/obj/structure/spawner/hivebot/proc/drop_loot() + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(2, loc) + smoke.start() + new /obj/effect/particle_effect/sparks(loc) + new /obj/effect/spawner/lootdrop/waste/hivebot/beacon(loc) + +/obj/effect/light_emitter/hivespawner + set_luminosity = 4 + set_cap = 2.5 + light_color = COLOR_RED_LIGHT diff --git a/code/modules/mob_spawner/spawner.dm b/code/modules/mob_spawner/spawner.dm new file mode 100644 index 000000000000..f5cfdadd0e96 --- /dev/null +++ b/code/modules/mob_spawner/spawner.dm @@ -0,0 +1,40 @@ +/obj/structure/spawner + name = "monster nest" + icon = 'icons/mob/nest.dmi' + icon_state = "hole" + max_integrity = 100 + + move_resist = INFINITY + anchored = TRUE + density = TRUE + + var/max_mobs = 5 + var/spawn_time = 300 //30 seconds default + var/mob_types = list(/mob/living/simple_animal/hostile/carp) + var/spawn_text = "emerges from" + var/faction = list("hostile") + var/spawn_sound = list('sound/effects/break_stone.ogg') + var/spawner_type = /datum/component/spawner + var/spawn_distance_min = 1 + var/spawn_distance_max = 1 + +/obj/structure/spawner/Initialize() + . = ..() + AddComponent(spawner_type, mob_types, spawn_time, faction, spawn_text, max_mobs, spawn_sound, spawn_distance_min, spawn_distance_max) + +/obj/structure/spawner/attack_animal(mob/living/simple_animal/M) + if(faction_check(faction, M.faction, FALSE)&&!M.client) + return + ..() + +/obj/structure/spawner/carp + name = "carp spawn" //the non game spawn meaning + desc = "A puddle, which appears to be full of carp" + icon_state = "puddle" + icon = 'icons/obj/watercloset.dmi' + max_integrity = 150 + max_mobs = 5 + spawn_time = 1200 + mob_types = list(/mob/living/simple_animal/hostile/carp) + spawn_text = "swims out of" + faction = list("carp") diff --git a/code/datums/components/spawner.dm b/code/modules/mob_spawner/spawner_componet.dm similarity index 99% rename from code/datums/components/spawner.dm rename to code/modules/mob_spawner/spawner_componet.dm index aab5bb6ea08a..8a904a5504c4 100644 --- a/code/datums/components/spawner.dm +++ b/code/modules/mob_spawner/spawner_componet.dm @@ -14,7 +14,6 @@ var/wave_timer var/current_timerid - /datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs, _spawn_sound, _spawn_distance_min, _spawn_distance_max, _wave_length, _wave_downtime) if(_spawn_time) spawn_time=_spawn_time diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index b231ea902371..8c2496ce05ab 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -40,7 +40,6 @@ /obj/structure/lavaland/ash_walker/deconstruct(disassembled) new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs))) - new /obj/effect/collapse(loc) return ..() /obj/structure/lavaland/ash_walker/process() diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index c47205a27323..c34d5cf7c985 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -55,18 +55,6 @@ range = 3 newVars = list("emagged" = 2, "remote_disabled" = 1,"shoot_sound" = 'sound/weapons/laser.ogg',"projectile" = /obj/projectile/beam/laser, "declare_arrests" = 0,"name" = "Wizard's Justicebot") -/obj/effect/proc_holder/spell/aoe_turf/conjure/linkWorlds - name = "Link Worlds" - desc = "A whole new dimension for you to play with! They won't be happy about it, though." - invocation = "WTF" - clothes_req = FALSE - charge_max = 600 - cooldown_min = 200 - summon_type = list(/obj/structure/spawner/nether) - summon_amt = 1 - range = 1 - cast_sound = 'sound/weapons/marauder.ogg' - /obj/effect/proc_holder/spell/targeted/conjure_item name = "Summon weapon" desc = "A generic spell that should not exist. This summons an instance of a specific type of item, or if one already exists, un-summons it. Summons into hand if possible." diff --git a/shiptest.dme b/shiptest.dme index 4f6f1e910dc4..90c6abbc9310 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -526,7 +526,6 @@ #include "code\datums\components\sizzle.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\soulstoned.dm" -#include "code\datums\components\spawner.dm" #include "code\datums\components\spill.dm" #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" @@ -1357,13 +1356,13 @@ #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" +#include "code\game\objects\structures\geyser.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" #include "code\game\objects\structures\guillotine.dm" #include "code\game\objects\structures\guncase.dm" #include "code\game\objects\structures\headpike.dm" -#include "code\game\objects\structures\hivebot.dm" #include "code\game\objects\structures\holosign.dm" #include "code\game\objects\structures\janicart.dm" #include "code\game\objects\structures\kitchen_spike.dm" @@ -1391,7 +1390,6 @@ #include "code\game\objects\structures\showcase.dm" #include "code\game\objects\structures\shower.dm" #include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\spawner.dm" #include "code\game\objects\structures\spirit_board.dm" #include "code\game\objects\structures\stairs.dm" #include "code\game\objects\structures\statues.dm" @@ -1441,9 +1439,6 @@ #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" -#include "code\game\objects\structures\icemoon\cave_entrance.dm" -#include "code\game\objects\structures\lavaland\geyser.dm" -#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\plaques\_plaques.dm" #include "code\game\objects\structures\plaques\static_plaques.dm" #include "code\game\objects\structures\signs\_signs.dm" @@ -2774,8 +2769,8 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord_outfits.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice demon.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice whelp.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobstrosity.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" @@ -2798,6 +2793,10 @@ #include "code\modules\mob\living\simple_animal\slime\slime.dm" #include "code\modules\mob\living\simple_animal\slime\slime_say.dm" #include "code\modules\mob\living\simple_animal\slime\subtypes.dm" +#include "code\modules\mob_spawner\burrow.dm" +#include "code\modules\mob_spawner\hivebot.dm" +#include "code\modules\mob_spawner\spawner.dm" +#include "code\modules\mob_spawner\spawner_componet.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\_modular_computer_shared.dm" #include "code\modules\modular_computers\computers\item\computer.dm" diff --git a/tools/HubMigrator/HubMigrator.dm b/tools/HubMigrator/HubMigrator.dm index cd7f7e6020eb..feb38b9301be 100644 --- a/tools/HubMigrator/HubMigrator.dm +++ b/tools/HubMigrator/HubMigrator.dm @@ -19,8 +19,7 @@ #define BOSS_MEDAL_DRAKE "Drake Killer" #define BOSS_MEDAL_HIEROPHANT "Hierophant Killer" #define BOSS_MEDAL_LEGION "Legion Killer" -#define BOSS_MEDAL_TENDRIL "Tendril Exterminator" -#define BOSS_MEDAL_SWARMERS "Swarmer Beacon Killer" +#define BOSS_MEDAL_NEST "Nest Exterminator" #define BOSS_MEDAL_MINER_CRUSHER "Blood-drunk Miner Crusher" #define BOSS_MEDAL_BUBBLEGUM_CRUSHER "Bubblegum Crusher" @@ -28,7 +27,6 @@ #define BOSS_MEDAL_DRAKE_CRUSHER "Drake Crusher" #define BOSS_MEDAL_HIEROPHANT_CRUSHER "Hierophant Crusher" #define BOSS_MEDAL_LEGION_CRUSHER "Legion Crusher" -#define BOSS_MEDAL_SWARMERS_CRUSHER "Swarmer Beacon Crusher" // Medal hub IDs for boss-kill scores #define BOSS_SCORE "Bosses Killed" @@ -38,8 +36,7 @@ #define DRAKE_SCORE "Drakes Killed" #define HIEROPHANT_SCORE "Hierophants Killed" #define LEGION_SCORE "Legion Killed" -#define SWARMER_BEACON_SCORE "Swarmer Beacs Killed" -#define TENDRIL_CLEAR_SCORE "Tendrils Killed" +#define NEST_CLEAR_SCORE "Nests Killed" @@ -67,15 +64,13 @@ BOSS_MEDAL_DRAKE, BOSS_MEDAL_HIEROPHANT, BOSS_MEDAL_LEGION, - BOSS_MEDAL_TENDRIL, - BOSS_MEDAL_SWARMERS, + BOSS_MEDAL_NEST, BOSS_MEDAL_MINER_CRUSHER, BOSS_MEDAL_BUBBLEGUM_CRUSHER, BOSS_MEDAL_COLOSSUS_CRUSHER, BOSS_MEDAL_DRAKE_CRUSHER, BOSS_MEDAL_HIEROPHANT_CRUSHER, - BOSS_MEDAL_LEGION_CRUSHER, - BOSS_MEDAL_SWARMERS_CRUSHER) + BOSS_MEDAL_LEGION_CRUSHER) var/list/valid_scores = list( BOSS_SCORE, @@ -85,8 +80,7 @@ DRAKE_SCORE, HIEROPHANT_SCORE, LEGION_SCORE, - SWARMER_BEACON_SCORE, - TENDRIL_CLEAR_SCORE) + NEST_CLEAR_SCORE) var/ach = "achievements" //IMPORTANT : ADD PREFIX HERE IF YOU'RE USING PREFIXED SCHEMA From 1721a4296d245c40c6f1cce5f72523ce7136d688 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 16:54:24 -0500 Subject: [PATCH 074/212] Automatic changelog generation for PR #2848 [ci skip] --- html/changelogs/AutoChangeLog-pr-2848.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2848.yml diff --git a/html/changelogs/AutoChangeLog-pr-2848.yml b/html/changelogs/AutoChangeLog-pr-2848.yml new file mode 100644 index 000000000000..8cfbe3e32c0f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2848.yml @@ -0,0 +1,6 @@ +author: FalloutFalcon +changes: + - {rscadd: A new generic nest used across all planets} + - {rscdel: Old portal and tendrils and other cruft} + - {refactor: refactorted mob spawners to have one for each planet} +delete-after: true From 13f6acddea812b16be967a3e66f9a15eda8e2a34 Mon Sep 17 00:00:00 2001 From: cuddleandtea <105150564+cuddleandtea@users.noreply.github.com> Date: Sat, 13 Jul 2024 00:37:38 +0300 Subject: [PATCH 075/212] Build mode light maker (#2905) ## About The Pull Request Hello dear comrades! Adds new submode for admins buildmode. You can create lights on any turf/mob/obj with different range, power and color. based on: #2902 because it's changes the same .dmi file with sprites ## Why It's Good For The Game Here is how it work in the video: https://youtu.be/Ias2_tdiLeU Admins can light up fast any areas and points of interest or just dark places that needs to be lit. A very handy tool for events and stuff. 1. Go to build mode and select my little lightbulb icon ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/7c391e51-056f-43cb-be0e-6c1277aa632b) 2. Already you can place light with power 1, range 3 and white color. Press Build Mode button to change this settings. ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/8c6eb212-42f4-48e8-8557-a940c5af3b6a) ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/ad0b44fa-96e5-43ef-9d18-3245d857ed16) 3. Enjoy this great tool for events and points of interest ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/c884ba28-8bac-488a-88ca-5973b29306d0) ## Changelog :cl: admin: new light maker subtype for build mode /:cl: --------- Signed-off-by: cuddleandtea <105150564+cuddleandtea@users.noreply.github.com> --- code/modules/buildmode/submodes/lightmaker.dm | 31 ++++++++++++++++++ icons/misc/buildmode.dmi | Bin 3376 -> 3492 bytes shiptest.dme | 1 + 3 files changed, 32 insertions(+) create mode 100644 code/modules/buildmode/submodes/lightmaker.dm diff --git a/code/modules/buildmode/submodes/lightmaker.dm b/code/modules/buildmode/submodes/lightmaker.dm new file mode 100644 index 000000000000..2b50343c641a --- /dev/null +++ b/code/modules/buildmode/submodes/lightmaker.dm @@ -0,0 +1,31 @@ +/datum/buildmode_mode/lightmaker + key = "lightmaker" + + var/light_range = 3 + var/light_power = 1 + var/light_color = COLOR_WHITE + +/datum/buildmode_mode/lightmaker/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Left Click")] -> Create light\n\ + [span_bold("Right Click")] -> Delete light\n\ + [span_bold("Right Click on Build Mode Button")] -> Change light properties")) + ) + +/datum/buildmode_mode/lightmaker/change_settings(client/target_client) + var/choice = alert("Change the new light range, power or color?", "Light Maker", "Range", "Power", "Color", "Cancel") + switch(choice) + if("Range") + light_range = input(target_client, "Range of light", text("Input")) as num|null + if("Power") + light_power = input(target_client, "Power of light", text("Input")) as num|null + if("Color") + light_color = input(target_client, "Light color", text("Input")) as color|null + +/datum/buildmode_mode/lightmaker/handle_click(client/target_client, params, obj/object) + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, LEFT_CLICK)) + object.set_light(light_range, light_power, light_color) + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + object.set_light(0,0,COLOR_WHITE) diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index db1e5fdba40b2b83f288613998dd728cab2d4d05..44698597b02cf83f38a5ea27baa6df2dc418e6c4 100644 GIT binary patch delta 2922 zcmV-w3zhV+8l)SrI|2b8lRN?0p-L^tz1h)w ziDO6E7Ei~Q)44djp7IW3GUSWL;{N6~&w8V|9+JC#p4DisHGe0GfpG{o&*XWx$un(Y z8uDG9RS_Ki#Fi+G(S+X%ct#iO5DS#DHCESXgVcFz4NIM0{$avTDMuPFey-G$cztt#ev?y=C2KsRuVY@t|)v6@Z`+$tDJlP?}4IZ4iPP>VfDhaYV`K& zn{?1%{9oS|$Ma$Qcs~K6e>bIB9_xyS000UpNkliGv(P6~Swu~!F|9b25-&R@1ed}E`z#pIT1bWpwe`vsXd*LbD$FmdY zSFb-qn0-R|ef|$d_|?`i*48FsSz9Ylpk4=XRe+%S0S%a)sBH!NGHZY@Kt)lW0N%27 zFjohI=sY?Lrmx_YV8%BWii4lE8PZmoMp93nYn1R&^1M?<`KzIX2 zs`qGCkpy&*ZM3nD7?_uV1Z>B_U0!#qx)Mde2H4e2*hNAu2$;+e2cftepeO`FKu`z- z$Y>Ru1A4Qk0f7W`@kZF@xVJtVtxyA`QK+r~Fp49Bj!o|spjZ4>JQ ztsm0>v2-#Dxu!(9O}dt1^}A@mc3%!?W2#TRg9a?Tf3>*a=5Bg>J@pB+))RMu)?Fxd z61Gm_abkbJtH4Bn6JRZ~Aqc;oA6l0Q@XPIN z2^2B`@s1};0-hWY?|5<~P@bcd1HxT@h6Ge6X*CMDu7Pw(-wy%QN179GTm#{rswV;{ zNm~)1f3AUhQ`;K>?n*=v08*H%z{jw@a)7xKF$91W;ws?neG*`L6ajvsWTjm|FvKVo zmjgV|TK53(jUqnX$)m0b@crmYdte07u7da3mVoQKct;_shmS%S644pGW&{EvsDj1y z@Oi+diM&40jzDw-8t5w2coY-k-zR}~dKqjye~L-*&zAtXqeAmYqvIzbpl1|1k2E`e z8UoD!_ryP(KuT8u&E$=azZ5x;)ZcHbFN3w1)|_p>KHzWPtmLmJKY`YI;x4dS9~fuu z|JUhhX5tR@RM$eC>4~mJyVE}&1m;(Y^UwL6)J!6-M4g_T!0eW_{GvYf_dq>8fq8Hz zfA&*-57pBX032R{K#jf(1e6a^{(OL5P2j$e-c2B2>g%J&5on(SXd~#i>?b(XL5x^9 z_3_c;2+RY9!Uw`ARH08WmibG`nNt`iG6B0!0|FiBG)?>j06YW$Iw3G2U77V^-H%Cx z1|{J0=WQRSU6HI(;(c8Ad5|3N`tx>_f1!aO?lj&JNz@I09^%1Z+0P+ek@jXd?UAuyTLICr@dsP#^(2q@p3 zxeDChM*?!jNCbgeL+GhQw1j4yet=K{CO66*v`K3T0P%IK3uGc-yC||qecq+@kV;)x zK2Tu}%mG^$+kc3FX*&C2BWweNe=JhjJ%$PBJ(P~10NQf`-cg7Vuyrxx2_vAaPZC2* zz!;;}#`h2?_rwuo1hms%1pOwz@wPE>WQqM(Nx<>{0|{sbu>`O`&7RH1b+JiXnFBxw z6twA`=KxDDTA$PD@=gF<@E^xODm&!e*k5mS&Im( zpUF&IO`xiNE(9ubV6h0;8F!HgG}kjB&|F^*0y(=5b^1~e$lCv})0e?oOl!`r)(4WG zKx;j57g&b%fuq{gUy${Iqqp9DLev*zCjR7(os(mZmGq2eV&QoKqaRls|Ec1HPYd<4 zxf(T(YDmAA;>6FKbn<6Ue>wGYlg~T#b0L5O4@^Jp^fS)env#`i0;4=0z7@a;cYq^w^<^kn5ZZ zx)LO3Pe+zK(`a@6pbS0!W#9VtcfPxO_vKeydDZT#zvm~wT^+A$e;_z>$XGJYo|6N} zo@4bb0Km^KY5kh-UwhpTe)yw3d#=C!$2aWs60p9T`_v(_Y^n)Rca#wT4Vn=EyN4;{ z_&5IKrd@m2*Z1AL@0MGCTA2elzD^&lBLGba*Z~L?r2p);+kgIxU;gTjJ2y6deb?R9 z1aN#K)(7T+Z=3_*f5cxgQ2K9vd(XYU`~CWT8yg$@?th>q0dW+vIY9DA8io7>fR{q+ z4^IB@$A=z%rYId+<)LH9|5$0<&HvR zfHyHD^8i^vD{HWMWMaO!?y~@Z{3W2LpLzDV=l}7-i!Z(We@aCTkfkaTL6QS}oW?4i zOe*FP=02<8snFwBnNMT|=hfFW^a=_sU+7CH*a(}4G9F*gstKmXXwW*#UE1K&Kr5bXc(z=!(} z=5#S^o`4{r7|0 zH=y5@^Z^0v`Fg0Hml)!Xa{!2liyww3fkA=n&m`=;+Pxb48 z2|xk(e~KH#2v-uYp*ODvC14$yS^|P=P{w>ZFNVj!1cZAY9bt5rq*ee5?*GrbzXD(w z3`@XWLczX|UB}hByJ7sFgpGgMLzRD5CI+csd+gp0UcTp z-06TEuwgF}5zxjoigCm!gi|0H0TW<{KwXY7Tm)03577XD0Ly{89HD`qVtt4PI62^n za2){^`b5`4ArY?Cm*8r2Ru-6mpbyc2#V4?GB@z?J`|k(WH(=qd#RWHa7u{a}2(OZA Uqw=>fqW}N^07*qoM6N<$f?)N9`2YX_ delta 2805 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 Hu0mjfaGzE4 diff --git a/shiptest.dme b/shiptest.dme index 90c6abbc9310..096d653c7158 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1861,6 +1861,7 @@ #include "code\modules\buildmode\submodes\basic.dm" #include "code\modules\buildmode\submodes\boom.dm" #include "code\modules\buildmode\submodes\copy.dm" +#include "code\modules\buildmode\submodes\lightmaker.dm" #include "code\modules\buildmode\submodes\delete.dm" #include "code\modules\buildmode\submodes\fill.dm" #include "code\modules\buildmode\submodes\map_export.dm" From b837cd319aed5bce61f0504ec34983ec93c7606d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 17:17:21 -0500 Subject: [PATCH 076/212] Automatic changelog generation for PR #2905 [ci skip] --- html/changelogs/AutoChangeLog-pr-2905.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2905.yml diff --git a/html/changelogs/AutoChangeLog-pr-2905.yml b/html/changelogs/AutoChangeLog-pr-2905.yml new file mode 100644 index 000000000000..ac701ff71df9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2905.yml @@ -0,0 +1,4 @@ +author: cuddleandtea +changes: + - {admin: new light maker subtype for build mode} +delete-after: true From 8d6370524020cee987f2f7cdda8ab24d99dd1ad3 Mon Sep 17 00:00:00 2001 From: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:23:24 -0700 Subject: [PATCH 077/212] 357 Revolver Guncase uses the correct subtype (#3206) ## About The Pull Request Fixes #3200 The guncase had the wrong subtype. ## Why It's Good For The Game I DEMAND "Apogee-Dev" BE DEMOTED- ![image](https://github.com/user-attachments/assets/8f6881f0-3f84-4af1-8ce4-8d4977e87f5a) ## Changelog :cl: fix: 357 guncase spawns with the correct revolver /:cl: --- code/game/objects/items/storage/guncases.dm | 2 +- code/modules/projectiles/guns/ballistic/revolver.dm | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/guncases.dm b/code/game/objects/items/storage/guncases.dm index d4dd2896ace9..b70de7a01444 100644 --- a/code/game/objects/items/storage/guncases.dm +++ b/code/game/objects/items/storage/guncases.dm @@ -153,7 +153,7 @@ /obj/item/storage/pistolcase/a357 /obj/item/storage/pistolcase/a357/PopulateContents() - new /obj/item/gun/ballistic/revolver/no_mag(src) + new /obj/item/gun/ballistic/revolver/syndicate/no_mag(src) new /obj/item/ammo_box/a357/empty(src) new /obj/item/ammo_box/a357/empty(src) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 416ab364ea78..545cbf8bf117 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -557,6 +557,9 @@ EMPTY_GUN_HELPER(revolver/detective) /obj/item/gun/ballistic/revolver/detective/no_mag spawnwithmagazine = FALSE +/obj/item/gun/ballistic/revolver/syndicate/no_mag + spawnwithmagazine = FALSE + /obj/item/gun/ballistic/revolver/no_mag spawnwithmagazine = FALSE From 1332f4b5af2d963b066f5c2a549a308228c7a275 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 18:34:06 -0500 Subject: [PATCH 078/212] Automatic changelog generation for PR #3206 [ci skip] --- html/changelogs/AutoChangeLog-pr-3206.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3206.yml diff --git a/html/changelogs/AutoChangeLog-pr-3206.yml b/html/changelogs/AutoChangeLog-pr-3206.yml new file mode 100644 index 000000000000..3bc6bbbf8d10 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3206.yml @@ -0,0 +1,4 @@ +author: Gristlebee +changes: + - {bugfix: 357 guncase spawns with the correct revolver} +delete-after: true From d82aa2608940decca3db0c3c7a49647a85cd54d9 Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:23:50 -0700 Subject: [PATCH 079/212] capsaicin no longer straight up kills you (#3150) ## About The Pull Request removes the body temperature increase from capsaicin ## Why It's Good For The Game >eats two chili peppers >starts running a fever 30C over the boiling point of water ![nacho](https://github.com/shiptest-ss13/Shiptest/assets/139387950/4ee8470c-f220-4181-83ab-a0d78755aa12) ## Changelog :cl: del: Capsaicin no longer Boils you /:cl: --- .../chemistry/reagents/food_reagents.dm | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 6a69ef38e6cd..7c2b3f62099f 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -209,30 +209,6 @@ taste_description = "hot peppers" taste_mult = 1.5 -/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/M) - var/heating = 0 - switch(current_cycle) - if(1 to 15) - heating = 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent(/datum/reagent/cryostylane)) - holder.remove_reagent(/datum/reagent/cryostylane, 5) - if(isslime(M)) - heating = rand(5,20) - if(15 to 25) - heating = 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - heating = rand(10,20) - if(25 to 35) - heating = 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - heating = rand(15,20) - if(35 to INFINITY) - heating = 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(isslime(M)) - heating = rand(20,25) - M.adjust_bodytemperature(heating) - ..() - /datum/reagent/consumable/frostoil name = "Frost Oil" description = "A special oil that noticeably chills the body. Extracted from chilly peppers and slimes." From 8d25df8f07180c1334516fb0204333ab0b659cb6 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 12 Jul 2024 18:47:00 -0500 Subject: [PATCH 080/212] Automatic changelog generation for PR #3150 [ci skip] --- html/changelogs/AutoChangeLog-pr-3150.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3150.yml diff --git a/html/changelogs/AutoChangeLog-pr-3150.yml b/html/changelogs/AutoChangeLog-pr-3150.yml new file mode 100644 index 000000000000..703db6e7b983 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3150.yml @@ -0,0 +1,4 @@ +author: generalthrax +changes: + - {rscdel: Capsaicin no longer Boils you} +delete-after: true From f3ea52f3b683973055ef03166680ac7619b08820 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 13 Jul 2024 00:54:58 +0000 Subject: [PATCH 081/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2848.yml | 6 ------ html/changelogs/AutoChangeLog-pr-2905.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3150.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3179.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3181.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3191.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3196.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3201.yml | 6 ------ html/changelogs/AutoChangeLog-pr-3206.yml | 4 ---- html/changelogs/archive/2024-07.yml | 24 +++++++++++++++++++++++ 10 files changed, 24 insertions(+), 43 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2848.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2905.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3150.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3179.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3181.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3191.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3196.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3201.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3206.yml diff --git a/html/changelogs/AutoChangeLog-pr-2848.yml b/html/changelogs/AutoChangeLog-pr-2848.yml deleted file mode 100644 index 8cfbe3e32c0f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2848.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: FalloutFalcon -changes: - - {rscadd: A new generic nest used across all planets} - - {rscdel: Old portal and tendrils and other cruft} - - {refactor: refactorted mob spawners to have one for each planet} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-2905.yml b/html/changelogs/AutoChangeLog-pr-2905.yml deleted file mode 100644 index ac701ff71df9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2905.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: cuddleandtea -changes: - - {admin: new light maker subtype for build mode} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3150.yml b/html/changelogs/AutoChangeLog-pr-3150.yml deleted file mode 100644 index 703db6e7b983..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3150.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: generalthrax -changes: - - {rscdel: Capsaicin no longer Boils you} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3179.yml b/html/changelogs/AutoChangeLog-pr-3179.yml deleted file mode 100644 index 6454eaea4d0c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3179.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TiberianEuan -changes: - - {rscadd: Black hoodie with grey hood.} - - {imageadd: New hoodie icons.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3181.yml b/html/changelogs/AutoChangeLog-pr-3181.yml deleted file mode 100644 index 6b6c7eebd1f9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3181.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SomeguyManperson -changes: - - {bugfix: brute damage is now required to break bones} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3191.yml b/html/changelogs/AutoChangeLog-pr-3191.yml deleted file mode 100644 index 4fe7934e29d7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3191.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Skies-Of-Blue -changes: - - {balance: you can now fit radios and pill bottles in both hoodies and winter coats} - - {bugfix: 'the innate storage on winter coats has been restored, alt click to access!'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3196.yml b/html/changelogs/AutoChangeLog-pr-3196.yml deleted file mode 100644 index aa923171f4dc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3196.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: FalloutFalcon -changes: - - {bugfix: pets no longer cause run times trying to open ship doors} - - {bugfix: no longer have to reinsert your id into your wallet for access} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3201.yml b/html/changelogs/AutoChangeLog-pr-3201.yml deleted file mode 100644 index ea229d14b59a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3201.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: generalthrax -changes: - - {bugfix: Fixed the Landmine mission description and flavoured it a little} - - {balance: Decreased the amount of landmines required for its mission and increased - the value per mine slightly} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3206.yml b/html/changelogs/AutoChangeLog-pr-3206.yml deleted file mode 100644 index 3bc6bbbf8d10..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3206.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Gristlebee -changes: - - {bugfix: 357 guncase spawns with the correct revolver} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index b29e8aedd9e0..d16159c1679a 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -68,3 +68,27 @@ meemofcourse: - balance: Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle Pilot). - code_imp: The Vanguard base outfit starts with gear. +2024-07-13: + FalloutFalcon: + - bugfix: pets no longer cause run times trying to open ship doors + - bugfix: no longer have to reinsert your id into your wallet for access + - rscadd: A new generic nest used across all planets + - rscdel: Old portal and tendrils and other cruft + - refactor: refactorted mob spawners to have one for each planet + Gristlebee: + - bugfix: 357 guncase spawns with the correct revolver + Skies-Of-Blue: + - balance: you can now fit radios and pill bottles in both hoodies and winter coats + - bugfix: the innate storage on winter coats has been restored, alt click to access! + SomeguyManperson: + - bugfix: brute damage is now required to break bones + TiberianEuan: + - rscadd: Black hoodie with grey hood. + - imageadd: New hoodie icons. + cuddleandtea: + - admin: new light maker subtype for build mode + generalthrax: + - bugfix: Fixed the Landmine mission description and flavoured it a little + - balance: Decreased the amount of landmines required for its mission and increased + the value per mine slightly + - rscdel: Capsaicin no longer Boils you From 4d1967f3ea425a931170f32aefcaf4a8e8b66d61 Mon Sep 17 00:00:00 2001 From: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Sun, 14 Jul 2024 01:29:45 -0700 Subject: [PATCH 082/212] SSD Indicators Will Be Real In 2020 (#3067) ## About The Pull Request Loosely ports https://github.com/Skyrat-SS13/Skyrat13/pull/420, splicing Novasector's SSD mechanics with our own. When a player goes SSD, they initially remain awake and gain a Zz icon above the character indicating they are away.
    look here! ![nyaru goes afk](https://github.com/shiptest-ss13/Shiptest/assets/86762641/98c61f04-7e65-4b24-a434-2769cc8a25f6)
    After the player has been disconnected for three minutes, their character will resume our current implementation of SSD behavior - losing the Zz icon and falling asleep.
    see? ![nyaru has been gone a while, huh](https://github.com/shiptest-ss13/Shiptest/assets/86762641/8c51e05f-a41d-40af-a259-3a2dc7e7cca2)
    This also adds the time spent SSD to examine text.
    it's helpful! ![taking a bit](https://github.com/shiptest-ss13/Shiptest/assets/86762641/15f91ab4-01b8-4d2f-8d8f-f5cf65f99213)
    ## Why It's Good For The Game Our current implementation of being SSD leaves some things to be desired. Whenever you disconnect, your character instantly passes out. This can lead to: - dropping critical items in dangerous situations, which is just sort of the worst - aghost causing your character to faint on the spot, something I've heard more than a few admins complain about over the last few years - players *reacting* to your character falling asleep as if it was a planned thing within your control - players moving your character to a bed, disrupting a scene you may have been intent on continuing if it weren't for that pesky internet cut - SSD players flooding the nearby chat with *snore out of nowhere Of course, there's merit to our current implementation as well. Having characters fall asleep keeps immersion clean, and having an SSD Indicator can be immersion breaking. This is why I've opted to remove the indicator and have characters fall asleep after a grace period of three minutes. It allows players a time to reconnect, or admins time to view what they needed to, without all of the disruptions listed above. ## Changelog :cl: add: an SSD Indicator for when you have been disconnected for less than three minutes balance: players will now remain awake for three minutes after disconnecting, with a new SSD icon to boot! balance: players SSD longer than three minutes will lose their icon and fall asleep, much like the previous behavior /:cl: --- .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/life.dm | 9 ++++-- code/modules/mob/living/living.dm | 26 ++++++++++++++++++ icons/mob/ssd_indicator.dmi | Bin 0 -> 311 bytes 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 icons/mob/ssd_indicator.dmi diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f92e8d762f2d..7bbe9fb1de72 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -326,7 +326,7 @@ if(!key) msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n" else if(!client) - msg += "[t_He] appears to be suffering from SSD - Space Sleep Disorder. [t_He] may snap out of it at any time! Or maybe never. It's best to leave [t_him] be.\n" + msg += "[t_He] [t_has] been suffering from SSD - Space Sleep Disorder - for [trunc(((world.time - lastclienttime) / (1 MINUTES)))] minutes. [t_He] may snap out of it at any time! Or maybe never. It's best to leave [t_him] be.\n" if (length(msg)) . += "[msg.Join("")]" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 0fc21db37d8c..c5145600bbf8 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -25,9 +25,12 @@ if(.) //not dead handle_blood() - if(isLivingSSD())//if you're disconnected, you're going to sleep - if(AmountSleeping() < 20) - AdjustSleeping(20)//adjust every 10 seconds + if(isLivingSSD()) // If you're disconnected, you're going to sleep + if(trunc((world.time - lastclienttime) / (3 MINUTES)) > 0) // After a three minute grace period, your character will fall asleep + if(AmountSleeping() < 20) + AdjustSleeping(20) // Adjust every 10 seconds + if(ssd_indicator) + cut_overlay(GLOB.ssd_indicator_overlay) // Prevents chronically SSD players from breaking immersion if(stat != DEAD) var/bprv = handle_bodyparts() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5c499fe21029..269c74a837bd 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1410,6 +1410,32 @@ if(player_logged && stat != DEAD) return TRUE +// The above code is kept to prevent old SSD behavior from breaking, while the code below is dedicated to the SSD Indicator + +GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('icons/mob/ssd_indicator.dmi', "default0", RUNECHAT_PLANE)) + +/mob/living + var/ssd_indicator = FALSE + var/lastclienttime = 0 + +/mob/living/proc/set_ssd_indicator(state) + if(state == ssd_indicator) + return + ssd_indicator = state + if(ssd_indicator && stat != DEAD) + add_overlay(GLOB.ssd_indicator_overlay) + else + cut_overlay(GLOB.ssd_indicator_overlay) + +/mob/living/Login() + . = ..() + set_ssd_indicator(FALSE) + +/mob/living/Logout() + . = ..() + lastclienttime = world.time + set_ssd_indicator(TRUE) + /mob/living/vv_get_header() . = ..() var/refid = REF(src) diff --git a/icons/mob/ssd_indicator.dmi b/icons/mob/ssd_indicator.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3f7d100b6c67e725055ef21a964cbcbb113dca6c GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ{HliLl8Vm$j4_H-qwSRlG-d9=Bb7470iYcT0gf&&Q+`DHA9k#g1nzrpr!Ksf{3onM7 zt~9UWyzn9_sPVDb6Mr#vp58;BU%iWc)ikAF(|NJtR<-gE?}Z*GC8T-FPfC$i=+qJG z0$Sbd>Eaj?(fam^A>RQ74%UGE9|QLOf3o&PfT5_*@}|@3hKi<|{#~sdQzl#Xud3cD(Xnp937P3qET zuudpu*edNf;oHvH1)_z&{9m+BU|`} Date: Sun, 14 Jul 2024 03:40:46 -0500 Subject: [PATCH 083/212] Automatic changelog generation for PR #3067 [ci skip] --- html/changelogs/AutoChangeLog-pr-3067.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3067.yml diff --git a/html/changelogs/AutoChangeLog-pr-3067.yml b/html/changelogs/AutoChangeLog-pr-3067.yml new file mode 100644 index 000000000000..072045a2f02d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3067.yml @@ -0,0 +1,9 @@ +author: Skies-Of-Blue +changes: + - {rscadd: an SSD Indicator for when you have been disconnected for less than three + minutes} + - {balance: 'players will now remain awake for three minutes after disconnecting, + with a new SSD icon to boot!'} + - {balance: 'players SSD longer than three minutes will lose their icon and fall + asleep, much like the previous behavior'} +delete-after: true From 08cb713d2b6296be3a94654358a54f2ecb0f8d9e Mon Sep 17 00:00:00 2001 From: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Sun, 14 Jul 2024 01:29:59 -0700 Subject: [PATCH 084/212] Ports 'Command bar typing indicators (client side html version)' (#3080) ## About The Pull Request Directly ports https://github.com/tgstation/tgstation/pull/83081, allowing typing indicators to trigger off of the command bar. ## Why It's Good For The Game Typing indicators are there for a reason! It's helpful to know if another player is cooking a message for thirty seconds or just staring at you. However, a good chunk of our players exclusively use the command bar to send messages, leaving us in the dark! This helps level the playing field. ## Changelog :cl: add: typing indicators now trigger off of the command bar /:cl: --- check_regex.yaml | 2 +- code/modules/client/client_procs.dm | 5 ++++ code/modules/client/verbs/typing.dm | 28 ++++++++++++++++++ html/typing_indicator.html | 46 +++++++++++++++++++++++++++++ interface/skin.dmf | 9 ++++++ shiptest.dme | 1 + 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 code/modules/client/verbs/typing.dm create mode 100644 html/typing_indicator.html diff --git a/check_regex.yaml b/check_regex.yaml index d03e15391975..3b5e13a650e5 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -38,7 +38,7 @@ standards: - exactly: [ - 265, + 266, "non-bitwise << uses", '(? + + + + + + + + diff --git a/interface/skin.dmf b/interface/skin.dmf index 9d933e057c46..18122c5e3e89 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -90,6 +90,15 @@ window "mainwindow" background-color = #272727 is-visible = false saved-params = "" + elem "commandbar_spy" + type = BROWSER + is-default = false + pos = 0,0 + size = 200x200 + anchor1 = -1,-1 + anchor2 = -1,-1 + is-visible = false + saved-params = "" window "mapwindow" elem "mapwindow" diff --git a/shiptest.dme b/shiptest.dme index 096d653c7158..2b65bc6d6d58 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1956,6 +1956,7 @@ #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\reset_held_keys.dm" +#include "code\modules\client\verbs\typing.dm" #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" From 2dbc39a1ba856ec55302a2dd7d4d357d3019922f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 14 Jul 2024 03:54:11 -0500 Subject: [PATCH 085/212] Automatic changelog generation for PR #3080 [ci skip] --- html/changelogs/AutoChangeLog-pr-3080.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3080.yml diff --git a/html/changelogs/AutoChangeLog-pr-3080.yml b/html/changelogs/AutoChangeLog-pr-3080.yml new file mode 100644 index 000000000000..5c4a3abdf25d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3080.yml @@ -0,0 +1,4 @@ +author: Skies-Of-Blue +changes: + - {rscadd: typing indicators now trigger off of the command bar} +delete-after: true From f5888f78afd02e4f2e42a052c1f01aa4bc5f8401 Mon Sep 17 00:00:00 2001 From: Theos Date: Sun, 14 Jul 2024 06:19:08 -0400 Subject: [PATCH 086/212] Guncrate fixes (#3158) ## About The Pull Request The beacon now has a proper subtype for not being loaded with ammo rather than having that be its default state The WT-550 no longer starts full in its guncase SKM magazines no longer start full in their guncases either Energy weapons which are meant to start empty now actually start empty The brimstone, hellfire, and scout now come with their respective guncases when ordered via cargo ## Why It's Good For The Game jjjjjjjjjjjjjjjjjjjjjj ## Changelog :cl: fix: gun cargo packs now act more as they would be expected to /:cl: --- code/game/objects/items/storage/guncases.dm | 4 ++-- code/modules/cargo/packs/gun.dm | 6 +++--- code/modules/projectiles/boxes_magazines/external/rifle.dm | 2 +- code/modules/projectiles/guns/ballistic/shotgun.dm | 2 +- code/modules/projectiles/guns/energy.dm | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/storage/guncases.dm b/code/game/objects/items/storage/guncases.dm index b70de7a01444..9cda5ac27a39 100644 --- a/code/game/objects/items/storage/guncases.dm +++ b/code/game/objects/items/storage/guncases.dm @@ -44,7 +44,7 @@ /obj/item/storage/guncase/beacon /obj/item/storage/guncase/beacon/PopulateContents() - new /obj/item/gun/ballistic/shotgun/doublebarrel/beacon(src) + new /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/no_mag(src) /obj/item/storage/guncase/scout /obj/item/storage/guncase/scout/PopulateContents() @@ -79,7 +79,7 @@ /obj/item/storage/guncase/wt550 /obj/item/storage/guncase/wt550/PopulateContents() - new /obj/item/gun/ballistic/automatic/smg/wt550(src) + new /obj/item/gun/ballistic/automatic/smg/wt550/no_mag(src) new /obj/item/ammo_box/magazine/wt550m9/empty(src) new /obj/item/ammo_box/magazine/wt550m9/empty(src) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 132e62bb0ada..1d71b2799026 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -120,14 +120,14 @@ name = "Hellfire Shotgun Crate" desc = "For when you need to deal with 8 hooligans. Contains a pump shotgun, with a 8-round capacity." cost = 2000 - contains = list(/obj/item/gun/ballistic/shotgun/hellfire) + contains = list(/obj/item/storage/guncase/hellfire) crate_name = "shotgun crate" /datum/supply_pack/gun/brimstone_shotgun name = "Brimstone Shotgun Crate" desc = "For when you need to deal with 5 hooligans, and QUICKLY. Contains a slamfire shotgun, with a 5-round capacity. Warranty voided if sawed off." cost = 2000 - contains = list(/obj/item/gun/ballistic/shotgun/brimstone) + contains = list(/obj/item/storage/guncase/brimstone) crate_name = "shotgun crate" /* @@ -159,7 +159,7 @@ name = "Scout Sniper Rifle Crate" desc = "Contains a traditional scoped rifle to hunt wildlife and big game from a respectful distance. Chambered in powerful .300 Magnum." cost = 5500 - contains = list(/obj/item/gun/ballistic/rifle/scout) + contains = list(/obj/item/storage/guncase/scout) crate_name = "rifle crate" /datum/supply_pack/gun/cobra20 diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm index 1066e5b7ef2d..9224c0db84af 100644 --- a/code/modules/projectiles/boxes_magazines/external/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -56,7 +56,7 @@ multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/skm_762_40/empty - start_empty = FALSE + start_empty = TRUE /obj/item/ammo_box/magazine/skm_762_40/extended name = "extended assault rifle magazine (7.62x40mm CLIP)" diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 9dba3399fcbd..692c09a45f42 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -797,7 +797,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) recoil = 2 recoil_unwielded = 4 -/obj/item/gun/ballistic/shotgun/doublebarrel/beacon +/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/no_mag spawnwithmagazine = FALSE /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 07eb9a159897..f3edb62d8942 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -63,8 +63,8 @@ cell = new cell_type(src) else cell = new(src) - if(!dead_cell) - cell.give(cell.maxcharge) + if(dead_cell) + cell.use(cell.maxcharge) update_ammo_types() recharge_newshot(TRUE) if(selfcharge) From 12e36fef8cb8a235ab68bd47f9c4b91828d57515 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 14 Jul 2024 05:30:03 -0500 Subject: [PATCH 087/212] Automatic changelog generation for PR #3158 [ci skip] --- html/changelogs/AutoChangeLog-pr-3158.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3158.yml diff --git a/html/changelogs/AutoChangeLog-pr-3158.yml b/html/changelogs/AutoChangeLog-pr-3158.yml new file mode 100644 index 000000000000..1de2c30deddf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3158.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: gun cargo packs now act more as they would be expected to} +delete-after: true From 2af6b1dce2b762e02017735ce28954698193c1fc Mon Sep 17 00:00:00 2001 From: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Sun, 14 Jul 2024 13:33:17 +0200 Subject: [PATCH 088/212] Two minor sunskipper tweaks. (#3204) ## About The Pull Request - Changed it's prefix to SV - adds a missing pipe ## Why It's Good For The Game it is ## Changelog :cl: tweak: Changed sunskipper's prefix to SV. fix: Added a missing pipe to the sunskipper. /:cl: --- _maps/configs/independent_sunskipper.json | 2 +- _maps/shuttles/independent/independent_sunskipper.dmm | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/_maps/configs/independent_sunskipper.json b/_maps/configs/independent_sunskipper.json index 08a4a56f9fde..ee17e126cc34 100644 --- a/_maps/configs/independent_sunskipper.json +++ b/_maps/configs/independent_sunskipper.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json", "map_name": "Sunskipper-class Culinary Vessel", - "prefix": "ISV", + "prefix": "SV", "namelists": ["CRUISE", "NATURAL"], "map_short_name": "Sunskipper-class", "map_path": "_maps/shuttles/independent/independent_sunskipper.dmm", diff --git a/_maps/shuttles/independent/independent_sunskipper.dmm b/_maps/shuttles/independent/independent_sunskipper.dmm index 61c49a25295e..113230223069 100644 --- a/_maps/shuttles/independent/independent_sunskipper.dmm +++ b/_maps/shuttles/independent/independent_sunskipper.dmm @@ -1560,6 +1560,9 @@ /obj/structure/cable/green{ icon_state = "4-9" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, /turf/open/floor/carpet/nanoweave, /area/ship/crew/cryo) "tP" = ( From 9f0fdabf1a79a9eead14a2dde8f72404184c2310 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 14 Jul 2024 06:43:51 -0500 Subject: [PATCH 089/212] Automatic changelog generation for PR #3204 [ci skip] --- html/changelogs/AutoChangeLog-pr-3204.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3204.yml diff --git a/html/changelogs/AutoChangeLog-pr-3204.yml b/html/changelogs/AutoChangeLog-pr-3204.yml new file mode 100644 index 000000000000..2b6963e69836 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3204.yml @@ -0,0 +1,5 @@ +author: Sadhorizon +changes: + - {tweak: Changed sunskipper's prefix to SV.} + - {bugfix: Added a missing pipe to the sunskipper.} +delete-after: true From 4cd699cd811fa718a1a3bd228274969443b88291 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 14 Jul 2024 19:22:32 -0500 Subject: [PATCH 090/212] Gun attachments (#2917) ## About The Pull Request Finishing #145 Requires #2877 ## Why It's Good For The Game ## Changelog :cl: refactor: refactored attachments to be modular /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Signed-off-by: Theos Co-authored-by: Matthew Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> Co-authored-by: Theos Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> --- code/__DEFINES/combat.dm | 2 +- code/__DEFINES/guns.dm | 97 ++- code/__DEFINES/sound.dm | 2 + code/_onclick/click.dm | 2 +- code/datums/action.dm | 7 +- code/datums/components/attachment.dm | 182 ++++++ code/datums/components/attachment_holder.dm | 188 ++++++ code/datums/wires/mines.dm | 4 +- code/game/mecha/equipment/weapons/weapons.dm | 8 +- .../objects/items/attachments/_attachment.dm | 99 ++++ .../game/objects/items/attachments/bayonet.dm | 22 + .../objects/items/attachments/laser_sight.dm | 23 + .../objects/items/attachments/rail_light.dm | 33 ++ .../objects/items/attachments/silencer.dm | 19 + code/game/objects/items/attachments/stock.dm | 40 ++ code/game/objects/items/devices/multitool.dm | 2 +- code/game/objects/items/pneumaticCannon.dm | 4 +- code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/storage/briefcase.dm | 2 +- .../game/objects/items/storage/uplink_kits.dm | 2 +- code/game/objects/items/toys.dm | 4 +- .../blackmarket/blackmarket_items/tools.dm | 2 +- code/modules/cargo/packs/gun.dm | 28 + code/modules/flufftext/Hallucination.dm | 8 +- .../mining/equipment/kinetic_crusher.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 4 + .../hostile/megafauna/codename_claw.dm | 1 - .../projectiles/ammunition/_ammunition.dm | 2 +- code/modules/projectiles/gun.dm | 559 +++++++++--------- code/modules/projectiles/guns/ballistic.dm | 173 +----- .../projectiles/guns/ballistic/assault.dm | 1 - .../projectiles/guns/ballistic/automatic.dm | 6 - .../projectiles/guns/ballistic/gauss.dm | 1 - .../modules/projectiles/guns/ballistic/hmg.dm | 3 - .../projectiles/guns/ballistic/launchers.dm | 1 - .../projectiles/guns/ballistic/pistol.dm | 10 +- .../projectiles/guns/ballistic/rifle.dm | 1 - .../projectiles/guns/ballistic/shotgun.dm | 24 +- .../modules/projectiles/guns/ballistic/smg.dm | 131 ++-- .../modules/projectiles/guns/ballistic/toy.dm | 4 - code/modules/projectiles/guns/energy.dm | 74 +-- .../projectiles/guns/energy/energy_gun.dm | 29 +- .../guns/energy/kinetic_accelerator.dm | 16 +- code/modules/projectiles/guns/energy/laser.dm | 8 +- .../projectiles/guns/energy/mounted.dm | 1 - code/modules/projectiles/guns/energy/pulse.dm | 5 +- .../projectiles/guns/energy/special.dm | 13 +- code/modules/projectiles/guns/energy/stun.dm | 6 - .../projectiles/guns/misc/beam_rifle.dm | 2 +- .../projectiles/guns/misc/syringe_gun.dm | 1 - code/modules/projectiles/guns/powered.dm | 35 +- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/spray.dm | 8 +- .../research/designs/weapon_designs.dm | 2 +- code/modules/uplink/uplink_items.dm | 2 +- icons/obj/guns/48x32guns.dmi | Bin 2116 -> 4457 bytes icons/obj/guns/attachments.dmi | Bin 0 -> 4332 bytes icons/obj/guns/bayonets.dmi | Bin 263 -> 0 bytes icons/obj/guns/energy.dmi | Bin 26588 -> 24323 bytes icons/obj/guns/flashlights.dmi | Bin 660 -> 0 bytes icons/obj/guns/projectile.dmi | Bin 18205 -> 17907 bytes shiptest.dme | 8 + 63 files changed, 1172 insertions(+), 749 deletions(-) create mode 100644 code/datums/components/attachment.dm create mode 100644 code/datums/components/attachment_holder.dm create mode 100644 code/game/objects/items/attachments/_attachment.dm create mode 100644 code/game/objects/items/attachments/bayonet.dm create mode 100644 code/game/objects/items/attachments/laser_sight.dm create mode 100644 code/game/objects/items/attachments/rail_light.dm create mode 100644 code/game/objects/items/attachments/silencer.dm create mode 100644 code/game/objects/items/attachments/stock.dm create mode 100644 icons/obj/guns/attachments.dmi delete mode 100644 icons/obj/guns/bayonets.dmi delete mode 100644 icons/obj/guns/flashlights.dmi diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ad0754c85b21..69886107d61c 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -142,7 +142,7 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) #define EXPLODE_DEVASTATE 1 #define EXPLODE_HEAVY 2 #define EXPLODE_LIGHT 3 -#define EXPLODE_GIB_THRESHOLD 50 //ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor +#define EXPLODE_GIB_THRESHOLD 50 //ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor #define EMP_HEAVY 1 #define EMP_LIGHT 2 diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index dba7ce93afaf..17cbab5683d8 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -12,7 +12,8 @@ #define TRIGGER_GUARD_NONE 0 #define TRIGGER_GUARD_NORMAL 1 //Gun bolt types -///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever +///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted. +/// Example: c20, shotguns, m90 #define BOLT_TYPE_STANDARD 1 ///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. /// Example: Some SMGs, the L6 @@ -29,18 +30,6 @@ ///added recoil of sawn off guns #define SAWN_OFF_RECOIL 1 -//ammo box sprite defines -///ammo box will always use provided icon state -#define AMMO_BOX_ONE_SPRITE 0 -///ammo box will have a different state for each bullet; - -#define AMMO_BOX_PER_BULLET 1 -///ammo box will have a different state for full and empty; -max_ammo and -0 -#define AMMO_BOX_FULL_EMPTY 2 - -#define SUPPRESSED_NONE 0 -#define SUPPRESSED_QUIET 1 ///standard suppressed -#define SUPPRESSED_VERY 2 /// no message - //Autofire component /// Compatible firemode is in the gun. Wait until it's held in the user hands. #define AUTOFIRE_STAT_IDLE (1<<0) @@ -54,6 +43,10 @@ #define COMSIG_AUTOFIRE_SHOT "autofire_shot" #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) +#define SUPPRESSED_NONE 0 +#define SUPPRESSED_QUIET 1 ///standard suppressed +#define SUPPRESSED_VERY 2 /// no message + #define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 #define MANUFACTURER_NONE null @@ -72,6 +65,69 @@ #define MANUFACTURER_PGF "the Etherbor Industries emblem" #define MANUFACTURER_IMPORT "Lanchester Import Co." +///////////////// +// ATTACHMENTS // +///////////////// +#define TRAIT_ATTACHABLE "attachable" + +#define COMSIG_ATTACHMENT_ATTACH "attach-attach" +#define COMSIG_ATTACHMENT_DETACH "attach-detach" +#define COMSIG_ATTACHMENT_EXAMINE "attach-examine" +#define COMSIG_ATTACHMENT_EXAMINE_MORE "attach-examine-more" +#define COMSIG_ATTACHMENT_PRE_ATTACK "attach-pre-attack" +#define COMSIG_ATTACHMENT_ATTACK "attach-attacked" +#define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" + +#define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" + +#define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" +#define ATTACHMENT_SLOT_MUZZLE "muzzle" +#define ATTACHMENT_SLOT_SCOPE "scope" +#define ATTACHMENT_SLOT_GRIP "grip" +#define ATTACHMENT_SLOT_RAIL "rail" +#define ATTACHMENT_SLOT_STOCK "stock" + +/proc/attachment_slot_to_bflag(slot) + switch(slot) + if(ATTACHMENT_SLOT_MUZZLE) + return (1<<0) + if(ATTACHMENT_SLOT_SCOPE) + return (1<<1) + if(ATTACHMENT_SLOT_GRIP) + return (1<<2) + if(ATTACHMENT_SLOT_RAIL) + return (1<<3) + if(ATTACHMENT_SLOT_STOCK) + return (1<<4) + +/proc/attachment_slot_from_bflag(slot) + switch(slot) + if(1<<0) + return ATTACHMENT_SLOT_MUZZLE + if(1<<1) + return ATTACHMENT_SLOT_SCOPE + if(1<<2) + return ATTACHMENT_SLOT_GRIP + if(1<<3) + return ATTACHMENT_SLOT_RAIL + if(1<<4) + return ATTACHMENT_SLOT_STOCK + +#define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ + ATTACHMENT_SLOT_MUZZLE = 1, \ + ATTACHMENT_SLOT_SCOPE = 1, \ + ATTACHMENT_SLOT_GRIP = 1, \ + ATTACHMENT_SLOT_RAIL = 1, \ + ATTACHMENT_SLOT_STOCK = 1, \ +) + +//attach_features_flags +/// Removable by hand +#define ATTACH_REMOVABLE_HAND (1<<0) +/// Removable via crowbar +#define ATTACH_REMOVABLE_TOOL (1<<1) +#define ATTACH_TOGGLE (1<<2) +#define ATTACH_NO_SPRITE (1<<3) ///////////////// // PROJECTILES // @@ -84,6 +140,18 @@ #define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle +//ammo box sprite defines +///ammo box will always use provided icon state +#define AMMO_BOX_ONE_SPRITE 0 +///ammo box will have a different state for each bullet; - +#define AMMO_BOX_PER_BULLET 1 +///ammo box will have a different state for full and empty; -max_ammo and -0 +#define AMMO_BOX_FULL_EMPTY 2 + +#define MAG_SIZE_SMALL 1 +#define MAG_SIZE_MEDIUM 2 +#define MAG_SIZE_LARGE 3 + //Projectile Reflect #define REFLECT_NORMAL (1<<0) #define REFLECT_FAKEPROJECTILE (1<<1) @@ -96,3 +164,6 @@ #define FIREMODE_FULLAUTO "auto" #define FIREMODE_OTHER "other" #define FIREMODE_OTHER_TWO "other2" + +#define GUN_LEFTHAND_ICON 'icons/mob/inhands/weapons/guns_lefthand.dmi' +#define GUN_RIGHTHAND_ICON 'icons/mob/inhands/weapons/guns_righthand.dmi' diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index d4d9807ec0af..1bd23038c600 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -173,3 +173,5 @@ #define SOUND_AREA_LAVALAND SOUND_ENVIRONMENT_MOUNTAINS #define SOUND_AREA_ICEMOON SOUND_ENVIRONMENT_CAVE #define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY + +#define SOUND_EMPTY_MAG 'sound/weapons/empty.ogg' diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 993026c0d5e0..a6f81d8ca4f1 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -366,7 +366,7 @@ return /atom/proc/CtrlShiftClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT) + SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user) return /* diff --git a/code/datums/action.dm b/code/datums/action.dm index de13fc002dde..cdca8729984f 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -86,9 +86,10 @@ if(owner) UnregisterSignal(owner, COMSIG_PARENT_QDELETING) owner = null - button.moved = FALSE //so the button appears in its normal position when given to another owner. - button.locked = FALSE - button.id = null + if(button) + button.moved = FALSE //so the button appears in its normal position when given to another owner. + button.locked = FALSE + button.id = null /datum/action/proc/Trigger() if(!IsAvailable()) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm new file mode 100644 index 000000000000..01e3abedd80b --- /dev/null +++ b/code/datums/components/attachment.dm @@ -0,0 +1,182 @@ +/datum/component/attachment + ///Slot the attachment goes on, also used in descriptions so should be player readable + var/slot + ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm] + var/attach_features_flags + ///Unused so far, should probally handle it in the parent unless you have a specific reason + var/list/valid_parent_types + var/datum/callback/on_attach + var/datum/callback/on_detach + var/datum/callback/on_toggle + ///Called on the parents preattack + var/datum/callback/on_preattack + ///Unused...Also a little broken.. + var/list/datum/action/actions + ///Generated if the attachment can toggle, sends COMSIG_ATTACHMENT_TOGGLE + var/datum/action/attachment/attachment_toggle_action + +/datum/component/attachment/Initialize( + slot = ATTACHMENT_SLOT_RAIL, + attach_features_flags = ATTACH_REMOVABLE_HAND, + valid_parent_types = list(/obj/item/gun), + datum/callback/on_attach = null, + datum/callback/on_detach = null, + datum/callback/on_toggle = null, + datum/callback/on_preattack = null, + list/signals = null + ) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.slot = slot + src.attach_features_flags = attach_features_flags + src.valid_parent_types = valid_parent_types + src.on_attach = on_attach + src.on_detach = on_detach + src.on_toggle = on_toggle + src.on_preattack = on_preattack + + ADD_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") + RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, PROC_REF(try_attach)) + RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) + RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE, PROC_REF(handle_examine)) + RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE_MORE, PROC_REF(handle_examine_more)) + if(attach_features_flags & ATTACH_TOGGLE) + RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) + attachment_toggle_action = new /datum/action/attachment(parent) + RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack)) + RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, PROC_REF(update_overlays)) + RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, PROC_REF(send_slot)) + + for(var/signal in signals) + RegisterSignal(parent, signal, signals[signal]) + +/datum/component/attachment/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") + if(actions && length(actions)) + var/obj/item/gun/parent = src.parent + parent.actions -= actions + QDEL_LIST(actions) + qdel(attachment_toggle_action) + return ..() + +/datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) + SIGNAL_HANDLER + if(attach_features_flags & ATTACH_TOGGLE) + INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user) + holder.update_icon() + attachment_toggle_action.UpdateButtonIcon() + +/datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) + if(on_toggle) + on_toggle.Invoke(holder, user) + return TRUE + + parent.attack_self(user) + return TRUE + +/datum/component/attachment/proc/update_overlays(obj/item/parent, list/overlays, list/offset) + if(!(attach_features_flags & ATTACH_NO_SPRITE)) + overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attached") + +/datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user, bypass_checks) + SIGNAL_HANDLER + + if(!bypass_checks) + if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types))) + return FALSE + + if(on_attach && !on_attach.Invoke(holder, user)) + return FALSE + + parent.forceMove(holder) + + if(attach_features_flags & ATTACH_TOGGLE) + holder.actions += list(attachment_toggle_action) + attachment_toggle_action.gun = holder + attachment_toggle_action.Grant(user) + + return TRUE + +/datum/component/attachment/proc/try_detach(obj/item/parent, obj/item/holder, mob/user) + SIGNAL_HANDLER + + if(!parent.Adjacent(user) || (valid_parent_types && (holder.type in valid_parent_types))) + return FALSE + + if(on_attach && !on_detach.Invoke(holder, user)) + return FALSE + + if(attach_features_flags & ATTACH_TOGGLE) + holder.actions -= list(attachment_toggle_action) + attachment_toggle_action.gun = null + attachment_toggle_action.Remove(user) + + if(user.can_put_in_hand(parent)) + user.put_in_hand(parent) + return TRUE + + parent.forceMove(holder.drop_location()) + return TRUE + +/datum/component/attachment/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) + SIGNAL_HANDLER + +/datum/component/attachment/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) + SIGNAL_HANDLER + +/datum/component/attachment/proc/relay_pre_attack(obj/item/parent, obj/item/gun, atom/target_atom, mob/user, params) + SIGNAL_HANDLER_DOES_SLEEP + + if(on_preattack) + return on_preattack.Invoke(gun, target_atom, user, params) + +/datum/component/attachment/proc/send_slot(obj/item/parent) + SIGNAL_HANDLER + return attachment_slot_to_bflag(slot) + +/datum/action/attachment + name = "Toggle Attachment" + check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + button_icon_state = null + ///Decides where we send our toggle signal for when pressed + var/obj/item/gun/gun = null + +/datum/action/attachment/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + icon_icon = target.icon + button_icon_state = target.icon_state + +/datum/action/attachment/Destroy() + . = ..() + gun = null + +/datum/action/attachment/Trigger() + ..() + SEND_SIGNAL(target, COMSIG_ATTACHMENT_TOGGLE, gun, owner) + +/datum/action/attachment/UpdateButtonIcon() + icon_icon = target.icon + button_icon_state = target.icon_state + ..() + +//Copied from item action.. +/datum/action/attachment/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) + if(button_icon && button_icon_state) + // If set, use the custom icon that we set instead + // of the item appearence + ..() + else if((target && current_button.appearance_cache != target.appearance) || force) //replace with /ref comparison if this is not valid. + var/obj/item/I = target + var/old_layer = I.layer + var/old_plane = I.plane + I.layer = FLOAT_LAYER //AAAH + I.plane = FLOAT_PLANE //^ what that guy said + current_button.cut_overlays() + current_button.add_overlay(I) + I.layer = old_layer + I.plane = old_plane + current_button.appearance_cache = I.appearance diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm new file mode 100644 index 000000000000..82968a17604b --- /dev/null +++ b/code/datums/components/attachment_holder.dm @@ -0,0 +1,188 @@ +/datum/component/attachment_holder + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + ///List of things you can attach to the parent + var/list/valid_types = null + ///How many slots a parent can hold of any one slot + var/list/slot_room = null + ///Icon offsets, should match the sprite itself so just find the position where it should attach + var/list/slot_offsets = null + var/list/obj/item/attachments = list() + +/datum/component/attachment_holder/Initialize( + list/slot_room = null, + list/valid_types = null, + list/slot_offsets = null, + list/default_attachments = null + ) + + if(!isgun(parent)) + return COMPONENT_INCOMPATIBLE + var/obj/item/gun/parent_gun = parent + + src.slot_room = slot_room + src.valid_types = valid_types + src.slot_offsets = slot_offsets + + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(handle_attack)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(handle_examine)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, PROC_REF(handle_examine_more)) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdel)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(handle_item_pre_attack)) + RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, PROC_REF(handle_ctrl_shift_click)) + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(handle_alt_click)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) + + if(length(default_attachments)) + for(var/attachment in default_attachments) + var/obj/item/attachment/new_attachment = new attachment(parent_gun.loc) + INVOKE_ASYNC(src, PROC_REF(do_attach), new_attachment, null, TRUE) + +/datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) + SIGNAL_HANDLER + + for(var/obj/item/attachment/attach as anything in attachments) + var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) + var/list/attach_overlays = list() + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays) + for(var/mutable_appearance/overlay as anything in attach_overlays) + if(slot_offsets && slot_offsets[slot]) + var/matrix/overlay_matrix = new + overlay_matrix.Translate(slot_offsets[slot]["x"] - attach.pixel_shift_x, slot_offsets[slot]["y"] - attach.pixel_shift_y) + overlay.transform = overlay_matrix + overlays += overlay + +/datum/component/attachment_holder/proc/handle_qdel() + SIGNAL_HANDLER + qdel(src) + +/datum/component/attachment_holder/Destroy(force, silent) + QDEL_LIST(attachments) + attachments = null + return ..() + +/datum/component/attachment_holder/proc/attachments_to_list(only_toggles = FALSE) + . = list() + for(var/obj/item/attachment/attach as anything in attachments) + if(attach.name in .) + stack_trace("two attachments with same name; this shouldn't happen and will cause failures") + continue + if(only_toggles && !(attach.attach_features_flags & ATTACH_TOGGLE)) + continue + .[attach.name] = attach + +/datum/component/attachment_holder/proc/handle_ctrl_shift_click(obj/item/parent, mob/user) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(do_attachment_radial), parent, user) + +/datum/component/attachment_holder/proc/handle_alt_click(obj/item/parent, mob/user) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, user) + +/datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user) + var/list/attachments_as_list = attachments_to_list(TRUE) + var/selection = show_radial_menu(user, parent, attachments_as_list) + var/obj/item/attach = attachments_as_list[selection] + if(!attach) + return + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_TOGGLE, parent, user) + +/datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) + if(length(attachments)) + examine_list += span_notice("It has [length(attachments)] attachment\s.") + for(var/obj/item/attach as anything in attachments) + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) + +/datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) + for(var/key in slot_room) + if(slot_room[key]) + examine_list += span_notice("It has [slot_room[key]] slot\s free for [key] attachments.") + if(length(attachments)) + examine_list += span_notice("It has the following attachments:") + for(var/obj/item/attach as anything in attachments) + examine_list += span_notice("\t- [attach.name]") + if(length(valid_types)) + examine_list += span_notice("It can accept:") + for(var/obj/attach_type as anything in valid_types) + examine_list += span_notice("\t- [initial(attach_type.name)]") + for(var/obj/item/attach as anything in attachments) + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list) + +/datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user, bypass_checks) + var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) + if(!(attachment.type in valid_types)) + to_chat(user, span_notice("[attachment] is not a valid attachment for this [parent]!")) + return + if(!slot_room[slot]) + to_chat(user, span_notice("[parent] does not contain room for [attachment]!")) + return + slot_room[slot]-- + . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user, bypass_checks) + if(.) + attachments += attachment + var/atom/parent = src.parent + parent.update_icon() + +/datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) + var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) + if(slot in slot_room) + slot_room[slot]++ + . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user) + if(.) + attachments -= attachment + var/atom/parent = src.parent + parent.update_icon() + +/datum/component/attachment_holder/proc/handle_detach(obj/item/parent, mob/user, obj/item/tool) + var/list/tool_list = list() + var/list/hand_list = list() + for(var/obj/item/attachment/attach as anything in attachments) + if(attach.attach_features_flags & ATTACH_REMOVABLE_TOOL) + tool_list[attach.name] = attach + if(attach.attach_features_flags & ATTACH_REMOVABLE_HAND) + hand_list[attach.name] = attach + if(tool) + if(!length(tool_list)) + return + var/selected = tgui_input_list(user, "Select Attachment", "Detach", tool_list) + if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed)) + return + do_detach(tool_list[selected], user) + else + if(!length(hand_list)) + return + var/selected = tgui_input_list(user, "Select Attachment", "Detach", hand_list) + if(do_after(user, 2 SECONDS, parent)) + do_detach(hand_list[selected], user) + + +/datum/component/attachment_holder/proc/handle_attack(obj/item/parent, obj/item/item, mob/user) + SIGNAL_HANDLER + + if(!user.Adjacent(parent)) + return + + if(item.tool_behaviour == TOOL_CROWBAR && length(attachments)) + INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, user, item) + return TRUE + + if(HAS_TRAIT(item, TRAIT_ATTACHABLE)) + INVOKE_ASYNC(src, PROC_REF(do_attach), item, user) + return TRUE + + for(var/obj/item/attach as anything in attachments) + if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_ATTACK, parent, item, user)) + parent.update_icon() + return TRUE + +/datum/component/attachment_holder/proc/handle_item_pre_attack(obj/item/parent, atom/target_atom, mob/user, params) + SIGNAL_HANDLER + + for(var/obj/item/attach as anything in attachments) + if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target_atom, user, params)) + return TRUE diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm index 4c856cf99d3f..91e0ac816189 100644 --- a/code/datums/wires/mines.dm +++ b/code/datums/wires/mines.dm @@ -28,7 +28,7 @@ if(WIRE_PIN) if(ourmine.clicked == TRUE) holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] click softly.")) - playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE) + playsound(ourmine, SOUND_EMPTY_MAG, 30, TRUE) ourmine.clicked = FALSE else holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad shifts slightly. Nothing happens.")) @@ -61,7 +61,7 @@ ourmine.dud = TRUE if(ourmine.clicked == TRUE) holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] shift out of place.")) - playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE) + playsound(ourmine, SOUND_EMPTY_MAG, 30, TRUE) ourmine.clicked = FALSE else holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad goes loose.")) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 4a16a6f9b249..b0b40ea0877e 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -6,7 +6,7 @@ var/fire_sound var/projectiles_per_shot = 1 var/variance = 0 - var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter + var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter var/projectile_delay = 0 var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. var/kickback = TRUE //Will using this weapon in no grav push mecha back. @@ -137,8 +137,8 @@ desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." icon_state = "mecha_plasmacutter" item_state = "plasmacutter" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON energy_drain = 30 projectile = /obj/projectile/plasma/adv/mech fire_sound = 'sound/weapons/plasma_cutter.ogg' @@ -347,7 +347,7 @@ projectiles_cache_max = 1200 projectiles_per_shot = 3 variance = 6 - randomspread = 1 + randomspread = TRUE projectile_delay = 2 harmful = TRUE ammo_type = "lmg" diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm new file mode 100644 index 000000000000..a6c25ec8cdf3 --- /dev/null +++ b/code/game/objects/items/attachments/_attachment.dm @@ -0,0 +1,99 @@ +///Most of the logic of attachments is held within the component which allows you to add other items as attachments in theory +/obj/item/attachment + name = "broken attachment" + desc = "alert coders" + icon = 'icons/obj/guns/attachments.dmi' + + //Slot the attachment goes on, also used in descriptions so should be player readable + var/slot = ATTACHMENT_SLOT_RAIL + ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm] + var/attach_features_flags = ATTACH_REMOVABLE_HAND + ///See attachment component + var/list/valid_parents = list() + ///Unused.. but could hold extra callbacks I assume? + var/list/signals = list() + ///Component that handles most of the logic of attachments + var/datum/component/attachment/attachment_comp + + ///If the attachment is on or off + var/toggled = FALSE + var/toggle_on_sound = 'sound/items/flashlight_on.ogg' + var/toggle_off_sound = 'sound/items/flashlight_off.ogg' + + ///Determines the amount of pixels to move the icon state for the overlay. in the x direction + var/pixel_shift_x = 16 + ///Determines the amount of pixels to move the icon state for the overlay. in the y direction + var/pixel_shift_y = 16 + + //Toggle modifers are handled seperatly + ///Modifier applied to the parent + var/spread_mod = 0 + ///Modifier applied to the parent + var/spread_unwielded_mod = 0 + ///Modifier applied to the parent, deciseconds + var/wield_delay = 0 + ///Modifier applied to the parent + var/size_mod = 0 + +/obj/item/attachment/Initialize() + . = ..() + attachment_comp = AddComponent( \ + /datum/component/attachment, \ + slot, \ + attach_features_flags, \ + valid_parents, \ + CALLBACK(src, PROC_REF(apply_attachment)), \ + CALLBACK(src, PROC_REF(remove_attachment)), \ + CALLBACK(src, PROC_REF(toggle_attachment)), \ + CALLBACK(src, PROC_REF(on_preattack)), \ + signals) + +/obj/item/attachment/Destroy() + qdel(attachment_comp) + attachment_comp = null + . = ..() + +/obj/item/attachment/proc/toggle_attachment(obj/item/gun/gun, mob/user) + SHOULD_CALL_PARENT(TRUE) + + playsound(user, toggled ? toggle_on_sound : toggle_off_sound, 40, TRUE) + toggled = !toggled + icon_state = "[initial(icon_state)][toggled ? "-on" : ""]" + +/// Checks if a user should be allowed to attach this attachment to the given parent +/obj/item/attachment/proc/apply_attachment(obj/item/gun/gun, mob/user) + SHOULD_CALL_PARENT(TRUE) + + if(toggled) + to_chat(user, span_warning("You cannot attach [src] while it is active!")) + return FALSE + + apply_modifiers(gun, user, TRUE) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) + return TRUE + +/obj/item/attachment/proc/remove_attachment(obj/item/gun/gun, mob/user) + SHOULD_CALL_PARENT(TRUE) + + if(toggled) + toggle_attachment(gun, user) + + apply_modifiers(gun, user, FALSE) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) + return TRUE + +/obj/item/attachment/proc/on_preattack(obj/item/gun/gun, atom/target, mob/user, list/params) + return FALSE + +///Handles the modifiers to the parent gun +/obj/item/attachment/proc/apply_modifiers(obj/item/gun/gun, mob/user, attaching) + if(attaching) + gun.spread += spread_mod + gun.spread_unwielded += spread_unwielded_mod + gun.wield_delay += wield_delay + gun.w_class += size_mod + else + gun.spread -= spread_mod + gun.spread_unwielded -= spread_unwielded_mod + gun.wield_delay -= wield_delay + gun.w_class -= size_mod diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm new file mode 100644 index 000000000000..6b1961f4b693 --- /dev/null +++ b/code/game/objects/items/attachments/bayonet.dm @@ -0,0 +1,22 @@ +/obj/item/attachment/bayonet + name = "bayonet" + desc = "Stabby-Stabby" + icon_state = "bayonet" + force = 15 + throwforce = 10 + pickup_sound = 'sound/items/handling/knife1_pickup.ogg' + drop_sound = 'sound/items/handling/knife3_drop.ogg' + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharpness = IS_SHARP_ACCURATE + + pixel_shift_x = 1 + pixel_shift_y = 4 + spread_mod = 1 + wield_delay = 0.1 SECONDS + +/obj/item/attachment/bayonet/on_preattack(obj/item/gun/gun, atom/target, mob/living/user, list/params) + if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) + melee_attack_chain(user, target, params) + return COMPONENT_NO_ATTACK + diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm new file mode 100644 index 000000000000..082da1153de5 --- /dev/null +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -0,0 +1,23 @@ +/obj/item/attachment/laser_sight + name = "laser sight" + desc = "Designed to be rail-mounted on a compatible firearm to provide increased accuracy and decreased spread." + icon_state = "laserpointer" + + attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE + pixel_shift_x = 1 + pixel_shift_y = 4 + wield_delay = 0.1 SECONDS + +/obj/item/attachment/laser_sight/toggle_attachment(obj/item/gun/gun, mob/user) + . = ..() + + if(toggled) + gun.spread -= 3 + gun.spread_unwielded -= 3 + gun.wield_delay -= 0.3 SECONDS + else + gun.spread += 3 + gun.spread_unwielded += 3 + gun.wield_delay += 0.3 SECONDS + + playsound(user, toggled ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm new file mode 100644 index 000000000000..0cfbe9661e9e --- /dev/null +++ b/code/game/objects/items/attachments/rail_light.dm @@ -0,0 +1,33 @@ +/obj/item/attachment/rail_light + name = "rail light" + desc = "A flashlight made to be mounted on a firearm." + icon_state = "raillight" + light_color = COLOR_LIGHT_ORANGE + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_range = 4 + light_power = 0.8 + light_on = FALSE + + attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE + pixel_shift_x = 1 + pixel_shift_y = 4 + wield_delay = 0.1 SECONDS + +/obj/item/attachment/rail_light/toggle_attachment(obj/item/gun/gun, mob/user) + . = ..() + set_light_on(toggled) + update_icon() + +/obj/item/attachment/rail_light/apply_attachment(obj/item/gun/gun, mob/user) + . = ..() + if(!.) + return + + set_light_flags(light_flags | LIGHT_ATTACHED) + +/obj/item/attachment/rail_light/remove_attachment(obj/item/gun/gun, mob/user) + . = ..() + if(!.) + return + + set_light_flags(light_flags & ~LIGHT_ATTACHED) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm new file mode 100644 index 000000000000..31cf3fc15b36 --- /dev/null +++ b/code/game/objects/items/attachments/silencer.dm @@ -0,0 +1,19 @@ +/obj/item/attachment/silencer + name = "suppressor" + desc = "An attachment for the barrel of a firearm. Muffles the gunshot and muzzle flash." + icon_state = "silencer" + + slot = ATTACHMENT_SLOT_MUZZLE + pixel_shift_x = 1 + pixel_shift_y = 2 + spread_mod = -1 + size_mod = 1 + +/obj/item/attachment/silencer/apply_attachment(obj/item/gun/gun, mob/user) + . = ..() + gun.suppressed = TRUE + +/obj/item/attachment/silencer/remove_attachment(obj/item/gun/gun, mob/user) + . = ..() + gun.suppressed = FALSE + return TRUE diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm new file mode 100644 index 000000000000..1fe286c14296 --- /dev/null +++ b/code/game/objects/items/attachments/stock.dm @@ -0,0 +1,40 @@ +/obj/item/attachment/foldable_stock + name = "folding stock" + desc = "A folding stock that can be attached to certain weapons to improve stability and decreases recoil." + icon_state = "skm-carbine-stock" + slot = ATTACHMENT_SLOT_STOCK + attach_features_flags = ATTACH_TOGGLE + + pixel_shift_x = 17 + pixel_shift_y = 18 + + var/toggled_slowdown = 0.10 + var/toggled_wield_delay = -0.4 SECONDS + var/toggled_recoil_bonus = -2 + var/toggled_spread_bonus = -5 + +/obj/item/attachment/foldable_stock/toggle_attachment(obj/item/gun/gun, mob/user) + . = ..() + + if(toggled) + to_chat(user, span_notice("You unfold the stock on the [src].")) + gun.w_class += 1 + gun.wield_delay += toggled_wield_delay + gun.wield_slowdown += toggled_slowdown + gun.recoil += toggled_recoil_bonus + gun.spread += toggled_spread_bonus + else + to_chat(user, span_notice("You fold the stock on the [src].")) + gun.w_class -= 1 + gun.wield_delay -= toggled_wield_delay + gun.wield_slowdown -= toggled_slowdown + gun.recoil -= toggled_recoil_bonus + gun.spread -= toggled_spread_bonus + + if(gun.wielded) + user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = gun.wield_slowdown) + + playsound(src, SOUND_EMPTY_MAG, 100, 1) + +/obj/item/attachment/foldable_stock/inteq + icon_state = "skm-inteqsmg-stock" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index dca088c1be2e..204371ca0e51 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -28,7 +28,7 @@ custom_materials = list(/datum/material/iron=50, /datum/material/glass=20) custom_premium_price = 450 toolspeed = 1 - usesound = 'sound/weapons/empty.ogg' + usesound = SOUND_EMPTY_MAG var/obj/machinery/buffer // simple machine buffer for device linkage var/mode = 0 diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 060e59f0f5de..5108a8713633 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -11,8 +11,8 @@ icon = 'icons/obj/pneumaticCannon.dmi' icon_state = "pneumaticCannon" item_state = "bulldog" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) var/maxWeightClass = 20 //The max weight of items that can fit into the cannon var/loadedWeightClass = 0 //The weight of items currently in the cannon diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 5d87b42b78e5..92123969a4cd 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -624,7 +624,7 @@ new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/gun/ballistic/automatic/smg/c20r(src) - new /obj/item/suppressor/specialoffer(src) + new /obj/item/attachment/silencer(src) /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses." diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index f55613dd4d21..64a3a11cf327 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -47,5 +47,5 @@ new /obj/item/clothing/under/syndicate/sniper(src) new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) - new /obj/item/suppressor/specialoffer(src) + new /obj/item/attachment/silencer(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index bfbc4679af88..f34aae9e6f82 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -120,7 +120,7 @@ switch (pickweight(list( "bond" = 2, "ninja" = 1, "darklord" = 1, "white_whale_holy_grail" = 2, "mad_scientist" = 2, "bee" = 1, "mr_freeze" = 2, "made_man"= 1))) if("bond") new /obj/item/gun/ballistic/automatic/pistol/syndicate(src) - new /obj/item/suppressor(src) + new /obj/item/attachment/silencer(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/clothing/under/chameleon(src) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b1dfb479b66c..5ce082d79dc9 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -187,8 +187,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "revolver" item_state = "gun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm index 384886ac30d3..d24cbf68171d 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm @@ -125,7 +125,7 @@ /datum/blackmarket_item/tool/suppressor name = "Suppressor" desc = "A suppressor, for when you to keep your murder on the down low." - item = /obj/item/suppressor + item = /obj/item/attachment/silencer price_min = 100 price_max = 700 diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 1d71b2799026..7ac296f09398 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -189,3 +189,31 @@ cost = 5000 contains = list(/obj/item/storage/guncase/skm) crate_name = "auto rifle crate" + +/datum/supply_pack/gun/attachment/rail_light + name = "Tactical Rail Light Crate" + desc = "Contains a single rail light to be mounted on a firearm." + cost = 250 + contains = list(/obj/item/attachment/rail_light) + crate_name = "rail light crate" + +/datum/supply_pack/gun/attachment/laser_sight + name = "Laser Sight Crate" + desc = "Contains a single rail light to be mounted on a firearm." + cost = 250 + contains = list(/obj/item/attachment/laser_sight) + crate_name = "laser sight crate" + +/datum/supply_pack/gun/attachment/bayonet + name = "Bayonet Crate" + desc = "Contains a single bayonet to be mounted on a firearm." + cost = 250 + contains = list(/obj/item/attachment/bayonet) + crate_name = "bayonet crate" + +/datum/supply_pack/gun/attachment/silencer + name = "Suppressor Crate" + desc = "Contains a single suppressor to be mounted on a firearm." + cost = 250 + contains = list(/obj/item/attachment/silencer) + crate_name = "silencer crate" diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index ced086e1dfc6..4774ea852424 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -476,15 +476,15 @@ GLOBAL_LIST_INIT(hallucination_list, list( A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER) if("taser") if(side == "right") - image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + image_file = GUN_RIGHTHAND_ICON else - image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + image_file = GUN_LEFTHAND_ICON A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER) if("ebow") if(side == "right") - image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + image_file = GUN_RIGHTHAND_ICON else - image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + image_file = GUN_LEFTHAND_ICON A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER) if("baton") if(side == "right") diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 030e592d80cd..b6073d4c86a2 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -113,7 +113,7 @@ /obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype) set_light_on(!light_on) - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) + playsound(user, SOUND_EMPTY_MAG, 100, TRUE) update_appearance() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 268413ef203c..e48f4d5af5aa 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -869,8 +869,8 @@ name = "Slowpoke" desc = "The work of a truly genius gunsmith, altered and \"improved\" by a truly deranged Nanotrasen scientist, using components from a kinetic accelerator and beam rifle. Draw, partner!" icon = 'icons/obj/guns/energy.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON icon_state = "spur" item_state = "spur" selfcharge = 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1cb061ff9fd9..64dfdfde91ce 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -501,6 +501,10 @@ else if(!(flags & SHOCK_NOGLOVES)) //This gets the siemens_coeff for all non tesla shocks if(gloves) siemens_coeff *= gloves.siemens_coefficient + //If it doesnt have physiology its prob still initializing. + if(!physiology) + . = ..() + return siemens_coeff *= physiology.siemens_coeff siemens_coeff *= dna.species.siemens_coeff . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm index 3a4506b62562..a762a9298279 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm @@ -232,7 +232,6 @@ projectiletype = /obj/projectile/tentacle projectilesound = 'sound/effects/splat.ogg' Shoot(target) - /////TENTACLE END /////STING ATTACK diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 26597a64f33b..b216296cfe8d 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -32,7 +32,7 @@ var/pellets = 1 //Pellets for spreadshot var/variance = 0 //Variance for inaccuracy fundamental to the casing - var/randomspread = 0 //Randomspread for automatics + var/randomspread = FALSE //Randomspread for automatics var/delay = 0 //Delay for energy weapons var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b92b79e0009f..707f4805afe3 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -4,6 +4,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "flatgun" item_state = "gun" + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=2000) @@ -16,101 +18,185 @@ attack_verb = list("struck", "hit", "bashed") pickup_sound = 'sound/items/handling/gun_pickup.ogg' drop_sound = 'sound/items/handling/gun_drop.ogg' + //trigger guard on the weapon, hulks can't fire them with their big meaty fingers + trigger_guard = TRIGGER_GUARD_NORMAL - /// The manufacturer of this weapon. For flavor mostly. If none, this will not show. + ///The manufacturer of this weapon. For flavor mostly. If none, this will not show. var/manufacturer = MANUFACTURER_NONE +/* + * Muzzle +*/ + ///Effect for the muzzle flash of the gun. + var/obj/effect/muzzle_flash/muzzle_flash + ///Icon state of the muzzle flash effect. + var/muzzleflash_iconstate + ///Brightness of the muzzle flash effect. + var/muzzle_flash_lum = 3 + ///Color of the muzzle flash effect. + var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW + +/* + * Firing +*/ var/fire_sound = 'sound/weapons/gun/pistol/shot.ogg' var/vary_fire_sound = TRUE var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' - ///Text showed when attempting to fire with no round or empty round. var/dry_fire_text = "click" - ///whether or not a message is displayed when fired - var/suppressed = null - var/can_suppress = FALSE + +/* + * Reloading +*/ + var/obj/item/ammo_casing/chambered = null + ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it + var/tac_reloads = TRUE + ///If we have the 'snowflake mechanic,' how long should it take to reload? + var/tactical_reload_delay = 1 SECONDS + +//BALLISTIC + ///Compatible magazines with the gun + var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info + ///Whether the gun alarms when empty or not. + var/empty_alarm = FALSE + ///Do we eject the magazine upon runing out of ammo? + var/empty_autoeject = FALSE + ///Whether the gun supports multiple special mag types + var/special_mags = FALSE + + ///Actual magazine currently contained within the gun + var/obj/item/ammo_box/magazine/magazine + ///whether the gun ejects the chambered casing + var/casing_ejector = TRUE + ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. + var/internal_magazine = FALSE + + ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx + var/magazine_wording = "magazine" + ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. + var/cartridge_wording = "bullet" + + ///sound when inserting magazine + var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' + ///sound when inserting an empty magazine + var/load_empty_sound = 'sound/weapons/gun/general/magazine_insert_empty.ogg' + ///volume of loading sound + var/load_sound_volume = 40 + ///whether loading sound should vary + var/load_sound_vary = TRUE + ///Sound of ejecting a magazine + var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' + ///sound of ejecting an empty magazine + var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg' + ///volume of ejecting a magazine + var/eject_sound_volume = 40 + ///whether eject sound should vary + var/eject_sound_vary = TRUE + +//ENERGY + //What type of power cell this uses + var/obj/item/stock_parts/cell/gun/cell + var/cell_type = /obj/item/stock_parts/cell/gun + //Can it be charged in a recharger? + var/can_charge = TRUE + var/selfcharge = FALSE + var/charge_tick = 0 + var/charge_delay = 4 + //whether the gun's cell drains the cyborg user's cell to recharge + var/use_cyborg_cell = FALSE + ///Used for large and small cells + var/mag_size = MAG_SIZE_MEDIUM + //Time it takes to unscrew the cell + var/unscrewing_time = 2 SECONDS + + ///if the gun's cell cannot be replaced + var/internal_cell = FALSE + + var/list/ammo_type = list(/obj/item/ammo_casing/energy) + //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. + var/select = 1 + +/* + * Operation +*/ + //whether or not a message is displayed when fired + var/suppressed = FALSE var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 - var/can_unsuppress = TRUE - var/obj/item/ammo_casing/chambered = null - ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it - trigger_guard = TRIGGER_GUARD_NORMAL - ///Set the description of the gun to this when sawed off - var/sawn_desc = null - ///This triggers some sprite behavior in shotguns and prevents further sawoff, note that can_be_sawn_off is on gun/ballistic and not here, wtf. - var/sawn_off = FALSE - /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst. - var/burst_size = 3 - ///The rate of fire when firing in a burst. Not the delay between bursts - var/burst_delay = 0.15 SECONDS - ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst - var/fire_delay = 0.2 SECONDS + //true if the gun is wielded via twohanded component, shouldnt affect anything else + var/wielded = FALSE + //true if the gun is wielded after delay, should affects accuracy + var/wielded_fully = FALSE + ///Slowdown for wielding + var/wield_slowdown = 0.1 + ///How long between wielding and firing in tenths of seconds + var/wield_delay = 0.4 SECONDS + ///Storing value for above + var/wield_time = 0 - /// after initializing, we set the firemode to this - var/default_firemode = FIREMODE_SEMIAUTO - ///Firemode index, due to code shit this is the currently selected firemode - var/firemode_index - /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here. - var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO) - /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example. - var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire") - ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on. - var/fire_select_icon_state_prefix = "" - ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single" - var/adjust_fire_select_icon_state_on_safety = FALSE +// BALLISTIC + ///Whether the gun has to be racked each shot or not. + var/semi_auto = TRUE + ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT + var/bolt_type = BOLT_TYPE_STANDARD + ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. + var/bolt_locked = FALSE + ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. + var/bolt_wording = "bolt" + ///length between individual racks + var/rack_delay = 5 + ///time of the most recent rack, used for cooldown purposes + var/recent_rack = 0 + + ///Whether the gun can be sawn off by sawing tools + var/can_be_sawn_off = FALSE + //description change if weapon is sawn-off + var/sawn_desc = null + var/sawn_off = FALSE - ///Are we firing a burst? If so, dont fire again until burst is done - var/currently_firing_burst = FALSE - ///This prevents gun from firing until the coodown is done, affected by lag - var/current_cooldown = 0 - ///affects if you can fire it unwielded or even dual wield it. LIGHT means dual wield allowed, HEAVY and higher means you have to wield to fire + ///sound of racking + var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg' + ///volume of racking + var/rack_sound_volume = 60 + ///whether racking sound should vary + var/rack_sound_vary = TRUE + ///sound of when the bolt is locked back manually + var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg' + ///volume of lock back + var/lock_back_sound_volume = 60 + ///whether lock back varies + var/lock_back_sound_vary = TRUE + + ///sound of dropping the bolt or releasing a slide + var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg' + ///volume of bolt drop/slide release + var/bolt_drop_sound_volume = 60 + ///empty alarm sound (if enabled) + var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg' + ///empty alarm volume sound + var/empty_alarm_volume = 70 + ///whether empty alarm sound varies + var/empty_alarm_vary = TRUE + +/* + * Stats +*/ var/weapon_weight = WEAPON_LIGHT - ///If dual wielding, add this to the spread - var/dual_wield_spread = 24 - /// ???, no clue what this is. Original desc: //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. - var/randomspread = 1 - - ///Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. + //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. var/projectile_damage_multiplier = 1 - - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - - var/list/attachment_options = list() //This.. works for now.. gun refactor soon - - var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. - var/obj/item/flashlight/seclite/gun_light - var/datum/action/item_action/toggle_gunlight/alight - var/gunlight_state = "flight" - - var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one. - var/obj/item/kitchen/knife/bayonet - var/knife_x_offset = 0 - var/knife_y_offset = 0 - - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite - var/ammo_y_offset = 0 - var/flight_x_offset = 0 - var/flight_y_offset = 0 - - //Zooming - var/zoomable = FALSE //whether the gun generates a Zoom action on creation - var/zoomed = FALSE //Zoom toggle - var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect) - var/zoom_out_amt = 0 - var/datum/action/toggle_scope_zoom/azoom - + //Speed someone can be flung if its point blank var/pb_knockback = 0 - var/wielded = FALSE // true if the gun is wielded via twohanded component, shouldnt affect anything else - - var/wielded_fully = FALSE // true if the gun is wielded after delay, should affects accuracy - + //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/randomspread = TRUE ///How much the bullet scatters when fired while wielded. var/spread = 4 ///How much the bullet scatters when fired while unwielded. var/spread_unwielded = 12 + //additional spread when dual wielding + var/dual_wield_spread = 24 + ///Screen shake when the weapon is fired while wielded. var/recoil = 0 @@ -121,43 +207,126 @@ ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. var/recoil_deviation = 22.5 - ///Slowdown for wielding - var/wield_slowdown = 0.1 - ///How long between wielding and firing in tenths of seconds - var/wield_delay = 0.4 SECONDS - ///Storing value for above - var/wield_time = 0 + /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst. + var/burst_size = 3 + ///The rate of fire when firing in a burst. Not the delay between bursts + var/burst_delay = 0.15 SECONDS + ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst + var/fire_delay = 0.2 SECONDS + //Prevent the weapon from firing again while already firing + var/firing_burst = 0 - ///Effect for the muzzle flash of the gun. - var/obj/effect/muzzle_flash/muzzle_flash - ///Icon state of the muzzle flash effect. - var/muzzleflash_iconstate - ///Brightness of the muzzle flash effect. - var/muzzle_flash_lum = 3 - ///Color of the muzzle flash effect. - var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW +/* + * Overlay +*/ + ///Used for positioning ammo count overlay on sprite + var/ammo_x_offset = 0 + var/ammo_y_offset = 0 - //gun saftey +//BALLISTIC + ///Whether the sprite has a visible magazine or not + var/mag_display = FALSE + ///Whether the sprite has a visible ammo display or not + var/mag_display_ammo = FALSE + ///Whether the sprite has a visible indicator for being empty or not. + var/empty_indicator = FALSE + ///Whether the sprite has a visible magazine or not + var/show_magazine_on_sprite = FALSE + ///Whether the sprite has a visible ammo display or not + var/show_magazine_on_sprite_ammo = FALSE + ///Whether the gun supports multiple special mag types + var/unique_mag_sprites_for_variants = FALSE + +//ENERGY + //Do we handle overlays with base update_appearance()? + var/automatic_charge_overlays = TRUE + var/charge_sections = 4 + //if this gun uses a stateful charge bar for more detail + var/shaded_charge = FALSE + //Modifies WHOS state //im SOMEWHAT this is wether or not the overlay changes based on the ammo type selected + var/modifystate = TRUE + +/* + * Attachment +*/ + ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED + var/list/valid_attachments = list() + ///Reference to our attachment holder to prevent subtypes having to call GetComponent + var/datum/component/attachment_holder/attachment_holder + ///Number of attachments that can fit on a given slot + var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE + ///Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y + var/list/slot_offsets = list() + +/* + * Zooming +*/ + ///Whether the gun generates a Zoom action on creation + var/zoomable = FALSE + //Zoom toggle + var/zoomed = FALSE + ///Distance in TURFs to move the user's screen forward (the "zoom" effect) + var/zoom_amt = 3 + var/zoom_out_amt = 0 + var/datum/action/toggle_scope_zoom/azoom + +/* + * Safety +*/ ///Does this gun have a saftey and thus can toggle it? var/has_safety = FALSE ///If the saftey on? If so, we can't fire the weapon var/safety = FALSE - ///The wording of safety. Useful for guns that have a non-standard safety system, like a revolver var/safety_wording = "safety" +/* + * Spawn Info (Stuff that becomes useless onces the gun is spawned, mostly here for mappers) +*/ + ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail + var/list/default_attachments = list() + +//BALLISTIC + ///Whether the gun will spawn loaded with a magazine + var/spawnwithmagazine = TRUE + +//ENERGY + //set to true so the gun is given an empty cell + var/dead_cell = FALSE + +// Need to sort + ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it + trigger_guard = TRIGGER_GUARD_NORMAL + + /// after initializing, we set the firemode to this + var/default_firemode = FIREMODE_SEMIAUTO + ///Firemode index, due to code shit this is the currently selected firemode + var/firemode_index + /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here. + var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO) + /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example. + var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire") + ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on. + var/fire_select_icon_state_prefix = "" + ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single" + var/adjust_fire_select_icon_state_on_safety = FALSE + + ///Are we firing a burst? If so, dont fire again until burst is done + var/currently_firing_burst = FALSE + ///This prevents gun from firing until the coodown is done, affected by lag + var/current_cooldown = 0 + /obj/item/gun/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - if(gun_light) - alight = new(src) muzzle_flash = new(src, muzzleflash_iconstate) build_zooming() build_firemodes() /obj/item/gun/ComponentInitialize() . = ..() + attachment_holder = AddComponent(/datum/component/attachment_holder, slot_available, valid_attachments, slot_offsets, default_attachments) AddComponent(/datum/component/two_handed) /// triggered on wield of two handed item @@ -196,16 +365,10 @@ user.remove_movespeed_modifier(/datum/movespeed_modifier/gun) /obj/item/gun/Destroy() - if(gun_light) - QDEL_NULL(gun_light) - if(bayonet) - QDEL_NULL(bayonet) if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) QDEL_NULL(chambered) if(azoom) QDEL_NULL(azoom) - if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK - QDEL_NULL(suppressed) if(muzzle_flash) QDEL_NULL(muzzle_flash) return ..() @@ -213,36 +376,17 @@ /obj/item/gun/handle_atom_del(atom/A) if(A == chambered) chambered = null - update_appearance() - if(A == bayonet) - clear_bayonet() - if(A == gun_light) - clear_gunlight() + update_icon() return ..() /obj/item/gun/examine(mob/user) . = ..() - if(gun_light) - . += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it." - if(can_flashlight) //if it has a light and this is false, the light is permanent. - . += "[gun_light] looks like it can be unscrewed from [src]." - else if(can_flashlight) - . += "It has a mounting point for a seclite." - - if(bayonet) - . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it." - if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent. - . += "[bayonet] looks like it can be unscrewed from [src]." - else if(can_bayonet) - . += "It has a bayonet lug on it." - if(has_safety) . += "The safety is [safety ? "ON" : "OFF"]. Ctrl-Click to toggle the safety." if(manufacturer) . += "It has [manufacturer] engraved on it." - /obj/item/gun/equipped(mob/living/user, slot) . = ..() if(zoomed && user.get_active_held_item() != src) @@ -250,48 +394,8 @@ /obj/item/gun/attack(mob/M as mob, mob/user) if(user.a_intent == INTENT_HARM) //Flogging - if(bayonet) - M.attackby(bayonet, user) - return - else - return ..() - return - -/obj/item/gun/attack_obj(obj/O, mob/user) - if(user.a_intent == INTENT_HARM) - if(bayonet) - O.attackby(bayonet, user) - return - return ..() - -/obj/item/gun/attackby(obj/item/I, mob/user, params) - if(user.a_intent == INTENT_HARM) - return ..() - else if(istype(I, /obj/item/flashlight/seclite)) - if(!can_flashlight) - return ..() - var/obj/item/flashlight/seclite/S = I - if(!gun_light) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You click [S] into place on [src].") - set_gun_light(S) - update_gunlight() - alight = new(src) - if(loc == user) - alight.Grant(user) - else if(istype(I, /obj/item/kitchen/knife)) - var/obj/item/kitchen/knife/K = I - if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it. - return ..() - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You attach [K] to [src]'s bayonet lug.") - bayonet = K - update_appearance() - - else return ..() + return //called after the gun has successfully fired its chambered ammo. /obj/item/gun/proc/process_chamber(atom/shooter) @@ -513,6 +617,7 @@ /obj/item/gun/proc/reset_current_cooldown() current_cooldown = FALSE + /obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) if(!safety) to_chat(user, "*[dry_fire_text]*") @@ -600,116 +705,6 @@ update_appearance() - -/obj/item/gun/screwdriver_act(mob/living/user, obj/item/I) - . = ..() - if(.) - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - attachment_options = list() - get_gun_attachments() - if(LAZYLEN(attachment_options) == 1) - remove_gun_attachments(user, I, attachment_options[1]) - else if (LAZYLEN(attachment_options)) - var/picked_option = show_radial_menu(user, src, attachment_options, radius = 38, require_near = TRUE) - remove_gun_attachments(user, I, picked_option) - -/obj/item/gun/proc/get_gun_attachments() - if(can_flashlight && gun_light) - attachment_options += list("Light" = image(icon = gun_light.icon, icon_state = gun_light.icon_state)) - if(can_bayonet && bayonet) - attachment_options += list("Knife" = image(icon = bayonet.icon, icon_state = bayonet.icon_state)) - -/obj/item/gun/proc/remove_gun_attachments(mob/living/user, obj/item/I, picked_option) - if(picked_option == "Light") - return remove_gun_attachment(user, I, gun_light, "unscrewed") - else if(picked_option == "Knife") - return remove_gun_attachment(user, I, bayonet, "unfix") - -/obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb) - if(tool_item) - tool_item.play_tool_sound(src) - to_chat(user, "You [removal_verb ? removal_verb : "remove"] [item_to_remove] from [src].") - item_to_remove.forceMove(drop_location()) - - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(item_to_remove) - - if(item_to_remove == bayonet) - return clear_bayonet() - else if(item_to_remove == gun_light) - return clear_gunlight() - -/obj/item/gun/proc/clear_bayonet() - if(!bayonet) - return - bayonet = null - update_appearance() - return TRUE - -/obj/item/gun/proc/clear_gunlight() - if(!gun_light) - return - var/obj/item/flashlight/seclite/removed_light = gun_light - set_gun_light(null) - update_gunlight() - removed_light.update_brightness() - QDEL_NULL(alight) - return TRUE - -/** - * Swaps the gun's seclight, dropping the old seclight if it has not been qdel'd. - * - * Returns the former gun_light that has now been replaced by this proc. - * Arguments: - * * new_light - The new light to attach to the weapon. Can be null, which will mean the old light is removed with no replacement. - */ -/obj/item/gun/proc/set_gun_light(obj/item/flashlight/seclite/new_light) - // Doesn't look like this should ever happen? We're replacing our old light with our old light? - if(gun_light == new_light) - CRASH("Tried to set a new gun light when the old gun light was also the new gun light.") - - . = gun_light - - // If there's an old gun light that isn't being QDELETED, detatch and drop it to the floor. - if(!QDELETED(gun_light)) - gun_light.set_light_flags(gun_light.light_flags & ~LIGHT_ATTACHED) - if(gun_light.loc != get_turf(src)) - gun_light.forceMove(get_turf(src)) - - // If there's a new gun light to be added, attach and move it to the gun. - if(new_light) - new_light.set_light_flags(new_light.light_flags | LIGHT_ATTACHED) - if(new_light.loc != src) - new_light.forceMove(src) - - gun_light = new_light - -/obj/item/gun/ui_action_click(mob/user, actiontype) - if(istype(actiontype, alight)) - toggle_gunlight() - else - ..() - -/obj/item/gun/proc/toggle_gunlight() - if(!gun_light) - return - - var/mob/living/carbon/human/user = usr - gun_light.on = !gun_light.on - gun_light.update_brightness() - to_chat(user, "You toggle the gunlight [gun_light.on ? "on":"off"].") - - playsound(user, gun_light.on ? gun_light.toggle_on_sound : gun_light.toggle_off_sound, 40, TRUE) - update_gunlight() - -/obj/item/gun/proc/update_gunlight() - update_appearance() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - /obj/item/gun/attack_hand(mob/user) . = ..() update_appearance() @@ -730,27 +725,6 @@ /obj/item/gun/update_overlays() . = ..() - if(gun_light) - var/mutable_appearance/flashlight_overlay - var/state = "[gunlight_state][gun_light.on? "_on":""]" //Generic state. - if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state? - state = gun_light.icon_state - flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state) - flashlight_overlay.pixel_x = flight_x_offset - flashlight_overlay.pixel_y = flight_y_offset - . += flashlight_overlay - - if(bayonet) - var/mutable_appearance/knife_overlay - var/state = "bayonet" //Generic state. - if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? - state = bayonet.icon_state - var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' - knife_overlay = mutable_appearance(bayonet_icons, state) - knife_overlay.pixel_x = knife_x_offset - knife_overlay.pixel_y = knife_y_offset - . += knife_overlay - if(ismob(loc) && has_safety) var/mutable_appearance/safety_overlay safety_overlay = mutable_appearance('icons/obj/guns/safety.dmi') @@ -987,10 +961,7 @@ flash_loc.vis_contents -= muzzle_flash muzzle_flash.applied = FALSE -///////////// -// ZOOMING // -///////////// - +//I need to refactor this into an attachment /datum/action/toggle_scope_zoom name = "Toggle Scope" check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index a4247898d59d..7c75d8fe9f56 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -13,90 +13,26 @@ has_safety = TRUE safety = TRUE - ///sound when inserting magazine - var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' - ///sound when inserting an empty magazine - var/load_empty_sound = 'sound/weapons/gun/general/magazine_insert_empty.ogg' - ///volume of loading sound - var/load_sound_volume = 40 - ///whether loading sound should vary - var/load_sound_vary = TRUE - ///sound of racking - var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg' - ///volume of racking - var/rack_sound_volume = 60 - ///whether racking sound should vary - var/rack_sound_vary = TRUE - ///sound of when the bolt is locked back manually - var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg' - ///volume of lock back - var/lock_back_sound_volume = 60 - ///whether lock back varies - var/lock_back_sound_vary = TRUE - ///Sound of ejecting a magazine - var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' - ///sound of ejecting an empty magazine - var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg' - ///volume of ejecting a magazine - var/eject_sound_volume = 40 - ///whether eject sound should vary - var/eject_sound_vary = TRUE - ///sound of dropping the bolt or releasing a slide - var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg' - ///volume of bolt drop/slide release - var/bolt_drop_sound_volume = 60 - ///empty alarm sound (if enabled) - var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg' - ///empty alarm volume sound - var/empty_alarm_volume = 70 - ///whether empty alarm sound varies - var/empty_alarm_vary = TRUE - - ///Whether the gun will spawn loaded with a magazine - var/spawnwithmagazine = TRUE - ///Compatible magazines with the gun - var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info - ///Whether the sprite has a visible magazine or not - var/show_magazine_on_sprite = FALSE - ///Whether the sprite has a visible ammo display or not - var/show_magazine_on_sprite_ammo = FALSE - ///Whether the sprite has a visible indicator for being empty or not. - var/empty_indicator = FALSE - ///Whether the gun alarms when empty or not. - var/empty_alarm = FALSE - ///Do we eject the magazine upon runing out of ammo? - var/empty_autoeject = FALSE - ///Whether the gun supports multiple special mag types - var/unique_mag_sprites_for_variants = FALSE - ///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT - var/bolt_type = BOLT_TYPE_STANDARD - ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. - var/bolt_locked = FALSE - ///Whether the gun has to be racked each shot or not. - var/semi_auto = TRUE - ///Actual magazine currently contained within the gun - var/obj/item/ammo_box/magazine/magazine - ///whether the gun ejects the chambered casing - var/casing_ejector = TRUE - ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. - var/internal_magazine = FALSE - ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. - var/bolt_wording = "bolt" - ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx - var/magazine_wording = "magazine" - ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. - var/cartridge_wording = "bullet" - ///length between individual racks - var/rack_delay = 5 - ///time of the most recent rack, used for cooldown purposes - var/recent_rack = 0 - ///Whether the gun can be sawn off by sawing tools - var/can_be_sawn_off = FALSE - - ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it - var/tac_reloads = TRUE //Snowflake mechanic no more. - ///If we have the 'snowflake mechanic,' how long should it take to reload? - var/tactical_reload_delay = 1 SECONDS + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet + ) + slot_available = list( + ATTACHMENT_SLOT_MUZZLE = 1, + ATTACHMENT_SLOT_RAIL = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 26, + "y" = 20, + ), + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, + ) + ) /obj/item/gun/ballistic/Initialize() . = ..() @@ -123,8 +59,6 @@ . += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]" if (bolt_type == BOLT_TYPE_OPEN && bolt_locked) . += "[icon_state]_bolt" - if (suppressed) - . += "[icon_state]_suppressor" if (magazine) if (unique_mag_sprites_for_variants) . += "[icon_state]_mag_[magazine.base_icon_state]" @@ -203,12 +137,12 @@ update_appearance() ///Handles all the logic needed for magazine insertion -/obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/AM, display_message = TRUE) - if(!istype(AM, mag_type)) - to_chat(user, "\The [AM] doesn't seem to fit into \the [src]...") +/obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/inserted_mag, display_message = TRUE) + if(!istype(inserted_mag, mag_type)) + to_chat(user, "\The [inserted_mag] doesn't seem to fit into \the [src]...") return FALSE - if(user.transferItemToLoc(AM, src)) - magazine = AM + if(user.transferItemToLoc(inserted_mag, src)) + magazine = inserted_mag if (display_message) to_chat(user, "You load a new [magazine_wording] into \the [src].") if (magazine.ammo_count()) @@ -287,48 +221,11 @@ A.update_appearance() update_appearance() return - if(istype(A, /obj/item/suppressor)) - var/obj/item/suppressor/S = A - if(!can_suppress) - to_chat(user, "You can't seem to figure out how to fit [S] on [src]!") - return - if(!user.is_holding(src)) - to_chat(user, "You need be holding [src] to fit [S] to it!") - return - if(suppressed) - to_chat(user, "[src] already has a suppressor!") - return - if(user.transferItemToLoc(A, src)) - to_chat(user, "You screw \the [S] onto \the [src].") - install_suppressor(A) - return if (can_be_sawn_off) if (sawoff(user, A)) return return FALSE -///Installs a new suppressor, assumes that the suppressor is already in the contents of src -/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) - suppressed = S - w_class += S.w_class //so pistols do not fit in pockets when suppressed - update_appearance() - -/obj/item/gun/ballistic/AltClick(mob/user) - if (unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - reskin_obj(user) - return - if(loc == user) - if(suppressed && can_unsuppress) - var/obj/item/suppressor/S = suppressed - if(!user.is_holding(src)) - return ..() - to_chat(user, "You unscrew \the [suppressed] from \the [src].") - user.put_in_hands(suppressed) - w_class -= S.w_class - suppressed = null - update_appearance() - return - ///Prefire empty checks for the bolt drop /obj/item/gun/ballistic/proc/prefire_empty_checks() if (!chambered && !get_ammo()) @@ -402,9 +299,7 @@ . += "It does not seem to have a round chambered." if (bolt_locked) . += "The [bolt_wording] is locked back and needs to be released before firing." - if (suppressed) - . += "It has a suppressor attached that can be removed with alt+click." - . += "You can [bolt_wording] [src] by pressing the unique action key. By default, this is space" + . += "You can [bolt_wording] [src] by pressing the unqiue action key. By default, this is space" ///Gets the number of bullets in the gun /obj/item/gun/ballistic/proc/get_ammo(countchambered = TRUE) @@ -437,9 +332,6 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(sawn_off) to_chat(user, "\The [src] is already shortened!") return - if(bayonet) - to_chat(user, "You cannot saw-off \the [src] with \the [bayonet] attached!") - return user.changeNext_move(CLICK_CD_MELEE) user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...") @@ -470,16 +362,3 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(AC.BB) process_fire(user, user, FALSE) . = TRUE - - -/obj/item/suppressor - name = "suppressor" - desc = "A syndicate small-arms suppressor for maximum espionage." - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "suppressor" - w_class = WEIGHT_CLASS_TINY - - -/obj/item/suppressor/specialoffer - name = "cheap suppressor" - desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits most weapons." diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index 3f649994827e..ce500cda930b 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -164,7 +164,6 @@ icon_state = "e40" item_state = "e40" mag_type = /obj/item/ammo_box/magazine/e40 - can_suppress = FALSE var/obj/item/gun/energy/laser/e40_laser_secondary/secondary fire_select_icon_state_prefix = "e40_" diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 2fea717c28a0..769ea9e7f57e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -1,7 +1,6 @@ /obj/item/gun/ballistic/automatic w_class = WEIGHT_CLASS_NORMAL - can_suppress = TRUE gun_firemodes = list(FIREMODE_SEMIAUTO) default_firemode = FIREMODE_SEMIAUTO @@ -33,8 +32,6 @@ mag_type = /obj/item/ammo_box/magazine/m10mm/rifle fire_delay = 0.5 SECONDS burst_size = 1 - can_unsuppress = TRUE - can_suppress = TRUE w_class = WEIGHT_CLASS_HUGE slot_flags = ITEM_SLOT_BACK show_magazine_on_sprite = TRUE @@ -48,7 +45,6 @@ item_state = "arg" mag_type = /obj/item/ammo_box/magazine/recharge fire_delay = 0.2 SECONDS - can_suppress = FALSE burst_size = 0 fire_sound = 'sound/weapons/laser.ogg' casing_ejector = FALSE @@ -59,8 +55,6 @@ icon_state = "ZipPistol" item_state = "ZipPistol" mag_type = /obj/item/ammo_box/magazine/zip_ammo_9mm - can_suppress = FALSE actions_types = list() - can_bayonet = FALSE show_magazine_on_sprite = TRUE weapon_weight = WEAPON_LIGHT diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm index 12264a3ccd8f..3fdc2e55dadd 100644 --- a/code/modules/projectiles/guns/ballistic/gauss.dm +++ b/code/modules/projectiles/guns/ballistic/gauss.dm @@ -11,7 +11,6 @@ mag_type = /obj/item/ammo_box/magazine/gauss fire_sound = 'sound/weapons/gun/gauss/magrifle.ogg' load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg' - can_suppress = FALSE burst_size = 1 fire_delay = 0.3 SECONDS spread = 0 diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm index 79977249dd31..8a3e68b9a6ec 100644 --- a/code/modules/projectiles/guns/ballistic/hmg.dm +++ b/code/modules/projectiles/guns/ballistic/hmg.dm @@ -163,7 +163,6 @@ base_icon_state = "l6" mag_type = /obj/item/ammo_box/magazine/mm712x82 - can_suppress = FALSE spread = 7 fire_delay = 0.1 SECONDS @@ -236,8 +235,6 @@ fire_select_icon_state_prefix = "caseless_" - can_suppress = FALSE - can_bayonet = FALSE show_magazine_on_sprite = TRUE w_class = WEIGHT_CLASS_BULKY manufacturer = MANUFACTURER_SOLARARMORIES diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index d82f2dbd1250..f18f97cd0f4f 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -55,7 +55,6 @@ fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' load_sound = 'sound/weapons/gun/general/rocket_load.ogg' w_class = WEIGHT_CLASS_BULKY - can_suppress = FALSE burst_size = 1 fire_delay = 0.4 SECONDS casing_ejector = FALSE diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 347f4950382e..b2416462da39 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -1,5 +1,4 @@ /obj/item/gun/ballistic/automatic/pistol - can_suppress = TRUE bolt_type = BOLT_TYPE_LOCKING vary_fire_sound = FALSE @@ -67,7 +66,6 @@ EMPTY_GUN_HELPER(automatic/pistol/syndicate) mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi' mag_type = /obj/item/ammo_box/magazine/m45 - can_suppress = FALSE fire_sound = 'sound/weapons/gun/pistol/candor.ogg' rack_sound = 'sound/weapons/gun/pistol/candor_cocked.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' @@ -106,7 +104,7 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) icon_state = "deagle" force = 14 mag_type = /obj/item/ammo_box/magazine/m50 - can_suppress = FALSE + mag_display = TRUE show_magazine_on_sprite = TRUE fire_sound = 'sound/weapons/gun/pistol/deagle.ogg' rack_sound = 'sound/weapons/gun/pistol/rack.ogg' @@ -166,7 +164,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST) default_firemode = FIREMODE_SEMIAUTO - /obj/item/gun/ballistic/automatic/pistol/commander name = "\improper Commander" desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." @@ -178,7 +175,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/co9mm - can_suppress = FALSE manufacturer = MANUFACTURER_NANOTRASEN fire_sound = 'sound/weapons/gun/pistol/commander.ogg' load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' @@ -216,7 +212,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/co9mm - can_suppress = FALSE var/funnysounds = TRUE var/cooldown = 0 load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' @@ -256,6 +251,7 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) to_chat(user, "You toggle [src]'s vox audio functions.") /obj/item/gun/ballistic/automatic/pistol/commissar/AltClick(mob/user) + . = ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if((cooldown < world.time - 200) && funnysounds) @@ -327,7 +323,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/disposable custom_materials = list(/datum/material/plastic=2000) - can_suppress = FALSE manufacturer = MANUFACTURER_NONE has_safety = FALSE //thing barely costs anything, why would it have a safety? safety = FALSE @@ -410,7 +405,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) w_class = WEIGHT_CLASS_TINY mag_type = /obj/item/ammo_box/magazine/m22lr - can_suppress = FALSE fire_sound = 'sound/weapons/gun/pistol/himehabu.ogg' load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg' diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 4cf82a445fb3..1e7724c5c9fa 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -99,7 +99,6 @@ if(.) spread = 24 spread_unwielded = 30 - can_bayonet = FALSE item_state = "illestren_sawn" mob_overlay_state = item_state weapon_weight = WEAPON_MEDIUM //you can fire it onehanded, makes it worse than worse than useless onehanded, but you can diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 692c09a45f42..1f15f8d01689 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -78,7 +78,7 @@ fire_delay = 0.05 SECONDS //slamfire rack_delay = 0.2 SECONDS - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE /obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user) @@ -111,7 +111,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg' fire_delay = 0.1 SECONDS @@ -141,8 +141,6 @@ recoil = 1 recoil_unwielded = 4 wield_delay = 0.65 SECONDS - -/obj/item/gun/ballistic/shotgun/automatic manufacturer = MANUFACTURER_NANOTRASEN /obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user) @@ -232,7 +230,6 @@ weapon_weight = WEAPON_MEDIUM mag_type = /obj/item/ammo_box/magazine/m12g - can_suppress = FALSE burst_size = 1 fire_delay = 0.4 SECONDS // this NEEDS the old delay. fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg' @@ -332,7 +329,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) "Stained Green" = "dshotgun_green" ) semi_auto = TRUE - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE bolt_type = BOLT_TYPE_NO_BOLT pb_knockback = 3 // it's a super shotgun! manufacturer = MANUFACTURER_HUNTERSPRIDE @@ -452,8 +449,8 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) name = "improvised shotgun" desc = "A length of pipe and miscellaneous bits of scrap fashioned into a rudimentary single-shot shotgun." icon = 'icons/obj/guns/projectile.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON mob_overlay_icon = null base_icon_state = "ishotgun" @@ -519,7 +516,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact/compact w_class = WEIGHT_CLASS_SMALL sawn_desc = "You know, this isn't funny anymore." - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(prob(0 + (magazine.ammo_count() * 20))) //minimum probability of 20, maximum of 60 @@ -542,7 +539,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact/compact/compact w_class = WEIGHT_CLASS_TINY sawn_desc = "Sigh. This is a trigger attached to a bullet." - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact/compact/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(prob(50)) //It's going to blow up. @@ -636,7 +633,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) rack_sound = 'sound/weapons/gun/rifle/skm_cocked.ogg' bolt_wording = "lever" cartridge_wording = "bullet" - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE wield_slowdown = 0.5 wield_delay = 0.65 SECONDS @@ -765,15 +762,12 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) inhand_y_dimension = 32 mag_type = /obj/item/ammo_box/magazine/internal/shot/beacon fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg' - can_be_sawn_off=TRUE w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_MEDIUM force = 10 - flags_1 = CONDUCT_1 - slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME semi_auto = TRUE - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE pb_knockback = 3 wield_slowdown = 0.7 spread_unwielded = 15 diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 96d4e7d922db..2cb68fc09176 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -50,10 +50,6 @@ item_state = "c20r" mag_type = /obj/item/ammo_box/magazine/smgm45 - can_bayonet = TRUE - can_suppress = FALSE - knife_x_offset = 26 - knife_y_offset = 12 show_magazine_on_sprite = TRUE show_magazine_on_sprite_ammo = TRUE empty_indicator = TRUE @@ -68,7 +64,6 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) /obj/item/gun/ballistic/automatic/smg/c20r/cobra name = "\improper Cobra 20" desc = "An older model of SMG manufactured by Scarborough Arms, a predecessor to the military C-20 series. Chambered in .45. " - can_bayonet = FALSE icon_state = "cobra20" item_state = "cobra20" @@ -90,11 +85,7 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) icon_state = "wt550" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 - can_suppress = FALSE actions_types = list() - can_bayonet = TRUE - knife_x_offset = 25 - knife_y_offset = 12 show_magazine_on_sprite = TRUE show_magazine_on_sprite_ammo = TRUE empty_indicator = TRUE @@ -158,7 +149,6 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) item_state = "m90" mag_type = /obj/item/ammo_box/magazine/m556 - can_suppress = FALSE gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "underbarrel grenade launcher") gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_OTHER) default_firemode = FIREMODE_SEMIAUTO @@ -241,7 +231,6 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) icon_state = "firestorm" item_state = "firestorm" mag_type = /obj/item/ammo_box/magazine/c45_firestorm_mag - can_suppress = FALSE unique_mag_sprites_for_variants = TRUE burst_size = 1 actions_types = list() @@ -315,11 +304,9 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) eject_empty_sound = 'sound/weapons/gun/rifle/skm_unload.ogg' weapon_weight = WEAPON_MEDIUM - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/skm_545_39 - actions_types = list(/datum/action/item_action/fold_stock) //once again, ideally an attatchment in the future - recoil = 2 recoil_unwielded = 6 @@ -329,76 +316,35 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) wield_delay = 0.6 SECONDS wield_slowdown = 0.35 - ///is the bipod deployed? - var/stock_folded = FALSE - - ///we add these two values to recoi/spread when we have the bipod deployed - var/stock_recoil_bonus = -2 - var/stock_spread_bonus = -5 - - var/folded_slowdown = 0.6 - var/folded_wield_delay = 0.6 SECONDS - - var/unfolded_slowdown = 0.35 - var/unfolded_wield_delay = 0.2 SECONDS - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/datum/action/item_action/fold_stock - name = "Fold/Unfold stock" - desc = "Fold or unfold the stock for easier storage." - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/ui_action_click(mob/user, action) - if(!istype(action, /datum/action/item_action/fold_stock)) - return ..() - fold(user) - - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/proc/fold(mob/user) - if(stock_folded) - to_chat(user, "You unfold the stock on the [src].") - w_class = WEIGHT_CLASS_BULKY - wield_delay = folded_wield_delay - wield_slowdown = folded_slowdown - else - to_chat(user, "You fold the stock on the [src].") - w_class = WEIGHT_CLASS_NORMAL - wield_delay = unfolded_wield_delay - wield_slowdown = unfolded_slowdown - - if(wielded) - user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) - - stock_folded = !stock_folded - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - update_appearance() - - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_recoil(mob/user, recoil_bonus = 0) - var/total_recoil = recoil_bonus - if(!stock_folded) - total_recoil += stock_recoil_bonus - - return ..(user, total_recoil) - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_spread(mob/user, bonus_spread) - var/total_spread = bonus_spread - - if(!stock_folded) - total_spread += stock_spread_bonus - - return ..(user, total_spread) - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_icon_state() - . = ..() - item_state = "[initial(item_state)][stock_folded ? "_nostock" : ""]" - mob_overlay_state = "[initial(item_state)][stock_folded ? "_nostock" : ""]" - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_overlays() - . = ..() - . += "[base_icon_state || initial(icon_state)][stock_folded ? "_nostock" : "_stock"]" + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet, + /obj/item/attachment/foldable_stock + ) + + slot_available = list( + ATTACHMENT_SLOT_MUZZLE = 1, + ATTACHMENT_SLOT_RAIL = 1, + ATTACHMENT_SLOT_STOCK = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 26, + "y" = 20, + ), + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, + ), + ATTACHMENT_SLOT_STOCK = list( + "x" = 11, + "y" = 20, + ) + ) + + default_attachments = list(/obj/item/attachment/foldable_stock) /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq name = "\improper SKM-44v Mongrel" @@ -426,16 +372,16 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) recoil = 0 recoil_unwielded = 4 - stock_spread_bonus = -4 - stock_recoil_bonus = -1 - wield_delay = 0.4 SECONDS - folded_slowdown = 0.15 - folded_wield_delay = 0.2 SECONDS - - unfolded_slowdown = 0.35 - unfolded_wield_delay = 0.4 SECONDS + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet, + /obj/item/attachment/foldable_stock/inteq + ) + default_attachments = list(/obj/item/attachment/foldable_stock/inteq) /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/proto name = "\improper Nanotrasen Saber SMG" @@ -447,4 +393,3 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) bolt_type = BOLT_TYPE_LOCKING show_magazine_on_sprite = TRUE manufacturer = MANUFACTURER_NANOTRASEN_OLD - diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 160569d3f86c..135a1b2d06b0 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -8,7 +8,6 @@ force = 0 throwforce = 0 burst_size = 3 - can_suppress = TRUE item_flags = NONE casing_ejector = FALSE manufacturer = MANUFACTURER_NANOTRASEN @@ -54,7 +53,6 @@ fire_sound = 'sound/items/syringeproj.ogg' item_flags = NONE casing_ejector = FALSE - can_suppress = FALSE pb_knockback = 0 recoil = -10 //its a toy... recoil_unwielded = -10 @@ -85,7 +83,6 @@ /obj/item/gun/ballistic/automatic/smg/c20r/toy name = "donksoft SMG" desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up." - can_suppress = FALSE item_flags = NONE mag_type = /obj/item/ammo_box/magazine/toy/smgm45 fire_sound = 'sound/items/syringeproj.ogg' @@ -105,7 +102,6 @@ name = "donksoft LMG" desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up." fire_sound = 'sound/items/syringeproj.ogg' - can_suppress = FALSE item_flags = NONE mag_type = /obj/item/ammo_box/magazine/toy/m762 casing_ejector = FALSE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f3edb62d8942..abe3e3fd7b43 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -10,41 +10,31 @@ has_safety = TRUE safety = TRUE + modifystate = FALSE + ammo_x_offset = 2 + gun_firemodes = list(FIREMODE_SEMIAUTO) default_firemode = FIREMODE_SEMIAUTO fire_select_icon_state_prefix = "laser_" - var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses - var/cell_type = /obj/item/stock_parts/cell/gun - var/modifystate = 0 - var/list/ammo_type = list(/obj/item/ammo_casing/energy) - var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. - var/can_charge = TRUE //Can it be charged in a recharger? - var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_appearance()? - var/charge_sections = 4 - ammo_x_offset = 2 - var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail - var/selfcharge = 0 - var/charge_tick = 0 - var/charge_delay = 4 - var/use_cyborg_cell = FALSE //whether the gun's cell drains the cyborg user's cell to recharge - var/dead_cell = FALSE //set to true so the gun is given an empty cell - - var/internal_cell = FALSE ///if the gun's cell cannot be replaced - var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell - var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell - var/unscrewing_time = 20 ///Time it takes to unscrew the cell - - ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it - var/tac_reloads = FALSE - ///If we allow tacitcal reloads, how long should it take to reload? - var/tactical_reload_delay = 1.2 SECONDS - - var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' //Sound when inserting magazine. UPDATE PLEASE - var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' //Sound of ejecting a cell. UPDATE PLEASE - var/sound_volume = 40 //Volume of loading/unloading sounds - var/load_sound_vary = TRUE //Should the load/unload sounds vary? + tac_reloads = FALSE + tactical_reload_delay = 1.2 SECONDS + + valid_attachments = list( + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet + ) + slot_available = list( + ATTACHMENT_SLOT_RAIL = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, + ) + ) /obj/item/gun/energy/emp_act(severity) . = ..() @@ -133,16 +123,16 @@ return ..() /obj/item/gun/energy/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C) - if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini)) + if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini)) to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]...")) return FALSE - if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large)) + if(mag_size == MAG_SIZE_LARGE && !istype(C, /obj/item/stock_parts/cell/gun/large)) to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]...")) return FALSE if(user.transferItemToLoc(C, src)) cell = C to_chat(user, span_notice("You load the [C] into \the [src].")) - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) update_appearance() return TRUE else @@ -150,7 +140,7 @@ return FALSE /obj/item/gun/energy/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null) - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) cell.forceMove(drop_location()) var/obj/item/stock_parts/cell/gun/old_cell = cell old_cell.update_appearance() @@ -170,17 +160,13 @@ user.put_in_hands(old_cell) update_appearance() -/obj/item/gun/energy/get_gun_attachments() +/obj/item/gun/energy/screwdriver_act(mob/living/user, obj/item/I) if(cell && !internal_cell) - attachment_options += list("Cell" = image(icon = cell.icon, icon_state = cell.icon_state)) - ..() - -/obj/item/gun/energy/remove_gun_attachments(mob/living/user, obj/item/I, picked_option) - if(picked_option == "Cell") - if(I.use_tool(src, user, unscrewing_time, volume=100)) - eject_cell(user, I) - return TRUE - ..() + to_chat(user, span_notice("You begin unscrewing and pulling out the cell...")) + if(I.use_tool(src, user, unscrewing_time, volume = 100)) + to_chat(user, span_notice("You remove the power cell.")) + eject_cell(user) + return ..() /obj/item/gun/energy/can_shoot(visuals) if(safety && !visuals) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 6988f1f6cb72..90bfa9a8ead1 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -8,11 +8,8 @@ icon_state = "energy" item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) - modifystate = 1 - can_flashlight = TRUE + modifystate = TRUE ammo_x_offset = 2 - flight_x_offset = 15 - flight_y_offset = 10 dual_wield_spread = 60 manufacturer = MANUFACTURER_SHARPLITE_NEW @@ -26,25 +23,16 @@ item_state = "gun" w_class = WEIGHT_CLASS_SMALL cell_type = /obj/item/stock_parts/cell/gun/mini - small_gun = TRUE + mag_size = MAG_SIZE_SMALL throwforce = 11 //This is funny, trust me. ammo_x_offset = 2 charge_sections = 3 - can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update - gunlight_state = "mini-light" - flight_x_offset = 19 - flight_y_offset = 13 - wield_delay = 0.2 SECONDS wield_slowdown = 0.15 spread = 2 spread_unwielded = 5 -/obj/item/gun/energy/e_gun/mini/Initialize() - set_gun_light(new /obj/item/flashlight/seclite(src)) - return ..() - /obj/item/gun/energy/e_gun/mini/empty_cell dead_cell = TRUE @@ -108,10 +96,9 @@ desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology." icon_state = "dragnet" item_state = "dragnet" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap) - can_flashlight = FALSE ammo_x_offset = 1 /obj/item/gun/energy/e_gun/dragnet/snare @@ -128,7 +115,6 @@ w_class = WEIGHT_CLASS_HUGE ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) weapon_weight = WEAPON_HEAVY - can_flashlight = FALSE trigger_guard = TRIGGER_GUARD_NONE ammo_x_offset = 2 @@ -198,7 +184,7 @@ item_state = "gun" ammo_x_offset = 2 charge_sections = 6 - small_gun = TRUE + mag_size = MAG_SIZE_SMALL wield_delay = 0.2 SECONDS wield_slowdown = 0.15 @@ -242,7 +228,7 @@ inhand_y_dimension = 64 icon_state = "iotshotgun" item_state = "shotgun_combat" - shaded_charge = 1 + shaded_charge = TRUE w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter/ultima, /obj/item/ammo_casing/energy/laser/ultima) var/obj/item/modular_computer/integratedNTOS @@ -257,10 +243,7 @@ mob_overlay_icon = 'icons/obj/guns/manufacturer/eoehoma/onmob.dmi' icon_state = "e11" ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/eoehoma) - can_flashlight = TRUE ammo_x_offset = 0 - flight_x_offset = 20 - flight_y_offset = 9 spread = 80 spread_unwielded = 140 dual_wield_spread = 140 diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index ac3aa9e3d21a..2ca71649a6f7 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -8,14 +8,8 @@ item_flags = NONE obj_flags = UNIQUE_RENAME weapon_weight = WEAPON_LIGHT - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 9 automatic_charge_overlays = FALSE - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 - internal_cell = TRUE + internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit custom_price = 750 w_class = WEIGHT_CLASS_BULKY @@ -28,12 +22,18 @@ var/overheat = FALSE var/mob/holder - var/max_mod_capacity = 100 var/list/modkits = list() var/recharge_timerid + slot_offsets = list( + ATTACHMENT_SLOT_RAIL = list( + "x" = 24, + "y" = 13, + ) + ) + /obj/item/gun/energy/kinetic_accelerator/shoot_with_empty_chamber(mob/living/user) playsound(src, dry_fire_sound, 30, TRUE) //click sound but no to_chat message to cut on spam return diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index c564ae32b4da..eff3d67b2df1 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -84,7 +84,7 @@ icon_state = "cshotgun" item_state = "shotgun" desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots." - shaded_charge = 0 + shaded_charge = FALSE ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter, /obj/item/ammo_casing/energy/electrode) manufacturer = MANUFACTURER_NONE @@ -96,7 +96,7 @@ icon_state = "lasercannon" item_state = "laser" w_class = WEIGHT_CLASS_BULKY - big_gun = TRUE + mag_size = MAG_SIZE_LARGE cell_type = "/obj/item/stock_parts/cell/gun/large" force = 10 flags_1 = CONDUCT_1 @@ -203,7 +203,7 @@ item_state = "gun" ammo_x_offset = 2 charge_sections = 4 - small_gun = TRUE + mag_size = MAG_SIZE_SMALL w_class = WEIGHT_CLASS_NORMAL cell_type = /obj/item/stock_parts/cell/gun/mini ammo_type = list(/obj/item/ammo_casing/energy/lasergun/hitscan) @@ -245,7 +245,7 @@ icon_state = "e50" item_state = "e50" - big_gun = TRUE + mag_size = MAG_SIZE_LARGE cell_type = /obj/item/stock_parts/cell/gun/large ammo_type = list(/obj/item/ammo_casing/energy/laser/eoehoma/e50) weapon_weight = WEAPON_HEAVY diff --git a/code/modules/projectiles/guns/energy/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm index 4dc5cae77558..cf67db9fd5ae 100644 --- a/code/modules/projectiles/guns/energy/mounted.dm +++ b/code/modules/projectiles/guns/energy/mounted.dm @@ -6,7 +6,6 @@ item_state = "armcannonstun4" force = 5 selfcharge = 1 - can_flashlight = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead /obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index dfa23e26b468..c2e5b4cb2933 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -39,11 +39,8 @@ icon_state = "pulse_carbine" item_state = null internal_cell = FALSE - big_gun = TRUE //haha gun go brr + mag_size = MAG_SIZE_LARGE //haha gun go brr cell_type = /obj/item/stock_parts/cell/gun/large - can_flashlight = TRUE - flight_x_offset = 18 - flight_y_offset = 12 ammo_x_offset = 2 charge_sections = 4 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 07f0aebaa9a0..09de7690b5ea 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -6,9 +6,8 @@ shaded_charge = FALSE ammo_x_offset = 2 ammo_y_offset = 2 - can_flashlight = FALSE w_class = WEIGHT_CLASS_HUGE - big_gun = TRUE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut. + mag_size = MAG_SIZE_LARGE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut. flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) @@ -28,9 +27,6 @@ slot_flags = ITEM_SLOT_BELT ammo_x_offset = 2 ammo_y_offset = 0 - can_flashlight = TRUE - flight_x_offset = 18 - flight_y_offset = 11 /obj/item/gun/energy/decloner name = "biological demolecularisor" @@ -51,10 +47,10 @@ icon_state = "flora" item_state = "gun" ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut, /obj/item/ammo_casing/energy/flora/revolution) - modifystate = 1 + modifystate = TRUE ammo_x_offset = 1 selfcharge = 1 - shaded_charge = 1 + shaded_charge = TRUE /obj/item/gun/energy/meteorgun name = "meteor gun" @@ -98,7 +94,6 @@ overheat_time = 20 holds_charge = TRUE unique_frequency = TRUE - can_flashlight = FALSE max_mod_capacity = 0 manufacturer = MANUFACTURER_SCARBOROUGH @@ -108,7 +103,7 @@ icon_state = "crossbowlarge" w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=4000) - suppressed = null + suppressed = FALSE ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) manufacturer = MANUFACTURER_NONE diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 168bbdc099dc..e70c46cc76f6 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -5,7 +5,6 @@ item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/electrode) ammo_x_offset = 3 - spread = 2 spread_unwielded = 4 @@ -22,7 +21,6 @@ /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating." - can_flashlight = FALSE can_charge = FALSE use_cyborg_cell = TRUE @@ -37,11 +35,7 @@ item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 10 manufacturer = MANUFACTURER_SHARPLITE_NEW - spread = 2 spread_unwielded = 4 diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 8b6626bc5e97..b131b03ec148 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -29,7 +29,7 @@ w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) internal_cell = FALSE //prevents you from giving it an OP cell - WS Edit //shut up dumb nerd - big_gun = TRUE + mag_size = MAG_SIZE_LARGE cell_type = "/obj/item/stock_parts/cell/gun/large" canMouseDown = TRUE var/aiming = FALSE diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 84d00b226371..809c15682cd4 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -80,7 +80,6 @@ w_class = WEIGHT_CLASS_SMALL force = 2 //Also very weak because it's smaller suppressed = TRUE //Softer fire sound - can_unsuppress = FALSE //Permanently silenced /obj/item/gun/syringe/dna name = "modified syringe gun" diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index ac7418748d9b..a9ab2f6365f4 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -1,21 +1,6 @@ /obj/item/gun/ballistic/automatic/powered mag_type = /obj/item/ammo_box/magazine/gauss - can_suppress = FALSE - - var/obj/item/stock_parts/cell/cell - var/cell_type = /obj/item/stock_parts/cell/gun - var/charge_sections = 3 - var/empty_battery_sound = FALSE // play empty alarm if no battery - - var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail - var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_appearance()? - - var/internal_cell = FALSE ///if the gun's cell cannot be replaced - var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell - var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell - var/unscrewing_time = 2 SECONDS ///Time it takes to unscrew the cell - var/sound_volume = 40 //Volume of loading/unloading cell sounds - + charge_sections = 3 /obj/item/gun/ballistic/automatic/powered/Initialize() . = ..() @@ -61,24 +46,24 @@ return ..() /obj/item/gun/ballistic/automatic/powered/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C) - if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini)) - to_chat(user, "[C] doesn't seem to fit into [src]...") + if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini)) + to_chat(user, "\The [C] doesn't seem to fit into \the [src]...") return FALSE - if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large)) - to_chat(user, "[C] doesn't seem to fit into [src]...") + if(mag_size == MAG_SIZE_LARGE && !istype(C, /obj/item/stock_parts/cell/gun/large)) + to_chat(user, "\The [C] doesn't seem to fit into \the [src]...") return FALSE if(user.transferItemToLoc(C, src)) cell = C - to_chat(user, "You load [C] into [src].") - playsound(src, load_sound, sound_volume, load_sound_vary) + to_chat(user, "You load the [C] into \the [src].") + playsound(src, load_sound, load_sound_volume, load_sound_vary) update_appearance() return TRUE else - to_chat(user, "You cannot seem to get [src] out of your hands!") + to_chat(user, "You cannot seem to get \the [src] out of your hands!") return FALSE /obj/item/gun/ballistic/automatic/powered/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null) - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) cell.forceMove(drop_location()) var/obj/item/stock_parts/cell/gun/old_cell = cell cell = null @@ -88,7 +73,7 @@ update_appearance() /obj/item/gun/ballistic/automatic/powered/screwdriver_act(mob/living/user, obj/item/I) - if(cell && !internal_cell && !bayonet && (!gun_light || !can_flashlight)) + if(cell && !internal_cell) to_chat(user, "You begin unscrewing and pulling out the cell...") if(I.use_tool(src, user, unscrewing_time, volume=100)) to_chat(user, "You remove the power cell.") diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 11cbd03c9787..78326279b6f9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -395,7 +395,7 @@ to_chat(user, "You remove [vial] from [src].") vial = null update_appearance() - playsound(loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(loc, SOUND_EMPTY_MAG, 50, 1) else to_chat(user, "This hypo isn't loaded!") return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 05f68682083c..b4f46e6e4c19 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -260,8 +260,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "chemsprayer" item_state = "chemsprayer" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON throwforce = 0 w_class = WEIGHT_CLASS_NORMAL stream_mode = 1 @@ -298,8 +298,8 @@ desc = "A utility used to spray large amounts of cleaning reagents in a given area. It regenerates space cleaner by itself but it's unable to be fueled by normal means." icon_state = "chemsprayer_janitor" item_state = "chemsprayer_janitor" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON reagent_flags = NONE list_reagents = list(/datum/reagent/space_cleaner = 1000) volume = 1000 diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 3353dcfb3289..c444336adde5 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -558,7 +558,7 @@ id = "suppressor" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/silver = 500) - build_path = /obj/item/suppressor + build_path = /obj/item/attachment/silencer category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 11eb6a4b49e6..9e935611e15f 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -683,7 +683,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_weapons/suppressor name = "Suppressor" desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns." - item = /obj/item/suppressor + item = /obj/item/attachment/silencer cost = 3 surplus = 10 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi index cbc495275adddddeace4e704d9e2211958b755e0..960b9ec448af3d5219cec73a774ceac1b17eaab6 100644 GIT binary patch literal 4457 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 literal 2116 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 FCIE^xUJC#K diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index e02a7e288cc8ae7f1a93df0a1e7f3fa9b423eaeb..6a32de5b08fbc1589b237d0337b0be2ca1d4f298 100644 GIT binary patch literal 24323 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
    b#Ap&XmRM+lydi0mew)n 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

    $lUEy3zB0vNylj{yQpEs)ZAv zSM>MPxn&6hYbXt*AX%;FYnY!{HRVHQM)F_Tl)nfXkUjHlCQK9WDcJ+`JtWTAP)hL! zdHrW8K!X_uqBch)uOZzB=g7=qY$V59cy8|&19+bKE9D2$DZY%a=qsge*0mE!R!40^ zAgR(xxtB*>rs3tLE?7xYfG4isnbPSl4N9M7)bBj<+S1udHttrKmCX_8)MbM6Xe_OT zPfZubJaEi!v%Lp@YXr?WK95dLuZaAn$k;KSMlJ3Y=y5Y30{Iwf)J(K){^y$ajRdvl~i@ZQQr(Qw+w=)m~X_Of)%^$ATKX06{I zryE<2YLjpODX0ILLUFb)9#(gfRMKB>OM7LVpmi`Q%8T#{aoYR#ZS|2um_x!(RQbwZYrST>Fw%gHwbMl-hQlXberH_U5|4nmaNLYbQZs?7 zEAcHBNwEgj(Y^gL3<4I_c5<=P%Slw0$QH^+Gw+V$Lr+~g*LMm+=R2Buc%*bnPxpl5mbZ@}67$-%|&szdB0 z**&_n?-CkSEXv3Zy#_z{aglG6dhnh;ZV=QE&(rEUwx`>*QlCED13magOd}7@s z6e@|cJO8%-MYCii?6c5d8N-G}dDp541a#QkDs>D65n^{+WJl-H!+Y;*eNQ~%wUVyc z-U(hBoiEi6{4@_-Xk;$^Y!!b-$@mT6Anea>yP5s#`NxVX11291(2-vH04NWksEjps zGh)>r!4dWQJx?RXghsJ(A@!I#BR1U&mW4vxAsM2?^c!@UkV=*G#>Uy7J;C}I`Po-Q zYy$1hyU;hqZMR;45LK40ZQxb1gI*#-diG}BEkB!N$RXB-r~zYvJo`V8o9`u8JmF|& zAsxnOxpcj}+A`kHWH~s6Q#6=OtmIs`6nZ`GqfXK@ld)hSO+@}P%P_(92Ls8htxY~1 zMd5@<>V3UOM~B(0Ww)PpC#Bnh2;tow)08(*B>-@u$#m|fxY zBRc92&dD7IT4HzEu8vPbdw%pq;zKG9;OjlEpMz(9rhqy$EZR?;F%P3YKcDj{T6yKO z>~_8om+r#_W`cz3%ZRg&PoZZcU_E6HVnXZ0KW;gm&aHaK(N%s2MkZ+~?R&FcTq0pZ zJf$rxcxe8ex*Q?G@DEB2(4pZtx~E!`iu7Y=$pxpNdMEbggLTN4-WAWQmq%wKs}jZ{ zrFT=1KXrfWRfBedg$kv6Rp{#Aj&)CxZp2K6{s{Wi86qCe8O40TeoO0GrG8`6~k(X1wX`T3;y-<0KXHD6=p3c5QWLdVYm5Oo`|z{sSOtTXB=rKK%<# z4_i#9yvk;^ms``<+9<#5z6ire0A>NsOX4Tl$uy zFqM1sZS%~wid3)`W|fx>EsF|%1MP8;v)(%M!)zR|9QOVc<7vxHg7@Ns$$Y&nx6JTI6WLv_#w_GjtcMBY ztqZ$kf1A&VK`?8WhEI$!rhym$>vl|5R#p+rf|1yjSoy!$Yj}A8QFqg-e$HP0`WPT( o01W>@dKo&Kxc`sQkMBrNKYe~eVC)KhwFjc`Qdy?tg-PK51DoG;IRF3v diff --git a/icons/obj/guns/flashlights.dmi b/icons/obj/guns/flashlights.dmi deleted file mode 100644 index eef6d953f94a53b63fc3346fd27240336082d8b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=%~c^0B`&GO$wiq3C7Jno3=9=> zg2M`mO22;zF8KKMiI%sn*10q1gExd4Tr__0Nawtd=E(pc$L!IgGahGs&TBLlba@MT z2Z`p0PPtTMblKQz$_|TQqwX%C0MAZ~%Uwdn!HPL1sULqeZuZJ-$7~qox=+cdRCK+I zdvPsq5AWRsh2*90bY^y4Ipg@p=cRB;O0l}TgQIWuB>ySZDlAMBtBX3O9$aD3S9sdw z22+j-Lv%wgO9Ji&Lo`Sng~spoCkYZ)0Lr^P0ni>!HGt>388b!BDzZQe4a z(2v)DPLE<*_2%1-=>LHtu}?1j);%V%`|cTr2S1eq_22yk+E_cy`6a{usjK(%{!+s3 zW`Z6wmtVliu=wJMXO;in9)4L8b=vO1%Aco8m}K5EhdCx&$cWuO&A(QRL4kv5$;(Bj zcCs#irhl1J$BMzAtiEGKSF`GeZMQ=$U%N|u?q+Zl5b3u$fAQ_NY|)$Z>+jdL9O7D$ o$O#N}em&;}`?kJMIQO3^xO$(nR_wXyz+}eY>FVdQ&MBb@00lJ}N&o-= diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 986c2f99692f6c9e31e560f9efe3202b1a398189..ab051d8a21bbe1185930e6a6e4d3663f5ac93166 100644 GIT binary patch literal 17907 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 literal 18205 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 Date: Sun, 14 Jul 2024 19:33:40 -0500 Subject: [PATCH 091/212] Automatic changelog generation for PR #2917 [ci skip] --- html/changelogs/AutoChangeLog-pr-2917.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2917.yml diff --git a/html/changelogs/AutoChangeLog-pr-2917.yml b/html/changelogs/AutoChangeLog-pr-2917.yml new file mode 100644 index 000000000000..0835401bda75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2917.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {refactor: refactored attachments to be modular} +delete-after: true From fb2082bd3b0841a1adf099da8e7d39bd6220e991 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 15 Jul 2024 00:56:44 +0000 Subject: [PATCH 092/212] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2917.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3067.yml | 9 --------- html/changelogs/AutoChangeLog-pr-3080.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3158.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3204.yml | 5 ----- html/changelogs/archive/2024-07.yml | 16 ++++++++++++++++ 6 files changed, 16 insertions(+), 26 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2917.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3067.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3080.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3158.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3204.yml diff --git a/html/changelogs/AutoChangeLog-pr-2917.yml b/html/changelogs/AutoChangeLog-pr-2917.yml deleted file mode 100644 index 0835401bda75..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2917.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FalloutFalcon -changes: - - {refactor: refactored attachments to be modular} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3067.yml b/html/changelogs/AutoChangeLog-pr-3067.yml deleted file mode 100644 index 072045a2f02d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3067.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Skies-Of-Blue -changes: - - {rscadd: an SSD Indicator for when you have been disconnected for less than three - minutes} - - {balance: 'players will now remain awake for three minutes after disconnecting, - with a new SSD icon to boot!'} - - {balance: 'players SSD longer than three minutes will lose their icon and fall - asleep, much like the previous behavior'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3080.yml b/html/changelogs/AutoChangeLog-pr-3080.yml deleted file mode 100644 index 5c4a3abdf25d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3080.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Skies-Of-Blue -changes: - - {rscadd: typing indicators now trigger off of the command bar} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3158.yml b/html/changelogs/AutoChangeLog-pr-3158.yml deleted file mode 100644 index 1de2c30deddf..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3158.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SomeguyManperson -changes: - - {bugfix: gun cargo packs now act more as they would be expected to} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3204.yml b/html/changelogs/AutoChangeLog-pr-3204.yml deleted file mode 100644 index 2b6963e69836..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3204.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Sadhorizon -changes: - - {tweak: Changed sunskipper's prefix to SV.} - - {bugfix: Added a missing pipe to the sunskipper.} -delete-after: true diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index d16159c1679a..fd9a9542550c 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -92,3 +92,19 @@ - balance: Decreased the amount of landmines required for its mission and increased the value per mine slightly - rscdel: Capsaicin no longer Boils you +2024-07-15: + FalloutFalcon: + - refactor: refactored attachments to be modular + Sadhorizon: + - tweak: Changed sunskipper's prefix to SV. + - bugfix: Added a missing pipe to the sunskipper. + Skies-Of-Blue: + - rscadd: typing indicators now trigger off of the command bar + - rscadd: an SSD Indicator for when you have been disconnected for less than three + minutes + - balance: players will now remain awake for three minutes after disconnecting, + with a new SSD icon to boot! + - balance: players SSD longer than three minutes will lose their icon and fall asleep, + much like the previous behavior + SomeguyManperson: + - bugfix: gun cargo packs now act more as they would be expected to From 0af56b3a635f475f123318a3d0ce0326fc26d0d5 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Tue, 16 Jul 2024 03:38:29 -0500 Subject: [PATCH 093/212] Express Console Supremacy (#2994) ## About The Pull Request Cuts out the old cargo console the express was a subtype, combining behaviors so there is only one. I would like to add the shopping list feature back so we can pool shipments together since most of our packs are now 1 item. ## Why It's Good For The Game Easier code managment ## Changelog :cl: refactor: refactored express console to not be a subtype of the cargo console and replacing it. /:cl: --- .../JungleRuins/jungle_cavecrew.dmm | 2 +- .../SpaceRuins/singularity_lab.dmm | 2 +- _maps/outpost/hangar/nt_asteroid_20x20.dmm | 2 +- _maps/outpost/hangar/nt_asteroid_40x20.dmm | 2 +- _maps/outpost/hangar/nt_asteroid_40x40.dmm | 2 +- _maps/outpost/hangar/nt_asteroid_56x20.dmm | 2 +- _maps/outpost/hangar/nt_asteroid_56x40.dmm | 2 +- _maps/outpost/nanotrasen_asteroid.dmm | 2 +- .../independent/independent_beluga.dmm | 2 +- .../shuttles/independent/independent_box.dmm | 2 +- .../independent/independent_bubble.dmm | 2 +- .../independent/independent_dwayne.dmm | 2 +- .../independent/independent_junker.dmm | 2 +- .../shuttles/independent/independent_kilo.dmm | 2 +- .../independent/independent_lagoon.dmm | 2 +- .../independent/independent_mudskipper.dmm | 2 +- .../independent/independent_rigger.dmm | 2 +- .../independent/independent_schmiedeberg.dmm | 2 +- .../independent/independent_shetland.dmm | 2 +- .../independent/independent_sunskipper.dmm | 2 +- _maps/shuttles/inteq/inteq_colossus.dmm | 2 +- _maps/shuttles/inteq/inteq_hound.dmm | 2 +- _maps/shuttles/inteq/inteq_talos.dmm | 2 +- _maps/shuttles/inteq/inteq_valor.dmm | 2 +- _maps/shuttles/inteq/inteq_vaquero.dmm | 2 +- .../shuttles/nanotrasen/nanotrasen_delta.dmm | 2 +- .../shuttles/nanotrasen/nanotrasen_gecko.dmm | 2 +- .../shuttles/nanotrasen/nanotrasen_heron.dmm | 2 +- _maps/shuttles/nanotrasen/nanotrasen_meta.dmm | 4 +- .../shuttles/nanotrasen/nanotrasen_mimir.dmm | 2 +- .../shuttles/nanotrasen/nanotrasen_osprey.dmm | 2 +- .../shuttles/nanotrasen/nanotrasen_ranger.dmm | 2 +- .../nanotrasen/nanotrasen_skipper.dmm | 2 +- _maps/shuttles/pgf/pgf_crying_sun.dmm | 2 +- _maps/shuttles/roumain/srm_elder.dmm | 2 +- _maps/shuttles/solgov/solgov_chronicle.dmm | 2 +- _maps/shuttles/solgov/solgov_inkwell.dmm | 2 +- _maps/shuttles/solgov/solgov_paracelsus.dmm | 2 +- .../syndicate/syndicate_cybersun_kansatsu.dmm | 2 +- .../syndicate/syndicate_gorlex_hyena.dmm | 2 +- .../syndicate/syndicate_gorlex_komodo.dmm | 2 +- .../syndicate/syndicate_litieguai.dmm | 2 +- .../shuttles/syndicate/syndicate_panacea.dmm | 2 +- .../syndicate/syndicate_twinkleshine.dmm | 2 +- check_regex.yaml | 2 +- .../circuitboards/computer_circuitboards.dm | 12 +- code/game/objects/structures/salvaging.dm | 2 +- code/modules/cargo/console.dm | 370 +++++++----- code/modules/cargo/expressconsole.dm | 262 --------- code/modules/cargo/supplypod_beacon.dm | 28 +- .../research/designs/mining_designs.dm | 2 +- shiptest.dme | 2 +- tgui/packages/tgui/interfaces/Cargo.js | 533 ------------------ .../OutpostCommunications/Catalog.js | 190 +++++++ .../index.tsx} | 39 +- .../interfaces/OutpostCommunications/types.ts | 28 + 56 files changed, 509 insertions(+), 1051 deletions(-) delete mode 100644 code/modules/cargo/expressconsole.dm delete mode 100644 tgui/packages/tgui/interfaces/Cargo.js create mode 100644 tgui/packages/tgui/interfaces/OutpostCommunications/Catalog.js rename tgui/packages/tgui/interfaces/{OutpostCommunications.tsx => OutpostCommunications/index.tsx} (88%) create mode 100644 tgui/packages/tgui/interfaces/OutpostCommunications/types.ts diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index 781ae59a84f4..dec4c65755f9 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -1762,7 +1762,7 @@ /turf/open/floor/plasteel/tech, /area/ruin/jungle/cavecrew/security) "vr" = ( -/obj/machinery/computer/cargo/express, +/obj/machinery/computer/cargo, /turf/open/floor/plasteel/patterned, /area/ruin/jungle/cavecrew/cargo) "vH" = ( diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm index 45591d25dde5..99ccda138d00 100644 --- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm +++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm @@ -3490,7 +3490,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 9 }, -/obj/machinery/computer/cargo/express, +/obj/machinery/computer/cargo, /turf/open/floor/carpet/nanoweave/beige, /area/ruin/space/has_grav/singularitylab/cargo) "nT" = ( diff --git a/_maps/outpost/hangar/nt_asteroid_20x20.dmm b/_maps/outpost/hangar/nt_asteroid_20x20.dmm index 118f810e93f8..858d984f4603 100644 --- a/_maps/outpost/hangar/nt_asteroid_20x20.dmm +++ b/_maps/outpost/hangar/nt_asteroid_20x20.dmm @@ -370,7 +370,7 @@ }, /area/hangar) "jw" = ( -/obj/machinery/computer/cargo/express, +/obj/machinery/computer/cargo, /obj/structure/railing{ dir = 8; layer = 4.1 diff --git a/_maps/outpost/hangar/nt_asteroid_40x20.dmm b/_maps/outpost/hangar/nt_asteroid_40x20.dmm index b57c4972362c..312e0443aeea 100644 --- a/_maps/outpost/hangar/nt_asteroid_40x20.dmm +++ b/_maps/outpost/hangar/nt_asteroid_40x20.dmm @@ -839,7 +839,7 @@ }, /area/hangar) "tH" = ( -/obj/machinery/computer/cargo/express, +/obj/machinery/computer/cargo, /obj/item/toy/plush/knight{ pixel_y = 25; pixel_x = 9 diff --git a/_maps/outpost/hangar/nt_asteroid_40x40.dmm b/_maps/outpost/hangar/nt_asteroid_40x40.dmm index 48649aedf4d8..005b657e38ee 100644 --- a/_maps/outpost/hangar/nt_asteroid_40x40.dmm +++ b/_maps/outpost/hangar/nt_asteroid_40x40.dmm @@ -60,7 +60,7 @@ /obj/effect/turf_decal/techfloor{ dir = 4 }, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/machinery/light/directional/east, diff --git a/_maps/outpost/hangar/nt_asteroid_56x20.dmm b/_maps/outpost/hangar/nt_asteroid_56x20.dmm index 9dac115ca5e7..11ba5baac070 100644 --- a/_maps/outpost/hangar/nt_asteroid_56x20.dmm +++ b/_maps/outpost/hangar/nt_asteroid_56x20.dmm @@ -284,7 +284,7 @@ }, /area/hangar) "kx" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8; pixel_x = 7 }, diff --git a/_maps/outpost/hangar/nt_asteroid_56x40.dmm b/_maps/outpost/hangar/nt_asteroid_56x40.dmm index a3018e28aa32..5d66d8966d0b 100644 --- a/_maps/outpost/hangar/nt_asteroid_56x40.dmm +++ b/_maps/outpost/hangar/nt_asteroid_56x40.dmm @@ -723,7 +723,7 @@ }, /area/hangar) "Ed" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8; pixel_x = 7 }, diff --git a/_maps/outpost/nanotrasen_asteroid.dmm b/_maps/outpost/nanotrasen_asteroid.dmm index d1a184d736fc..816befea0002 100644 --- a/_maps/outpost/nanotrasen_asteroid.dmm +++ b/_maps/outpost/nanotrasen_asteroid.dmm @@ -5585,7 +5585,7 @@ /turf/open/floor/concrete/reinforced, /area/outpost/maintenance/aft) "tW" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/effect/turf_decal/techfloor{ diff --git a/_maps/shuttles/independent/independent_beluga.dmm b/_maps/shuttles/independent/independent_beluga.dmm index 1eae63fcac48..c8ef49a3b35e 100644 --- a/_maps/shuttles/independent/independent_beluga.dmm +++ b/_maps/shuttles/independent/independent_beluga.dmm @@ -4742,7 +4742,7 @@ /area/ship/crew) "UO" = ( /obj/effect/turf_decal/industrial/traffic/corner, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /obj/machinery/light/directional/south, diff --git a/_maps/shuttles/independent/independent_box.dmm b/_maps/shuttles/independent/independent_box.dmm index 0e1e4e9439b5..577290c6581c 100644 --- a/_maps/shuttles/independent/independent_box.dmm +++ b/_maps/shuttles/independent/independent_box.dmm @@ -1802,7 +1802,7 @@ /obj/effect/turf_decal/corner/opaque/blue{ dir = 4 }, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /obj/machinery/firealarm/directional/south, diff --git a/_maps/shuttles/independent/independent_bubble.dmm b/_maps/shuttles/independent/independent_bubble.dmm index c34ad8349987..08fd116f2536 100644 --- a/_maps/shuttles/independent/independent_bubble.dmm +++ b/_maps/shuttles/independent/independent_bubble.dmm @@ -1164,7 +1164,7 @@ }, /obj/item/circuitboard/computer/selling_pad_control, /obj/item/circuitboard/machine/selling_pad, -/obj/item/circuitboard/computer/cargo/express, +/obj/item/circuitboard/computer/cargo, /obj/structure/closet/crate/engineering, /turf/open/floor/plasteel, /area/ship/cargo) diff --git a/_maps/shuttles/independent/independent_dwayne.dmm b/_maps/shuttles/independent/independent_dwayne.dmm index ef1435cb1558..668e1e164530 100644 --- a/_maps/shuttles/independent/independent_dwayne.dmm +++ b/_maps/shuttles/independent/independent_dwayne.dmm @@ -1974,7 +1974,7 @@ /obj/effect/turf_decal/corner/opaque/blue/half{ dir = 4 }, -/obj/machinery/computer/cargo/express/retro{ +/obj/machinery/computer/cargo/retro{ dir = 8 }, /turf/open/floor/plasteel/dark, diff --git a/_maps/shuttles/independent/independent_junker.dmm b/_maps/shuttles/independent/independent_junker.dmm index a5b4354e7456..136e6e6e17fb 100644 --- a/_maps/shuttles/independent/independent_junker.dmm +++ b/_maps/shuttles/independent/independent_junker.dmm @@ -2277,7 +2277,7 @@ }, /obj/effect/decal/cleanable/glass, /obj/structure/safe/floor, -/obj/item/circuitboard/computer/cargo/express, +/obj/item/circuitboard/computer/cargo, /turf/open/floor/pod/dark, /area/ship/crew/office) "Rj" = ( diff --git a/_maps/shuttles/independent/independent_kilo.dmm b/_maps/shuttles/independent/independent_kilo.dmm index a4c390afde8d..0f1f92a475c8 100644 --- a/_maps/shuttles/independent/independent_kilo.dmm +++ b/_maps/shuttles/independent/independent_kilo.dmm @@ -1252,7 +1252,7 @@ /area/ship/crew) "sW" = ( /obj/effect/turf_decal/industrial/outline/yellow, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/machinery/airalarm/directional/east, diff --git a/_maps/shuttles/independent/independent_lagoon.dmm b/_maps/shuttles/independent/independent_lagoon.dmm index 14823f92db63..77b0d605e91b 100644 --- a/_maps/shuttles/independent/independent_lagoon.dmm +++ b/_maps/shuttles/independent/independent_lagoon.dmm @@ -256,7 +256,7 @@ /turf/open/floor/plasteel, /area/ship/external) "bt" = ( -/obj/machinery/computer/cargo/express/retro{ +/obj/machinery/computer/cargo/retro{ dir = 4 }, /turf/open/floor/plasteel/patterned/cargo_one, diff --git a/_maps/shuttles/independent/independent_mudskipper.dmm b/_maps/shuttles/independent/independent_mudskipper.dmm index f82cdc7ba748..d7a3341b8927 100644 --- a/_maps/shuttles/independent/independent_mudskipper.dmm +++ b/_maps/shuttles/independent/independent_mudskipper.dmm @@ -913,7 +913,7 @@ /obj/structure/sign/warning/incident{ pixel_x = -32 }, -/obj/machinery/computer/cargo/express/retro{ +/obj/machinery/computer/cargo/retro{ dir = 4 }, /turf/open/floor/plasteel/tech/grid, diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm index daf3cf9ecdb3..42a9f999f3f7 100644 --- a/_maps/shuttles/independent/independent_rigger.dmm +++ b/_maps/shuttles/independent/independent_rigger.dmm @@ -2231,7 +2231,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 }, -/obj/machinery/computer/cargo/express, +/obj/machinery/computer/cargo, /obj/item/radio/intercom/directional/north, /turf/open/floor/carpet/blue, /area/ship/bridge) diff --git a/_maps/shuttles/independent/independent_schmiedeberg.dmm b/_maps/shuttles/independent/independent_schmiedeberg.dmm index 454e7503cb52..ce7b407a4731 100644 --- a/_maps/shuttles/independent/independent_schmiedeberg.dmm +++ b/_maps/shuttles/independent/independent_schmiedeberg.dmm @@ -756,7 +756,7 @@ /turf/open/floor/wood/walnut, /area/ship/crew/canteen) "ka" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /obj/item/radio/intercom/directional/south, diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm index e269c70cfefa..f147aeb82276 100644 --- a/_maps/shuttles/independent/independent_shetland.dmm +++ b/_maps/shuttles/independent/independent_shetland.dmm @@ -5464,7 +5464,7 @@ /obj/effect/turf_decal/corner/opaque/neutral/three_quarters{ dir = 1 }, -/obj/machinery/computer/cargo/express/retro, +/obj/machinery/computer/cargo/retro, /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) "VD" = ( diff --git a/_maps/shuttles/independent/independent_sunskipper.dmm b/_maps/shuttles/independent/independent_sunskipper.dmm index 113230223069..de92179a11f7 100644 --- a/_maps/shuttles/independent/independent_sunskipper.dmm +++ b/_maps/shuttles/independent/independent_sunskipper.dmm @@ -2050,7 +2050,7 @@ /turf/open/floor/plasteel/tech, /area/ship/cargo) "AP" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ icon_state = "computer-right"; dir = 8 }, diff --git a/_maps/shuttles/inteq/inteq_colossus.dmm b/_maps/shuttles/inteq/inteq_colossus.dmm index 870a12949973..5925b9c0acdd 100644 --- a/_maps/shuttles/inteq/inteq_colossus.dmm +++ b/_maps/shuttles/inteq/inteq_colossus.dmm @@ -852,7 +852,7 @@ /area/ship/hallway/fore) "iX" = ( /obj/item/radio/intercom/wideband/directional/south, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /obj/effect/turf_decal/borderfloor, diff --git a/_maps/shuttles/inteq/inteq_hound.dmm b/_maps/shuttles/inteq/inteq_hound.dmm index 5616d1d2d4b0..da82ccbf26b7 100644 --- a/_maps/shuttles/inteq/inteq_hound.dmm +++ b/_maps/shuttles/inteq/inteq_hound.dmm @@ -1580,7 +1580,7 @@ dir = 1 }, /obj/effect/turf_decal/steeldecal/steel_decals_central4, -/obj/machinery/computer/cargo/express, +/obj/machinery/computer/cargo, /obj/item/radio/intercom/wideband/directional/north{ pixel_y = 25; pixel_x = 6 diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm index 7a4a3bec6618..491853b5266c 100644 --- a/_maps/shuttles/inteq/inteq_talos.dmm +++ b/_maps/shuttles/inteq/inteq_talos.dmm @@ -2329,7 +2329,7 @@ /turf/open/floor/plasteel/tech, /area/ship/security/armory) "os" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/effect/turf_decal/corner/opaque/brown{ diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm index 1d0c4910e49e..0b41578dd31b 100644 --- a/_maps/shuttles/inteq/inteq_valor.dmm +++ b/_maps/shuttles/inteq/inteq_valor.dmm @@ -3855,7 +3855,7 @@ /turf/open/floor/plasteel/patterned, /area/ship/cargo) "Ko" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /obj/effect/turf_decal/corner/opaque/brown{ diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm index 23a80717b42f..9e8f7d6c81f5 100644 --- a/_maps/shuttles/inteq/inteq_vaquero.dmm +++ b/_maps/shuttles/inteq/inteq_vaquero.dmm @@ -2897,7 +2897,7 @@ /turf/open/floor/plasteel/tech, /area/ship/cargo) "TK" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/effect/turf_decal/corner/opaque/yellow, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm index b723b020aa36..e5890b401cfa 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm @@ -2530,7 +2530,7 @@ /turf/open/floor/plasteel/dark, /area/ship/bridge) "Lv" = ( -/obj/machinery/computer/cargo/express/retro{ +/obj/machinery/computer/cargo/retro{ dir = 8 }, /obj/effect/turf_decal/corner/opaque/nsorange, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm index b05fd520c158..351f188e3369 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm @@ -4283,7 +4283,7 @@ /turf/open/floor/plasteel/grimy, /area/ship/crew) "RK" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 4 }, /obj/item/radio/intercom/directional/west, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm index b92747f3a3e2..0a0c9dead99f 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm @@ -10099,7 +10099,7 @@ /turf/open/floor/plasteel/tech, /area/ship/engineering) "LS" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/structure/railing{ diff --git a/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm index 9abfe4c6c6cb..663a567b8bbc 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm @@ -1107,7 +1107,7 @@ /turf/open/floor/plasteel/dark, /area/ship/cargo) "dg" = ( -/obj/machinery/computer/cargo/express/retro{ +/obj/machinery/computer/cargo/retro{ dir = 8 }, /obj/effect/turf_decal/corner/opaque/blue/three_quarters{ @@ -2647,7 +2647,7 @@ /area/ship/cargo) "Du" = ( /obj/effect/turf_decal/corner/transparent/neutral/full, -/obj/machinery/computer/cargo/express/retro{ +/obj/machinery/computer/cargo/retro{ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm index f5ffea852281..928fc6bd90ee 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm @@ -4024,7 +4024,7 @@ /turf/open/floor/plasteel, /area/ship/security/prison) "xT" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /turf/open/floor/plasteel/telecomms_floor, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm b/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm index 774f1d57cc40..0c860abb9e20 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm @@ -95,7 +95,7 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/effect/turf_decal/corner/opaque/brown{ diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm index a106a307bb18..342ffb8fa928 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm @@ -464,7 +464,7 @@ /turf/open/floor/plasteel/white, /area/ship/hallway/port) "eE" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /turf/open/floor/plasteel/tech, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm b/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm index f910af5043c8..f9aeea662f05 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm @@ -4235,7 +4235,7 @@ "JA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /turf/open/floor/plasteel/dark, diff --git a/_maps/shuttles/pgf/pgf_crying_sun.dmm b/_maps/shuttles/pgf/pgf_crying_sun.dmm index 919770509bec..e016ef725525 100644 --- a/_maps/shuttles/pgf/pgf_crying_sun.dmm +++ b/_maps/shuttles/pgf/pgf_crying_sun.dmm @@ -464,7 +464,7 @@ /turf/open/floor/plasteel/telecomms_floor, /area/ship/hallway/port) "dK" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/structure/catwalk/over/plated_catwalk/dark, diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm index e4a85560cb67..5ef138ad19db 100644 --- a/_maps/shuttles/roumain/srm_elder.dmm +++ b/_maps/shuttles/roumain/srm_elder.dmm @@ -3609,7 +3609,7 @@ /turf/open/floor/wood/maple, /area/ship/crew/cryo) "Sg" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/effect/turf_decal/spline/fancy/wood{ diff --git a/_maps/shuttles/solgov/solgov_chronicle.dmm b/_maps/shuttles/solgov/solgov_chronicle.dmm index 13e78929b4dc..012261bda246 100644 --- a/_maps/shuttles/solgov/solgov_chronicle.dmm +++ b/_maps/shuttles/solgov/solgov_chronicle.dmm @@ -350,7 +350,7 @@ /turf/open/floor/wood, /area/ship/crew) "da" = ( -/obj/machinery/computer/cargo/express/solgov{ +/obj/machinery/computer/cargo/solgov{ dir = 4 }, /obj/item/radio/intercom/directional/west, diff --git a/_maps/shuttles/solgov/solgov_inkwell.dmm b/_maps/shuttles/solgov/solgov_inkwell.dmm index da2a6b032eaa..86781cc2e251 100644 --- a/_maps/shuttles/solgov/solgov_inkwell.dmm +++ b/_maps/shuttles/solgov/solgov_inkwell.dmm @@ -2139,7 +2139,7 @@ /turf/open/floor/plasteel/mono, /area/ship/cargo) "nO" = ( -/obj/machinery/computer/cargo/express/solgov, +/obj/machinery/computer/cargo/solgov, /turf/open/floor/wood/maple, /area/ship/bridge) "nR" = ( diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm index b099e500aee9..1235af6da913 100644 --- a/_maps/shuttles/solgov/solgov_paracelsus.dmm +++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm @@ -2725,7 +2725,7 @@ /obj/structure/railing/wood{ dir = 8 }, -/obj/machinery/computer/cargo/express/solgov{ +/obj/machinery/computer/cargo/solgov{ dir = 4 }, /obj/effect/turf_decal/siding/wood{ diff --git a/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm b/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm index 41faf816d827..ffc2472b5dec 100644 --- a/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm +++ b/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm @@ -258,7 +258,7 @@ /turf/open/floor/plasteel/stairs, /area/ship/cargo) "fk" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /obj/machinery/button/door{ diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm index 7c7a34fd2690..ae46dc0286f3 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm @@ -952,7 +952,7 @@ "pI" = ( /obj/item/radio/intercom/wideband/directional/east, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 1 }, /obj/effect/turf_decal/borderfloorblack, diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index 7c323e43dbe0..bfbdc4e43e04 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -3507,7 +3507,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/ship/hallway/central) "HI" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ layer = 3 }, /obj/effect/turf_decal/techfloor{ diff --git a/_maps/shuttles/syndicate/syndicate_litieguai.dmm b/_maps/shuttles/syndicate/syndicate_litieguai.dmm index c2e92f15f167..09ad85bc606f 100644 --- a/_maps/shuttles/syndicate/syndicate_litieguai.dmm +++ b/_maps/shuttles/syndicate/syndicate_litieguai.dmm @@ -2608,7 +2608,7 @@ /turf/open/floor/plasteel/white, /area/ship/hallway/central) "TA" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /turf/open/floor/plasteel/dark, diff --git a/_maps/shuttles/syndicate/syndicate_panacea.dmm b/_maps/shuttles/syndicate/syndicate_panacea.dmm index a55e39dd9e27..702798048e53 100644 --- a/_maps/shuttles/syndicate/syndicate_panacea.dmm +++ b/_maps/shuttles/syndicate/syndicate_panacea.dmm @@ -887,7 +887,7 @@ /turf/open/floor/suns/dark/plain, /area/ship/crew/office/lobby) "fG" = ( -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8 }, /turf/open/floor/suns/dark, diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm index 9967d69f6d07..1adef58948fe 100644 --- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm +++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm @@ -1580,7 +1580,7 @@ /obj/effect/turf_decal/corner/opaque/syndiered/half{ dir = 4 }, -/obj/machinery/computer/cargo/express{ +/obj/machinery/computer/cargo{ dir = 8; icon_state = "computer-left" }, diff --git a/check_regex.yaml b/check_regex.yaml index 3b5e13a650e5..441f1e44d743 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -31,7 +31,7 @@ standards: - exactly: [4, "/mob text paths", '"/mob'] - exactly: [43, "/obj text paths", '"/obj'] - exactly: [0, "/turf text paths", '"/turf'] - - exactly: [117, "text2path uses", "text2path"] + - exactly: [116, "text2path uses", "text2path"] - exactly: [18, "world<< uses", 'world[ \t]*<<'] - exactly: [0, "world.log<< uses", 'world.log[ \t]*<<'] diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 54dcfb36c131..47739ded1551 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -362,7 +362,7 @@ build_path = /obj/machinery/computer/bounty /obj/item/circuitboard/computer/cargo - name = "Supply Console (Computer Board)" + name = "Outpost Comms Console (Computer Board)" icon_state = "supply" build_path = /obj/machinery/computer/cargo var/contraband = FALSE @@ -381,16 +381,6 @@ obj_flags |= EMAGGED to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.") -/obj/item/circuitboard/computer/cargo/express - name = "Outpost Comms Console (Computer Board)" - build_path = /obj/machinery/computer/cargo/express - -/obj/item/circuitboard/computer/cargo/express/multitool_act(mob/living/user) - return - -/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user) - return - /obj/item/circuitboard/computer/mining name = "Outpost Status Display (Computer Board)" icon_state = "supply" diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm index ebefc58e5c01..d373f8eb94a9 100644 --- a/code/game/objects/structures/salvaging.dm +++ b/code/game/objects/structures/salvaging.dm @@ -673,7 +673,7 @@ /obj/effect/spawner/lootdrop/random_computer_circuit_rare loot = list( - /obj/item/circuitboard/computer/cargo/express = 5, + /obj/item/circuitboard/computer/cargo = 5, /obj/item/circuitboard/computer/communications = 5, /obj/item/circuitboard/computer/shuttle/helm = 5, /obj/item/circuitboard/computer/med_data = 5, diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 143480b2bc71..82fd2c11d01a 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -1,42 +1,57 @@ +#define BEACON_COST 500 +#define SP_LINKED 1 +#define SP_READY 2 +#define SP_LAUNCH 3 +#define SP_UNLINK 4 +#define SP_UNREADY 5 + /obj/machinery/computer/cargo - name = "supply console" - desc = "Used to order supplies, approve requests, and control the shuttle." - icon_screen = "supply" + name = "outpost communications console" + desc = "This console allows the user to communicate with a nearby outpost to \ + purchase supplies and manage missions. Purchases are delivered near-instantly." + icon_screen = "supply_express" circuit = /obj/item/circuitboard/computer/cargo light_color = COLOR_BRIGHT_ORANGE - var/requestonly = FALSE var/contraband = FALSE var/self_paid = FALSE var/safety_warning = "For safety reasons, the automated supply shuttle \ cannot transport live organisms, human remains, classified nuclear weaponry, \ homing beacons or machinery housing any form of artificial intelligence." - var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." - /// radio used by the console to send messages on supply channel - var/obj/item/radio/headset/radio /// var that tracks message cooldown var/message_cooldown - -/obj/machinery/computer/cargo/request - name = "supply request console" - desc = "Used to request supplies from cargo." - icon_screen = "request" - circuit = /obj/item/circuitboard/computer/cargo/request - requestonly = TRUE + var/blockade_warning = "Bluespace instability detected. Delivery impossible." + var/message + /// Number of beacons printed. Used to determine beacon names. + var/printed_beacons = 0 + var/list/supply_pack_data + /// The currently linked supplypod beacon + var/obj/item/supplypod_beacon/beacon + /// Area instance that cargo pods are sent to + var/area/landingzone + /// The pod type used to deliver orders + var/podType = /obj/structure/closet/supplypod/centcompod + /// Cooldown to prevent printing supplypod beacon spam + var/cooldown = 0 + /// Is the console in beacon mode? exists to let beacon know when a pod may come in + var/use_beacon = FALSE + /// The account to charge purchases to, defaults to the cargo budget + var/datum/bank_account/charge_account /obj/machinery/computer/cargo/Initialize() . = ..() - radio = new /obj/item/radio/headset/headset_cargo(src) var/obj/item/circuitboard/computer/cargo/board = circuit contraband = board.contraband if (board.obj_flags & EMAGGED) obj_flags |= EMAGGED else obj_flags &= ~EMAGGED + generate_pack_data() /obj/machinery/computer/cargo/Destroy() - QDEL_NULL(radio) + if(beacon) + beacon.unlink_console() return ..() /obj/machinery/computer/cargo/proc/get_export_categories() @@ -65,49 +80,68 @@ /obj/machinery/computer/cargo/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Cargo", name) + ui = new(user, src, "OutpostCommunications", name) ui.open() + if(!charge_account) + reconnect() -/obj/machinery/computer/cargo/ui_data() +/obj/machinery/computer/cargo/ui_data(mob/user) + var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? var/list/data = list() - data["location"] = SSshuttle.supply.getStatusText() - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + + // not a big fan of get_containing_shuttle + var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src) + var/datum/overmap/ship/controlled/ship + var/outpost_docked = FALSE if(D) - data["points"] = D.account_balance - data["away"] = SSshuttle.supply.get_docked() == SSshuttle.supply_away_port - data["self_paid"] = self_paid - data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE - var/message = "Remember to stamp and send back the supply manifests." - if(SSshuttle.centcom_message) - message = SSshuttle.centcom_message + ship = D.current_ship + outpost_docked = istype(ship.docked_to, /datum/overmap/outpost) + + data["onShip"] = !isnull(ship) + data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0 + data["maxMissions"] = ship ? ship.max_missions : 0 + data["outpostDocked"] = outpost_docked + data["points"] = charge_account ? charge_account.account_balance : 0 + data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user) + data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui + data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay? + data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? + data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE + data["beaconError"] = use_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary + data["hasBeacon"] = beacon != null//is there a linked beacon? + data["beaconName"] = beacon ? beacon.name : "No Beacon Found" + data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons + data["supplies"] = list() + message = "Sales are near-instantaneous - please choose carefully." if(SSshuttle.supplyBlocked) message = blockade_warning + if(use_beacon && !beacon) + message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed + else if (use_beacon && !canBeacon) + message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf data["message"] = message - data["cart"] = list() - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - data["cart"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.cost, - "id" = SO.id, - "orderer" = SO.orderer, - "paid" = !isnull(SO.paying_account) //paid by requester - )) + if(!supply_pack_data) + generate_pack_data() + stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]") + data["supplies"] = supply_pack_data + if (cooldown > 0)//cooldown used for printing beacons + cooldown-- - data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.requestlist) - data["requests"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.cost, - "orderer" = SO.orderer, - "reason" = SO.reason, - "id" = SO.id - )) + data["shipMissions"] = list() + data["outpostMissions"] = list() + + if(ship) + for(var/datum/mission/M as anything in ship.missions) + data["shipMissions"] += list(M.get_tgui_info()) + if(outpost_docked) + var/datum/overmap/outpost/out = ship.docked_to + for(var/datum/mission/M as anything in out.missions) + data["outpostMissions"] += list(M.get_tgui_info()) return data /obj/machinery/computer/cargo/ui_static_data(mob/user) var/list/data = list() - data["requestonly"] = requestonly data["supplies"] = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] @@ -116,7 +150,7 @@ "name" = P.group, "packs" = list() ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) + if(P.hidden && !(obj_flags & EMAGGED)) continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, @@ -124,7 +158,6 @@ "id" = pack, "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. "small_item" = P.small_item, - "access" = P.access )) return data @@ -133,115 +166,154 @@ if(.) return switch(action) - if("send") - if(!SSshuttle.supply.canMove()) - say(safety_warning) + if("withdrawCash") + var/val = text2num(params["value"]) + // no giving yourself money + if(!charge_account || !val || val <= 0) return - if(SSshuttle.supplyBlocked) - say(blockade_warning) - return - if(SSshuttle.supply.get_docked() == SSshuttle.supply_home_port) - SSshuttle.supply.export_categories = get_export_categories() - SSshuttle.moveShuttle(SSshuttle.supply, SSshuttle.supply_away_port, TRUE) - say("The supply shuttle is departing.") - investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO) - else - investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO) - say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") - SSshuttle.moveShuttle(SSshuttle.supply, SSshuttle.supply_home_port, TRUE) - . = TRUE + if(charge_account.adjust_money(-val)) + var/obj/item/holochip/cash_chip = new /obj/item/holochip(drop_location(), val) + if(ishuman(usr)) + var/mob/living/carbon/human/user = usr + user.put_in_hands(cash_chip) + playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE) + src.visible_message("[src] dispenses a holochip.") + return TRUE + + if("LZCargo") + use_beacon = FALSE + if (beacon) + beacon.update_status(SP_UNREADY) //ready light on beacon will turn off + if("LZBeacon") + use_beacon = TRUE + if (beacon) + beacon.update_status(SP_READY) //turns on the beacon's ready light + if("printBeacon") + if(charge_account?.adjust_money(-BEACON_COST)) + cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam + var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) + C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) + printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 + beacon.name = "Supply Pod Beacon #[printed_beacons]" if("add") - if(istype(src, /obj/machinery/computer/cargo/express)) - return - var/id = text2path(params["id"]) - var/datum/supply_pack/pack = SSshuttle.supply_packs[id] - if(!istype(pack)) - return - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly) + var/area/ship/current_area = get_area(src) + var/datum/supply_pack/pack = SSshuttle.supply_packs[text2path(params["id"])] + if( \ + !pack || !charge_account?.has_money(pack.cost) || !istype(current_area) || \ + !istype(current_area.mobile_port.current_ship.docked_to, /datum/overmap/outpost) \ + ) return - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - - var/datum/bank_account/account - if(self_paid && ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id_card = H.get_idcard(TRUE) - if(!istype(id_card)) - say("No ID card detected.") - return - account = id_card.registered_account - if(!istype(account)) - say("Invalid bank account.") - return + var/turf/landing_turf + if(!isnull(beacon) && use_beacon) // prioritize beacons over landing in cargobay + landing_turf = get_turf(beacon) + beacon.update_status(SP_LAUNCH) + else if(!use_beacon)// find a suitable supplypod landing zone in cargobay + var/list/empty_turfs = list() + if(!landingzone) + reconnect() + if(!landingzone) + WARNING("[src] couldnt find a Ship/Cargo (aka cargobay) area on a ship, and as such it has set the supplypod landingzone to the area it resides in.") + landingzone = get_area(src) + for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone + if(T.is_blocked_turf()) + continue + empty_turfs += T + CHECK_TICK + landing_turf = pick(empty_turfs) + + // note that, because of CHECK_TICK above, we aren't sure if we can + // afford the pack, even though we checked earlier. luckily adjust_money + // returns false if the account can't afford the price + if(landing_turf && charge_account.adjust_money(-pack.cost)) + var/name = "*None Provided*" + var/rank = "*None Provided*" + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + name = H.get_authentification_name() + rank = H.get_assignment(hand_first = TRUE) + else if(issilicon(usr)) + name = usr.real_name + rank = "Silicon" + var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "") + new /obj/effect/pod_landingzone(landing_turf, podType, SO) + update_appearance() // ?????????????????? + return TRUE - var/reason = "" - if(requestonly && !self_paid) - reason = stripped_input("Reason:", name, "") - if(isnull(reason) || ..()) + if("mission-act") + var/datum/mission/mission = locate(params["ref"]) + var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src) + var/datum/overmap/ship/controlled/ship = D.current_ship + var/datum/overmap/outpost/outpost = ship.docked_to + if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery + return + if(!mission.accepted) + if(LAZYLEN(ship.missions) >= ship.max_missions) return + mission.accept(ship, loc) + return TRUE + else if(mission.servant == ship) + if(mission.can_complete()) + mission.turn_in() + else + mission.give_up() + return TRUE - var/turf/T = get_turf(src) - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account) - SO.generateRequisition(T) - if(requestonly && !self_paid) - SSshuttle.requestlist += SO - else - SSshuttle.shoppinglist += SO - if(self_paid) - say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") - if(requestonly && message_cooldown < world.time) - radio.talk_into(src, "A new order has been requested.", RADIO_CHANNEL_COMMAND) - message_cooldown = world.time + 30 SECONDS - . = TRUE - if("remove") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - if(SO.id == id) - SSshuttle.shoppinglist -= SO - . = TRUE - break - if("clear") - SSshuttle.shoppinglist.Cut() - . = TRUE - if("approve") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) - if(SO.id == id) - SSshuttle.requestlist -= SO - SSshuttle.shoppinglist += SO - . = TRUE - break - if("deny") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) - if(SO.id == id) - SSshuttle.requestlist -= SO - . = TRUE - break - if("denyall") - SSshuttle.requestlist.Cut() - . = TRUE - if("toggleprivate") - self_paid = !self_paid - . = TRUE - if(.) - post_signal("supply") +/obj/machinery/computer/cargo/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) + . = ..() + reconnect(port) -/obj/machinery/computer/cargo/proc/post_signal(command) +/obj/machinery/computer/cargo/proc/reconnect(obj/docking_port/mobile/port) + if(!port) + var/area/ship/current_area = get_area(src) + if(!istype(current_area)) + return + port = current_area.mobile_port + if(!port) + return + charge_account = port.current_ship.ship_account + landingzone = locate(/area/ship/cargo) in port.shuttle_areas - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) +/obj/machinery/computer/cargo/attackby(obj/item/W, mob/living/user, params) + var/value = W.get_item_credit_value() + if(value && charge_account) + charge_account.adjust_money(value) + to_chat(user, "You deposit [W]. The Vessel Budget is now [charge_account.account_balance] cr.") + qdel(W) + return TRUE + else if(istype(W, /obj/item/supplypod_beacon)) + var/obj/item/supplypod_beacon/sb = W + if (sb.cargo_console != src) + sb.link_console(src, user) + return TRUE + else + to_chat(user, "[src] is already linked to [sb].") + ..() - if(!frequency) - return +/obj/machinery/computer/cargo/proc/generate_pack_data() + supply_pack_data = list() + for(var/pack in SSshuttle.supply_packs) + var/datum/supply_pack/P = SSshuttle.supply_packs[pack] + if(!supply_pack_data[P.group]) + supply_pack_data[P.group] = list( + "name" = P.group, + "packs" = list() + ) + if((P.hidden)) + continue + supply_pack_data[P.group]["packs"] += list(list( + "name" = P.name, + "cost" = P.cost, + "id" = pack, + "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. + )) + +/obj/machinery/computer/cargo/retro + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-retro" + deconpath = /obj/structure/frame/computer/retro - var/datum/signal/status_signal = new(list("command" = command)) - frequency.post_signal(src, status_signal) +/obj/machinery/computer/cargo/solgov + icon = 'icons/obj/machines/retro_computer.dmi' + icon_state = "computer-solgov" + deconpath = /obj/structure/frame/computer/solgov diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm deleted file mode 100644 index 81409d63d031..000000000000 --- a/code/modules/cargo/expressconsole.dm +++ /dev/null @@ -1,262 +0,0 @@ -#define BEACON_COST 500 -#define SP_LINKED 1 -#define SP_READY 2 -#define SP_LAUNCH 3 -#define SP_UNLINK 4 -#define SP_UNREADY 5 - -/obj/machinery/computer/cargo/express - name = "outpost communications console" - desc = "This console allows the user to communicate with a nearby outpost to \ - purchase supplies and manage missions. Purchases are delivered near-instantly." - icon_screen = "supply_express" - circuit = /obj/item/circuitboard/computer/cargo/express - var/blockade_warning = "Bluespace instability detected. Delivery impossible." - - var/message - /// Number of beacons printed. Used to determine beacon names. - var/printed_beacons = 0 - var/list/meme_pack_data - /// The currently linked supplypod beacon - var/obj/item/supplypod_beacon/beacon - /// Area instance that cargo pods are sent to - var/area/landingzone - /// The pod type used to deliver orders - var/podType = /obj/structure/closet/supplypod/centcompod - /// Cooldown to prevent printing supplypod beacon spam - var/cooldown = 0 - /// Is the console in beacon mode? exists to let beacon know when a pod may come in - var/use_beacon = FALSE - /// The account to charge purchases to, defaults to the cargo budget - var/datum/bank_account/charge_account - -/obj/machinery/computer/cargo/express/retro - icon = 'icons/obj/machines/retro_computer.dmi' - icon_state = "computer-retro" - deconpath = /obj/structure/frame/computer/retro - -/obj/machinery/computer/cargo/express/solgov - icon = 'icons/obj/machines/retro_computer.dmi' - icon_state = "computer-solgov" - deconpath = /obj/structure/frame/computer/solgov - -/obj/machinery/computer/cargo/express/Initialize() - . = ..() - packin_up() - -/obj/machinery/computer/cargo/express/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) - . = ..() - reconnect(port) - -/obj/machinery/computer/cargo/express/proc/reconnect(obj/docking_port/mobile/port) - if(!port) - var/area/ship/current_area = get_area(src) - if(!istype(current_area)) - return - port = current_area.mobile_port - if(!port) - return - charge_account = port.current_ship.ship_account - landingzone = locate(/area/ship/cargo) in port.shuttle_areas - -/obj/machinery/computer/cargo/express/Destroy() - if(beacon) - beacon.unlink_console() - return ..() - -/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params) - var/value = W.get_item_credit_value() - if(value && charge_account) - charge_account.adjust_money(value) - to_chat(user, "You deposit [W]. The Vessel Budget is now [charge_account.account_balance] cr.") - qdel(W) - return TRUE - else if(istype(W, /obj/item/supplypod_beacon)) - var/obj/item/supplypod_beacon/sb = W - if (sb.express_console != src) - sb.link_console(src, user) - return TRUE - else - to_chat(user, "[src] is already linked to [sb].") - ..() - -/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry - meme_pack_data = list() // sorry for what? - for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all - if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice - meme_pack_data[P.group] = list( // it gets cheaper when I return it - "name" = P.group, // mmhm - "packs" = list() // sometimes, I return it so much, I rip the manifest - ) // see, my quartermaster taught me a few things too - if((P.hidden)) // like, how not to rip the manifest - continue// by using someone else's crate - meme_pack_data[P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.cost, - "id" = pack, - "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. - )) - -/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "OutpostCommunications", name) - ui.open() - if(!charge_account) - reconnect() - -/obj/machinery/computer/cargo/express/ui_data(mob/user) - var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? - var/list/data = list() - - // not a big fan of get_containing_shuttle - var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src) - var/datum/overmap/ship/controlled/ship - var/outpost_docked = FALSE - if(D) - ship = D.current_ship - outpost_docked = istype(ship.docked_to, /datum/overmap/outpost) - - data["onShip"] = !isnull(ship) - data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0 - data["maxMissions"] = ship ? ship.max_missions : 0 - data["outpostDocked"] = outpost_docked - data["points"] = charge_account ? charge_account.account_balance : 0 - data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user) - data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui - data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay? - data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? - data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE - data["beaconError"] = use_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary - data["hasBeacon"] = beacon != null//is there a linked beacon? - data["beaconName"] = beacon ? beacon.name : "No Beacon Found" - data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons - data["supplies"] = list() - message = "Sales are near-instantaneous - please choose carefully." - if(SSshuttle.supplyBlocked) - message = blockade_warning - if(use_beacon && !beacon) - message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed - else if (use_beacon && !canBeacon) - message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf - data["message"] = message - if(!meme_pack_data) - packin_up() - stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]") - data["supplies"] = meme_pack_data - if (cooldown > 0)//cooldown used for printing beacons - cooldown-- - - data["shipMissions"] = list() - data["outpostMissions"] = list() - - if(ship) - for(var/datum/mission/M as anything in ship.missions) - data["shipMissions"] += list(M.get_tgui_info()) - if(outpost_docked) - var/datum/overmap/outpost/out = ship.docked_to - for(var/datum/mission/M as anything in out.missions) - data["outpostMissions"] += list(M.get_tgui_info()) - - return data - -/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return - - switch(action) - if("withdrawCash") - var/val = text2num(params["value"]) - // no giving yourself money - if(!charge_account || !val || val <= 0) - return - if(charge_account.adjust_money(-val)) - var/obj/item/holochip/cash_chip = new /obj/item/holochip(drop_location(), val) - if(ishuman(usr)) - var/mob/living/carbon/human/user = usr - user.put_in_hands(cash_chip) - playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE) - src.visible_message("[src] dispenses a holochip.") - return TRUE - - if("LZCargo") - use_beacon = FALSE - if (beacon) - beacon.update_status(SP_UNREADY) //ready light on beacon will turn off - if("LZBeacon") - use_beacon = TRUE - if (beacon) - beacon.update_status(SP_READY) //turns on the beacon's ready light - if("printBeacon") - if(charge_account?.adjust_money(-BEACON_COST)) - cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam - var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) - C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) - printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 - beacon.name = "Supply Pod Beacon #[printed_beacons]" - - if("add") - var/area/ship/current_area = get_area(src) - var/datum/supply_pack/pack = SSshuttle.supply_packs[text2path(params["id"])] - if( \ - !pack || !charge_account?.has_money(pack.cost) || !istype(current_area) || \ - !istype(current_area.mobile_port.current_ship.docked_to, /datum/overmap/outpost) \ - ) - return - - var/turf/landing_turf - if(!isnull(beacon) && use_beacon) // prioritize beacons over landing in cargobay - landing_turf = get_turf(beacon) - beacon.update_status(SP_LAUNCH) - else if(!use_beacon)// find a suitable supplypod landing zone in cargobay - var/list/empty_turfs = list() - if(!landingzone) - reconnect() - if(!landingzone) - WARNING("[src] couldnt find a Ship/Cargo (aka cargobay) area on a ship, and as such it has set the supplypod landingzone to the area it resides in.") - landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone - if(T.is_blocked_turf()) - continue - empty_turfs += T - CHECK_TICK - landing_turf = pick(empty_turfs) - - // note that, because of CHECK_TICK above, we aren't sure if we can - // afford the pack, even though we checked earlier. luckily adjust_money - // returns false if the account can't afford the price - if(landing_turf && charge_account.adjust_money(-pack.cost)) - var/name = "*None Provided*" - var/rank = "*None Provided*" - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "") - new /obj/effect/pod_landingzone(landing_turf, podType, SO) - update_appearance() // ?????????????????? - return TRUE - - if("mission-act") - var/datum/mission/mission = locate(params["ref"]) - var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src) - var/datum/overmap/ship/controlled/ship = D.current_ship - var/datum/overmap/outpost/outpost = ship.docked_to - if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery - return - if(!mission.accepted) - if(LAZYLEN(ship.missions) >= ship.max_missions) - return - mission.accept(ship, loc) - return TRUE - else if(mission.servant == ship) - if(mission.can_complete()) - mission.turn_in() - else - mission.give_up() - return TRUE diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 11fd10229e5e..b9c41a29e11f 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -7,7 +7,7 @@ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL - var/obj/machinery/computer/cargo/express/express_console + var/obj/machinery/computer/cargo/cargo_console var/linked = FALSE var/ready = FALSE var/launched = FALSE @@ -49,39 +49,39 @@ /obj/item/supplypod_beacon/examine(user) . = ..() - if(!express_console) + if(!cargo_console) . += "[src] is not currently linked to an Express Supply console." else . += "Alt-click to unlink it from the Express Supply console." /obj/item/supplypod_beacon/Destroy() - if(express_console) - express_console.beacon = null + if(cargo_console) + cargo_console.beacon = null return ..() /obj/item/supplypod_beacon/proc/unlink_console() - if(express_console) - express_console.beacon = null - express_console = null + if(cargo_console) + cargo_console.beacon = null + cargo_console = null update_status(SP_UNLINK) update_status(SP_UNREADY) -/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user) +/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/C, mob/living/user) if (C.beacon)//if new console has a beacon, then... C.beacon.unlink_console()//unlink the old beacon from new console - if (express_console)//if this beacon has an express console - express_console.beacon = null//remove the connection the expressconsole has from beacons - express_console = C//set the linked console var to the console - express_console.beacon = src//out with the old in with the news + if (cargo_console)//if this beacon has an express console + cargo_console.beacon = null//remove the connection the expressconsole has from beacons + cargo_console = C//set the linked console var to the console + cargo_console.beacon = src//out with the old in with the news update_status(SP_LINKED) - if (express_console.use_beacon) + if (cargo_console.use_beacon) update_status(SP_READY) to_chat(user, "[src] linked to [C].") /obj/item/supplypod_beacon/AltClick(mob/user) if (!user.canUseTopic(src, !issilicon(user))) return - if (express_console) + if (cargo_console) unlink_console() else to_chat(user, "There is no linked console.") diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index 2cddc5043c3f..aa221c2b21a7 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -8,7 +8,7 @@ id = "cargoexpress"//the coder reading this build_type = IMPRINTER materials = list(/datum/material/glass = 1000) - build_path = /obj/item/circuitboard/computer/cargo/express + build_path = /obj/item/circuitboard/computer/cargo category = list("Mining Designs") departmental_flags = DEPARTMENTAL_FLAG_CARGO diff --git a/shiptest.dme b/shiptest.dme index 4b8478ffbf1b..c0d9a7d4df66 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1882,9 +1882,9 @@ #include "code\modules\cargo\bounty.dm" #include "code\modules\cargo\bounty_console.dm" #include "code\modules\cargo\centcom_podlauncher.dm" +#include "code\modules\cargo\console.dm" #include "code\modules\cargo\export_scanner.dm" #include "code\modules\cargo\exports.dm" -#include "code\modules\cargo\expressconsole.dm" #include "code\modules\cargo\gondolapod.dm" #include "code\modules\cargo\order.dm" #include "code\modules\cargo\packs.dm" diff --git a/tgui/packages/tgui/interfaces/Cargo.js b/tgui/packages/tgui/interfaces/Cargo.js deleted file mode 100644 index 9dfcd417f593..000000000000 --- a/tgui/packages/tgui/interfaces/Cargo.js +++ /dev/null @@ -1,533 +0,0 @@ -import { flow } from 'common/fp'; -import { filter, sortBy } from 'common/collections'; -import { useBackend, useSharedState } from '../backend'; -import { - AnimatedNumber, - Box, - Button, - Flex, - Icon, - Input, - LabeledList, - NoticeBox, - Section, - Stack, - Table, - Tabs, -} from '../components'; -import { formatMoney } from '../format'; -import { Window } from '../layouts'; - -export const Cargo = (props, context) => { - return ( - - - - - - ); -}; - -export const CargoContent = (props, context) => { - const { act, data } = useBackend(context); - const [tab, setTab] = useSharedState(context, 'tab', 'catalog'); - const { requestonly } = data; - const cart = data.cart || []; - const requests = data.requests || []; - return ( - - -
    - - setTab('catalog')} - > - Catalog - - 0 && 'yellow'} - selected={tab === 'requests'} - onClick={() => setTab('requests')} - > - Requests ({requests.length}) - - {!requestonly && ( - <> - 0 && 'yellow'} - selected={tab === 'cart'} - onClick={() => setTab('cart')} - > - Checkout ({cart.length}) - - setTab('help')} - > - Help - - - )} - -
    - {tab === 'catalog' && } - {tab === 'requests' && } - {tab === 'cart' && } - {tab === 'help' && } -
    - ); -}; - -const CargoStatus = (props, context) => { - const { act, data } = useBackend(context); - const { - department, - grocery, - away, - docked, - loan, - loan_dispatched, - location, - message, - points, - requestonly, - can_send, - } = data; - return ( -
    - formatMoney(value)} - /> - {' credits'} - - } - > - - - {(docked && !requestonly && can_send && ( -
    - ); -}; - -/** - * Take entire supplies tree - * and return a flat supply pack list that matches search, - * sorted by name and only the first page. - * @param {any[]} supplies Supplies list. - * @param {string} search The search term - * @returns {any[]} The flat list of supply packs. - */ -const searchForSupplies = (supplies, search) => { - search = search.toLowerCase(); - - return flow([ - (categories) => categories.flatMap((category) => category.packs), - filter( - (pack) => - pack.name?.toLowerCase().includes(search.toLowerCase()) || - pack.desc?.toLowerCase().includes(search.toLowerCase()) - ), - sortBy((pack) => pack.name), - (packs) => packs.slice(0, 25), - ])(supplies); -}; - -export const CargoCatalog = (props, context) => { - const { express } = props; - const { act, data } = useBackend(context); - - const { self_paid, app_cost } = data; - - const supplies = Object.values(data.supplies); - - const [activeSupplyName, setActiveSupplyName] = useSharedState( - context, - 'supply', - supplies[0]?.name - ); - - const [searchText, setSearchText] = useSharedState( - context, - 'search_text', - '' - ); - - const activeSupply = - activeSupplyName === 'search_results' - ? { packs: searchForSupplies(supplies, searchText) } - : supplies.find((supply) => supply.name === activeSupplyName); - - return ( -
    - - act('toggleprivate')} - /> - - ) - } - > - - - - - - - - - - { - if (value === searchText) { - return; - } - - if (value.length) { - // Start showing results - setActiveSupplyName('search_results'); - } else if (activeSupplyName === 'search_results') { - // return to normal category - setActiveSupplyName(supplies[0]?.name); - } - setSearchText(value); - }} - onChange={(e, value) => { - // Allow edge cases like the X button to work - const onInput = e.target?.props?.onInput; - if (onInput) { - onInput(e, value); - } - }} - /> - - - - {supplies.map((supply) => ( - { - setActiveSupplyName(supply.name); - setSearchText(''); - }} - > - {supply.name} ({supply.packs.length}) - - ))} - - - - - {activeSupply?.packs.map((pack) => { - const tags = []; - if (pack.small_item) { - tags.push('Small'); - } - if (pack.access) { - tags.push('Restricted'); - } - return ( - - {pack.name} - - {tags.join(', ')} - - - - - - ); - })} -
    -
    -
    -
    - ); -}; - -const CargoRequests = (props, context) => { - const { act, data } = useBackend(context); - const { requestonly, can_send, can_approve_requests } = data; - const requests = data.requests || []; - // Labeled list reimplementation to squeeze extra columns out of it - return ( -
    act('denyall')} - /> - ) - } - > - {requests.length === 0 && No Requests} - {requests.length > 0 && ( - - {requests.map((request) => ( - - - #{request.id} - - {request.object} - - {request.orderer} - - - {request.reason} - - - {formatMoney(request.cost)} cr - - {(!requestonly || can_send) && can_approve_requests && ( - -
    - )} -
    - ); -}; - -const CargoCartButtons = (props, context) => { - const { act, data } = useBackend(context); - const { requestonly, can_send, can_approve_requests } = data; - const cart = data.cart || []; - const total = cart.reduce((total, entry) => total + entry.cost, 0); - if (requestonly || !can_send || !can_approve_requests) { - return null; - } - return ( - <> - - {cart.length === 0 && 'Cart is empty'} - {cart.length === 1 && '1 item'} - {cart.length >= 2 && cart.length + ' items'}{' '} - {total > 0 && `(${formatMoney(total)} cr)`} - -