diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7a79b28b09aa..4dfa55a79231 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -24,9 +24,8 @@ /tools/docker/ @Fira /Dockerfile @Fira -# MorrowWolf +# Zonespace -/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @morrowwolf -/code/modules/gear_presets/survivors.dm @morrowwolf +/code/modules/gear_presets/survivors.dm @zonespace27 # MULTIPLE OWNERS diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 49eda07616c2..5eb8f0219e73 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -10,6 +10,12 @@ body: placeholder: "#1, #2, #3, etc" validations: required: true + - type: input + id: round-id + attributes: + label: Round ID + description: If known, what was the Round ID this bug was found on? Can be left blank if unknown or occured across multiple rounds. + placeholder: "12345" - type: textarea id: what-happened attributes: diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 683f3909b447..0488055312f7 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -60,6 +60,34 @@ jobs: with: outputFile: output-annotations.txt + + odlint: + name: Lint with OpenDream + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - name: Get OpenDream Version + run: | + source dependencies.sh + echo "OPENDREAM_VERSION=$OPENDREAM_VERSION" >> $GITHUB_ENV + - name: Restore OpenDream cache + uses: actions/cache@v3 + id: cache-od + with: + path: ~/OpenDream + key: ${{ runner.os }}-opendream-${{ env.OPENDREAM_VERSION }} + - name: Download OpenDream + if: steps.cache-od.outputs.cache-hit != 'true' + run: | + bash tools/ci/download_od.sh + - name: Setup OpenDream + if: steps.cache-od.outputs.cache-hit != 'true' + run: | + bash tools/ci/setup_od.sh + - name: Run OpenDream + run: | + bash tools/ci/run_od.sh + compile_all_maps: if: "!contains(github.event.head_commit.message, '[ci skip]')" name: Compile Maps diff --git a/.gitignore b/.gitignore index 210efc84d75b..4d2b7e810de8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ test_environment.txt # byond-tracy backend, not shipped with the codebase so it shouldn't be maintained prof.dll libprof.so + +# OpenDream compatibility stuff +colonialmarines.json diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 113b78dbada1..f1424f5560ec 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -283,7 +283,6 @@ block( \ /// Only use the CEILING_PROTECTION_TIER_X defines for `protection_level` #define CEILING_IS_PROTECTED(ceiling, protection_level) (ceiling >= protection_level) - // Default font settings #define FONT_SIZE "5pt" #define DEFAULT_FONT_COLOR "#09f" @@ -493,6 +492,18 @@ block( \ #define TURF_PROTECTION_CAS 2 #define TURF_PROTECTION_OB 3 +/// Convert a turf protection level to a ceiling protection level +/proc/get_ceiling_protection_level(turf_protection_level) + switch(turf_protection_level) + if(TURF_PROTECTION_OB) + return CEILING_PROTECTION_TIER_4 + if(TURF_PROTECTION_CAS) + return CEILING_PROTECTION_TIER_3 + if(TURF_PROTECTION_MORTAR) + return CEILING_PROTECTION_TIER_2 + else + return CEILING_NO_PROTECTION + // Anything above the deck boundary is the upper deck, anything below is the lower deck // This is exclusive, so anything ON the boundary is an edge case that's neither on the upper nor the lower deck #define ALMAYER_DECK_BOUNDARY 101 diff --git a/code/__DEFINES/bullet_traits.dm b/code/__DEFINES/bullet_traits.dm index 0ca3bce2e602..40e250cd0dd2 100644 --- a/code/__DEFINES/bullet_traits.dm +++ b/code/__DEFINES/bullet_traits.dm @@ -3,7 +3,7 @@ // list of args if there are any args /// An entry to a list for giving projectiles bullet traits /// Must be placed inside of a list -#define BULLET_TRAIT_ENTRY(trait, args...) trait = #args ? list(##args) : null +#define BULLET_TRAIT_ENTRY(trait, args...) trait = list(##args) /// An entry to a list for giving projectiles bullet traits with a unique ID /// Must be placed inside of a list #define BULLET_TRAIT_ENTRY_ID(id, trait, args...) id = list(trait, ##args) diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm index 0a9e00b59e04..6614272d33e5 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm @@ -36,6 +36,10 @@ #define COMSIG_HUMAN_UPDATE_SIGHT "human_update_sight" #define COMPONENT_OVERRIDE_UPDATE_SIGHT (1<<0) +///from /mob/living/carbon/human/movement_delay() +#define COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION "human_movement_cancel_interaction" + #define COMPONENT_HUMAN_MOVEMENT_KEEP_USING (1<<0) + ///from /mob/living/carbon/human/update_sight() #define COMSIG_HUMAN_POST_UPDATE_SIGHT "human_post_update_sight" ///from /mob/living/carbon/human/movement_delay(): (list/movedata) diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 52263a5e1367..89b88f67c038 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -267,6 +267,7 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_UPP_GENERAL "UPP Army General" #define JOB_UPP_COMBAT_SYNTH "UPP Combat Synthetic" +#define JOB_UPP_SUPPORT_SYNTH "UPP Support Synthetic" #define UPP_JOB_LIST list(JOB_UPP, JOB_UPP_ENGI, JOB_UPP_MEDIC, JOB_UPP_SPECIALIST, JOB_UPP_LEADER, JOB_UPP_POLICE, JOB_UPP_LT_OFFICER, JOB_UPP_LT_DOKTOR, JOB_UPP_SRLT_OFFICER, JOB_UPP_KPT_OFFICER, JOB_UPP_KOL_OFFICER, JOB_UPP_COMBAT_SYNTH) #define UPP_JOB_GRUNT_LIST list(JOB_UPP, JOB_UPP_ENGI, JOB_UPP_MEDIC, JOB_UPP_SPECIALIST, JOB_UPP_LEADER, JOB_UPP_POLICE, JOB_UPP_CREWMAN) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8a65a4b961ff..158c59aff327 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -166,7 +166,6 @@ #define SS_INIT_MINIMAP -34 #define SS_INIT_STATPANELS -98 #define SS_INIT_CHAT -100 //Should be last to ensure chat remains smooth during init. -#define SS_INIT_EARLYRUNTIMES -500 // Post-init notifier // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 6187a67825a4..d468d6044196 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.5.3" +#define TGS_DMAPI_VERSION "6.6.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -129,6 +129,13 @@ /// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 +/// DreamDaemon public visibility level. +#define TGS_VISIBILITY_PUBLIC 0 +/// DreamDaemon private visibility level. +#define TGS_VISIBILITY_PRIVATE 1 +/// DreamDaemon invisible visibility level. +#define TGS_VISIBILITY_INVISIBLE 2 + //REQUIRED HOOKS /** @@ -458,6 +465,10 @@ /world/proc/TgsSecurityLevel() return +/// Returns the current BYOND visibility level as a TGS_VISIBILITY_ define if TGS is present, null otherwise. Requires TGS to be using interop API version 5 or higher otherwise the string "___unimplemented" wil be returned. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! +/world/proc/TgsVisibility() + return + /// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsTestMerges() return diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b40ae85c3f5f..ef500b6af9f8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -221,6 +221,9 @@ /// Can lockout blackmarket from ASRS console circuits. #define TRAIT_TOOL_TRADEBAND "t_tool_tradeband" +/// Can hack ASRS consoles to access the black market +#define TRAIT_TOOL_BLACKMARKET_HACKER "t_tool_blackmarket_hacker" + // CLOTHING TRAITS #define TRAIT_CLOTHING_HOOD "t_clothing_hood" diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 60d2681a1d1a..1116f1acb2a8 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -732,11 +732,12 @@ world if (isnull(dir)) dir = thing.dir - if (ishuman(thing)) // Shitty workaround for a BYOND issue. + // Commented out because this is seemingly our source of bad icon operations + /* if (ishuman(thing)) // Shitty workaround for a BYOND issue. var/icon/temp = icon2collapse icon2collapse = icon() icon2collapse.Insert(temp, dir = SOUTH) - dir = SOUTH + dir = SOUTH*/ else if (isnull(dir)) dir = SOUTH @@ -876,22 +877,93 @@ world return image_to_center //For creating consistent icons for human looking simple animals -/proc/get_flat_human_icon(icon_id, datum/equipment_preset/preset, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override) +/proc/get_flat_human_icon(icon_id, equipment_preset_dresscode, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override) var/static/list/humanoid_icon_cache = list() if(!icon_id || !humanoid_icon_cache[icon_id]) var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(dummy_key) + if(prefs) prefs.copy_all_to(body) - arm_equipment(body, preset) + body.update_body() + body.update_hair() + + // Assumption: Is a list + if(outfit_override) + for(var/obj/item/cur_item as anything in outfit_override) + body.equip_to_appropriate_slot(cur_item) + + // Assumption: Is a string or path + if(equipment_preset_dresscode) + arm_equipment(body, equipment_preset_dresscode) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") - for(var/D in showDirs) - body.setDir(D) + for(var/dir in showDirs) + body.setDir(dir) var/icon/partial = getFlatIcon(body) - out_icon.Insert(partial, dir = D) + out_icon.Insert(partial, dir = dir) humanoid_icon_cache[icon_id] = out_icon dummy_key ? unset_busy_human_dummy(dummy_key) : qdel(body) return out_icon else return humanoid_icon_cache[icon_id] + +/proc/get_flat_human_copy_icon(mob/living/carbon/human/original, equipment_preset_dresscode, showDirs = GLOB.cardinals, outfit_override) + var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(null) + + if(original) + // From /datum/preferences/proc/copy_appearance_to + body.age = original.age + body.gender = original.gender + body.ethnicity = original.ethnicity + body.body_type = original.body_type + + body.r_eyes = original.r_eyes + body.g_eyes = original.g_eyes + body.b_eyes = original.b_eyes + + body.r_hair = original.r_hair + body.g_hair = original.g_hair + body.b_hair = original.b_hair + + body.r_gradient = original.r_gradient + body.g_gradient = original.g_gradient + body.b_gradient = original.b_gradient + body.grad_style = original.grad_style + + body.r_facial = original.r_facial + body.g_facial = original.g_facial + body.b_facial = original.b_facial + + body.r_skin = original.r_skin + body.g_skin = original.g_skin + body.b_skin = original.b_skin + + body.h_style = original.h_style + body.f_style = original.f_style + + body.underwear = original.underwear + body.undershirt = original.undershirt + + body.update_body() + body.update_hair() + + // Assumption: Is a list + if(outfit_override) + for(var/obj/item/cur_item as anything in outfit_override) + body.equip_to_appropriate_slot(cur_item) + + // Assumption: Is a string or path + if(equipment_preset_dresscode) + arm_equipment(body, equipment_preset_dresscode) + + var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") + for(var/dir in showDirs) + body.setDir(dir) + var/icon/partial = getFlatIcon(body) + out_icon.Insert(partial, dir = dir) + + // log_debug("get_flat_human_copy_icon called on ref=[REF(original)], instance=[original], type=[original.type], with [length(original.overlays)] overlays reduced to [length(body.overlays)] overlays") + + qdel(body) + return out_icon diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 4e4a1b3ff31c..5d0d113b0c55 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -21,7 +21,7 @@ var/char = copytext(hex, i, i + 1) switch(char) if("0") - //Apparently, switch works with empty statements, yay! If that doesn't work, blame me, though. -- Urist + pass() if("9", "8", "7", "6", "5", "4", "3", "2", "1") num += text2num(char) * 16 ** power if("a", "A") @@ -77,7 +77,6 @@ hex += "E" if(15.0) hex += "F" - else power-- while(length(hex) < placeholder) hex = text("0[]", hex) @@ -165,8 +164,6 @@ return 6 if("SOUTHWEST") return 10 - else - return //Converts an angle (degrees) into an ss13 direction /proc/angle2dir(degree) diff --git a/code/__odlint.dm b/code/__odlint.dm new file mode 100644 index 000000000000..f42517133746 --- /dev/null +++ b/code/__odlint.dm @@ -0,0 +1,11 @@ +// This file is included right at the start of the DME. +// Its purpose is to enable multiple lints (pragmas) that are supported by OpenDream to better validate the codebase +// These are essentially nitpicks the DM compiler should pick up on but doesnt + +#ifndef SPACEMAN_DMM +#ifdef OPENDREAM +// These are in their own file as you need to do it with an include as a hack to avoid +// SpacemanDMM evaluating the #pragma lines, even if its outside a block it cares about +#include "__pragmas.dm" +#endif +#endif diff --git a/code/__pragmas.dm b/code/__pragmas.dm new file mode 100644 index 000000000000..39c14e1bbc95 --- /dev/null +++ b/code/__pragmas.dm @@ -0,0 +1,27 @@ +//1000-1999 +#pragma FileAlreadyIncluded error +#pragma MissingIncludedFile error +#pragma MisplacedDirective error +#pragma UndefineMissingDirective error +#pragma DefinedMissingParen error +#pragma ErrorDirective error +#pragma WarningDirective error +#pragma MiscapitalizedDirective error + +//2000-2999 +#pragma SoftReservedKeyword error +#pragma DuplicateVariable error +#pragma DuplicateProcDefinition error +#pragma TooManyArguments error +#pragma PointlessParentCall error +#pragma PointlessBuiltinCall error +#pragma SuspiciousMatrixCall error +#pragma MalformedRange error +#pragma InvalidRange error +#pragma InvalidSetStatement error +#pragma InvalidOverride error +#pragma DanglingVarType error +#pragma MissingInterpolatedExpression error + +//3000-3999 +#pragma EmptyBlock error diff --git a/code/_byond_version_compat.dm b/code/_byond_version_compat.dm index 719d85654b5f..26968f0f837c 100644 --- a/code/_byond_version_compat.dm +++ b/code/_byond_version_compat.dm @@ -3,7 +3,7 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 #define MIN_COMPILER_BUILD 1588 -#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) +#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. #error You need version 514.1588 or higher diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 0f81b0173ac1..20aa2081318c 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -30,7 +30,7 @@ #define CBT #endif -#if !defined(CBT) && !defined(SPACEMAN_DMM) +#if !defined(CBT) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) #warn Building with Dream Maker is no longer supported and will result in errors. #warn In order to build, run BUILD.bat in the bin directory. #warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index d514bdedfcdf..37a858d76699 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -116,6 +116,10 @@ return var/mob/living/carbon/human/H = mymob var/mob/screenmob = viewer || H + + if(!screenmob?.client) + return + if(!gear.len) inventory_shown = FALSE return //species without inv slots don't show items. @@ -181,6 +185,9 @@ var/mob/living/carbon/human/H = mymob var/mob/screenmob = viewer || H + if(!screenmob?.client) + return + if(H.hud_used) if(H.hud_used.hud_shown) if(H.s_store) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 23da8cc8c9eb..3d544dca1390 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -131,7 +131,7 @@ SUBSYSTEM_DEF(atoms) switch(result) if (INITIALIZE_HINT_NORMAL) - // pass + pass() if(INITIALIZE_HINT_LATELOAD) if(arguments[1]) //mapload late_loaders += A diff --git a/code/controllers/subsystem/inactivity.dm b/code/controllers/subsystem/inactivity.dm index dd547e1f406b..5edd4e8c5294 100644 --- a/code/controllers/subsystem/inactivity.dm +++ b/code/controllers/subsystem/inactivity.dm @@ -1,20 +1,26 @@ -#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.) +#define INACTIVITY_KICK 10 MINUTES SUBSYSTEM_DEF(inactivity) name = "Inactivity" - wait = INACTIVITY_KICK + wait = 1 MINUTES flags = SS_NO_INIT | SS_BACKGROUND priority = SS_PRIORITY_INACTIVITY runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY /datum/controller/subsystem/inactivity/fire(resumed = FALSE) - if (CONFIG_GET(flag/kick_inactive)) - for(var/i in GLOB.clients) - var/client/C = i - if(C.admin_holder && C.admin_holder.rights & R_ADMIN) //Skip admins. - continue - if (C.is_afk(INACTIVITY_KICK)) - if (!istype(C.mob, /mob/dead)) - log_access("AFK: [key_name(C)]") - to_chat(C, SPAN_WARNING("You have been inactive for more than 10 minutes and have been disconnected.")) - qdel(C) + if(list_clear_nulls(GLOB.clients)) + debug_log("Removed nulls from GLOB.clients!") + if(list_clear_nulls(GLOB.player_list)) + debug_log("Removed nulls from GLOB.player_list!") + + if (!CONFIG_GET(flag/kick_inactive)) + return + + for(var/client/current as anything in GLOB.clients) + if(current.admin_holder && current.admin_holder.rights & R_ADMIN) //Skip admins. + continue + if(current.is_afk(INACTIVITY_KICK)) + if(!istype(current.mob, /mob/dead)) + log_access("AFK: [key_name(current)]") + to_chat(current, SPAN_WARNING("You have been inactive for more than [INACTIVITY_KICK / 600] minutes and have been disconnected.")) + qdel(current) diff --git a/code/controllers/subsystem/init/earlyruntimes.dm b/code/controllers/subsystem/init/earlyruntimes.dm deleted file mode 100644 index 8e43b94a0735..000000000000 --- a/code/controllers/subsystem/init/earlyruntimes.dm +++ /dev/null @@ -1,14 +0,0 @@ -/// Just messages the unwary coder to tell them there are errors that likely escaped their debugguer. -SUBSYSTEM_DEF(earlyruntimes) - name = "Early Runtimes" - init_order = SS_INIT_EARLYRUNTIMES - flags = SS_NO_FIRE - -/datum/controller/subsystem/earlyruntimes/stat_entry(msg) - msg = " Early Runtimes: [init_runtimes_count || 0] | All runtimes: [total_runtimes || 0]" - return ..() - -/datum/controller/subsystem/earlyruntimes/Initialize() - if(init_runtimes_count) - return SS_INIT_FAILURE - return SS_INIT_SUCCESS diff --git a/code/controllers/subsystem/init/law.dm b/code/controllers/subsystem/init/law.dm index 52fbbbeadf5d..c7ade815972c 100644 --- a/code/controllers/subsystem/init/law.dm +++ b/code/controllers/subsystem/init/law.dm @@ -8,20 +8,24 @@ SUBSYSTEM_DEF(law_init) var/list/minor_law = list() var/list/major_law = list() var/list/capital_law = list() + var/list/precautionary_law = list() /datum/controller/subsystem/law_init/Initialize() - for(var/L in subtypesof(/datum/law/optional_law)) - optional_law += new L + for(var/law in subtypesof(/datum/law/optional_law)) + optional_law += new law - for(var/L in subtypesof(/datum/law/minor_law)) - minor_law += new L + for(var/law in subtypesof(/datum/law/minor_law)) + minor_law += new law - for(var/L in subtypesof(/datum/law/major_law)) - major_law += new L + for(var/law in subtypesof(/datum/law/major_law)) + major_law += new law - for(var/L in subtypesof(/datum/law/capital_law)) - capital_law += new L + for(var/law in subtypesof(/datum/law/capital_law)) + capital_law += new law - laws = optional_law + minor_law + major_law + capital_law + for(var/law in subtypesof(/datum/law/precautionary_charge)) + precautionary_law += new law + + laws = optional_law + minor_law + major_law + capital_law + precautionary_law return SS_INIT_SUCCESS diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index afecabd74be0..be69bdad1b7e 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -29,9 +29,7 @@ SUBSYSTEM_DEF(mapping) /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() if(!configs) configs = load_map_configs(ALL_MAPTYPES, error_if_missing = FALSE) - for(var/i in GLOB.clients) - var/client/C = i - winset(C, null, "mainwindow.title='[CONFIG_GET(string/title)] - [SSmapping.configs[SHIP_MAP].map_name]'") + world.name = "[CONFIG_GET(string/title)] - [SSmapping.configs[SHIP_MAP].map_name]" /datum/controller/subsystem/mapping/Initialize(timeofday) HACK_LoadMapConfig() diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 1f94e67a8c33..b65ca1e758a2 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -44,6 +44,9 @@ SUBSYSTEM_DEF(statpanels) var/client/target = currentrun[length(currentrun)] currentrun.len-- + if(!target) + continue + if(!target.stat_panel.is_ready()) continue @@ -313,14 +316,39 @@ SUBSYSTEM_DEF(statpanels) for(index in 1 to length(to_make)) var/atom/thing = to_make[index] + // var/start_time = REALTIMEOFDAY var/generated_string - /* We're cheap and won't render all overlays. It's expensive and updates with onmob changes! - if(ismob(thing) || length(thing.overlays) > 2) - generated_string = costly_icon2html(thing, parent, sourceonly=TRUE) + // We're cheap and won't render all overlays. It's expensive and updates with onmob changes! + //if(ismob(thing) || length(thing.overlays) > 2) + //generated_string = costly_icon2html(thing, parent, sourceonly=TRUE) + if(ishuman(thing)) + var/mob/living/carbon/human/human_thing = thing + var/icon + + // Ensure they have their armor since its going to be the majority of their appearance + var/list/armor = list() + var/obj/item/uniform = human_thing.get_item_by_slot(WEAR_BODY) + if(uniform) + armor += new uniform.type + var/obj/item/hat = human_thing.get_item_by_slot(WEAR_HEAD) + if(hat) + armor += new hat.type + var/obj/item/suit = human_thing.get_item_by_slot(WEAR_JACKET) + if(suit) + armor += new suit.type + var/obj/item/gloves = human_thing.get_item_by_slot(WEAR_HANDS) + if(gloves) + armor += new gloves.type + var/obj/item/shoes = human_thing.get_item_by_slot(WEAR_FEET) + if(shoes) + armor += new shoes.type + + // If we don't succeed making a flat human icon below, allowing the human to pass into icon2html will throw a bad icon operation because of a workaround in icon2html for humans... + icon = get_flat_human_copy_icon(human_thing, showDirs = list(SOUTH), outfit_override = armor) + generated_string = icon2html(icon, parent, sourceonly=TRUE) + // log_debug("object_window_info called on ref=[REF(thing)], instance=[thing], type=[thing.type], finished in [(REALTIMEOFDAY-start_time) / 10]s") else generated_string = icon2html(thing, parent, sourceonly=TRUE) - */ - generated_string = icon2html(thing, parent, sourceonly=TRUE) newly_seen[thing] = generated_string if(TICK_CHECK) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 3882228a5ab1..a56e10636a1e 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -273,7 +273,7 @@ SUBSYSTEM_DEF(vote) question = "Gamemode vote" randomize_entries = TRUE for(var/mode_type in config.gamemode_cache) - var/datum/game_mode/M = initial(mode_type) + var/datum/game_mode/M = mode_type if(initial(M.config_tag)) var/vote_cycle_met = !initial(M.vote_cycle) || (text2num(SSperf_logging?.round?.id) % initial(M.vote_cycle) == 0) if(initial(M.votable) && vote_cycle_met) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index 345ddfe005f3..251267a04fdb 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -101,8 +101,8 @@ SSdatabase.create_parametric_query(query_updatetable, qpars, CB) /datum/db/adapter/brsql_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) - if(!sync) - set waitfor = 0 + set waitfor = FALSE + var/length = values.len var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, qpars) @@ -530,7 +530,7 @@ if(first && !is_id) if(!items_first) update_items+="," - update_items+="`[table_name]`.[esfield]=`__prep_update`.[esfield]" + update_items+="`[table_name]`.[esfield]=`subquery`.[esfield]" items_first = FALSE local_first = FALSE calltext += "SELECT [local_text]" @@ -539,9 +539,7 @@ issue_log += "No ID passed to update query." return "" // AAAAAAAAAAAAAH FUCK DON'T JUST KILL THE ENTIRE FUCKING TABLE BRUH return {" - WITH __prep_update as ( - [calltext] - ) UPDATE `[connection.database]`.`[table_name]` INNER JOIN `__prep_update` ON `[table_name]`.id = `__prep_update`.id SET [update_items] + UPDATE `[connection.database]`.`[table_name]` JOIN (WITH `__prep_update` AS ( [calltext] ) SELECT * FROM `__prep_update`) subquery ON `[table_name]`.id = subquery.id SET [update_items] "} /datum/db/adapter/brsql_adapter/proc/getquery_delete_table(table_name, list/ids) diff --git a/code/datums/_ndatabase/code/native_adapter.dm b/code/datums/_ndatabase/code/native_adapter.dm index a5e4d41fb6a0..1c23a6ceab8f 100644 --- a/code/datums/_ndatabase/code/native_adapter.dm +++ b/code/datums/_ndatabase/code/native_adapter.dm @@ -83,8 +83,7 @@ SSdatabase.create_query(query_gettable, CB) /datum/db/adapter/native_adapter/update_table(table_name, list/values, datum/callback/CB, sync = FALSE) - if(!sync) - set waitfor = 0 + set waitfor = FALSE for(var/list/vals in values) var/list/qpars = list() diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm new file mode 100644 index 000000000000..a858c6b1f5a7 --- /dev/null +++ b/code/datums/ammo/ammo.dm @@ -0,0 +1,246 @@ +/datum/ammo + var/name = "generic bullet" + //Icon state when a human is permanently killed with it by execution/suicide. + var/headshot_state = null + var/icon = 'icons/obj/items/weapons/projectiles.dmi' + var/icon_state = "bullet" + /// The icon that is displayed when the bullet bounces off something. + var/ping = "ping_b" + /// When it deals damage. + var/sound_hit + /// When it's blocked by human armor. + var/sound_armor + /// When it misses someone. + var/sound_miss + /// When it bounces off something. + var/sound_bounce + /// When the bullet is absorbed by a xeno_shield + var/sound_shield_hit + /// Snipers use this to simulate poor accuracy at close ranges + var/accurate_range_min = 0 + /// How much the ammo scatters when burst fired, added to gun scatter, along with other mods + var/scatter = 0 + var/stamina_damage = 0 + /// This is the base damage of the bullet as it is fired + var/damage = 0 + /// BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here + var/damage_type = BRUTE + /// How much armor it ignores before calculations take place + var/penetration = 0 + /// The % chance it will imbed in a human + var/shrapnel_chance = 0 + /// The shrapnel type the ammo will embed, if the chance rolls + var/shrapnel_type = 0 + /// Type path of the extra projectiles + var/bonus_projectiles_type + /// How many extra projectiles it shoots out. Works kind of like firing on burst, but all of the projectiles travel together + var/bonus_projectiles_amount = 0 + /// Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony + var/debilitate[] = null + /// how much armor breaking will be done per point of penetration. This is for weapons that penetrate with their shape (like needle bullets) + var/pen_armor_punch = 0.5 + /// how much armor breaking is done by sheer weapon force. This is for big blunt weapons + var/damage_armor_punch = 0.5 + /// if we should play a special sound when firing. + var/sound_override = null + var/flags_ammo_behavior = NO_FLAGS + + /// This is added to the bullet's base accuracy. + var/accuracy = HIT_ACCURACY_TIER_1 + /// How much the accuracy varies when fired. // This REDUCES the lower bound of accuracy variance by 2%, to 96%. + var/accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 + /// This INCREASES the upper bound of accuracy variance by 2%, to 107%. + var/accuracy_var_high = PROJECTILE_VARIANCE_TIER_9 + /// For most guns, this is where the bullet dramatically looses accuracy. Not for snipers though. + var/accurate_range = 6 + /// This will de-increment a counter on the bullet. + var/max_range = 22 + /// Same as with accuracy variance. + var/damage_var_low = PROJECTILE_VARIANCE_TIER_9 + /// This INCREASES the upper bound of damage variance by 2%, to 107%. + var/damage_var_high = PROJECTILE_VARIANCE_TIER_9 + /// How much damage the bullet loses per turf traveled after the effective range + var/damage_falloff = DAMAGE_FALLOFF_TIER_10 + /// How much damage the bullet loses per turf away before the effective range + var/damage_buildup = DAMAGE_BUILDUP_TIER_1 + /// What minimum range the ammo deals full damage, builds up the closer you get. 0 for no minimum. Added onto gun range as a modifier. + var/effective_range_min = EFFECTIVE_RANGE_OFF + /// What maximum range the ammo deals full damage, tapers off using damage_falloff after hitting this value. 0 for no maximum. Added onto gun range as a modifier. + var/effective_range_max = EFFECTIVE_RANGE_OFF + /// How fast the projectile moves. + var/shell_speed = AMMO_SPEED_TIER_1 + + var/handful_type = /obj/item/ammo_magazine/handful + var/handful_color + /// custom handful sprite, for shotgun shells or etc. + var/handful_state = "bullet" + /// so handfuls say 'buckshot shells' not 'shell' + var/multiple_handful_name + + /// Does this apply xenomorph behaviour delegate? + var/apply_delegate = TRUE + + /// An assoc list in the format list(/datum/element/bullet_trait_to_give = list(...args)) + /// that will be given to a projectile with the current ammo datum + var/list/list/traits_to_give + + var/flamer_reagent_type = /datum/reagent/napalm/ut + + /// The flicker that plays when a bullet hits a target. Usually red. Can be nulled so it doesn't show up at all. + var/hit_effect_color = "#FF0000" + +/datum/ammo/New() + set_bullet_traits() + +/datum/ammo/proc/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) //NOT used on New(), applied to the projectiles. + return + +/// Populate traits_to_give in this proc +/datum/ammo/proc/set_bullet_traits() + return + +/datum/ammo/can_vv_modify() + return FALSE + +/datum/ammo/proc/do_at_half_range(obj/projectile/P) + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) + return + +/datum/ammo/proc/do_at_max_range(obj/projectile/P) + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_shield_block(mob/M, obj/projectile/P) //Does it do something special when shield blocked? Ie. a flare or grenade that still blows up. + return + +/datum/ammo/proc/on_hit_turf(turf/T, obj/projectile/P) //Special effects when hitting dense turfs. + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_hit_mob(mob/M, obj/projectile/P, mob/user) //Special effects when hitting mobs. + SHOULD_NOT_SLEEP(TRUE) + return + +///Special effects when pointblanking mobs. Ultimately called from /living/attackby(). Return TRUE to end the PB attempt. +/datum/ammo/proc/on_pointblank(mob/living/L, obj/projectile/P, mob/living/user, obj/item/weapon/gun/fired_from) + return + +/datum/ammo/proc/on_hit_obj(obj/O, obj/projectile/P) //Special effects when hitting objects. + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_near_target(turf/T, obj/projectile/P) //Special effects when passing near something. Range of things that triggers it is controlled by other ammo flags. + return 0 //return 0 means it flies even after being near something. Return 1 means it stops + +/datum/ammo/proc/knockback(mob/living/living_mob, obj/projectile/fired_projectile, max_range = 2) + if(!living_mob || living_mob == fired_projectile.firer) + return + if(fired_projectile.distance_travelled > max_range || living_mob.lying) + return //Two tiles away or more, basically. + + if(living_mob.mob_size >= MOB_SIZE_BIG) + return //Big xenos are not affected. + + shake_camera(living_mob, 3, 4) + knockback_effects(living_mob, fired_projectile) + slam_back(living_mob, fired_projectile) + +/datum/ammo/proc/slam_back(mob/living/living_mob, obj/projectile/fired_projectile) + /// Either knockback or slam them into an obstacle. + var/direction = Get_Compass_Dir(fired_projectile.z ? fired_projectile : fired_projectile.firer, living_mob) //More precise than get_dir. + if(!direction) //Same tile. + return + if(!step(living_mob, direction)) + living_mob.animation_attack_on(get_step(living_mob, direction)) + playsound(living_mob.loc, "punch", 25, 1) + living_mob.visible_message(SPAN_DANGER("[living_mob] slams into an obstacle!"), + isxeno(living_mob) ? SPAN_XENODANGER("You slam into an obstacle!") : SPAN_HIGHDANGER("You slam into an obstacle!"), null, 4, CHAT_TYPE_TAKING_HIT) + living_mob.apply_damage(MELEE_FORCE_TIER_2) + +///The applied effects for knockback(), overwrite to change slow/stun amounts for different ammo datums +/datum/ammo/proc/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + target.apply_effect(0.7, WEAKEN) // 0.9 seconds of stun, per agreement from Balance Team when switched from MC stuns to exact stuns + target.apply_effect(1, SUPERSLOW) + target.apply_effect(2, SLOW) + to_chat(target, SPAN_XENODANGER("You are shaken by the sudden impact!")) + else + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/proc/slowdown(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + target.apply_effect(1, SUPERSLOW) + target.apply_effect(2, SLOW) + to_chat(target, SPAN_XENODANGER("You are slowed by the sudden impact!")) + else + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) + if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) + return + + if(target_mob.mob_size >= MOB_SIZE_BIG) + return //too big to push + + to_chat(target_mob, isxeno(target_mob) ? SPAN_XENODANGER("You are pushed back by the sudden impact!") : SPAN_HIGHDANGER("You are pushed back by the sudden impact!"), null, 4, CHAT_TYPE_TAKING_HIT) + slam_back(target_mob, fired_projectile, max_range) + +/datum/ammo/proc/burst(atom/target, obj/projectile/P, damage_type = BRUTE, range = 1, damage_div = 2, show_message = SHOW_MESSAGE_VISIBLE) //damage_div says how much we divide damage + if(!target || !P) return + for(var/mob/living/carbon/M in orange(range,target)) + if(P.firer == M) + continue + if(show_message) + var/msg = "You are hit by backlash from \a [P.name]!" + M.visible_message(SPAN_DANGER("[M] is hit by backlash from \a [P.name]!"),isxeno(M) ? SPAN_XENODANGER("[msg]"):SPAN_HIGHDANGER("[msg]")) + var/damage = P.damage/damage_div + + var/mob/living/carbon/xenomorph/XNO = null + + if(isxeno(M)) + XNO = M + var/total_explosive_resistance = XNO.caste.xeno_explosion_resistance + XNO.armor_explosive_buff + damage = armor_damage_reduction(GLOB.xeno_explosive, damage, total_explosive_resistance , 60, 0, 0.5, XNO.armor_integrity) + var/armor_punch = armor_break_calculation(GLOB.xeno_explosive, damage, total_explosive_resistance, 60, 0, 0.5, XNO.armor_integrity) + XNO.apply_armorbreak(armor_punch) + + M.apply_damage(damage,damage_type) + + if(XNO && XNO.xeno_shields.len) + P.play_shielded_hit_effect(M) + else + P.play_hit_effect(M) + +/datum/ammo/proc/fire_bonus_projectiles(obj/projectile/original_P) + set waitfor = 0 + + var/turf/curloc = get_turf(original_P.shot_from) + var/initial_angle = Get_Angle(curloc, original_P.target_turf) + + for(var/i in 1 to bonus_projectiles_amount) //Want to run this for the number of bonus projectiles. + var/final_angle = initial_angle + + var/obj/projectile/P = new /obj/projectile(curloc, original_P.weapon_cause_data) + P.generate_bullet(GLOB.ammo_list[bonus_projectiles_type]) //No bonus damage or anything. + P.accuracy = round(P.accuracy * original_P.accuracy/initial(original_P.accuracy)) //if the gun changes the accuracy of the main projectile, it also affects the bonus ones. + original_P.give_bullet_traits(P) + + var/total_scatter_angle = P.scatter + final_angle += rand(-total_scatter_angle, total_scatter_angle) + var/turf/new_target = get_angle_target_turf(curloc, final_angle, 30) + + P.fire_at(new_target, original_P.firer, original_P.shot_from, P.ammo.max_range, P.ammo.shell_speed, original_P.original) //Fire! + +/datum/ammo/proc/drop_flame(turf/T, datum/cause_data/cause_data) // ~Art updated fire 20JAN17 + if(!istype(T)) + return + if(locate(/obj/flamer_fire) in T) + return + + var/datum/reagent/R = new flamer_reagent_type() + new /obj/flamer_fire(T, cause_data, R) diff --git a/code/datums/ammo/bullet/bullet.dm b/code/datums/ammo/bullet/bullet.dm new file mode 100644 index 000000000000..dadb644201df --- /dev/null +++ b/code/datums/ammo/bullet/bullet.dm @@ -0,0 +1,81 @@ +/* +//====== + Default Ammo +//====== +*/ +//Only when things screw up do we use this as a placeholder. +/datum/ammo/bullet + name = "default bullet" + icon_state = "bullet" + headshot_state = HEADSHOT_OVERLAY_LIGHT + flags_ammo_behavior = AMMO_BALLISTIC + sound_hit = "ballistic_hit" + sound_armor = "ballistic_armor" + sound_miss = "ballistic_miss" + sound_bounce = "ballistic_bounce" + sound_shield_hit = "ballistic_shield_hit" + + accurate_range_min = 0 + damage = 10 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_1 + shrapnel_type = /obj/item/shard/shrapnel + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/proc/handle_battlefield_execution(datum/ammo/firing_ammo, mob/living/hit_mob, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) + SIGNAL_HANDLER + + if(!user || hit_mob == user || user.zone_selected != "head" || user.a_intent != INTENT_HARM || !ishuman_strict(hit_mob)) + return + + if(!skillcheck(user, SKILL_EXECUTION, SKILL_EXECUTION_TRAINED)) + to_chat(user, SPAN_DANGER("You don't know how to execute someone correctly.")) + return + + var/mob/living/carbon/human/execution_target = hit_mob + + if(execution_target.status_flags & PERMANENTLY_DEAD) + to_chat(user, SPAN_DANGER("[execution_target] has already been executed!")) + return + + INVOKE_ASYNC(src, PROC_REF(attempt_battlefield_execution), src, execution_target, firing_projectile, user, fired_from) + + return COMPONENT_CANCEL_AMMO_POINT_BLANK + +/datum/ammo/bullet/proc/attempt_battlefield_execution(datum/ammo/firing_ammo, mob/living/carbon/human/execution_target, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) + user.affected_message(execution_target, + SPAN_HIGHDANGER("You aim \the [fired_from] at [execution_target]'s head!"), + SPAN_HIGHDANGER("[user] aims \the [fired_from] directly at your head!"), + SPAN_DANGER("[user] aims \the [fired_from] at [execution_target]'s head!")) + + user.next_move += 1.1 SECONDS //PB has no click delay; readding it here to prevent people accidentally queuing up multiple executions. + + if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE) || !user.Adjacent(execution_target)) + fired_from.delete_bullet(firing_projectile, TRUE) + return + + if(!(fired_from.flags_gun_features & GUN_SILENCED)) + playsound(user, fired_from.fire_sound, fired_from.firesound_volume, FALSE) + else + playsound(user, fired_from.fire_sound, 25, FALSE) + + shake_camera(user, 1, 2) + + execution_target.apply_damage(damage * 3, BRUTE, "head", no_limb_loss = TRUE, permanent_kill = TRUE) //Apply gobs of damage and make sure they can't be revived later... + execution_target.apply_damage(200, OXY) //...fill out the rest of their health bar with oxyloss... + execution_target.death(create_cause_data("execution", user)) //...make certain they're properly dead... + shake_camera(execution_target, 3, 4) + execution_target.update_headshot_overlay(headshot_state) //...and add a gory headshot overlay. + + execution_target.visible_message(SPAN_HIGHDANGER(uppertext("[execution_target] WAS EXECUTED!")), \ + SPAN_HIGHDANGER("You WERE EXECUTED!")) + + user.count_niche_stat(STATISTICS_NICHE_EXECUTION, 1, firing_projectile.weapon_cause_data?.cause_name) + + var/area/execution_area = get_area(execution_target) + + msg_admin_attack(FONT_SIZE_HUGE("[key_name(usr)] has battlefield executed [key_name(execution_target)] in [get_area(usr)] ([usr.loc.x],[usr.loc.y],[usr.loc.z])."), usr.loc.x, usr.loc.y, usr.loc.z) + log_attack("[key_name(usr)] battlefield executed [key_name(execution_target)] at [execution_area.name].") + + if(flags_ammo_behavior & AMMO_EXPLOSIVE) + execution_target.gib() + diff --git a/code/datums/ammo/bullet/lever_action.dm b/code/datums/ammo/bullet/lever_action.dm new file mode 100644 index 000000000000..2770231b6811 --- /dev/null +++ b/code/datums/ammo/bullet/lever_action.dm @@ -0,0 +1,72 @@ +/* +//====== + Lever Action +//====== +*/ + +/datum/ammo/bullet/lever_action + name = "lever-action bullet" + + damage = 80 + penetration = 0 + accuracy = HIT_ACCURACY_TIER_1 + shell_speed = AMMO_SPEED_TIER_6 + accurate_range = 14 + handful_state = "lever_action_bullet" + +//unused and not working. need to refactor MD code. Unobtainable. +//intended mechanic is to have xenos hit with it show up very frequently on any MDs around +/datum/ammo/bullet/lever_action/tracker + name = "tracking lever-action bullet" + icon_state = "redbullet" + damage = 70 + penetration = ARMOR_PENETRATION_TIER_3 + accuracy = HIT_ACCURACY_TIER_1 + handful_state = "tracking_lever_action_bullet" + +/datum/ammo/bullet/lever_action/tracker/on_hit_mob(mob/M, obj/projectile/P, mob/user) + //SEND_SIGNAL(user, COMSIG_BULLET_TRACKING, user, M) + M.visible_message(SPAN_DANGER("You hear a faint beep under [M]'s [M.mob_size > MOB_SIZE_HUMAN ? "chitin" : "skin"].")) + +/datum/ammo/bullet/lever_action/training + name = "lever-action blank" + icon_state = "blank" + damage = 70 //blanks CAN hurt you if shot very close + penetration = 0 + accuracy = HIT_ACCURACY_TIER_1 + damage_falloff = DAMAGE_FALLOFF_BLANK //not much, though (comparatively) + shell_speed = AMMO_SPEED_TIER_5 + handful_state = "training_lever_action_bullet" + +//unused, and unobtainable... for now +/datum/ammo/bullet/lever_action/marksman + name = "marksman lever-action bullet" + shrapnel_chance = 0 + damage_falloff = 0 + accurate_range = 12 + damage = 70 + penetration = ARMOR_PENETRATION_TIER_6 + shell_speed = AMMO_SPEED_TIER_6 + handful_state = "marksman_lever_action_bullet" + +/datum/ammo/bullet/lever_action/xm88 + name = ".458 SOCOM round" + + damage = 80 + penetration = ARMOR_PENETRATION_TIER_2 + accuracy = HIT_ACCURACY_TIER_1 + shell_speed = AMMO_SPEED_TIER_6 + accurate_range = 14 + handful_state = "boomslang_bullet" + +/datum/ammo/bullet/lever_action/xm88/pen20 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/lever_action/xm88/pen30 + penetration = ARMOR_PENETRATION_TIER_6 + +/datum/ammo/bullet/lever_action/xm88/pen40 + penetration = ARMOR_PENETRATION_TIER_8 + +/datum/ammo/bullet/lever_action/xm88/pen50 + penetration = ARMOR_PENETRATION_TIER_10 diff --git a/code/datums/ammo/bullet/pistol.dm b/code/datums/ammo/bullet/pistol.dm new file mode 100644 index 000000000000..8be63b0a15af --- /dev/null +++ b/code/datums/ammo/bullet/pistol.dm @@ -0,0 +1,265 @@ +/* +//====== + Pistol Ammo +//====== +*/ + +// Used by M4A3, M4A3 Custom and B92FS +/datum/ammo/bullet/pistol + name = "pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + damage = 40 + penetration= ARMOR_PENETRATION_TIER_2 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pistol/tiny + name = "light pistol bullet" + +/datum/ammo/bullet/pistol/tranq + name = "tranquilizer bullet" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST + stamina_damage = 30 + damage = 15 + +//2020 rebalance: is supposed to counter runners and lurkers, dealing high damage to the only castes with no armor. +//Limited by its lack of versatility and lower supply, so marines finally have an answer for flanker castes that isn't just buckshot. + +/datum/ammo/bullet/pistol/hollow + name = "hollowpoint pistol bullet" + + damage = 55 //hollowpoint is strong + penetration = 0 //hollowpoint can't pierce armor! + shrapnel_chance = SHRAPNEL_CHANCE_TIER_3 //hollowpoint causes shrapnel + +// Used by M4A3 AP and mod88 +/datum/ammo/bullet/pistol/ap + name = "armor-piercing pistol bullet" + + damage = 25 + accuracy = HIT_ACCURACY_TIER_2 + penetration= ARMOR_PENETRATION_TIER_8 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pistol/ap/penetrating + name = "wall-penetrating pistol bullet" + shrapnel_chance = 0 + + damage = 30 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/pistol/ap/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/pistol/ap/toxin + name = "toxic pistol bullet" + var/acid_per_hit = 10 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/pistol/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/pistol/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/le + name = "armor-shredding pistol bullet" + + damage = 15 + penetration = ARMOR_PENETRATION_TIER_4 + pen_armor_punch = 3 + +/datum/ammo/bullet/pistol/rubber + name = "rubber pistol bullet" + sound_override = 'sound/weapons/gun_c99.ogg' + + damage = 0 + stamina_damage = 25 + shrapnel_chance = 0 + +// Reskinned rubber bullet used for the ES-4 CL pistol. +/datum/ammo/bullet/pistol/rubber/stun + name = "stun pistol bullet" + sound_override = null + +// Used by M1911, Deagle and KT-42 +/datum/ammo/bullet/pistol/heavy + name = "heavy pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + damage = 55 + penetration = ARMOR_PENETRATION_TIER_3 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pistol/heavy/super //Commander's variant + name = ".50 heavy pistol bullet" + damage = 60 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/pistol/heavy/super/highimpact + name = ".50 high-impact pistol bullet" + penetration = ARMOR_PENETRATION_TIER_1 + debilitate = list(0,1.5,0,0,0,1,0,0) + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/pistol/heavy/super/highimpact/ap + name = ".50 high-impact armor piercing pistol bullet" + penetration = ARMOR_PENETRATION_TIER_10 + damage = 45 + +/datum/ammo/bullet/pistol/heavy/super/highimpact/upp + name = "high-impact pistol bullet" + sound_override = 'sound/weapons/gun_DE50.ogg' + penetration = ARMOR_PENETRATION_TIER_6 + debilitate = list(0,1.5,0,0,0,1,0,0) + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/pistol/heavy/super/highimpact/New() + ..() + RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) + +/datum/ammo/bullet/pistol/heavy/super/highimpact/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 4) + +/datum/ammo/bullet/pistol/deagle + name = ".50 heavy pistol bullet" + damage = 45 + headshot_state = HEADSHOT_OVERLAY_HEAVY + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_5 + +/datum/ammo/bullet/pistol/incendiary + name = "incendiary pistol bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_3 + damage = 20 + +/datum/ammo/bullet/pistol/incendiary/set_bullet_traits() + ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +// Used by the hipower +// I know that the 'high power' in the name is supposed to mean its 'impressive' magazine capacity +// but this is CM, half our guns have baffling misconceptions and mistakes (how do you grab the type-71?) so it's on-brand. +// maybe in the far flung future of 2280 someone screwed up the design. + +/datum/ammo/bullet/pistol/highpower + name = "high-powered pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = HIT_ACCURACY_TIER_3 + damage = 36 + penetration = ARMOR_PENETRATION_TIER_5 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + +// Used by VP78 and Auto 9 +/datum/ammo/bullet/pistol/squash + name = "squash-head pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + debilitate = list(0,0,0,0,0,0,0,2) + + accuracy = HIT_ACCURACY_TIER_4 + damage = 45 + penetration= ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_6 //"VP78 - the only pistol viable as a primary."-Vampmare, probably. + +/datum/ammo/bullet/pistol/squash/toxin + name = "toxic squash-head pistol bullet" + var/acid_per_hit = 10 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/pistol/squash/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/pistol/squash/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/squash/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/squash/penetrating + name = "wall-penetrating squash-head pistol bullet" + shrapnel_chance = 0 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/pistol/squash/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/pistol/squash/incendiary + name = "incendiary squash-head pistol bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + accuracy = HIT_ACCURACY_TIER_3 + damage = 35 + +/datum/ammo/bullet/pistol/squash/incendiary/set_bullet_traits() + ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + + +/datum/ammo/bullet/pistol/mankey + name = "live monkey" + icon_state = "monkey1" + ping = null //no bounce off. + damage_type = BURN + debilitate = list(4,4,0,0,0,0,0,0) + flags_ammo_behavior = AMMO_IGNORE_ARMOR + + damage = 15 + damage_var_high = PROJECTILE_VARIANCE_TIER_5 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/bullet/pistol/mankey/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/pistol/mankey/on_hit_mob(mob/M,obj/projectile/P) + if(P && P.loc && !M.stat && !istype(M,/mob/living/carbon/human/monkey)) + P.visible_message(SPAN_DANGER("The [src] chimpers furiously!")) + new /mob/living/carbon/human/monkey(P.loc) + +/datum/ammo/bullet/pistol/smart + name = "smartpistol bullet" + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_8 + damage = 30 + penetration = 20 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm new file mode 100644 index 000000000000..633bf3e2f7ff --- /dev/null +++ b/code/datums/ammo/bullet/revolver.dm @@ -0,0 +1,180 @@ +/* +//====== + Revolver Ammo +//====== +*/ + +/datum/ammo/bullet/revolver + name = "revolver bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + damage = 55 + penetration = ARMOR_PENETRATION_TIER_1 + accuracy = HIT_ACCURACY_TIER_1 + +/datum/ammo/bullet/revolver/marksman + name = "marksman revolver bullet" + + shrapnel_chance = 0 + damage_falloff = 0 + accurate_range = 12 + penetration = ARMOR_PENETRATION_TIER_7 + +/datum/ammo/bullet/revolver/heavy + name = "heavy revolver bullet" + + damage = 35 + penetration = ARMOR_PENETRATION_TIER_4 + accuracy = HIT_ACCURACY_TIER_3 + +/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/entity, obj/projectile/bullet) + slowdown(entity, bullet) + pushback(entity, bullet, 4) + +/datum/ammo/bullet/revolver/incendiary + name = "incendiary revolver bullet" + damage = 40 + +/datum/ammo/bullet/revolver/incendiary/set_bullet_traits() + ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/revolver/marksman/toxin + name = "toxic revolver bullet" + var/acid_per_hit = 10 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/revolver/marksman/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/revolver/marksman/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/revolver/marksman/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/revolver/penetrating + name = "wall-penetrating revolver bullet" + shrapnel_chance = 0 + + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/revolver/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/revolver/upp + name = "heavy revolver bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + penetration = ARMOR_PENETRATION_TIER_4 + damage = 70 + + +/datum/ammo/bullet/revolver/upp/shrapnel + name = "shrapnel shot" + headshot_state = HEADSHOT_OVERLAY_HEAVY //Gol-dang shotgun blow your fething head off. + debilitate = list(0,0,0,0,0,0,0,0) + icon_state = "shrapnelshot" + handful_state = "shrapnel" + bonus_projectiles_type = /datum/ammo/bullet/revolver/upp/shrapnel_bits + + max_range = 6 + damage = 40 // + TIER_4 * 3 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + penetration = ARMOR_PENETRATION_TIER_8 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + shrapnel_chance = 100 + shrapnel_type = /obj/item/shard/shrapnel/upp + //roughly 90 or so damage with the additional shrapnel, around 130 in total with primary round + +/datum/ammo/bullet/revolver/upp/shrapnel/on_hit_mob(mob/M, obj/projectile/P) + pushback(M, P, 1) + +/datum/ammo/bullet/revolver/upp/shrapnel_bits + name = "small shrapnel" + icon_state = "shrapnelshot_bit" + + max_range = 6 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_4 + scatter = SCATTER_AMOUNT_TIER_1 + bonus_projectiles_amount = 0 + shrapnel_type = /obj/item/shard/shrapnel/upp/bits + +/datum/ammo/bullet/revolver/small + name = "small revolver bullet" + headshot_state = HEADSHOT_OVERLAY_LIGHT + + damage = 45 + + penetration = ARMOR_PENETRATION_TIER_3 + +/datum/ammo/bullet/revolver/small/hollowpoint + name = "small hollowpoint revolver bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + damage = 75 // way too strong because it's hard to make a good balance between HP and normal with this system, but the damage falloff is really strong + penetration = 0 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + +/datum/ammo/bullet/revolver/mateba + name = ".454 heavy revolver bullet" + + damage = 60 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/revolver/mateba/highimpact + name = ".454 heavy high-impact revolver bullet" + debilitate = list(0,2,0,0,0,1,0,0) + penetration = ARMOR_PENETRATION_TIER_1 + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/revolver/mateba/highimpact/ap + name = ".454 heavy high-impact armor piercing revolver bullet" + penetration = ARMOR_PENETRATION_TIER_10 + damage = 45 + +/datum/ammo/bullet/revolver/mateba/highimpact/New() + ..() + RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) + +/datum/ammo/bullet/revolver/mateba/highimpact/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 4) + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive //if you ever put this in normal gameplay, i am going to scream + name = ".454 heavy explosive revolver bullet" + damage = 100 + damage_var_low = PROJECTILE_VARIANCE_TIER_10 + damage_var_high = PROJECTILE_VARIANCE_TIER_1 + penetration = ARMOR_PENETRATION_TIER_10 + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_BALLISTIC + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_mob(mob/M, obj/projectile/P) + ..() + cell_explosion(get_turf(M), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_obj(obj/O, obj/projectile/P) + ..() + cell_explosion(get_turf(O), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_turf(turf/T, obj/projectile/P) + ..() + cell_explosion(T, 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/revolver/webley //Mateba round without the knockdown. + name = ".455 Webley bullet" + damage = 60 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_2 diff --git a/code/datums/ammo/bullet/rifle.dm b/code/datums/ammo/bullet/rifle.dm new file mode 100644 index 000000000000..b6085572e3b9 --- /dev/null +++ b/code/datums/ammo/bullet/rifle.dm @@ -0,0 +1,210 @@ +/* +//====== + Rifle Ammo +//====== +*/ + +/datum/ammo/bullet/rifle + name = "rifle bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + damage = 40 + penetration = ARMOR_PENETRATION_TIER_1 + accurate_range = 16 + accuracy = HIT_ACCURACY_TIER_4 + scatter = SCATTER_AMOUNT_TIER_10 + shell_speed = AMMO_SPEED_TIER_6 + effective_range_max = 7 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + max_range = 24 //So S8 users don't have their bullets magically disappaer at 22 tiles (S8 can see 24 tiles) + +/datum/ammo/bullet/rifle/holo_target + name = "holo-targeting rifle bullet" + damage = 30 + var/holo_stacks = 10 + +/datum/ammo/bullet/rifle/holo_target/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) + +/datum/ammo/bullet/rifle/holo_target/hunting + name = "holo-targeting hunting bullet" + damage = 25 + holo_stacks = 15 + +/datum/ammo/bullet/rifle/explosive + name = "explosive rifle bullet" + + damage = 25 + accurate_range = 22 + accuracy = 0 + shell_speed = AMMO_SPEED_TIER_4 + damage_falloff = DAMAGE_FALLOFF_TIER_9 + +/datum/ammo/bullet/rifle/explosive/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(get_turf(M), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/rifle/explosive/on_hit_obj(obj/O, obj/projectile/P) + cell_explosion(get_turf(O), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/rifle/explosive/on_hit_turf(turf/T, obj/projectile/P) + if(T.density) + cell_explosion(T, 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/rifle/ap + name = "armor-piercing rifle bullet" + + damage = 30 + penetration = ARMOR_PENETRATION_TIER_8 + +// Basically AP but better. Focused at taking out armour temporarily +/datum/ammo/bullet/rifle/ap/toxin + name = "toxic rifle bullet" + var/acid_per_hit = 7 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/rifle/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/rifle/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/rifle/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + + +/datum/ammo/bullet/rifle/ap/penetrating + name = "wall-penetrating rifle bullet" + shrapnel_chance = 0 + + damage = 35 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/rifle/ap/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/rifle/le + name = "armor-shredding rifle bullet" + + damage = 20 + penetration = ARMOR_PENETRATION_TIER_4 + pen_armor_punch = 5 + +/datum/ammo/bullet/rifle/heap + name = "high-explosive armor-piercing rifle bullet" + + headshot_state = HEADSHOT_OVERLAY_HEAVY + damage = 55//big damage, doesn't actually blow up because thats stupid. + penetration = ARMOR_PENETRATION_TIER_8 + +/datum/ammo/bullet/rifle/rubber + name = "rubber rifle bullet" + sound_override = 'sound/weapons/gun_c99.ogg' + + damage = 0 + stamina_damage = 15 + shrapnel_chance = 0 + +/datum/ammo/bullet/rifle/incendiary + name = "incendiary rifle bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 30 + shell_speed = AMMO_SPEED_TIER_4 + accuracy = -HIT_ACCURACY_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_10 + +/datum/ammo/bullet/rifle/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/rifle/m4ra + name = "A19 high velocity bullet" + shrapnel_chance = 0 + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + accurate_range_min = 4 + + damage = 55 + scatter = -SCATTER_AMOUNT_TIER_8 + penetration= ARMOR_PENETRATION_TIER_7 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/rifle/m4ra/incendiary + name = "A19 high velocity incendiary bullet" + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 40 + accuracy = HIT_ACCURACY_TIER_4 + scatter = -SCATTER_AMOUNT_TIER_8 + penetration= ARMOR_PENETRATION_TIER_5 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/rifle/m4ra/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/rifle/m4ra/impact + name = "A19 high velocity impact bullet" + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 40 + accuracy = -HIT_ACCURACY_TIER_2 + scatter = -SCATTER_AMOUNT_TIER_8 + penetration = ARMOR_PENETRATION_TIER_10 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/rifle/m4ra/impact/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 32) // Can knockback basically at max range + +/datum/ammo/bullet/rifle/m4ra/impact/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(2, SUPERSLOW) + target.apply_effect(5, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/bullet/rifle/mar40 + name = "heavy rifle bullet" + + damage = 55 + +/datum/ammo/bullet/rifle/type71 + name = "heavy rifle bullet" + + damage = 55 + penetration = ARMOR_PENETRATION_TIER_3 + +/datum/ammo/bullet/rifle/type71/ap + name = "heavy armor-piercing rifle bullet" + + damage = 40 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/rifle/type71/heap + name = "heavy high-explosive armor-piercing rifle bullet" + + headshot_state = HEADSHOT_OVERLAY_HEAVY + damage = 65 + penetration = ARMOR_PENETRATION_TIER_10 diff --git a/code/datums/ammo/bullet/shotgun.dm b/code/datums/ammo/bullet/shotgun.dm new file mode 100644 index 000000000000..4cedb8b3ee69 --- /dev/null +++ b/code/datums/ammo/bullet/shotgun.dm @@ -0,0 +1,362 @@ +/* +//====== + Shotgun Ammo +//====== +*/ + +/datum/ammo/bullet/shotgun + headshot_state = HEADSHOT_OVERLAY_HEAVY + +/datum/ammo/bullet/shotgun/slug + name = "shotgun slug" + handful_state = "slug_shell" + + accurate_range = 6 + max_range = 8 + damage = 70 + penetration = ARMOR_PENETRATION_TIER_4 + damage_armor_punch = 2 + handful_state = "slug_shell" + +/datum/ammo/bullet/shotgun/slug/on_hit_mob(mob/M,obj/projectile/P) + knockback(M, P, 6) + +/datum/ammo/bullet/shotgun/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(1, SUPERSLOW) + target.apply_effect(3, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/bullet/shotgun/beanbag + name = "beanbag slug" + headshot_state = HEADSHOT_OVERLAY_LIGHT //It's not meant to kill people... but if you put it in your mouth, it will. + handful_state = "beanbag_slug" + icon_state = "beanbag" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST + sound_override = 'sound/weapons/gun_shotgun_riot.ogg' + + max_range = 12 + shrapnel_chance = 0 + damage = 0 + stamina_damage = 45 + accuracy = HIT_ACCURACY_TIER_3 + shell_speed = AMMO_SPEED_TIER_3 + handful_state = "beanbag_slug" + +/datum/ammo/bullet/shotgun/beanbag/on_hit_mob(mob/M, obj/projectile/P) + if(!M || M == P.firer) return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + shake_camera(H, 2, 1) + + +/datum/ammo/bullet/shotgun/incendiary + name = "incendiary slug" + handful_state = "incendiary_slug" + damage_type = BURN + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = -HIT_ACCURACY_TIER_2 + max_range = 12 + damage = 55 + penetration= ARMOR_PENETRATION_TIER_1 + handful_state = "incendiary_slug" + +/datum/ammo/bullet/shotgun/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shotgun/incendiary/on_hit_mob(mob/M,obj/projectile/P) + burst(get_turf(M),P,damage_type) + knockback(M,P) + +/datum/ammo/bullet/shotgun/incendiary/on_hit_obj(obj/O,obj/projectile/P) + burst(get_turf(P),P,damage_type) + +/datum/ammo/bullet/shotgun/incendiary/on_hit_turf(turf/T,obj/projectile/P) + burst(get_turf(T),P,damage_type) + + +/datum/ammo/bullet/shotgun/flechette + name = "flechette shell" + icon_state = "flechette" + handful_state = "flechette_shell" + bonus_projectiles_type = /datum/ammo/bullet/shotgun/flechette_spread + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + max_range = 12 + damage = 30 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_7 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + handful_state = "flechette_shell" + multiple_handful_name = TRUE + +/datum/ammo/bullet/shotgun/flechette_spread + name = "additional flechette" + icon_state = "flechette" + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + max_range = 12 + damage = 30 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_7 + scatter = SCATTER_AMOUNT_TIER_5 + +/datum/ammo/bullet/shotgun/buckshot + name = "buckshot shell" + icon_state = "buckshot" + handful_state = "buckshot_shell" + multiple_handful_name = TRUE + bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_5 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_5 + accurate_range = 4 + max_range = 4 + damage = 65 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_1 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + shell_speed = AMMO_SPEED_TIER_2 + damage_armor_punch = 0 + pen_armor_punch = 0 + handful_state = "buckshot_shell" + multiple_handful_name = TRUE + +/datum/ammo/bullet/shotgun/buckshot/incendiary + name = "incendiary buckshot shell" + handful_state = "incen_buckshot" + handful_type = /obj/item/ammo_magazine/handful/shotgun/buckshot/incendiary + +/datum/ammo/bullet/shotgun/buckshot/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shotgun/buckshot/on_hit_mob(mob/M,obj/projectile/P) + knockback(M,P) + +//buckshot variant only used by the masterkey shotgun attachment. +/datum/ammo/bullet/shotgun/buckshot/masterkey + bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread/masterkey + + damage = 55 + +/datum/ammo/bullet/shotgun/spread + name = "additional buckshot" + icon_state = "buckshot" + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 4 + max_range = 6 + damage = 65 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_2 + scatter = SCATTER_AMOUNT_TIER_1 + damage_armor_punch = 0 + pen_armor_punch = 0 + +/datum/ammo/bullet/shotgun/spread/masterkey + damage = 20 + +/* + 8 GAUGE SHOTGUN AMMO +*/ + +/datum/ammo/bullet/shotgun/heavy/buckshot + name = "heavy buckshot shell" + icon_state = "buckshot" + handful_state = "heavy_buckshot" + multiple_handful_name = TRUE + bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/spread + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + accurate_range = 3 + max_range = 3 + damage = 75 + penetration = 0 + shell_speed = AMMO_SPEED_TIER_2 + damage_armor_punch = 0 + pen_armor_punch = 0 + +/datum/ammo/bullet/shotgun/heavy/buckshot/on_hit_mob(mob/M,obj/projectile/P) + knockback(M,P) + +/datum/ammo/bullet/shotgun/heavy/buckshot/spread + name = "additional heavy buckshot" + max_range = 4 + scatter = SCATTER_AMOUNT_TIER_1 + bonus_projectiles_amount = 0 + +//basically the same +/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath + name = "dragon's breath shell" + handful_state = "heavy_dragonsbreath" + multiple_handful_name = TRUE + damage_type = BURN + damage = 60 + accurate_range = 3 + max_range = 4 + bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread + +/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread + name = "additional dragon's breath" + bonus_projectiles_amount = 0 + accurate_range = 4 + max_range = 5 //make use of the ablaze property + shell_speed = AMMO_SPEED_TIER_4 // so they hit before the main shell stuns + + +/datum/ammo/bullet/shotgun/heavy/slug + name = "heavy shotgun slug" + handful_state = "heavy_slug" + + accurate_range = 7 + max_range = 8 + damage = 90 //ouch. + penetration = ARMOR_PENETRATION_TIER_6 + damage_armor_punch = 2 + +/datum/ammo/bullet/shotgun/heavy/slug/on_hit_mob(mob/M,obj/projectile/P) + knockback(M, P, 7) + +/datum/ammo/bullet/shotgun/heavy/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(2, SUPERSLOW) + target.apply_effect(5, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/bullet/shotgun/heavy/beanbag + name = "heavy beanbag slug" + icon_state = "beanbag" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + handful_state = "heavy_beanbag" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST + sound_override = 'sound/weapons/gun_shotgun_riot.ogg' + + max_range = 7 + shrapnel_chance = 0 + damage = 0 + stamina_damage = 100 + accuracy = HIT_ACCURACY_TIER_2 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/bullet/shotgun/heavy/beanbag/on_hit_mob(mob/M, obj/projectile/P) + if(!M || M == P.firer) + return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + shake_camera(H, 2, 1) + +/datum/ammo/bullet/shotgun/heavy/flechette + name = "heavy flechette shell" + icon_state = "flechette" + handful_state = "heavy_flechette" + multiple_handful_name = TRUE + bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/flechette_spread + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_3 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_3 + max_range = 12 + damage = 45 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_10 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_2 + +/datum/ammo/bullet/shotgun/heavy/flechette_spread + name = "additional heavy flechette" + icon_state = "flechette" + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + max_range = 12 + damage = 45 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_10 + scatter = SCATTER_AMOUNT_TIER_4 + +//Enormous shell for Van Bandolier's superheavy double-barreled hunting gun. +/datum/ammo/bullet/shotgun/twobore + name = "two bore bullet" + icon_state = "autocannon" + handful_state = "twobore" + + accurate_range = 8 //Big low-velocity projectile; this is for blasting dangerous game at close range. + max_range = 14 //At this range, it's lost all its damage anyway. + damage = 300 //Hits like a buckshot PB. + penetration = ARMOR_PENETRATION_TIER_3 + damage_falloff = DAMAGE_FALLOFF_TIER_1 * 3 //It has a lot of energy, but the 26mm bullet drops off fast. + effective_range_max = EFFECTIVE_RANGE_MAX_TIER_2 //Full damage up to this distance, then falloff for each tile beyond. + var/hit_messages = list() + +/datum/ammo/bullet/shotgun/twobore/on_hit_mob(mob/living/M, obj/projectile/P) + var/mob/shooter = P.firer + if(shooter && ismob(shooter) && HAS_TRAIT(shooter, TRAIT_TWOBORE_TRAINING) && M.stat != DEAD && prob(40)) //Death is handled by periodic life() checks so this should have a chance to fire on a killshot. + if(!length(hit_messages)) //Pick and remove lines, refill on exhaustion. + hit_messages = list("Got you!", "Aha!", "Bullseye!", "It's curtains for you, Sonny Jim!", "Your head will look fantastic on my wall!", "I have you now!", "You miserable coward! Come and fight me like a man!", "Tally ho!") + var/message = pick_n_take(hit_messages) + shooter.say(message) + + if(P.distance_travelled > 8) + knockback(M, P, 12) + + else if(!M || M == P.firer || M.lying) //These checks are included in knockback and would be redundant above. + return + + shake_camera(M, 3, 4) + M.apply_effect(2, WEAKEN) + M.apply_effect(4, SLOW) + if(iscarbonsizexeno(M)) + to_chat(M, SPAN_XENODANGER("The impact knocks you off your feet!")) + else //This will hammer a Yautja as hard as a human. + to_chat(M, SPAN_HIGHDANGER("The impact knocks you off your feet!")) + + step(M, get_dir(P.firer, M)) + +/datum/ammo/bullet/shotgun/twobore/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(2, SUPERSLOW) + target.apply_effect(5, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) diff --git a/code/datums/ammo/bullet/smg.dm b/code/datums/ammo/bullet/smg.dm new file mode 100644 index 000000000000..e24b3021da97 --- /dev/null +++ b/code/datums/ammo/bullet/smg.dm @@ -0,0 +1,147 @@ +/* +//====== + SMG Ammo +//====== +*/ +//2020 SMG/ammo rebalance. default ammo actually has penetration so it can be useful, by 4khan: should be meh against t3s, better under 15 armor. Perfectly does this right now (oct 2020) +//has reduced falloff compared to the m39. this means it is best for kiting castes (mostly t2s and below admittedly) +//while the m39 ap is better for shredding them at close range, but has reduced velocity, so it's better for just running in and erasing armor-centric castes (defender, crusher) +// which i think is really interesting and good balance, giving both ammo types a reason to exist even against ravagers. +//i feel it is necessary to reflavor the default bullet, because otherwise, people won't be able to notice it has less falloff and faster bullet speed. even with a changelog, +//way too many people don't read the changelog, and after one or two months the changelog entry is all but archive, so there needs to be an ingame description of what the ammo does +//in comparison to armor-piercing rounds. + +/datum/ammo/bullet/smg + name = "submachinegun bullet" + damage = 34 + accurate_range = 4 + effective_range_max = 4 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_6 + damage_falloff = DAMAGE_FALLOFF_TIER_5 + scatter = SCATTER_AMOUNT_TIER_6 + accuracy = HIT_ACCURACY_TIER_3 + +/datum/ammo/bullet/smg/m39 + name = "high-velocity submachinegun bullet" //i don't want all smgs to inherit 'high velocity' + +/datum/ammo/bullet/smg/ap + name = "armor-piercing submachinegun bullet" + + damage = 26 + penetration = ARMOR_PENETRATION_TIER_6 + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/smg/heap + name = "high-explosive armor-piercing submachinegun bullet" + + damage = 45 + headshot_state = HEADSHOT_OVERLAY_MEDIUM + penetration = ARMOR_PENETRATION_TIER_6 + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/smg/ap/toxin + name = "toxic submachinegun bullet" + var/acid_per_hit = 5 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/smg/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/smg/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/smg/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/smg/nail + name = "7x45mm plasteel nail" + icon_state = "nail-projectile" + + damage = 25 + penetration = ARMOR_PENETRATION_TIER_5 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + accurate_range = 5 + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/smg/incendiary + name = "incendiary submachinegun bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 25 + accuracy = -HIT_ACCURACY_TIER_2 + +/datum/ammo/bullet/smg/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/smg/ap/penetrating + name = "wall-penetrating submachinegun bullet" + shrapnel_chance = 0 + + damage = 30 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/smg/ap/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/smg/le + name = "armor-shredding submachinegun bullet" + + scatter = SCATTER_AMOUNT_TIER_10 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_4 + shell_speed = AMMO_SPEED_TIER_3 + damage_falloff = DAMAGE_FALLOFF_TIER_10 + pen_armor_punch = 4 + +/datum/ammo/bullet/smg/rubber + name = "rubber submachinegun bullet" + sound_override = 'sound/weapons/gun_c99.ogg' + + damage = 0 + stamina_damage = 10 + shrapnel_chance = 0 + +/datum/ammo/bullet/smg/mp27 + name = "simple submachinegun bullet" + damage = 40 + accurate_range = 5 + effective_range_max = 7 + penetration = 0 + shell_speed = AMMO_SPEED_TIER_6 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + scatter = SCATTER_AMOUNT_TIER_6 + accuracy = HIT_ACCURACY_TIER_2 + +// less damage than the m39, but better falloff, range, and AP + +/datum/ammo/bullet/smg/ppsh + name = "crude submachinegun bullet" + damage = 26 + accurate_range = 7 + effective_range_max = 7 + penetration = ARMOR_PENETRATION_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + scatter = SCATTER_AMOUNT_TIER_5 + +/datum/ammo/bullet/smg/pps43 + name = "simple submachinegun bullet" + damage = 35 + accurate_range = 7 + effective_range_max = 10 + penetration = ARMOR_PENETRATION_TIER_4 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + scatter = SCATTER_AMOUNT_TIER_6 diff --git a/code/datums/ammo/bullet/sniper.dm b/code/datums/ammo/bullet/sniper.dm new file mode 100644 index 000000000000..a82f00631608 --- /dev/null +++ b/code/datums/ammo/bullet/sniper.dm @@ -0,0 +1,170 @@ +/* +//====== + Sniper Ammo +//====== +*/ + +/datum/ammo/bullet/sniper + name = "sniper bullet" + headshot_state = HEADSHOT_OVERLAY_HEAVY + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER + accurate_range_min = 4 + + accuracy = HIT_ACCURACY_TIER_8 + accurate_range = 32 + max_range = 32 + scatter = 0 + damage = 70 + penetration= ARMOR_PENETRATION_TIER_10 + shell_speed = AMMO_SPEED_TIER_6 + damage_falloff = 0 + +/datum/ammo/bullet/sniper/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + L.apply_armoured_damage(damage*2, ARMOR_BULLET, BRUTE, null, penetration) + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + +/datum/ammo/bullet/sniper/incendiary + name = "incendiary sniper bullet" + damage_type = BRUTE + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER + + //Removed accuracy = 0, accuracy_var_high = Variance Tier 6, and scatter = 0. -Kaga + damage = 60 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/sniper/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/sniper/incendiary/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + var/blind_duration = 5 + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_BIG) + blind_duration = 2 + L.AdjustEyeBlur(blind_duration) + L.adjust_fire_stacks(10) + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + +/datum/ammo/bullet/sniper/flak + name = "flak sniper bullet" + damage_type = BRUTE + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER + + accuracy = HIT_ACCURACY_TIER_8 + scatter = SCATTER_AMOUNT_TIER_8 + damage = 55 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 //Documenting old code: This converts to a variance of 96-109% damage. -Kaga + penetration = 0 + +/datum/ammo/bullet/sniper/flak/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/slow_duration = 7 + var/mob/living/L = M + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_BIG) + slow_duration = 4 + M.adjust_effect(slow_duration, SUPERSLOW) + L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + else + burst(get_turf(M),P,damage_type, 2 , 2) + burst(get_turf(M),P,damage_type, 1 , 2 , 0) + +/datum/ammo/bullet/sniper/flak/on_near_target(turf/T, obj/projectile/P) + burst(T,P,damage_type, 2 , 2) + burst(T,P,damage_type, 1 , 2, 0) + return 1 + +/datum/ammo/bullet/sniper/crude + name = "crude sniper bullet" + damage = 42 + penetration = ARMOR_PENETRATION_TIER_6 + +/datum/ammo/bullet/sniper/crude/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + pushback(M, P, 3) + +/datum/ammo/bullet/sniper/upp + name = "armor-piercing sniper bullet" + damage = 80 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/sniper/anti_materiel + name = "anti-materiel sniper bullet" + + shrapnel_chance = 0 // This isn't leaving any shrapnel. + accuracy = HIT_ACCURACY_TIER_8 + damage = 125 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + var/size_damage_mod = 0.8 + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_XENO) + size_damage_mod += 0.6 + if(target.mob_size >= MOB_SIZE_BIG) + size_damage_mod += 0.6 + L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) + // 180% damage to all targets (225), 240% (300) against non-Runner xenos, and 300% against Big xenos (375). -Kaga + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + +/datum/ammo/bullet/sniper/anti_materiel/vulture + damage = 400 // Fully intended to vaporize anything smaller than a mini cooper + accurate_range_min = 10 + handful_state = "vulture_bullet" + sound_hit = 'sound/bullets/bullet_vulture_impact.ogg' + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER|AMMO_ANTIVEHICLE + +/datum/ammo/bullet/sniper/anti_materiel/vulture/on_hit_mob(mob/hit_mob, obj/projectile/bullet) + . = ..() + knockback(hit_mob, bullet, 30) + hit_mob.apply_effect(3, SLOW) + +/datum/ammo/bullet/sniper/anti_materiel/vulture/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating/heavy) + )) + +/datum/ammo/bullet/sniper/elite + name = "supersonic sniper bullet" + + shrapnel_chance = 0 // This isn't leaving any shrapnel. + accuracy = HIT_ACCURACY_TIER_8 + damage = 150 + shell_speed = AMMO_SPEED_TIER_6 + AMMO_SPEED_TIER_2 + +/datum/ammo/bullet/sniper/elite/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/sniper/elite/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + var/size_damage_mod = 0.5 + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_XENO) + size_damage_mod += 0.5 + if(target.mob_size >= MOB_SIZE_BIG) + size_damage_mod += 1 + L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) + else + L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) + // 150% damage to runners (225), 300% against Big xenos (450), and 200% against all others (300). -Kaga + to_chat(P.firer, SPAN_WARNING("Bullseye!")) diff --git a/code/datums/ammo/bullet/special_ammo.dm b/code/datums/ammo/bullet/special_ammo.dm new file mode 100644 index 000000000000..cdf30b1af7fe --- /dev/null +++ b/code/datums/ammo/bullet/special_ammo.dm @@ -0,0 +1,176 @@ +/* +//====== + Special Ammo +//====== +*/ + +/datum/ammo/bullet/smartgun + name = "smartgun bullet" + icon_state = "redbullet" + flags_ammo_behavior = AMMO_BALLISTIC + + max_range = 12 + accuracy = HIT_ACCURACY_TIER_4 + damage = 30 + penetration = 0 + +/datum/ammo/bullet/smartgun/armor_piercing + name = "armor-piercing smartgun bullet" + icon_state = "bullet" + + accurate_range = 12 + accuracy = HIT_ACCURACY_TIER_2 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_8 + damage_armor_punch = 1 + +/datum/ammo/bullet/smartgun/dirty + name = "irradiated smartgun bullet" + debilitate = list(0,0,0,3,0,0,0,1) + + shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 + accurate_range = 32 + accuracy = HIT_ACCURACY_TIER_3 + damage = 40 + penetration = 0 + +/datum/ammo/bullet/smartgun/dirty/armor_piercing + debilitate = list(0,0,0,3,0,0,0,1) + + accurate_range = 22 + accuracy = HIT_ACCURACY_TIER_3 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_7 + damage_armor_punch = 3 + +/datum/ammo/bullet/smartgun/holo_target //Royal marines smartgun bullet has only diff between regular ammo is this one does holostacks + name = "holo-targeting smartgun bullet" + damage = 30 + ///Stuff for the HRP holotargetting stacks + var/holo_stacks = 15 + +/datum/ammo/bullet/smartgun/holo_target/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) + +/datum/ammo/bullet/smartgun/holo_target/ap + name = "armor-piercing smartgun bullet" + icon_state = "bullet" + + accurate_range = 12 + accuracy = HIT_ACCURACY_TIER_2 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_8 + damage_armor_punch = 1 + +/datum/ammo/bullet/smartgun/m56_fpw + name = "\improper M56 FPW bullet" + icon_state = "redbullet" + flags_ammo_behavior = AMMO_BALLISTIC + + max_range = 7 + accuracy = HIT_ACCURACY_TIER_7 + damage = 35 + penetration = ARMOR_PENETRATION_TIER_1 + +/datum/ammo/bullet/turret + name = "autocannon bullet" + icon_state = "redbullet" //Red bullets to indicate friendly fire restriction + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_COVER + + accurate_range = 22 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 + max_range = 22 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_7 + damage_armor_punch = 0 + pen_armor_punch = 0 + shell_speed = 2*AMMO_SPEED_TIER_6 + accuracy = HIT_ACCURACY_TIER_5 + +/datum/ammo/bullet/turret/dumb + icon_state = "bullet" + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/machinegun //Adding this for the MG Nests (~Art) + name = "machinegun bullet" + icon_state = "bullet" // Keeping it bog standard with the turret but allows it to be changed + + accurate_range = 12 + damage = 35 + penetration= ARMOR_PENETRATION_TIER_10 //Bumped the penetration to serve a different role from sentries, MGs are a bit more offensive + accuracy = HIT_ACCURACY_TIER_3 + +/datum/ammo/bullet/machinegun/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) + )) + +/datum/ammo/bullet/machinegun/auto // for M2C, automatic variant for M56D, stats for bullet should always be moderately overtuned to fulfill its ultra-offense + flank-push purpose + name = "heavy machinegun bullet" + + accurate_range = 10 + damage = 50 + penetration = ARMOR_PENETRATION_TIER_6 + accuracy = -HIT_ACCURACY_TIER_2 // 75 accuracy + shell_speed = AMMO_SPEED_TIER_2 + max_range = 15 + effective_range_max = 7 + damage_falloff = DAMAGE_FALLOFF_TIER_8 + +/datum/ammo/bullet/machinegun/auto/set_bullet_traits() + return + +/datum/ammo/bullet/minigun + name = "minigun bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 12 + damage = 35 + penetration = ARMOR_PENETRATION_TIER_6 + +/datum/ammo/bullet/minigun/New() + ..() + if(SSticker.mode && MODE_HAS_FLAG(MODE_FACTION_CLASH)) + damage = 15 + else if(SSticker.current_state < GAME_STATE_PLAYING) + RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(setup_hvh_damage)) + +/datum/ammo/bullet/minigun/proc/setup_hvh_damage() + if(MODE_HAS_FLAG(MODE_FACTION_CLASH)) + damage = 15 + +/datum/ammo/bullet/minigun/tank + accuracy = -HIT_ACCURACY_TIER_1 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 + accurate_range = 12 + +/datum/ammo/bullet/m60 + name = "M60 bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = HIT_ACCURACY_TIER_2 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 12 + damage = 45 //7.62x51 is scary + penetration= ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pkp + name = "machinegun bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = HIT_ACCURACY_TIER_1 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 14 + damage = 35 + penetration= ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 diff --git a/code/datums/ammo/bullet/tank.dm b/code/datums/ammo/bullet/tank.dm new file mode 100644 index 000000000000..70a953c6e273 --- /dev/null +++ b/code/datums/ammo/bullet/tank.dm @@ -0,0 +1,74 @@ +/* +//====== + Tank Ammo +//====== +*/ + +/datum/ammo/bullet/tank/flak + name = "flak autocannon bullet" + icon_state = "autocannon" + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + accurate_range_min = 4 + + accuracy = HIT_ACCURACY_TIER_8 + scatter = 0 + damage = 60 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_6 + accurate_range = 32 + max_range = 32 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/tank/flak/on_hit_mob(mob/M,obj/projectile/P) + burst(get_turf(M),P,damage_type, 2 , 3) + burst(get_turf(M),P,damage_type, 1 , 3 , 0) + +/datum/ammo/bullet/tank/flak/on_near_target(turf/T, obj/projectile/P) + burst(get_turf(T),P,damage_type, 2 , 3) + burst(get_turf(T),P,damage_type, 1 , 3, 0) + return 1 + +/datum/ammo/bullet/tank/flak/on_hit_obj(obj/O,obj/projectile/P) + burst(get_turf(P),P,damage_type, 2 , 3) + burst(get_turf(P),P,damage_type, 1 , 3 , 0) + +/datum/ammo/bullet/tank/flak/on_hit_turf(turf/T,obj/projectile/P) + burst(get_turf(T),P,damage_type, 2 , 3) + burst(get_turf(T),P,damage_type, 1 , 3 , 0) + +/datum/ammo/bullet/tank/dualcannon + name = "dualcannon bullet" + icon_state = "autocannon" + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_8 + scatter = 0 + damage = 50 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_3 + accurate_range = 10 + max_range = 12 + shell_speed = AMMO_SPEED_TIER_5 + +/datum/ammo/bullet/tank/dualcannon/on_hit_mob(mob/M,obj/projectile/P) + for(var/mob/living/carbon/L in get_turf(M)) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) + +/datum/ammo/bullet/tank/dualcannon/on_near_target(turf/T, obj/projectile/P) + for(var/mob/living/carbon/L in T) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) + return 1 + +/datum/ammo/bullet/tank/dualcannon/on_hit_obj(obj/O,obj/projectile/P) + for(var/mob/living/carbon/L in get_turf(O)) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) + +/datum/ammo/bullet/tank/dualcannon/on_hit_turf(turf/T,obj/projectile/P) + for(var/mob/living/carbon/L in T) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) diff --git a/code/datums/ammo/energy.dm b/code/datums/ammo/energy.dm new file mode 100644 index 000000000000..01c69ffa0015 --- /dev/null +++ b/code/datums/ammo/energy.dm @@ -0,0 +1,241 @@ +/* +//====== + Energy Ammo +//====== +*/ + +/datum/ammo/energy + ping = null //no bounce off. We can have one later. + sound_hit = "energy_hit" + sound_miss = "energy_miss" + sound_bounce = "energy_bounce" + + damage_type = BURN + flags_ammo_behavior = AMMO_ENERGY + + accuracy = HIT_ACCURACY_TIER_4 + +/datum/ammo/energy/emitter //Damage is determined in emitter.dm + name = "emitter bolt" + icon_state = "emitter" + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_ARMOR + + accurate_range = 6 + max_range = 6 + +/datum/ammo/energy/taser + name = "taser bolt" + icon_state = "stun" + damage_type = OXY + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_ALWAYS_FF //Not that ignoring will do much right now. + + stamina_damage = 45 + accuracy = HIT_ACCURACY_TIER_8 + shell_speed = AMMO_SPEED_TIER_1 // Slightly faster + hit_effect_color = "#FFFF00" + +/datum/ammo/energy/taser/on_hit_mob(mob/M, obj/projectile/P) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.disable_special_items() // Disables scout cloak + +/datum/ammo/energy/taser/precise + name = "precise taser bolt" + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_MP + +/datum/ammo/energy/rxfm_eva + name = "laser blast" + icon_state = "laser_new" + flags_ammo_behavior = AMMO_LASER + accurate_range = 14 + max_range = 22 + damage = 45 + stamina_damage = 25 //why not + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/energy/rxfm_eva/on_hit_mob(mob/living/M, obj/projectile/P) + ..() + if(prob(10)) //small chance for one to ignite on hit + M.fire_act() + +/datum/ammo/energy/laz_uzi + name = "laser bolt" + icon_state = "laser_new" + flags_ammo_behavior = AMMO_ENERGY + damage = 40 + accurate_range = 5 + effective_range_max = 7 + max_range = 10 + shell_speed = AMMO_SPEED_TIER_4 + scatter = SCATTER_AMOUNT_TIER_6 + accuracy = HIT_ACCURACY_TIER_3 + damage_falloff = DAMAGE_FALLOFF_TIER_8 + +/datum/ammo/energy/yautja + headshot_state = HEADSHOT_OVERLAY_MEDIUM + accurate_range = 12 + shell_speed = AMMO_SPEED_TIER_3 + damage_type = BURN + flags_ammo_behavior = AMMO_IGNORE_RESIST + +/datum/ammo/energy/yautja/pistol + name = "plasma pistol bolt" + icon_state = "ion" + + damage = 40 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/energy/yautja/pistol/incendiary + damage = 10 + +/datum/ammo/energy/yautja/pistol/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shrapnel/plasma + name = "plasma wave" + shrapnel_chance = 0 + penetration = ARMOR_PENETRATION_TIER_10 + accuracy = HIT_ACCURACY_TIER_MAX + damage = 15 + icon_state = "shrapnel_plasma" + damage_type = BURN + +/datum/ammo/bullet/shrapnel/plasma/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) + hit_mob.apply_effect(2, WEAKEN) + +/datum/ammo/energy/yautja/caster + name = "root caster bolt" + icon_state = "ion" + +/datum/ammo/energy/yautja/caster/stun + name = "low power stun bolt" + debilitate = list(2,2,0,0,0,1,0,0) + + damage = 0 + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + +/datum/ammo/energy/yautja/caster/bolt + name = "plasma bolt" + icon_state = "pulse1" + flags_ammo_behavior = AMMO_IGNORE_RESIST + shell_speed = AMMO_SPEED_TIER_6 + damage = 35 + +/datum/ammo/energy/yautja/caster/bolt/stun + name = "high power stun bolt" + var/stun_time = 2 + + damage = 0 + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + +/datum/ammo/energy/yautja/caster/bolt/stun/on_hit_mob(mob/M, obj/projectile/P) + var/mob/living/carbon/C = M + var/stun_time = src.stun_time + if(istype(C)) + if(isyautja(C) || ispredalien(C)) + return + to_chat(C, SPAN_DANGER("An electric shock ripples through your body, freezing you in place!")) + log_attack("[key_name(C)] was stunned by a high power stun bolt from [key_name(P.firer)] at [get_area(P)]") + + if(ishuman(C)) + var/mob/living/carbon/human/H = C + stun_time++ + H.apply_effect(stun_time, WEAKEN) + else + M.apply_effect(stun_time, WEAKEN) + + C.apply_effect(stun_time, STUN) + ..() + +/datum/ammo/energy/yautja/caster/sphere + name = "plasma eradicator" + icon_state = "bluespace" + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_HITS_TARGET_TURF + shell_speed = AMMO_SPEED_TIER_4 + accuracy = HIT_ACCURACY_TIER_8 + + damage = 55 + + accurate_range = 8 + max_range = 8 + + var/vehicle_slowdown_time = 5 SECONDS + +/datum/ammo/energy/yautja/caster/sphere/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/sphere/on_hit_turf(turf/T, obj/projectile/P) + cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/sphere/on_hit_obj(obj/O, obj/projectile/P) + if(istype(O, /obj/vehicle/multitile)) + var/obj/vehicle/multitile/multitile_vehicle = O + multitile_vehicle.next_move = world.time + vehicle_slowdown_time + playsound(multitile_vehicle, 'sound/effects/meteorimpact.ogg', 35) + multitile_vehicle.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Eradicator", P.firer)) + multitile_vehicle.interior_crash_effect() + multitile_vehicle.ex_act(150, P.dir, P.weapon_cause_data, 100) + cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/sphere/do_at_max_range(obj/projectile/P) + cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + + +/datum/ammo/energy/yautja/caster/sphere/stun + name = "plasma immobilizer" + damage = 0 + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + accurate_range = 20 + max_range = 20 + + var/stun_range = 4 // Big + var/stun_time = 6 + +/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_mob(mob/M, obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_turf(turf/T,obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_obj(obj/O,obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/do_at_max_range(obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/proc/do_area_stun(obj/projectile/P) + playsound(P, 'sound/weapons/wave.ogg', 75, 1, 25) + for (var/mob/living/carbon/M in view(src.stun_range, get_turf(P))) + var/stun_time = src.stun_time + log_attack("[key_name(M)] was stunned by a plasma immobilizer from [key_name(P.firer)] at [get_area(P)]") + if (isyautja(M)) + stun_time -= 2 + if(ispredalien(M)) + continue + to_chat(M, SPAN_DANGER("A powerful electric shock ripples through your body, freezing you in place!")) + M.apply_effect(stun_time, STUN) + + if (ishuman(M)) + var/mob/living/carbon/human/H = M + H.apply_effect(stun_time, WEAKEN) + else + M.apply_effect(stun_time, WEAKEN) + +/datum/ammo/energy/yautja/rifle/bolt + name = "plasma rifle bolt" + icon_state = "ion" + damage_type = BURN + debilitate = list(0,2,0,0,0,0,0,0) + flags_ammo_behavior = AMMO_IGNORE_RESIST + + damage = 55 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/energy/yautja/rifle/bolt/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) + if(isxeno(hit_mob)) + var/mob/living/carbon/xenomorph/xeno = hit_mob + xeno.apply_damage(damage * 0.75, BURN) + xeno.interference = 30 diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm new file mode 100644 index 000000000000..bdb284753dc4 --- /dev/null +++ b/code/datums/ammo/misc.dm @@ -0,0 +1,294 @@ +/* +//====== + Misc Ammo +//====== +*/ + +/datum/ammo/alloy_spike + name = "alloy spike" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + ping = "ping_s" + icon_state = "MSpearFlight" + sound_hit = "alloy_hit" + sound_armor = "alloy_armor" + sound_bounce = "alloy_bounce" + + accuracy = HIT_ACCURACY_TIER_8 + accurate_range = 12 + max_range = 12 + damage = 30 + penetration= ARMOR_PENETRATION_TIER_10 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 + shrapnel_type = /obj/item/shard/shrapnel + +/datum/ammo/flamethrower + name = "flame" + icon_state = "pulse0" + damage_type = BURN + flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_HITS_TARGET_TURF + + max_range = 6 + damage = 35 + +/datum/ammo/flamethrower/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/flamethrower/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + +/datum/ammo/flamethrower/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + +/datum/ammo/flamethrower/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + +/datum/ammo/flamethrower/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + +/datum/ammo/flamethrower/tank_flamer + flamer_reagent_type = /datum/reagent/napalm/blue + +/datum/ammo/flamethrower/sentry_flamer + flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME + flamer_reagent_type = /datum/reagent/napalm/blue + + accuracy = HIT_ACCURACY_TIER_8 + accurate_range = 6 + max_range = 12 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/flamethrower/sentry_flamer/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/flamethrower/sentry_flamer/glob + max_range = 14 + accurate_range = 10 + var/datum/effect_system/smoke_spread/phosphorus/smoke + +/datum/ammo/flamethrower/sentry_flamer/glob/New() + . = ..() + smoke = new() + +/datum/ammo/flamethrower/sentry_flamer/glob/drop_flame(turf/T, datum/cause_data/cause_data) + if(!istype(T)) + return + smoke.set_up(1, 0, T, new_cause_data = cause_data) + smoke.start() + +/datum/ammo/flamethrower/sentry_flamer/glob/Destroy() + qdel(smoke) + return ..() + +/datum/ammo/flamethrower/sentry_flamer/mini + name = "normal fire" + +/datum/ammo/flamethrower/sentry_flamer/mini/drop_flame(turf/T, datum/cause_data/cause_data) + if(!istype(T)) + return + var/datum/reagent/napalm/ut/R = new() + R.durationfire = BURN_TIME_INSTANT + new /obj/flamer_fire(T, cause_data, R, 0) + +/datum/ammo/flare + name = "flare" + ping = null //no bounce off. + damage_type = BURN + flags_ammo_behavior = AMMO_HITS_TARGET_TURF + icon_state = "flare" + + damage = 15 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 14 + shell_speed = AMMO_SPEED_TIER_3 + + var/flare_type = /obj/item/device/flashlight/flare/on/gun + handful_type = /obj/item/device/flashlight/flare + +/datum/ammo/flare/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/flare/on_hit_mob(mob/M,obj/projectile/P) + drop_flare(get_turf(M), P, P.firer) + +/datum/ammo/flare/on_hit_obj(obj/O,obj/projectile/P) + drop_flare(get_turf(P), P, P.firer) + +/datum/ammo/flare/on_hit_turf(turf/T, obj/projectile/P) + if(T.density && isturf(P.loc)) + drop_flare(P.loc, P, P.firer) + else + drop_flare(T, P, P.firer) + +/datum/ammo/flare/do_at_max_range(obj/projectile/P, mob/firer) + drop_flare(get_turf(P), P, P.firer) + +/datum/ammo/flare/proc/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) + var/obj/item/device/flashlight/flare/G = new flare_type(T) + var/matrix/rotation = matrix() + rotation.Turn(fired_projectile.angle - 90) + G.apply_transform(rotation) + G.visible_message(SPAN_WARNING("\A [G] bursts into brilliant light nearby!")) + return G + +/datum/ammo/flare/signal + name = "signal flare" + icon_state = "flare_signal" + flare_type = /obj/item/device/flashlight/flare/signal/gun + handful_type = /obj/item/device/flashlight/flare/signal + +/datum/ammo/flare/signal/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) + var/obj/item/device/flashlight/flare/signal/gun/signal_flare = ..() + signal_flare.activate_signal(firer) + if(istype(fired_projectile.shot_from, /obj/item/weapon/gun/flare)) + var/obj/item/weapon/gun/flare/flare_gun_fired_from = fired_projectile.shot_from + flare_gun_fired_from.last_signal_flare_name = signal_flare.name + +/datum/ammo/flare/starshell + name = "starshell ash" + icon_state = "starshell_bullet" + max_range = 5 + flare_type = /obj/item/device/flashlight/flare/on/starshell_ash + +/datum/ammo/flare/starshell/set_bullet_traits() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff, /datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/souto + name = "Souto Can" + ping = null //no bounce off. + damage_type = BRUTE + shrapnel_type = /obj/item/reagent_container/food/drinks/cans/souto/classic + flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_IGNORE_ARMOR|AMMO_IGNORE_RESIST|AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER|AMMO_SPECIAL_EMBED + var/obj/item/reagent_container/food/drinks/cans/souto/can_type + icon_state = "souto_classic" + + max_range = 12 + shrapnel_chance = 10 + accuracy = HIT_ACCURACY_TIER_8 + HIT_ACCURACY_TIER_8 + accurate_range = 12 + shell_speed = AMMO_SPEED_TIER_1 + +/datum/ammo/souto/on_embed(mob/embedded_mob, obj/limb/target_organ) + if(ishuman(embedded_mob) && !isyautja(embedded_mob)) + if(istype(target_organ)) + target_organ.embed(new can_type) + +/datum/ammo/souto/on_hit_mob(mob/M, obj/projectile/P) + if(!M || M == P.firer) return + if(M.throw_mode && !M.get_active_hand()) //empty active hand and we're in throw mode. If so we catch the can. + if(!M.is_mob_incapacitated()) // People who are not able to catch cannot catch. + if(P.contents.len == 1) + for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents) + M.put_in_active_hand(S) + for(var/mob/O in viewers(world_view_size, P)) //find all people in view. + O.show_message(SPAN_DANGER("[M] catches the [S]!"), SHOW_MESSAGE_VISIBLE) //Tell them the can was caught. + return //Can was caught. + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.name == "Human") //no effect on synths or preds. + H.apply_effect(6, STUN) + H.apply_effect(8, WEAKEN) + H.apply_effect(15, DAZE) + H.apply_effect(15, SLOW) + shake_camera(H, 2, 1) + if(P.contents.len) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/on_hit_obj(obj/O,obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/on_hit_turf(turf/T, obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/do_at_max_range(obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/on_shield_block(mob/M, obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/proc/drop_can(loc, obj/projectile/P) + if(P.contents.len) + for(var/obj/item/I in P.contents) + I.forceMove(loc) + randomize_projectile(P) + +/datum/ammo/souto/proc/randomize_projectile(obj/projectile/P) + shrapnel_type = pick(typesof(/obj/item/reagent_container/food/drinks/cans/souto)-/obj/item/reagent_container/food/drinks/cans/souto) + +/datum/ammo/grenade_container + name = "grenade shell" + ping = null + damage_type = BRUTE + var/nade_type = /obj/item/explosive/grenade/high_explosive + icon_state = "grenade" + flags_ammo_behavior = AMMO_IGNORE_COVER|AMMO_SKIPS_ALIENS + + damage = 15 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 6 + +/datum/ammo/grenade_container/on_hit_mob(mob/M,obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/on_hit_obj(obj/O,obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/on_hit_turf(turf/T,obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/do_at_max_range(obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/proc/drop_nade(obj/projectile/P) + var/turf/T = get_turf(P) + var/obj/item/explosive/grenade/G = new nade_type(T) + G.visible_message(SPAN_WARNING("\A [G] lands on [T]!")) + G.det_time = 10 + G.cause_data = P.weapon_cause_data + G.activate() + +/datum/ammo/grenade_container/rifle + flags_ammo_behavior = NO_FLAGS + +/datum/ammo/grenade_container/smoke + name = "smoke grenade shell" + nade_type = /obj/item/explosive/grenade/smokebomb + icon_state = "smoke_shell" + +/datum/ammo/hugger_container + name = "hugger shell" + ping = null + damage_type = BRUTE + var/hugger_hive = XENO_HIVE_NORMAL + icon_state = "smoke_shell" + + damage = 15 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 6 + +/datum/ammo/hugger_container/on_hit_mob(mob/M,obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/on_hit_obj(obj/O,obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/on_hit_turf(turf/T,obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/do_at_max_range(obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/proc/spawn_hugger(turf/T) + var/obj/item/clothing/mask/facehugger/child = new(T) + child.hivenumber = hugger_hive + INVOKE_ASYNC(child, TYPE_PROC_REF(/obj/item/clothing/mask/facehugger, leap_at_nearest_target)) diff --git a/code/datums/ammo/rocket.dm b/code/datums/ammo/rocket.dm new file mode 100644 index 000000000000..52914f745110 --- /dev/null +++ b/code/datums/ammo/rocket.dm @@ -0,0 +1,300 @@ +/* +//====== + Rocket Ammo +//====== +*/ + +/datum/ammo/rocket + name = "high explosive rocket" + icon_state = "missile" + ping = null //no bounce off. + sound_bounce = "rocket_bounce" + damage_falloff = 0 + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE + var/datum/effect_system/smoke_spread/smoke + + accuracy = HIT_ACCURACY_TIER_2 + accurate_range = 7 + max_range = 7 + damage = 15 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/rocket/New() + ..() + smoke = new() + +/datum/ammo/rocket/Destroy() + qdel(smoke) + smoke = null + . = ..() + +/datum/ammo/rocket/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(get_turf(M), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, get_turf(M)) + if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. + M.ex_act(350, P.dir, P.weapon_cause_data, 100) + smoke.start() + +/datum/ammo/rocket/on_hit_obj(obj/O, obj/projectile/P) + cell_explosion(get_turf(O), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, get_turf(O)) + smoke.start() + +/datum/ammo/rocket/on_hit_turf(turf/T, obj/projectile/P) + cell_explosion(T, 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/do_at_max_range(obj/projectile/P) + cell_explosion(get_turf(P), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, get_turf(P)) + smoke.start() + +/datum/ammo/rocket/ap + name = "anti-armor rocket" + damage_falloff = 0 + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET + + accuracy = HIT_ACCURACY_TIER_8 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 + accurate_range = 6 + max_range = 6 + damage = 10 + penetration= ARMOR_PENETRATION_TIER_10 + +/datum/ammo/rocket/ap/on_hit_mob(mob/M, obj/projectile/P) + var/turf/T = get_turf(M) + M.ex_act(150, P.dir, P.weapon_cause_data, 100) + M.apply_effect(2, WEAKEN) + M.apply_effect(2, PARALYZE) + if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. + M.ex_act(300, P.dir, P.weapon_cause_data, 100) + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/on_hit_obj(obj/O, obj/projectile/P) + var/turf/T = get_turf(O) + O.ex_act(150, P.dir, P.weapon_cause_data, 100) + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/on_hit_turf(turf/T, obj/projectile/P) + var/hit_something = 0 + for(var/mob/M in T) + M.ex_act(150, P.dir, P.weapon_cause_data, 100) + M.apply_effect(4, WEAKEN) + M.apply_effect(4, PARALYZE) + hit_something = 1 + continue + if(!hit_something) + for(var/obj/O in T) + if(O.density) + O.ex_act(150, P.dir, P.weapon_cause_data, 100) + hit_something = 1 + continue + if(!hit_something) + T.ex_act(150, P.dir, P.weapon_cause_data, 200) + + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/do_at_max_range(obj/projectile/P) + var/turf/T = get_turf(P) + var/hit_something = 0 + for(var/mob/M in T) + M.ex_act(250, P.dir, P.weapon_cause_data, 100) + M.apply_effect(2, WEAKEN) + M.apply_effect(2, PARALYZE) + hit_something = 1 + continue + if(!hit_something) + for(var/obj/O in T) + if(O.density) + O.ex_act(250, P.dir, P.weapon_cause_data, 100) + hit_something = 1 + continue + if(!hit_something) + T.ex_act(250, P.dir, P.weapon_cause_data) + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/anti_tank + name = "anti-tank rocket" + damage = 100 + var/vehicle_slowdown_time = 5 SECONDS + shrapnel_chance = 5 + shrapnel_type = /obj/item/large_shrapnel/at_rocket_dud + +/datum/ammo/rocket/ap/anti_tank/on_hit_obj(obj/O, obj/projectile/P) + if(istype(O, /obj/vehicle/multitile)) + var/obj/vehicle/multitile/M = O + M.next_move = world.time + vehicle_slowdown_time + playsound(M, 'sound/effects/meteorimpact.ogg', 35) + M.at_munition_interior_explosion_effect(cause_data = create_cause_data("Anti-Tank Rocket")) + M.interior_crash_effect() + var/turf/T = get_turf(M.loc) + M.ex_act(150, P.dir, P.weapon_cause_data, 100) + smoke.set_up(1, T) + smoke.start() + return + return ..() + + +/datum/ammo/rocket/ltb + name = "cannon round" + icon_state = "ltb" + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE + + accuracy = HIT_ACCURACY_TIER_3 + accurate_range = 32 + max_range = 32 + damage = 25 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/rocket/ltb/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(get_turf(M), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(M), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/ltb/on_hit_obj(obj/O, obj/projectile/P) + cell_explosion(get_turf(O), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(O), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/ltb/on_hit_turf(turf/T, obj/projectile/P) + cell_explosion(get_turf(T), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(T), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/ltb/do_at_max_range(obj/projectile/P) + cell_explosion(get_turf(P), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(P), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/wp + name = "white phosphorous rocket" + flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE + damage_type = BURN + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 8 + damage = 90 + max_range = 8 + +/datum/ammo/rocket/wp/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/rocket/wp/drop_flame(turf/T, datum/cause_data/cause_data) + playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) + if(!istype(T)) return + smoke.set_up(1, T) + smoke.start() + var/datum/reagent/napalm/blue/R = new() + new /obj/flamer_fire(T, cause_data, R, 3) + + var/datum/effect_system/smoke_spread/phosphorus/landingSmoke = new /datum/effect_system/smoke_spread/phosphorus + landingSmoke.set_up(3, 0, T, null, 6, cause_data) + landingSmoke.start() + landingSmoke = null + +/datum/ammo/rocket/wp/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + +/datum/ammo/rocket/wp/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + +/datum/ammo/rocket/wp/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + +/datum/ammo/rocket/wp/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp + name = "extreme-intensity incendiary rocket" + flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE + damage_type = BURN + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 8 + damage = 150 + max_range = 10 + +/datum/ammo/rocket/wp/upp/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/rocket/wp/upp/drop_flame(turf/T, datum/cause_data/cause_data) + playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) + if(!istype(T)) return + smoke.set_up(1, T) + smoke.start() + var/datum/reagent/napalm/upp/R = new() + new /obj/flamer_fire(T, cause_data, R, 3) + +/datum/ammo/rocket/wp/upp/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad + name = "thermobaric rocket" + flags_ammo_behavior = AMMO_ROCKET|AMMO_STRIKES_SURFACE + + damage = 100 + max_range = 32 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/rocket/wp/quad/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/custom + name = "custom rocket" + +/datum/ammo/rocket/custom/proc/prime(atom/A, obj/projectile/P) + var/obj/item/weapon/gun/launcher/rocket/launcher = P.shot_from + var/obj/item/ammo_magazine/rocket/custom/rocket = launcher.current_mag + if(rocket.locked && rocket.warhead && rocket.warhead.detonator) + if(rocket.fuel && rocket.fuel.reagents.get_reagent_amount(rocket.fuel_type) >= rocket.fuel_requirement) + rocket.forceMove(P.loc) + rocket.warhead.cause_data = P.weapon_cause_data + rocket.warhead.prime() + qdel(rocket) + smoke.set_up(1, get_turf(A)) + smoke.start() + +/datum/ammo/rocket/custom/on_hit_mob(mob/M, obj/projectile/P) + prime(M, P) + +/datum/ammo/rocket/custom/on_hit_obj(obj/O, obj/projectile/P) + prime(O, P) + +/datum/ammo/rocket/custom/on_hit_turf(turf/T, obj/projectile/P) + prime(T, P) + +/datum/ammo/rocket/custom/do_at_max_range(obj/projectile/P) + prime(null, P) diff --git a/code/datums/ammo/shrapnel.dm b/code/datums/ammo/shrapnel.dm new file mode 100644 index 000000000000..e27caa4b277d --- /dev/null +++ b/code/datums/ammo/shrapnel.dm @@ -0,0 +1,157 @@ +/* +//====== + Shrapnel +//====== +*/ +/datum/ammo/bullet/shrapnel + name = "shrapnel" + icon_state = "buckshot" + accurate_range_min = 5 + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER + + accuracy = HIT_ACCURACY_TIER_3 + accurate_range = 32 + max_range = 8 + damage = 25 + damage_var_low = -PROJECTILE_VARIANCE_TIER_6 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_4 + shell_speed = AMMO_SPEED_TIER_2 + shrapnel_chance = 5 + +/datum/ammo/bullet/shrapnel/on_hit_obj(obj/O, obj/projectile/P) + if(istype(O, /obj/structure/barricade)) + var/obj/structure/barricade/B = O + B.health -= rand(2, 5) + B.update_health(1) + +/datum/ammo/bullet/shrapnel/rubber + name = "rubber pellets" + icon_state = "rubber_pellets" + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + + damage = 0 + stamina_damage = 25 + shrapnel_chance = 0 + + +/datum/ammo/bullet/shrapnel/hornet_rounds + name = ".22 hornet round" + icon_state = "hornet_round" + flags_ammo_behavior = AMMO_BALLISTIC + damage = 20 + shrapnel_chance = 0 + shell_speed = AMMO_SPEED_TIER_3//she fast af boi + penetration = ARMOR_PENETRATION_TIER_5 + +/datum/ammo/bullet/shrapnel/hornet_rounds/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/bonus_damage_stack, 10, world.time) + +/datum/ammo/bullet/shrapnel/incendiary + name = "flaming shrapnel" + icon_state = "beanbag" // looks suprisingly a lot like flaming shrapnel chunks + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + + shell_speed = AMMO_SPEED_TIER_1 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/shrapnel/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shrapnel/metal + name = "metal shrapnel" + icon_state = "shrapnelshot_bit" + flags_ammo_behavior = AMMO_STOPPED_BY_COVER|AMMO_BALLISTIC + shell_speed = AMMO_SPEED_TIER_1 + damage = 30 + shrapnel_chance = 15 + accuracy = HIT_ACCURACY_TIER_8 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/shrapnel/light // weak shrapnel + name = "light shrapnel" + icon_state = "shrapnel_light" + + damage = 10 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_1 + shrapnel_chance = 0 + +/datum/ammo/bullet/shrapnel/light/human + name = "human bone fragments" + icon_state = "shrapnel_human" + + shrapnel_chance = 50 + shrapnel_type = /obj/item/shard/shrapnel/bone_chips/human + +/datum/ammo/bullet/shrapnel/light/human/var1 // sprite variants + icon_state = "shrapnel_human1" + +/datum/ammo/bullet/shrapnel/light/human/var2 // sprite variants + icon_state = "shrapnel_human2" + +/datum/ammo/bullet/shrapnel/light/xeno + name = "alien bone fragments" + icon_state = "shrapnel_xeno" + + shrapnel_chance = 50 + shrapnel_type = /obj/item/shard/shrapnel/bone_chips/xeno + +/datum/ammo/bullet/shrapnel/spall // weak shrapnel + name = "spall" + icon_state = "shrapnel_light" + + damage = 10 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_1 + shrapnel_chance = 0 + +/datum/ammo/bullet/shrapnel/light/glass + name = "glass shrapnel" + icon_state = "shrapnel_glass" + +/datum/ammo/bullet/shrapnel/light/effect/ // no damage, but looks bright and neat + name = "sparks" + + damage = 1 // Tickle tickle + +/datum/ammo/bullet/shrapnel/light/effect/ver1 + icon_state = "shrapnel_bright1" + +/datum/ammo/bullet/shrapnel/light/effect/ver2 + icon_state = "shrapnel_bright2" + +/datum/ammo/bullet/shrapnel/jagged + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + accuracy = HIT_ACCURACY_TIER_MAX + +/datum/ammo/bullet/shrapnel/jagged/on_hit_mob(mob/M, obj/projectile/P) + if(isxeno(M)) + M.apply_effect(0.4, SLOW) + +/* +//======== + CAS 30mm impacters +//======== +*/ +/datum/ammo/bullet/shrapnel/gau //for the GAU to have a impact bullet instead of firecrackers + name = "30mm Multi-Purpose shell" + + damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. + damage_type = BRUTE + penetration = ARMOR_PENETRATION_TIER_2 + accuracy = HIT_ACCURACY_TIER_MAX + max_range = 0 + shrapnel_chance = 100 //the least of your problems + +/datum/ammo/bullet/shrapnel/gau/at + name = "30mm Anti-Tank shell" + + damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. + penetration = ARMOR_PENETRATION_TIER_8 + accuracy = HIT_ACCURACY_TIER_MAX diff --git a/code/datums/ammo/xeno.dm b/code/datums/ammo/xeno.dm new file mode 100644 index 000000000000..9d91920ac6f8 --- /dev/null +++ b/code/datums/ammo/xeno.dm @@ -0,0 +1,394 @@ +/* +//====== + Xeno Spits +//====== +*/ +/datum/ammo/xeno + icon_state = "neurotoxin" + ping = "ping_x" + damage_type = TOX + flags_ammo_behavior = AMMO_XENO + + ///used to make cooldown of the different spits vary. + var/added_spit_delay = 0 + var/spit_cost + + /// Should there be a windup for this spit? + var/spit_windup = FALSE + + /// Should there be an additional warning while winding up? (do not put to true if there is not a windup) + var/pre_spit_warn = FALSE + accuracy = HIT_ACCURACY_TIER_8*2 + max_range = 12 + +/datum/ammo/xeno/toxin + name = "neurotoxic spit" + damage_falloff = 0 + flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST + spit_cost = 25 + var/effect_power = XENO_NEURO_TIER_4 + var/datum/callback/neuro_callback + + shell_speed = AMMO_SPEED_TIER_3 + max_range = 7 + +/datum/ammo/xeno/toxin/New() + ..() + + neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_neuro)) + +/proc/apply_neuro(mob/M, power, insta_neuro) + if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX) && !insta_neuro) + M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) + return //endurance 5 makes you immune to weak neurotoxin + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) + H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) + return //species like zombies or synths are immune to neurotoxin + + if(!isxeno(M)) + if(insta_neuro) + if(M.knocked_down < 3) + M.adjust_effect(1 * power, WEAKEN) + return + + if(ishuman(M)) + M.apply_effect(2.5, SUPERSLOW) + M.visible_message(SPAN_DANGER("[M]'s movements are slowed.")) + + var/no_clothes_neuro = FALSE + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!H.wear_suit || H.wear_suit.slowdown == 0) + no_clothes_neuro = TRUE + + if(no_clothes_neuro) + if(M.knocked_down < 5) + M.adjust_effect(1 * power, WEAKEN) // KD them a bit more + M.visible_message(SPAN_DANGER("[M] falls prone.")) + +/proc/apply_scatter_neuro(mob/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX)) + M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) + return //endurance 5 makes you immune to weak neuro + if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) + H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) + return + + if(M.knocked_down < 0.7) // apply knockdown only if current knockdown is less than 0.7 second + M.apply_effect(0.7, WEAKEN) + M.visible_message(SPAN_DANGER("[M] falls prone.")) + +/datum/ammo/xeno/toxin/on_hit_mob(mob/M,obj/projectile/P) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.status_flags & XENO_HOST) + neuro_callback.Invoke(H, effect_power, TRUE) + return + + neuro_callback.Invoke(M, effect_power, FALSE) + +/datum/ammo/xeno/toxin/medium //Spitter + name = "neurotoxic spatter" + spit_cost = 50 + effect_power = 1 + + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/xeno/toxin/queen + name = "neurotoxic spit" + spit_cost = 50 + effect_power = 2 + + accuracy = HIT_ACCURACY_TIER_5*2 + max_range = 6 - 1 + +/datum/ammo/xeno/toxin/queen/on_hit_mob(mob/M,obj/projectile/P) + neuro_callback.Invoke(M, effect_power, TRUE) + +/datum/ammo/xeno/toxin/shotgun + name = "neurotoxic droplet" + flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST + bonus_projectiles_type = /datum/ammo/xeno/toxin/shotgun/additional + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 5 + max_range = 5 + scatter = SCATTER_AMOUNT_NEURO + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_4 + +/datum/ammo/xeno/toxin/shotgun/New() + ..() + + neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_scatter_neuro)) + +/datum/ammo/xeno/toxin/shotgun/additional + name = "additional neurotoxic droplets" + + bonus_projectiles_amount = 0 + +/datum/ammo/xeno/acid + name = "acid spit" + icon_state = "xeno_acid" + sound_hit = "acid_hit" + sound_bounce = "acid_bounce" + damage_type = BURN + spit_cost = 25 + flags_ammo_behavior = AMMO_ACIDIC|AMMO_XENO + accuracy = HIT_ACCURACY_TIER_5 + damage = 20 + max_range = 8 // 7 will disappear on diagonals. i love shitcode + penetration = ARMOR_PENETRATION_TIER_2 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/xeno/acid/on_shield_block(mob/M, obj/projectile/P) + burst(M,P,damage_type) + +/datum/ammo/xeno/acid/on_hit_mob(mob/M, obj/projectile/P) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.status_flags & XENO_HOST && HAS_TRAIT(C, TRAIT_NESTED) || C.stat == DEAD) + return FALSE + ..() + +/datum/ammo/xeno/acid/spatter + name = "acid spatter" + + damage = 30 + max_range = 6 + +/datum/ammo/xeno/acid/spatter/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + if(. == FALSE) + return + + new /datum/effects/acid(M, P.firer) + +/datum/ammo/xeno/acid/praetorian + name = "acid splash" + + accuracy = HIT_ACCURACY_TIER_10 + HIT_ACCURACY_TIER_5 + max_range = 8 + damage = 30 + shell_speed = AMMO_SPEED_TIER_2 + added_spit_delay = 0 + +/datum/ammo/xeno/acid/dot + name = "acid spit" + +/datum/ammo/xeno/acid/prae_nade // Used by base prae's acid nade + name = "acid scatter" + + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + accuracy = HIT_ACCURACY_TIER_5 + accurate_range = 32 + max_range = 4 + damage = 25 + shell_speed = AMMO_SPEED_TIER_1 + scatter = SCATTER_AMOUNT_TIER_6 + + apply_delegate = FALSE + +/datum/ammo/xeno/acid/prae_nade/on_hit_mob(mob/M, obj/projectile/P) + if (!ishuman(M)) + return + + var/mob/living/carbon/human/H = M + + var/datum/effects/prae_acid_stacks/PAS = null + for (var/datum/effects/prae_acid_stacks/prae_acid_stacks in H.effects_list) + PAS = prae_acid_stacks + break + + if (PAS == null) + PAS = new /datum/effects/prae_acid_stacks(H) + else + PAS.increment_stack_count() + +/datum/ammo/xeno/boiler_gas + name = "glob of neuro gas" + icon_state = "neuro_glob" + ping = "ping_x" + debilitate = list(2,2,0,1,11,12,1,10) // Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony + flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE|AMMO_IGNORE_RESIST|AMMO_HITS_TARGET_TURF|AMMO_ACIDIC + var/datum/effect_system/smoke_spread/smoke_system + spit_cost = 200 + pre_spit_warn = TRUE + spit_windup = 5 SECONDS + accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_4 + accuracy = HIT_ACCURACY_TIER_2 + scatter = SCATTER_AMOUNT_TIER_4 + shell_speed = 0.75 + max_range = 16 + /// range on the smoke in tiles from center + var/smokerange = 4 + var/lifetime_mult = 1.0 + +/datum/ammo/xeno/boiler_gas/New() + ..() + set_xeno_smoke() + +/datum/ammo/xeno/boiler_gas/Destroy() + qdel(smoke_system) + smoke_system = null + . = ..() + +/datum/ammo/xeno/boiler_gas/on_hit_mob(mob/moob, obj/projectile/proj) + if(iscarbon(moob)) + var/mob/living/carbon/carbon = moob + if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) + return + var/datum/effects/neurotoxin/neuro_effect = locate() in moob.effects_list + if(!neuro_effect) + neuro_effect = new /datum/effects/neurotoxin(moob, proj.firer) + neuro_effect.duration += 5 + moob.apply_effect(3, DAZE) + to_chat(moob, SPAN_HIGHDANGER("Neurotoxic liquid spreads all over you and immediately soaks into your pores and orifices! Oh fuck!")) // Fucked up but have a chance to escape rather than being game-ended + drop_nade(get_turf(proj), proj,TRUE) + +/datum/ammo/xeno/boiler_gas/on_hit_obj(obj/outbacksteakhouse, obj/projectile/proj) + drop_nade(get_turf(proj), proj) + +/datum/ammo/xeno/boiler_gas/on_hit_turf(turf/Turf, obj/projectile/proj) + if(Turf.density && isturf(proj.loc)) + drop_nade(proj.loc, proj) //we don't want the gas globs to land on dense turfs, they block smoke expansion. + else + drop_nade(Turf, proj) + +/datum/ammo/xeno/boiler_gas/do_at_max_range(obj/projectile/proj) + drop_nade(get_turf(proj), proj) + +/datum/ammo/xeno/boiler_gas/proc/set_xeno_smoke(obj/projectile/proj) + smoke_system = new /datum/effect_system/smoke_spread/xeno_weaken() + +/datum/ammo/xeno/boiler_gas/proc/drop_nade(turf/turf, obj/projectile/proj) + var/lifetime_mult = 1.0 + var/datum/cause_data + if(isboiler(proj.firer)) + cause_data = proj.weapon_cause_data + smoke_system.set_up(smokerange, 0, turf, new_cause_data = cause_data) + smoke_system.lifetime = 12 * lifetime_mult + smoke_system.start() + turf.visible_message(SPAN_DANGER("A glob of acid lands with a splat and explodes into noxious fumes!")) + + +/datum/ammo/xeno/boiler_gas/acid + name = "glob of acid gas" + icon_state = "acid_glob" + ping = "ping_x" + accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 + smokerange = 3 + + +/datum/ammo/xeno/boiler_gas/acid/set_xeno_smoke(obj/projectile/proj) + smoke_system = new /datum/effect_system/smoke_spread/xeno_acid() + +/datum/ammo/xeno/boiler_gas/acid/on_hit_mob(mob/moob, obj/projectile/proj) + if(iscarbon(moob)) + var/mob/living/carbon/carbon = moob + if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) + return + to_chat(moob,SPAN_HIGHDANGER("Acid covers your body! Oh fuck!")) + playsound(moob,"acid_strike",75,1) + INVOKE_ASYNC(moob, TYPE_PROC_REF(/mob, emote), "pain") // why do I need this bullshit + new /datum/effects/acid(moob, proj.firer) + drop_nade(get_turf(proj), proj,TRUE) + +/datum/ammo/xeno/bone_chips + name = "bone chips" + icon_state = "shrapnel_light" + ping = null + flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR + damage_type = BRUTE + bonus_projectiles_type = /datum/ammo/xeno/bone_chips/spread + + damage = 8 + max_range = 6 + accuracy = HIT_ACCURACY_TIER_8 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_7 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_7 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_7 + shrapnel_type = /obj/item/shard/shrapnel/bone_chips + shrapnel_chance = 60 + +/datum/ammo/xeno/bone_chips/on_hit_mob(mob/M, obj/projectile/P) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) + return + if(ishuman_strict(M) || isxeno(M)) + playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) + if(M.slowed < 3) + M.apply_effect(3, SLOW) + +/datum/ammo/xeno/bone_chips/spread + name = "small bone chips" + + scatter = 30 // We want a wild scatter angle + max_range = 5 + bonus_projectiles_amount = 0 + +/datum/ammo/xeno/bone_chips/spread/short_range + name = "small bone chips" + + max_range = 3 // Very short range + +/datum/ammo/xeno/bone_chips/spread/runner_skillshot + name = "bone chips" + + scatter = 0 + max_range = 5 + damage = 10 + shrapnel_chance = 0 + +/datum/ammo/xeno/bone_chips/spread/runner/on_hit_mob(mob/M, obj/projectile/P) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) + return + if(ishuman_strict(M) || isxeno(M)) + playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) + if(M.slowed < 6) + M.apply_effect(6, SLOW) + +/datum/ammo/xeno/oppressor_tail + name = "tail hook" + icon_state = "none" + ping = null + flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR + damage_type = BRUTE + + damage = XENO_DAMAGE_TIER_5 + max_range = 4 + accuracy = HIT_ACCURACY_TIER_MAX + +/datum/ammo/xeno/oppressor_tail/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) + //The projectile has no icon, so the overlay shows up in FRONT of the projectile, and the beam connects to it in the middle. + var/image/hook_overlay = new(icon = 'icons/effects/beam.dmi', icon_state = "oppressor_tail_hook", layer = BELOW_MOB_LAYER) + generated_projectile.overlays += hook_overlay + +/datum/ammo/xeno/oppressor_tail/on_hit_mob(mob/target, obj/projectile/fired_proj) + var/mob/living/carbon/xenomorph/xeno_firer = fired_proj.firer + if(xeno_firer.can_not_harm(target)) + return + + shake_camera(target, 5, 0.1 SECONDS) + var/obj/effect/beam/tail_beam = fired_proj.firer.beam(target, "oppressor_tail", 'icons/effects/beam.dmi', 0.5 SECONDS, 5) + var/image/tail_image = image('icons/effects/status_effects.dmi', "hooked") + target.overlays += tail_image + + new /datum/effects/xeno_slow(target, fired_proj.firer, ttl = 0.5 SECONDS) + target.apply_effect(0.5, STUN) + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom/movable, throw_atom), fired_proj.firer, get_dist(fired_proj.firer, target)-1, SPEED_VERY_FAST) + + qdel(tail_beam) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/ammo/xeno/oppressor_tail, remove_tail_overlay), target, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. + +/datum/ammo/xeno/oppressor_tail/proc/remove_tail_overlay(mob/overlayed_mob, image/tail_image) + overlayed_mob.overlays -= tail_image diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index 7ed61852e9bf..19f73a9843ce 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -13,7 +13,7 @@ var/leaders = 0 spawn_max_amount = TRUE -/datum/emergency_call/cryo_squad/spawn_candidates(announce, override_spawn_loc, announce_dispatch_message) +/datum/emergency_call/cryo_squad/spawn_candidates(quiet_launch, announce_incoming, override_spawn_loc) var/datum/squad/marine/cryo/cryo_squad = RoleAuthority.squads_by_type[/datum/squad/marine/cryo] leaders = cryo_squad.num_leaders . = ..() diff --git a/code/datums/emergency_calls/cryo_marines_heavy.dm b/code/datums/emergency_calls/cryo_marines_heavy.dm index 70ce52443573..f4fe3c9f2a57 100644 --- a/code/datums/emergency_calls/cryo_marines_heavy.dm +++ b/code/datums/emergency_calls/cryo_marines_heavy.dm @@ -16,7 +16,7 @@ var/leaders = 0 -/datum/emergency_call/cryo_squad_equipped/spawn_candidates(announce, override_spawn_loc, announce_dispatch_message) +/datum/emergency_call/cryo_squad_equipped/spawn_candidates(quiet_launch, announce_incoming, override_spawn_loc) var/datum/squad/marine/cryo/cryo_squad = RoleAuthority.squads_by_type[/datum/squad/marine/cryo] leaders = cryo_squad.num_leaders . = ..() diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 6533086d98f3..4c3dfbbfac2b 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -91,12 +91,12 @@ else return chosen_call -/datum/game_mode/proc/get_specific_call(call_name, quiet_launch = FALSE, announce = TRUE, is_emergency = TRUE, info = "", announce_dispatch_message = TRUE) +/datum/game_mode/proc/get_specific_call(call_name, quiet_launch = FALSE, announce_incoming = TRUE, info = "") for(var/datum/emergency_call/E in all_calls) //Loop through all potential candidates if(E.name == call_name) var/datum/emergency_call/em_call = new E.type() em_call.objective_info = info - em_call.activate(quiet_launch, announce, is_emergency, announce_dispatch_message) + em_call.activate(quiet_launch, announce_incoming) return error("get_specific_call could not find emergency call '[call_name]'") return @@ -168,7 +168,7 @@ return var/deathtime = world.time - usr.timeofdeath - if(deathtime < 1 MINUTES) //Nice try, ghosting right after the announcement + if(deathtime < 30 SECONDS) //Nice try, ghosting right after the announcement if(SSmapping.configs[GROUND_MAP].map_name != MAP_WHISKEY_OUTPOST) // people ghost so often on whiskey outpost. to_chat(src, SPAN_WARNING("You ghosted too recently.")) return @@ -192,7 +192,7 @@ else to_chat(src, SPAN_WARNING("You did not get enlisted in the response team. Better luck next time!")) -/datum/emergency_call/proc/activate(quiet_launch = FALSE, announce = TRUE, turf/override_spawn_loc, announce_dispatch_message = TRUE) +/datum/emergency_call/proc/activate(quiet_launch = FALSE, announce_incoming = TRUE, turf/override_spawn_loc) set waitfor = 0 if(!SSticker.mode) //Something horribly wrong with the gamemode ticker return @@ -205,9 +205,9 @@ if(!quiet_launch) marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY) - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), quiet_launch, announce, override_spawn_loc, announce_dispatch_message), 30 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), quiet_launch, announce_incoming, override_spawn_loc), 30 SECONDS) -/datum/emergency_call/proc/spawn_candidates(quiet_launch = FALSE, announce = TRUE, override_spawn_loc, announce_dispatch_message = TRUE) +/datum/emergency_call/proc/spawn_candidates(quiet_launch = FALSE, announce_incoming = TRUE, override_spawn_loc) if(SSticker.mode) SSticker.mode.picked_calls -= src @@ -248,7 +248,7 @@ if(I.current) to_chat(I.current, SPAN_WARNING("You didn't get selected to join the distress team. Better luck next time!")) - if(announce) + if(announce_incoming) marine_announcement(dispatch_message, "Distress Beacon", 'sound/AI/distressreceived.ogg', logging = ARES_LOG_SECURITY) //Announcement that the Distress Beacon has been answered, does not hint towards the chosen ERT message_admins("Distress beacon: [src.name] finalized, setting up candidates.") @@ -304,7 +304,7 @@ create_member(null, override_spawn_loc) candidates = list() - if(arrival_message && announce) + if(arrival_message && announce_incoming) marine_announcement(arrival_message, "Intercepted Tranmission:") /datum/emergency_call/proc/add_candidate(mob/M) diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm index 04bcfecf9128..562dac3fe154 100644 --- a/code/datums/emergency_calls/upp.dm +++ b/code/datums/emergency_calls/upp.dm @@ -4,7 +4,7 @@ /datum/emergency_call/upp name = "UPP Naval Infantry (Squad)" mob_max = 9 - probability = 10 + probability = 20 shuttle_id = "Distress_UPP" name_of_spawn = /obj/effect/landmark/ert_spawns/distress_upp item_spawn = /obj/effect/landmark/ert_spawns/distress_upp/item @@ -14,15 +14,17 @@ max_heavies = 1 max_smartgunners = 0 var/heavy_pick = TRUE // whether heavy should count as either a minigunner or shotgunner - hostility = TRUE var/max_synths = 1 var/synths = 0 /datum/emergency_call/upp/New() - ..() - arrival_message = "T*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns )0r c|*$e @u*r*r$ c0m&*t." - objectives = "Eliminate the UA Forces to ensure the UPP prescence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." - + . = ..() + hostility = pick(50;FALSE,50;TRUE) + arrival_message = "[MAIN_SHIP_NAME] t*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns and pR*epr# t% r@nd$r a(tD." + if(hostility) + objectives = "Eliminate the UA Forces to ensure the UPP prescence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." + else + objectives = "Render assistance towards the UA Forces, do not engage UA forces. Listen to your superior officers." /datum/emergency_call/upp/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) @@ -94,10 +96,26 @@ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) +/datum/emergency_call/upp/hostile + name = "UPP Naval Infantry (Squad) (Hostile)" + hostility = TRUE + +/datum/emergency_call/upp/hostile/New() + ..() + arrival_message = "[MAIN_SHIP_NAME] t*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns and pR*epr# t% r@nd$r a(tD." + objectives = "Eliminate the UA Forces to ensure the UPP presence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." + +/datum/emergency_call/upp/friendly + name = "UPP Naval Infantry (Squad) (Friendly)" + hostility = FALSE + +/datum/emergency_call/upp/friendly/New() + ..() + arrival_message = "This is UPP dispatch. USS Almayer, We are responding to your distress call, we will render aid as able, do not fire." + objectives = "Render assistance towards the UA Forces, Listen to your superior officers." /datum/emergency_call/upp/platoon - name = "UPP Naval Infantry (Platoon)" - mob_min = 4 + name = "UPP Naval Infantry (Platoon) (Hostile)" mob_max = 30 probability = 0 max_medics = 3 @@ -106,6 +124,21 @@ max_engineers = 2 max_synths = 1 heavy_pick = FALSE + hostility = TRUE + +/datum/emergency_call/upp/platoon/New() + ..() + arrival_message = "[MAIN_SHIP_NAME] t*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns and pR*epr# t% r@nd$r a(tD." + objectives = "Eliminate the UA Forces to ensure the UPP presence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." + +/datum/emergency_call/upp/platoon/friendly + name = "UPP Naval Infantry (Platoon) (Friendly)" + hostility = FALSE + +/datum/emergency_call/upp/platoon/friendly/New() + ..() + arrival_message = "This is UPP dispatch. USS Almayer, We are responding to your distress call, we will render aid as able, do not fire." + objectives = "Render assistance towards the UA Forces, Listen to your superior officers." /obj/effect/landmark/ert_spawns/distress_upp name = "Distress_UPP" diff --git a/code/datums/factions/upp.dm b/code/datums/factions/upp.dm index 5a790c89be67..90b04765cf85 100644 --- a/code/datums/factions/upp.dm +++ b/code/datums/factions/upp.dm @@ -41,6 +41,8 @@ hud_icon_state = "co" if(JOB_UPP_COMBAT_SYNTH) hud_icon_state = "synth" + if(JOB_UPP_SUPPORT_SYNTH) + hud_icon_state = "synth" if(JOB_UPP_COMMANDO) hud_icon_state = "com" if(JOB_UPP_COMMANDO_MEDIC) diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index a5baf09a1360..752287882277 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -4,8 +4,8 @@ /datum/keybinding/client/admin_help - hotkey_keys = list("F1") - classic_keys = list("F1") + hotkey_keys = list("Unbound") + classic_keys = list("Unbound") name = "admin_help" full_name = "Admin Help" description = "Ask an admin for help." diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm index d1a6adafa2f3..83b9be0ac053 100644 --- a/code/datums/langchat/langchat.dm +++ b/code/datums/langchat/langchat.dm @@ -13,7 +13,6 @@ #define LANGCHAT_LONGEST_TEXT 64 #define LANGCHAT_WIDTH 96 -#define LANGCHAT_X_OFFSET -32 #define LANGCHAT_MAX_ALPHA 196 //pop defines @@ -48,6 +47,13 @@ M.client.images -= langchat_image langchat_listeners = null +/atom/proc/langchat_set_x_offset() + langchat_image.maptext_x = world.icon_size / 2 - langchat_image.maptext_width / 2 +/atom/movable/langchat_set_x_offset() + langchat_image.maptext_x = bound_width / 2 - langchat_image.maptext_width / 2 +/mob/langchat_set_x_offset() + langchat_image.maptext_x = icon_size / 2 - langchat_image.maptext_width / 2 + ///Creates the image if one does not exist, resets settings that are modified by speech procs. /atom/proc/langchat_make_image(override_color = null) if(!langchat_image) @@ -57,8 +63,8 @@ langchat_image.appearance_flags = NO_CLIENT_COLOR|KEEP_APART|RESET_COLOR|RESET_TRANSFORM langchat_image.maptext_y = langchat_height langchat_image.maptext_height = 64 - langchat_image.maptext_x = LANGCHAT_X_OFFSET langchat_image.maptext_y -= LANGCHAT_MESSAGE_POP_Y_SINK + langchat_set_x_offset() langchat_image.pixel_y = 0 langchat_image.alpha = 0 @@ -103,6 +109,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH + langchat_set_x_offset() langchat_listeners = listeners for(var/mob/M in langchat_listeners) @@ -149,6 +156,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH * 2 + langchat_set_x_offset() langchat_listeners = listeners for(var/mob/M in langchat_listeners) diff --git a/code/datums/skills.dm b/code/datums/skills.dm deleted file mode 100644 index 9178e6f7a1b1..000000000000 --- a/code/datums/skills.dm +++ /dev/null @@ -1,2199 +0,0 @@ -// Individual skill -/datum/skill - /// Name of the skill - var/skill_name = null - /// used for the view UI - var/readable_skill_name = null - /// Level of skill in this... skill - var/skill_level = 0 - /// the max level this skill can be, used for tgui - var/max_skill_level = 0 - -/datum/skill/proc/get_skill_level() - return skill_level - -/datum/skill/proc/set_skill(new_level, mob/owner) - skill_level = new_level - -/datum/skill/proc/is_skilled(req_level, is_explicit = FALSE) - if(is_explicit) - return (skill_level == req_level) - return (skill_level >= req_level) - -// Lots of defines here. See #define/skills.dm - -/datum/skill/cqc - skill_name = SKILL_CQC - readable_skill_name = "CQC" - skill_level = SKILL_CQC_DEFAULT - max_skill_level = SKILL_CQC_MAX - -/datum/skill/melee_weapons - skill_name = SKILL_MELEE_WEAPONS - readable_skill_name = "melee weapons" - skill_level = SKILL_MELEE_DEFAULT - max_skill_level = SKILL_MELEE_MAX - -/datum/skill/firearms - skill_name = SKILL_FIREARMS - skill_level = SKILL_FIREARMS_TRAINED - max_skill_level = SKILL_FIREARMS_MAX - -/datum/skill/spec_weapons - skill_name = SKILL_SPEC_WEAPONS - readable_skill_name = "specialist weapons" - skill_level = SKILL_SPEC_DEFAULT - max_skill_level = SKILL_SPEC_ALL - -/datum/skill/endurance - skill_name = SKILL_ENDURANCE - skill_level = SKILL_ENDURANCE_WEAK - max_skill_level = SKILL_ENDURANCE_MAX - -/datum/skill/engineer - skill_name = SKILL_ENGINEER - skill_level = SKILL_ENGINEER_DEFAULT - max_skill_level = SKILL_ENGINEER_MAX - -/datum/skill/construction - skill_name = SKILL_CONSTRUCTION - skill_level = SKILL_CONSTRUCTION_DEFAULT - max_skill_level = SKILL_CONSTRUCTION_MAX - -/datum/skill/leadership - skill_name = SKILL_LEADERSHIP - skill_level = SKILL_LEAD_NOVICE - max_skill_level = SKILL_LEAD_MAX - -/datum/skill/leadership/set_skill(new_level, mob/living/owner) - ..() - if(!owner) - return - - if(!ishuman(owner)) - return - - // Give/remove issue order actions - if(is_skilled(SKILL_LEAD_TRAINED)) - ADD_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) - else - REMOVE_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) - -/datum/skill/overwatch - skill_name = SKILL_OVERWATCH - skill_level = SKILL_OVERWATCH_DEFAULT - max_skill_level = SKILL_OVERWATCH_MAX - -/datum/skill/medical - skill_name = SKILL_MEDICAL - skill_level = SKILL_MEDICAL_DEFAULT - max_skill_level = SKILL_MEDICAL_MAX - -/datum/skill/surgery - skill_name = SKILL_SURGERY - skill_level = SKILL_SURGERY_DEFAULT - max_skill_level = SKILL_SURGERY_MAX - -/datum/skill/surgery/set_skill(new_level, mob/living/owner) - ..() - if(!owner) - return - - if(!ishuman(owner)) - return - - // Give/remove surgery toggle action - var/datum/action/surgery_toggle/surgery_action = locate() in owner.actions - if(is_skilled(SKILL_SURGERY_NOVICE)) - if(!surgery_action) - give_action(owner, /datum/action/surgery_toggle) - else - surgery_action.update_surgery_skill() - else - if(surgery_action) - surgery_action.remove_from(owner) - -/datum/skill/research - skill_name = SKILL_RESEARCH - skill_level = SKILL_RESEARCH_DEFAULT - max_skill_level = SKILL_RESEARCH_MAX - -/datum/skill/antag - skill_name = SKILL_ANTAG - readable_skill_name = "illegal technology" - skill_level = SKILL_ANTAG_DEFAULT - max_skill_level = SKILL_ANTAG_MAX - -/datum/skill/pilot - skill_name = SKILL_PILOT - skill_level = SKILL_PILOT_DEFAULT - max_skill_level = SKILL_PILOT_MAX - -/datum/skill/navigations - skill_name = SKILL_NAVIGATIONS - skill_level = SKILL_NAVIGATIONS_DEFAULT - max_skill_level = SKILL_NAVIGATIONS_MAX - -/datum/skill/police - skill_name = SKILL_POLICE - skill_level = SKILL_POLICE_DEFAULT - max_skill_level = SKILL_POLICE_MAX - -/datum/skill/powerloader - skill_name = SKILL_POWERLOADER - skill_level = SKILL_POWERLOADER_DEFAULT - max_skill_level = SKILL_POWERLOADER_MAX - -/datum/skill/vehicles - skill_name = SKILL_VEHICLE - skill_level = SKILL_VEHICLE_DEFAULT - max_skill_level = SKILL_VEHICLE_MAX - -/datum/skill/jtac - skill_name = SKILL_JTAC - readable_skill_name = "JTAC" - skill_level = SKILL_JTAC_NOVICE - max_skill_level = SKILL_JTAC_MAX - -/datum/skill/execution - skill_name = SKILL_EXECUTION - skill_level = SKILL_EXECUTION_DEFAULT - max_skill_level = SKILL_EXECUTION_MAX - -/datum/skill/intel - skill_name = SKILL_INTEL - skill_level = SKILL_INTEL_NOVICE - max_skill_level = SKILL_INTEL_MAX - -/datum/skill/domestic - skill_name = SKILL_DOMESTIC - skill_level = SKILL_DOMESTIC_NONE - max_skill_level = SKILL_DOMESTIC_MAX - -/datum/skill/fireman - skill_name = SKILL_FIREMAN - readable_skill_name = "fireman carrying" - skill_level = SKILL_FIREMAN_DEFAULT - max_skill_level = SKILL_FIREMAN_MAX - -/// Skill with an extra S at the end is a collection of multiple skills. Basically a skillSET -/// This is to organize and provide a common interface to the huge heap of skills there are -/datum/skills - /// The name of the skillset - var/name - // The mob that has this skillset - var/mob/owner - - // List of skill datums. - // Also, if this is populated when the datum is created, it will set the skill levels automagically - var/list/skills = list() - // Same as above, but for children of parents that just add a lil something else - var/list/additional_skills = list() - -/datum/skills/New(mob/skillset_owner) - owner = skillset_owner - - // Setup every single skill - for(var/skill_type in subtypesof(/datum/skill)) - var/datum/skill/S = new skill_type() - - // Fancy hack to convert a list of desired skill levels in each named skill into a skill level in the actual skill datum - // Lets the skills list be used multipurposely for both storing skill datums and choosing skill levels for different skillsets - var/predetermined_skill_level = additional_skills[S.skill_name] ? additional_skills[S.skill_name] : skills[S.skill_name] - skills[S.skill_name] = S - - if(!isnull(predetermined_skill_level)) - S.set_skill(predetermined_skill_level, owner) - -/datum/skills/Destroy() - owner = null - skills = null // Don't need to delete, /datum/skill should softdel - SStgui.close_uis(src) - return ..() - -// Checks if the given skill is contained in this skillset at all -/datum/skills/proc/has_skill(skill) - return isnull(skills[skill]) - -// Returns the skill DATUM for the given skill -/datum/skills/proc/get_skill(skill) - if(!skills) - return null - return skills[skill] - -// Returns the skill level for the given skill -/datum/skills/proc/get_skill_level(skill) - var/datum/skill/S = get_skill(skill) - if(!S) - return -1 - if(QDELETED(S)) - return -1 - return S.get_skill_level() - -// Sets the skill LEVEL for a given skill -/datum/skills/proc/set_skill(skill, new_level) - var/datum/skill/S = skills[skill] - if(!S) - return - return S.set_skill(new_level, owner) - -/datum/skills/proc/increment_skill(skill, increment, cap) - var/datum/skill/S = skills[skill] - if(!S || skillcheck(owner, skill, cap)) - return - return S.set_skill(min(cap,S.skill_level+increment), owner) - -/datum/skills/proc/decrement_skill(skill, increment) - var/datum/skill/S = skills[skill] - if(!S) - return - return S.set_skill(max(0,S.skill_level-increment), owner) - -// Checks if the skillset is AT LEAST skilled enough to pass a skillcheck for the given skill level -/datum/skills/proc/is_skilled(skill, req_level, is_explicit = FALSE) - var/datum/skill/S = get_skill(skill) - if(QDELETED(S)) - return FALSE - return S.is_skilled(req_level, is_explicit) - -// Adjusts the full skillset to a new type of skillset. Pass the datum type path for the desired skillset -/datum/skills/proc/set_skillset(skillset_type) - var/datum/skills/skillset = new skillset_type() - var/list/skill_levels = initial(skillset.skills) - - name = skillset.name - for(var/skill in skill_levels) - set_skill(skill, skill_levels[skill]) - qdel(skillset) - -/* ---------------------- -CIVILIAN ---------------------- -*/ - -/datum/skills/civilian - name = "Civilian" - skills = list( - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_ENDURANCE = SKILL_ENDURANCE_NONE, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/manager - name = "Weyland-Yutani Manager" // Semi-competent leader with basic knowledge in most things. - skills = list( - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/datum/skills/civilian/icc_investigation - name = "ICC CL - Black Market ERT" - skills = list( - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //The ASRS consoles - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_POLICE = SKILL_POLICE_SKILLED, //The CMB Tradeband Compliance Device - ) - -/datum/skills/civilian/manager/director - name = "Weyland-Yutani Director" - skills = list( - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/datum/skills/civilian/survivor - name = "Survivor" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - ) - -/datum/skills/civilian/survivor/manager - name = "Weyland-Yutani Manager" - skills = list( - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/datum/skills/civilian/survivor/goon - name = "Survivor Goon" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/pmc - name = "Survivor PMC" - additional_skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/pmc/medic - name = "Survivor PMC Medic" - additional_skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/pmc/engineer - name = "Survivor PMC Engineer" - additional_skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/civilian/survivor/doctor - name = "Survivor Doctor" - additional_skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/civilian/survivor/clf - name = "Survivor CLF" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - ) - -/datum/skills/civilian/survivor/scientist - name = "Survivor Scientist" - additional_skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - ) - -/datum/skills/civilian/survivor/chef - name = "Survivor Chef" - additional_skills = list( - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, - ) - -/datum/skills/civilian/survivor/miner - name = "Survivor Miner" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/trucker - name = "Survivor Trucker" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - ) - -/datum/skills/civilian/survivor/engineer - name = "Survivor Engineer" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/chaplain - name = "Survivor Chaplain" - additional_skills = list( - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - ) - -/datum/skills/civilian/survivor/marshal - name = "Survivor Marshal" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - ) - -/datum/skills/civilian/survivor/prisoner - name = "Survivor Prisoner" - additional_skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/gangleader - name = "Survivor Gang Leader" - additional_skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - ) - -/* ---------------------- -MILITARY SURVIVORS ---------------------- -*/ -//Hardcore survivors with poor equipment and skills, prove you're the best of the best. - -/datum/skills/military/survivor/forecon_standard - name = "Reconnaissance Rifleman" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_techician - name = "Reconnaissance Support Technician" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_marksman - name = "Reconnaissance Designated Marksman" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SCOUT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_smartgunner - name = "Reconnaissance Smartgunner" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_sniper - name = "Reconnaissance Sniper" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SNIPER, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_squad_leader - name = "Reconnaissance Squad Leader" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/* ---------------------- -COMMAND STAFF ---------------------- -*/ - -/datum/skills/general - name = "General" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people - SKILL_INTEL = SKILL_INTEL_EXPERT - ) - -/datum/skills/commander - name = "Commanding Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED //can change ship alt - ) - -/datum/skills/XO - name = "Executive Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //to fix CIC apc. - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - ) - -/datum/skills/SO - name = "Staff Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/SEA - name = "Senior Enlisted Advisor" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/SEA/New(mob/skillset_owner) - ..() - give_action(skillset_owner, /datum/action/looc_toggle) - -/datum/skills/SEA/Destroy() - remove_action(owner, /datum/action/looc_toggle) - return ..() - -/datum/skills/CMO - name = "CMO" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/CMP - name = "Chief MP" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/auxiliary_officer - name = "Auxiliary Support Officer" - skills = list( - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - ) - -/datum/skills/CE - name = "Chief Engineer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_INTEL = SKILL_INTEL_TRAINED, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - ) - -/datum/skills/RO - name = "Requisition Officer" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/* ---------------------- -MILITARY NONCOMBATANT ---------------------- -*/ - -/datum/skills/doctor - name = "Doctor" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/nurse - name = "Nurse" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - ) - -/datum/skills/researcher - name = "Researcher" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/pilot - name = "Pilot Officer" - skills = list( - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/crew_chief - name = "Dropship Crew Chief" - skills = list( - SKILL_PILOT = SKILL_PILOT_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - ) - -/datum/skills/MP - name = "Military Police" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/MW - name = "Military Warden" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - ) - -/datum/skills/provost - name = "Provost" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - ) - -/datum/skills/OT - name = "Ordnance Technician" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/MT - name = "Maintenance Technician" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, - ) - -/datum/skills/mess_technician - name = "Mess Technician" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, // need to hunt food somehow - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER - ) - -/datum/skills/CT - name = "Cargo Technician" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/* ---------------------- -SYNTHETIC ---------------------- -*/ - -/datum/skills/synthetic - name = "Synthetic" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MASTER, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - ) - -/datum/skills/colonial_synthetic - name = SYNTH_COLONY - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_INTEL = SKILL_INTEL_TRAINED, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - ) - -/datum/skills/working_joe - name = SYNTH_WORKING_JOE - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, //So they can fully use the Maintenance Jack - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - ) - -/datum/skills/infiltrator_synthetic - name = SYNTH_INFILTRATOR - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MASTER, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - SKILL_ANTAG = SKILL_ANTAG_AGENT, - ) - -/* ------------------------------- -United States Colonial Marines ------------------------------- -*/ - -/datum/skills/pfc - name = "Private" - //same as default - -/datum/skills/pfc/crafty - name = "Crafty Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - ) - -/datum/skills/combat_medic - name = "Combat Medic" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/combat_medic/crafty - name = "Crafty Combat Medic" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - ) - -/datum/skills/combat_engineer - name = "Combat Engineer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/smartgunner - name = "Squad Smartgunner" - skills = list( - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/specialist - name = "Squad Weapons Specialist" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. - SKILL_SPEC_WEAPONS = SKILL_SPEC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER - ) - -/datum/skills/tl - name = "Fireteam Leader" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/SL - name = "Squad Leader" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/intel - name = "Intelligence Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/* -------------------------- -COLONIAL LIBERATION FRONT -------------------------- -*/ - -/datum/skills/clf - name = "CLF Soldier" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/clf/combat_engineer - name = "CLF Engineer" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/clf/combat_medic - name = "CLF Medic" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/clf/specialist - name = "CLF Specialist" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED - ) - -/datum/skills/clf/leader - name = "CLF Leader" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, // to use their C4 - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI - ) - -/datum/skills/clf/commander - name = "CLF Cell Commander" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - ) - -/* ------------ -FREELANCERS ------------ -*/ - -//NOTE: Freelancer training is similar to the USCM's, but with additional construction skills - -/datum/skills/freelancer - name = "Freelancer Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/freelancer/combat_medic - name = "Freelancer Medic" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/freelancer/SL - name = "Freelancer Leader" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/* --------------------------- -UNITED PROGRESSIVE PEOPLES --------------------------- -*/ - -//NOTE: UPP make up for their subpar gear with extreme training. - -/datum/skills/upp - name = "UPP Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - ) - -/datum/skills/upp/combat_engineer - name = "UPP Sapper" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - ) - -/datum/skills/upp/combat_medic - name = "UPP Medic" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - ) - -/datum/skills/upp/specialist - name = "UPP Specialist" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - ) - -/datum/skills/upp/SL - name = "UPP Squad Leader" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/upp/military_police - name = "UPP Military Police" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - ) - -/datum/skills/upp/officer - name = "UPP Officer" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/upp/kapitan - name = "UPP Kapitan" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/upp/commander - name = "UPP Command Officer" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - ) -/datum/skills/upp/conscript - name = "UPP Conscript" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - ) - -/* ----------------------------- -Private Military Contractors ----------------------------- -*/ - -//NOTE: Compared to the USCM, PMCs have additional firearms training, construction skills and policing skills - -/datum/skills/pmc - name = "PMC Private" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - ) - -/datum/skills/pmc/medic - name = "PMC Medic" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - ) - -/datum/skills/pmc/medic/chem - name = "PMC Medical Investigator" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - ) - -/datum/skills/pmc/smartgunner - name = "PMC Smartgunner" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/pmc/specialist - name = "PMC Specialist" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/pmc/SL - name = "PMC Leader" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/pmc/SL/chem - name = "PMC Lead Investigator" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/pmc/tank_crew - name = "Vehicle Crewman" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/pmc/doctor - name = "PMC Triage Doctor" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, //trained in medicine more than combat - SKILL_CQC = SKILL_CQC_TRAINED - ) - -/datum/skills/pmc/engineer - name = "PMC Corporate Technician" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/pmc/director - name = "PMC Site Director" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - ) - -/* ---------------------- -CONTRACTORS ---------------------- -*/ -/datum/skills/contractor - name = "Contractor Standard" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/contractor/leader - name = "Contractor Leader" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - SKILL_JTAC = SKILL_JTAC_MASTER, - ) - -/datum/skills/contractor/medic - name = "Contractor Medic" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/contractor/engi - name = "Contractor Engi" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_MAX, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - ) - -/datum/skills/contractor/heavy - name = "Contractor Machinegunner" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/* ---------------------- -COLONIAL MARSHALS ---------------------- -*/ -/datum/skills/cmb - name = "CMB Deputy" - skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - ) - -/datum/skills/cmb/leader - name = "CMB Marshal" - skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_FIREMAN = SKILL_FIREMAN_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/synthetic/cmb - name = "CMB Investigative Synthetic" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, // incase the synth needs to use consoles for investigations or tracking - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, // Not a medical Synthetic, but operate if absolutely needed. - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER - ) - -/datum/skills/military/survivor/upp_private - name = "UPP Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/upp_sapper - name = "UPP Sapper" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/upp_medic - name = "UPP Medic" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/upp_spec - name = "UPP Specialist" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - ) - -/datum/skills/military/survivor/upp_sl - name = "UPP Squad Leader" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/* ---------------------- -SPEC-OPS ---------------------- -*/ - -/datum/skills/commando - name = "Commando" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/medic - name = "Commando Medic" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/leader - name = "Commando Leader" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/commando/deathsquad - name = "Deathsquad" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/deathsquad/leader - name = "Deathsquad Leader" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/deathsquad/officer - name = "Deathsquad Officer" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/spy - name = "Spy" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/ninja - name = "Ninja" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/* ---------------------- -MISCELLANEOUS ---------------------- -*/ - -/datum/skills/mercenary - name = "Mercenary" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/mercenary/elite - name = "Elite Mercenary" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/mercenary/elite/medic - name = "Elite Mercenary Medic" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/mercenary/elite/engineer - name = "Elite Mercenary Engineer" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_PILOT = SKILL_PILOT_EXPERT, - ) - -/datum/skills/mercenary/elite/heavy - name = "Elite Mercenary Heavy" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - ) - -/datum/skills/mercenary/elite/leader - name = "Elite Mercenary Leader" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_PILOT = SKILL_PILOT_EXPERT, - ) - -/datum/skills/dutchmerc - name = "Dutch's Dozen Mercenary" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - ) - -/datum/skills/dutchmedic - name = "Dutch's Dozen Medic" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - ) - -/datum/skills/tank_crew - name = "Vehicle Crewman" - skills = list( - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/gladiator - name = "Gladiator" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - ) - -/datum/skills/gladiator/champion - name = "Gladiator Champion" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/gladiator/champion/leader - name = "Gladiator Leader" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, //Spartacus! - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - ) - -/datum/skills/yautja/warrior - name = "Yautja Warrior" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_ANTAG = SKILL_ANTAG_HUNTER, - ) - -/datum/skills/dutch - name = "Dutch" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_ANTAG = SKILL_ANTAG_HUNTER, - ) - -/datum/skills/cultist_leader - name = "Cultist Leader" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - ) - -/datum/skills/souto - name = "Souto Man" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - ) - -/datum/skills/everything //max it out - name = "Ultra" - skills = list( - SKILL_CQC = SKILL_CQC_MAX, - SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_ENGINEER = SKILL_ENGINEER_MAX, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, - SKILL_LEADERSHIP = SKILL_LEAD_MAX, - SKILL_OVERWATCH = SKILL_OVERWATCH_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_MAX, - SKILL_SURGERY = SKILL_SURGERY_MAX, - SKILL_RESEARCH = SKILL_RESEARCH_MAX, - SKILL_ANTAG = SKILL_ANTAG_MAX, - SKILL_PILOT = SKILL_PILOT_MAX, - SKILL_POLICE = SKILL_POLICE_MAX, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_MAX, - SKILL_JTAC = SKILL_JTAC_MAX, - SKILL_EXECUTION = SKILL_EXECUTION_MAX, - SKILL_INTEL = SKILL_INTEL_MAX, - ) - -/* ----------------------------- -Royal Marines Commando ----------------------------- -*/ - -//NOTE: Skills take heavy from PMCs - -/datum/skills/rmc - name = "Royal Marines Commando" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - ) - -/datum/skills/rmc/specialist - name = "Royal Marines Commando Specialist" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/rmc/smartgun - name = "Royal Marines Commando Smartgunner" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - ) - -/datum/skills/rmc/leader - name = "Royal Marines Commando Leader" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - ) diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm new file mode 100644 index 000000000000..9b55adc9b1f4 --- /dev/null +++ b/code/datums/skills/civilian.dm @@ -0,0 +1,213 @@ +/* +--------------------- +CIVILIAN +--------------------- +*/ + +/datum/skills/civilian + name = "Civilian" + skills = list( + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_ENDURANCE = SKILL_ENDURANCE_NONE, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/manager + name = "Weyland-Yutani Manager" // Semi-competent leader with basic knowledge in most things. + skills = list( + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +/datum/skills/civilian/icc_investigation + name = "ICC CL - Black Market ERT" + skills = list( + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //The ASRS consoles + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_POLICE = SKILL_POLICE_SKILLED, //The CMB Tradeband Compliance Device + ) + +/datum/skills/civilian/manager/director + name = "Weyland-Yutani Director" + skills = list( + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +//civilian that are survivor could be in is own file maybe + +/datum/skills/civilian/survivor + name = "Survivor" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + ) + +/datum/skills/civilian/survivor/manager + name = "Weyland-Yutani Manager" + skills = list( + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +/datum/skills/civilian/survivor/goon + name = "Survivor Goon" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/pmc + name = "Survivor PMC" + additional_skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/pmc/medic + name = "Survivor PMC Medic" + additional_skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/pmc/engineer + name = "Survivor PMC Engineer" + additional_skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/civilian/survivor/doctor + name = "Survivor Doctor" + additional_skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/civilian/survivor/clf + name = "Survivor CLF" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + ) + +/datum/skills/civilian/survivor/scientist + name = "Survivor Scientist" + additional_skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + ) + +/datum/skills/civilian/survivor/chef + name = "Survivor Chef" + additional_skills = list( + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, + ) + +/datum/skills/civilian/survivor/miner + name = "Survivor Miner" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/trucker + name = "Survivor Trucker" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + ) + +/datum/skills/civilian/survivor/engineer + name = "Survivor Engineer" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/chaplain + name = "Survivor Chaplain" + additional_skills = list( + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) + +/datum/skills/civilian/survivor/marshal + name = "Survivor Marshal" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + ) + +/datum/skills/civilian/survivor/prisoner + name = "Survivor Prisoner" + additional_skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/gangleader + name = "Survivor Gang Leader" + additional_skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) diff --git a/code/datums/skills/clf.dm b/code/datums/skills/clf.dm new file mode 100644 index 000000000000..6042febb6b48 --- /dev/null +++ b/code/datums/skills/clf.dm @@ -0,0 +1,92 @@ +/* +------------------------- +COLONIAL LIBERATION FRONT +------------------------- +*/ + +/datum/skills/clf + name = "CLF Soldier" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/clf/combat_engineer + name = "CLF Engineer" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/clf/combat_medic + name = "CLF Medic" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/clf/specialist + name = "CLF Specialist" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED + ) + +/datum/skills/clf/leader + name = "CLF Leader" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, // to use their C4 + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI + ) + +/datum/skills/clf/commander + name = "CLF Cell Commander" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + ) diff --git a/code/datums/skills/cmb.dm b/code/datums/skills/cmb.dm new file mode 100644 index 000000000000..b29a4c314567 --- /dev/null +++ b/code/datums/skills/cmb.dm @@ -0,0 +1,60 @@ +/* +--------------------- +COLONIAL MARSHALS +--------------------- +*/ +/datum/skills/cmb + name = "CMB Deputy" + skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + ) + +/datum/skills/cmb/leader + name = "CMB Marshal" + skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_FIREMAN = SKILL_FIREMAN_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/synthetic/cmb + name = "CMB Investigative Synthetic" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, // incase the synth needs to use consoles for investigations or tracking + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, // Not a medical Synthetic, but operate if absolutely needed. + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER + ) diff --git a/code/datums/skills/commando.dm b/code/datums/skills/commando.dm new file mode 100644 index 000000000000..dabae682bd0b --- /dev/null +++ b/code/datums/skills/commando.dm @@ -0,0 +1,116 @@ +/* +--------------------- +SPEC-OPS +--------------------- +*/ + +/datum/skills/commando + name = "Commando" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/medic + name = "Commando Medic" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/leader + name = "Commando Leader" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/commando/deathsquad + name = "Deathsquad" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/deathsquad/leader + name = "Deathsquad Leader" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/deathsquad/officer + name = "Deathsquad Officer" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/spy + name = "Spy" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/ninja + name = "Ninja" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) diff --git a/code/datums/skills/contractor.dm b/code/datums/skills/contractor.dm new file mode 100644 index 000000000000..183e95c941f5 --- /dev/null +++ b/code/datums/skills/contractor.dm @@ -0,0 +1,90 @@ +/* +--------------------- +CONTRACTORS +--------------------- +*/ +/datum/skills/contractor + name = "Contractor Standard" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/contractor/leader + name = "Contractor Leader" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_JTAC = SKILL_JTAC_MASTER, + ) + +/datum/skills/contractor/medic + name = "Contractor Medic" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/contractor/engi + name = "Contractor Engi" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_MAX, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + ) + +/datum/skills/contractor/heavy + name = "Contractor Machinegunner" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) diff --git a/code/datums/skills/dutch.dm b/code/datums/skills/dutch.dm new file mode 100644 index 000000000000..5c2c63a8c463 --- /dev/null +++ b/code/datums/skills/dutch.dm @@ -0,0 +1,46 @@ +/datum/skills/dutch + name = "Dutch" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_ANTAG = SKILL_ANTAG_HUNTER, + ) + +/datum/skills/dutchmerc + name = "Dutch's Dozen Mercenary" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + ) + +/datum/skills/dutchmedic + name = "Dutch's Dozen Medic" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + ) diff --git a/code/datums/skills/forecon.dm b/code/datums/skills/forecon.dm new file mode 100644 index 000000000000..4799dd68d617 --- /dev/null +++ b/code/datums/skills/forecon.dm @@ -0,0 +1,102 @@ +/* +--------------------- +MILITARY SURVIVORS +--------------------- +*/ +//Hardcore survivors with poor equipment and skills, prove you're the best of the best. + +/datum/skills/military/survivor/forecon_standard + name = "Reconnaissance Rifleman" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_techician + name = "Reconnaissance Support Technician" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_marksman + name = "Reconnaissance Designated Marksman" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SCOUT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_smartgunner + name = "Reconnaissance Smartgunner" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_sniper + name = "Reconnaissance Sniper" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SNIPER, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_squad_leader + name = "Reconnaissance Squad Leader" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) diff --git a/code/datums/skills/freelancer.dm b/code/datums/skills/freelancer.dm new file mode 100644 index 000000000000..7f7256318edb --- /dev/null +++ b/code/datums/skills/freelancer.dm @@ -0,0 +1,40 @@ +/* +----------- +FREELANCERS +----------- +*/ + +//NOTE: Freelancer training is similar to the USCM's, but with additional construction skills + +/datum/skills/freelancer + name = "Freelancer Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/freelancer/combat_medic + name = "Freelancer Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/freelancer/SL + name = "Freelancer Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + + diff --git a/code/datums/skills/gladiator.dm b/code/datums/skills/gladiator.dm new file mode 100644 index 000000000000..7ba2c9eff455 --- /dev/null +++ b/code/datums/skills/gladiator.dm @@ -0,0 +1,33 @@ +/datum/skills/gladiator + name = "Gladiator" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + ) + +/datum/skills/gladiator/champion + name = "Gladiator Champion" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/gladiator/champion/leader + name = "Gladiator Leader" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, //Spartacus! + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + ) diff --git a/code/datums/skills/mercenary.dm b/code/datums/skills/mercenary.dm new file mode 100644 index 000000000000..8d842ea30dd2 --- /dev/null +++ b/code/datums/skills/mercenary.dm @@ -0,0 +1,85 @@ +/datum/skills/mercenary + name = "Mercenary" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/mercenary/elite + name = "Elite Mercenary" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/mercenary/elite/medic + name = "Elite Mercenary Medic" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/mercenary/elite/engineer + name = "Elite Mercenary Engineer" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_PILOT = SKILL_PILOT_EXPERT, + ) + +/datum/skills/mercenary/elite/heavy + name = "Elite Mercenary Heavy" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + ) + +/datum/skills/mercenary/elite/leader + name = "Elite Mercenary Leader" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_PILOT = SKILL_PILOT_EXPERT, + ) diff --git a/code/datums/skills/misc.dm b/code/datums/skills/misc.dm new file mode 100644 index 000000000000..e4f78219b5c6 --- /dev/null +++ b/code/datums/skills/misc.dm @@ -0,0 +1,86 @@ +/* +--------------------- +MISCELLANEOUS +--------------------- +*/ + +/datum/skills/tank_crew + name = "Vehicle Crewman" + skills = list( + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/yautja/warrior + name = "Yautja Warrior" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_ANTAG = SKILL_ANTAG_HUNTER, + ) + +/datum/skills/cultist_leader + name = "Cultist Leader" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + ) + +/datum/skills/souto + name = "Souto Man" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + ) + +/datum/skills/everything //max it out + name = "Ultra" + skills = list( + SKILL_CQC = SKILL_CQC_MAX, + SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_ENGINEER = SKILL_ENGINEER_MAX, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, + SKILL_LEADERSHIP = SKILL_LEAD_MAX, + SKILL_OVERWATCH = SKILL_OVERWATCH_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_MAX, + SKILL_SURGERY = SKILL_SURGERY_MAX, + SKILL_RESEARCH = SKILL_RESEARCH_MAX, + SKILL_ANTAG = SKILL_ANTAG_MAX, + SKILL_PILOT = SKILL_PILOT_MAX, + SKILL_POLICE = SKILL_POLICE_MAX, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_MAX, + SKILL_JTAC = SKILL_JTAC_MAX, + SKILL_EXECUTION = SKILL_EXECUTION_MAX, + SKILL_INTEL = SKILL_INTEL_MAX, + ) diff --git a/code/datums/skills/pmc.dm b/code/datums/skills/pmc.dm new file mode 100644 index 000000000000..df7027e2a7ab --- /dev/null +++ b/code/datums/skills/pmc.dm @@ -0,0 +1,171 @@ +/* +---------------------------- +Private Military Contractors +---------------------------- +*/ + +//NOTE: Compared to the USCM, PMCs have additional firearms training, construction skills and policing skills + +/datum/skills/pmc + name = "PMC Private" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + ) + +/datum/skills/pmc/medic + name = "PMC Medic" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + ) + +/datum/skills/pmc/medic/chem + name = "PMC Medical Investigator" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + ) + +/datum/skills/pmc/smartgunner + name = "PMC Smartgunner" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/pmc/specialist + name = "PMC Specialist" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/pmc/SL + name = "PMC Leader" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/pmc/SL/chem + name = "PMC Lead Investigator" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/pmc/tank_crew + name = "Vehicle Crewman" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/pmc/doctor + name = "PMC Triage Doctor" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, //trained in medicine more than combat + SKILL_CQC = SKILL_CQC_TRAINED + ) + +/datum/skills/pmc/engineer + name = "PMC Corporate Technician" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/pmc/director + name = "PMC Site Director" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + ) diff --git a/code/datums/skills/rmc.dm b/code/datums/skills/rmc.dm new file mode 100644 index 000000000000..89aa39b154ad --- /dev/null +++ b/code/datums/skills/rmc.dm @@ -0,0 +1,71 @@ +/* +---------------------------- +Royal Marines Commando +---------------------------- +*/ + +//NOTE: Skills take heavy from PMCs + +/datum/skills/rmc + name = "Royal Marines Commando" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + ) + +/datum/skills/rmc/specialist + name = "Royal Marines Commando Specialist" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/rmc/smartgun + name = "Royal Marines Commando Smartgunner" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + ) + +/datum/skills/rmc/leader + name = "Royal Marines Commando Leader" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) diff --git a/code/datums/skills/skills.dm b/code/datums/skills/skills.dm new file mode 100644 index 000000000000..5d1a69e174ed --- /dev/null +++ b/code/datums/skills/skills.dm @@ -0,0 +1,267 @@ +// Individual skill +/datum/skill + /// Name of the skill + var/skill_name = null + /// used for the view UI + var/readable_skill_name = null + /// Level of skill in this... skill + var/skill_level = 0 + /// the max level this skill can be, used for tgui + var/max_skill_level = 0 + +/datum/skill/proc/get_skill_level() + return skill_level + +/datum/skill/proc/set_skill(new_level, mob/owner) + skill_level = new_level + +/datum/skill/proc/is_skilled(req_level, is_explicit = FALSE) + if(is_explicit) + return (skill_level == req_level) + return (skill_level >= req_level) + +// Lots of defines here. See #define/skills.dm + +/datum/skill/cqc + skill_name = SKILL_CQC + readable_skill_name = "CQC" + skill_level = SKILL_CQC_DEFAULT + max_skill_level = SKILL_CQC_MAX + +/datum/skill/melee_weapons + skill_name = SKILL_MELEE_WEAPONS + readable_skill_name = "melee weapons" + skill_level = SKILL_MELEE_DEFAULT + max_skill_level = SKILL_MELEE_MAX + +/datum/skill/firearms + skill_name = SKILL_FIREARMS + skill_level = SKILL_FIREARMS_TRAINED + max_skill_level = SKILL_FIREARMS_MAX + +/datum/skill/spec_weapons + skill_name = SKILL_SPEC_WEAPONS + readable_skill_name = "specialist weapons" + skill_level = SKILL_SPEC_DEFAULT + max_skill_level = SKILL_SPEC_ALL + +/datum/skill/endurance + skill_name = SKILL_ENDURANCE + skill_level = SKILL_ENDURANCE_WEAK + max_skill_level = SKILL_ENDURANCE_MAX + +/datum/skill/engineer + skill_name = SKILL_ENGINEER + skill_level = SKILL_ENGINEER_DEFAULT + max_skill_level = SKILL_ENGINEER_MAX + +/datum/skill/construction + skill_name = SKILL_CONSTRUCTION + skill_level = SKILL_CONSTRUCTION_DEFAULT + max_skill_level = SKILL_CONSTRUCTION_MAX + +/datum/skill/leadership + skill_name = SKILL_LEADERSHIP + skill_level = SKILL_LEAD_NOVICE + max_skill_level = SKILL_LEAD_MAX + +/datum/skill/leadership/set_skill(new_level, mob/living/owner) + ..() + if(!owner) + return + + if(!ishuman(owner)) + return + + // Give/remove issue order actions + if(is_skilled(SKILL_LEAD_TRAINED)) + ADD_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) + else + REMOVE_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) + +/datum/skill/overwatch + skill_name = SKILL_OVERWATCH + skill_level = SKILL_OVERWATCH_DEFAULT + max_skill_level = SKILL_OVERWATCH_MAX + +/datum/skill/medical + skill_name = SKILL_MEDICAL + skill_level = SKILL_MEDICAL_DEFAULT + max_skill_level = SKILL_MEDICAL_MAX + +/datum/skill/surgery + skill_name = SKILL_SURGERY + skill_level = SKILL_SURGERY_DEFAULT + max_skill_level = SKILL_SURGERY_MAX + +/datum/skill/surgery/set_skill(new_level, mob/living/owner) + ..() + if(!owner) + return + + if(!ishuman(owner)) + return + + // Give/remove surgery toggle action + var/datum/action/surgery_toggle/surgery_action = locate() in owner.actions + if(is_skilled(SKILL_SURGERY_NOVICE)) + if(!surgery_action) + give_action(owner, /datum/action/surgery_toggle) + else + surgery_action.update_surgery_skill() + else + if(surgery_action) + surgery_action.remove_from(owner) + +/datum/skill/research + skill_name = SKILL_RESEARCH + skill_level = SKILL_RESEARCH_DEFAULT + max_skill_level = SKILL_RESEARCH_MAX + +/datum/skill/antag + skill_name = SKILL_ANTAG + readable_skill_name = "illegal technology" + skill_level = SKILL_ANTAG_DEFAULT + max_skill_level = SKILL_ANTAG_MAX + +/datum/skill/pilot + skill_name = SKILL_PILOT + skill_level = SKILL_PILOT_DEFAULT + max_skill_level = SKILL_PILOT_MAX + +/datum/skill/navigations + skill_name = SKILL_NAVIGATIONS + skill_level = SKILL_NAVIGATIONS_DEFAULT + max_skill_level = SKILL_NAVIGATIONS_MAX + +/datum/skill/police + skill_name = SKILL_POLICE + skill_level = SKILL_POLICE_DEFAULT + max_skill_level = SKILL_POLICE_MAX + +/datum/skill/powerloader + skill_name = SKILL_POWERLOADER + skill_level = SKILL_POWERLOADER_DEFAULT + max_skill_level = SKILL_POWERLOADER_MAX + +/datum/skill/vehicles + skill_name = SKILL_VEHICLE + skill_level = SKILL_VEHICLE_DEFAULT + max_skill_level = SKILL_VEHICLE_MAX + +/datum/skill/jtac + skill_name = SKILL_JTAC + readable_skill_name = "JTAC" + skill_level = SKILL_JTAC_NOVICE + max_skill_level = SKILL_JTAC_MAX + +/datum/skill/execution + skill_name = SKILL_EXECUTION + skill_level = SKILL_EXECUTION_DEFAULT + max_skill_level = SKILL_EXECUTION_MAX + +/datum/skill/intel + skill_name = SKILL_INTEL + skill_level = SKILL_INTEL_NOVICE + max_skill_level = SKILL_INTEL_MAX + +/datum/skill/domestic + skill_name = SKILL_DOMESTIC + skill_level = SKILL_DOMESTIC_NONE + max_skill_level = SKILL_DOMESTIC_MAX + +/datum/skill/fireman + skill_name = SKILL_FIREMAN + readable_skill_name = "fireman carrying" + skill_level = SKILL_FIREMAN_DEFAULT + max_skill_level = SKILL_FIREMAN_MAX + +/// Skill with an extra S at the end is a collection of multiple skills. Basically a skillSET +/// This is to organize and provide a common interface to the huge heap of skills there are +/datum/skills + /// The name of the skillset + var/name + // The mob that has this skillset + var/mob/owner + + // List of skill datums. + // Also, if this is populated when the datum is created, it will set the skill levels automagically + var/list/skills = list() + // Same as above, but for children of parents that just add a lil something else + var/list/additional_skills = list() + +/datum/skills/New(mob/skillset_owner) + owner = skillset_owner + + // Setup every single skill + for(var/skill_type in subtypesof(/datum/skill)) + var/datum/skill/S = new skill_type() + + // Fancy hack to convert a list of desired skill levels in each named skill into a skill level in the actual skill datum + // Lets the skills list be used multipurposely for both storing skill datums and choosing skill levels for different skillsets + var/predetermined_skill_level = additional_skills[S.skill_name] ? additional_skills[S.skill_name] : skills[S.skill_name] + skills[S.skill_name] = S + + if(!isnull(predetermined_skill_level)) + S.set_skill(predetermined_skill_level, owner) + +/datum/skills/Destroy() + owner = null + skills = null // Don't need to delete, /datum/skill should softdel + SStgui.close_uis(src) + return ..() + +// Checks if the given skill is contained in this skillset at all +/datum/skills/proc/has_skill(skill) + return isnull(skills[skill]) + +// Returns the skill DATUM for the given skill +/datum/skills/proc/get_skill(skill) + if(!skills) + return null + return skills[skill] + +// Returns the skill level for the given skill +/datum/skills/proc/get_skill_level(skill) + var/datum/skill/S = get_skill(skill) + if(!S) + return -1 + if(QDELETED(S)) + return -1 + return S.get_skill_level() + +// Sets the skill LEVEL for a given skill +/datum/skills/proc/set_skill(skill, new_level) + var/datum/skill/S = skills[skill] + if(!S) + return + return S.set_skill(new_level, owner) + +/datum/skills/proc/increment_skill(skill, increment, cap) + var/datum/skill/S = skills[skill] + if(!S || skillcheck(owner, skill, cap)) + return + return S.set_skill(min(cap,S.skill_level+increment), owner) + +/datum/skills/proc/decrement_skill(skill, increment) + var/datum/skill/S = skills[skill] + if(!S) + return + return S.set_skill(max(0,S.skill_level-increment), owner) + +// Checks if the skillset is AT LEAST skilled enough to pass a skillcheck for the given skill level +/datum/skills/proc/is_skilled(skill, req_level, is_explicit = FALSE) + var/datum/skill/S = get_skill(skill) + if(QDELETED(S)) + return FALSE + return S.is_skilled(req_level, is_explicit) + +// Adjusts the full skillset to a new type of skillset. Pass the datum type path for the desired skillset +/datum/skills/proc/set_skillset(skillset_type) + var/datum/skills/skillset = new skillset_type() + var/list/skill_levels = initial(skillset.skills) + + name = skillset.name + for(var/skill in skill_levels) + set_skill(skill, skill_levels[skill]) + qdel(skillset) diff --git a/code/datums/skills/synthetic.dm b/code/datums/skills/synthetic.dm new file mode 100644 index 000000000000..3925dd9605b3 --- /dev/null +++ b/code/datums/skills/synthetic.dm @@ -0,0 +1,90 @@ +/* +--------------------- +SYNTHETIC +--------------------- +*/ + +/datum/skills/synthetic + name = "Synthetic" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MASTER, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + ) + +/datum/skills/colonial_synthetic + name = SYNTH_COLONY + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_INTEL = SKILL_INTEL_TRAINED, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + ) + +/datum/skills/working_joe + name = SYNTH_WORKING_JOE + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, //So they can fully use the Maintenance Jack + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + ) + +/datum/skills/infiltrator_synthetic + name = SYNTH_INFILTRATOR + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MASTER, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + SKILL_ANTAG = SKILL_ANTAG_AGENT, + ) diff --git a/code/datums/skills/upp.dm b/code/datums/skills/upp.dm new file mode 100644 index 000000000000..77401ab62878 --- /dev/null +++ b/code/datums/skills/upp.dm @@ -0,0 +1,218 @@ +/* +-------------------------- +UNITED PROGRESSIVE PEOPLES +-------------------------- +*/ + +//NOTE: UPP make up for their subpar gear with extreme training. + +/datum/skills/upp + name = "UPP Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + ) + +/datum/skills/upp/combat_engineer + name = "UPP Sapper" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + ) + +/datum/skills/upp/combat_medic + name = "UPP Medic" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + ) + +/datum/skills/upp/specialist + name = "UPP Specialist" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + ) + +/datum/skills/upp/SL + name = "UPP Squad Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/upp/military_police + name = "UPP Military Police" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + ) + +/datum/skills/upp/officer + name = "UPP Officer" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/upp/kapitan + name = "UPP Kapitan" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/upp/commander + name = "UPP Command Officer" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + ) +/datum/skills/upp/conscript + name = "UPP Conscript" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + ) + + +//Survivor + +/datum/skills/military/survivor/upp_private + name = "UPP Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_sapper + name = "UPP Sapper" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_medic + name = "UPP Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_spec + name = "UPP Specialist" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + ) + +/datum/skills/military/survivor/upp_sl + name = "UPP Squad Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm new file mode 100644 index 000000000000..8a6d2fd2c8c2 --- /dev/null +++ b/code/datums/skills/uscm.dm @@ -0,0 +1,410 @@ +/* +------------------------------ +United States Colonial Marines +------------------------------ +*/ + +/datum/skills/pfc + name = "Private" + //same as default + +/datum/skills/pfc/crafty + name = "Crafty Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + ) + +/datum/skills/combat_medic + name = "Combat Medic" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/combat_medic/crafty + name = "Crafty Combat Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + ) + +/datum/skills/combat_engineer + name = "Combat Engineer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/smartgunner + name = "Squad Smartgunner" + skills = list( + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/specialist + name = "Squad Weapons Specialist" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. + SKILL_SPEC_WEAPONS = SKILL_SPEC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER + ) + +/datum/skills/tl + name = "Fireteam Leader" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/SL + name = "Squad Leader" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/intel + name = "Intelligence Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +/* +--------------------- +MILITARY NONCOMBATANT +--------------------- +*/ + +/datum/skills/doctor + name = "Doctor" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/nurse + name = "Nurse" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + ) + +/datum/skills/researcher + name = "Researcher" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/pilot + name = "Pilot Officer" + skills = list( + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/crew_chief + name = "Dropship Crew Chief" + skills = list( + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + ) + +/datum/skills/MP + name = "Military Police" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/MW + name = "Military Warden" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + ) + +/datum/skills/provost + name = "Provost" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + ) + +/datum/skills/OT + name = "Ordnance Technician" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/MT + name = "Maintenance Technician" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, + ) + +/datum/skills/mess_technician + name = "Mess Technician" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, // need to hunt food somehow + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER + ) + +/datum/skills/CT + name = "Cargo Technician" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/* +--------------------- +COMMAND STAFF +--------------------- +*/ + +/datum/skills/general + name = "General" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people + SKILL_INTEL = SKILL_INTEL_EXPERT + ) + +/datum/skills/commander + name = "Commanding Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED //can change ship alt + ) + +/datum/skills/XO + name = "Executive Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //to fix CIC apc. + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + ) + +/datum/skills/SO + name = "Staff Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/SEA + name = "Senior Enlisted Advisor" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/SEA/New(mob/skillset_owner) + ..() + give_action(skillset_owner, /datum/action/looc_toggle) + +/datum/skills/SEA/Destroy() + remove_action(owner, /datum/action/looc_toggle) + return ..() + +/datum/skills/CMO + name = "CMO" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/CMP + name = "Chief MP" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/auxiliary_officer + name = "Auxiliary Support Officer" + skills = list( + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + ) + +/datum/skills/CE + name = "Chief Engineer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_INTEL = SKILL_INTEL_TRAINED, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + ) + +/datum/skills/RO + name = "Requisition Officer" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm index 4a01e4e9d72b..cb3053a33442 100644 --- a/code/datums/statistics/entities/death_stats.dm +++ b/code/datums/statistics/entities/death_stats.dm @@ -84,6 +84,10 @@ if(!mind || statistic_exempt) return + var/area/area = get_area(death_loc) + handle_observer_message(cause_data, cause_mob, death_loc, area) + + // Perform logging above before get_player_from_key to avoid delays var/datum/entity/statistic/death/new_death = DB_ENTITY(/datum/entity/statistic/death) var/datum/entity/player/player_entity = get_player_from_key(mind.ckey) if(player_entity) @@ -95,11 +99,8 @@ new_death.role_name = get_role_name() new_death.mob_name = real_name new_death.faction_name = faction - new_death.is_xeno = FALSE - - var/area/A = get_area(death_loc) - new_death.area_name = A.name + new_death.area_name = area.name new_death.cause_name = cause_data?.cause_name var/datum/entity/player/cause_player = get_player_from_key(cause_data?.ckey) @@ -132,8 +133,6 @@ new_death.total_damage_taken = life_damage_taken_total new_death.total_revives_done = life_revives_total - handle_observer_message(cause_data, cause_mob, death_loc, A) - if(round_statistics) round_statistics.track_death(new_death) diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 5f8fae824312..1b8464820bb6 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -127,70 +127,42 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. spawn_guns() //the crate gives 2 guns /obj/structure/largecrate/black_market/confiscated_weaponry/proc/spawn_guns() - switch(rand(1,6)) + switch(rand(1, 5)) if(1) //pmc - if(prob(50)) - new /obj/item/weapon/gun/rifle/nsg23/no_lock(src) - new /obj/item/ammo_magazine/rifle/nsg23(src) - new /obj/item/ammo_magazine/rifle/nsg23(src) - new /obj/item/ammo_magazine/rifle/nsg23/ap(src) - new /obj/item/ammo_magazine/rifle/nsg23/extended(src) - else - new /obj/item/weapon/gun/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/weapon/gun/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) if(2) //pizza new /obj/item/weapon/gun/pistol/holdout(src) new /obj/item/ammo_magazine/pistol/holdout(src) if(3) //clf - switch(rand(1, 3)) + switch(rand(1, 2)) if(1) - new /obj/item/weapon/twohanded/lungemine/damaged(src) - if(2) new /obj/item/weapon/gun/smg/uzi(src) new /obj/item/ammo_magazine/smg/uzi/extended(src) new /obj/item/ammo_magazine/smg/uzi(src) new /obj/item/ammo_magazine/smg/uzi(src) - if(3) + if(2) new /obj/item/weapon/gun/smg/mac15(src) new /obj/item/ammo_magazine/smg/mac15/extended(src) new /obj/item/ammo_magazine/smg/mac15(src) new /obj/item/ammo_magazine/smg/mac15(src) if(4) //upp - if(prob(50)) - new /obj/item/weapon/gun/rifle/type71(src) - new /obj/item/ammo_magazine/rifle/type71/ap(src) - new /obj/item/ammo_magazine/rifle/type71(src) - new /obj/item/ammo_magazine/rifle/type71(src) - else - new /obj/item/weapon/gun/shotgun/type23/riot_control(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) //NO buckshot! + new /obj/item/weapon/gun/shotgun/type23/riot_control(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) //NO buckshot! if(5) //freelancer - if(prob(80)) - new /obj/item/weapon/gun/rifle/mar40(src) - new /obj/item/ammo_magazine/rifle/mar40/extended(src) - new /obj/item/ammo_magazine/rifle/mar40(src) - new /obj/item/ammo_magazine/rifle/mar40(src) - else - new /obj/item/weapon/gun/rifle/mar40/lmg(src) - new /obj/item/ammo_magazine/rifle/mar40/lmg(src) - if(6) //VAIPO - if(prob(50)) - new /obj/item/weapon/gun/rifle/mar40/tactical(src) - new /obj/item/ammo_magazine/rifle/mar40/extended(src) - new /obj/item/ammo_magazine/rifle/mar40/extended(src) - new /obj/item/ammo_magazine/rifle/mar40(src) - else - new /obj/item/weapon/gun/rifle/mar40/lmg(src) - new /obj/item/ammo_magazine/rifle/mar40/lmg(src) - new /obj/item/ammo_magazine/rifle/mar40/lmg(src) + new /obj/item/weapon/gun/rifle/mar40(src) + new /obj/item/ammo_magazine/rifle/mar40/extended(src) + new /obj/item/ammo_magazine/rifle/mar40(src) + new /obj/item/ammo_magazine/rifle/mar40(src) + /* Misc. Individual Guns */ @@ -561,10 +533,6 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/reagent_container/food/snacks/egg/random, /obj/item/reagent_container/food/snacks/egg/random, //not a dupe /obj/item/reagent_container/food/snacks/xemeatpie, - /obj/item/reagent_container/food/snacks/monkeycube, - /obj/item/reagent_container/food/snacks/monkeycube/farwacube, - /obj/item/reagent_container/food/snacks/monkeycube/stokcube, - /obj/item/reagent_container/food/snacks/monkeycube/yirencube, /obj/item/reagent_container/food/snacks/upp, /obj/item/reagent_container/food/snacks/mre_pack/xmas1, /obj/item/reagent_container/food/snacks/mre_pack/xmas2, @@ -722,13 +690,6 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted dollar_cost = 50 containertype = /obj/structure/largecrate/black_market -/datum/supply_packs/contraband/surplus/surplus_m4ra_extended - name = "surplus magazine box (Ext M4RA x 12)" - contains = list(/obj/item/ammo_box/magazine/m4ra/ext) - dollar_cost = 45 - crate_heat = 3 - containertype = /obj/structure/largecrate/black_market - /* - Misc. USCM weaponry - */ /datum/supply_packs/contraband/surplus/mk45_automag @@ -1108,7 +1069,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro new /obj/item/ammo_magazine/smg/mac15/extended(loc) new /obj/item/ammo_magazine/smg/mac15/extended(loc) loot_message = SPAN_NOTICE("It's some CLF SMG armaments.") - if(21 to 25) + if(21 to 29) // Discovered Yautja ruins.. (None of these will trigger any alarms. They are far too old, degraded, and useless for any Yautja to care.) new /obj/item/clothing/mask/yautja_flavor(loc) new /obj/item/clothing/suit/armor/yautja_flavor(loc) @@ -1116,13 +1077,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro new /obj/item/weapon/twohanded/yautja/glaive/damaged(loc) new /obj/item/stack/yautja_rope(loc) loot_message = SPAN_NOTICE("It's some strange ancient gear...?") - if(26 to 30) - // Damaged lunge mines, don't let the marines near these. Not even *close* to effective against even a runner. - new /obj/item/weapon/twohanded/lungemine/damaged(loc) - new /obj/item/weapon/twohanded/lungemine/damaged(loc) - new /obj/item/weapon/twohanded/lungemine/damaged(loc) - loot_message = SPAN_NOTICE("It's a bunch of lunge mines..?") - if(31 to 35) + if(30 to 35) // CLF nades! loot_message = SPAN_NOTICE("It's a package of assorted CLF grenades!") var/list/nades_to_pick = list( diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm index 60bf117a6b92..8e42fd1e76a8 100644 --- a/code/defines/procs/announcement.dm +++ b/code/defines/procs/announcement.dm @@ -45,13 +45,11 @@ if((H.faction != faction_to_display && !add_PMCs) || (H.faction != faction_to_display && add_PMCs && !(H.faction in FACTION_LIST_WY)) && !(faction_to_display in H.faction_group)) //faction checks targets.Remove(H) - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - switch(logging) - if(ARES_LOG_MAIN) - link.log_ares_announcement(title, message) - if(ARES_LOG_SECURITY) - link.log_ares_security(title, message) + switch(logging) + if(ARES_LOG_MAIN) + log_ares_announcement(title, message) + if(ARES_LOG_SECURITY) + log_ares_security(title, message) else if(faction_to_display == "Everyone (-Yautja)") for(var/mob/M in targets) @@ -98,13 +96,11 @@ for(var/mob/living/silicon/decoy/ship_ai/AI in ai_mob_list) INVOKE_ASYNC(AI, TYPE_PROC_REF(/mob/living/silicon/decoy/ship_ai, say), message) - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - switch(logging) - if(ARES_LOG_MAIN) - link.log_ares_announcement("[MAIN_AI_SYSTEM] Comms Update", message) - if(ARES_LOG_SECURITY) - link.log_ares_security("[MAIN_AI_SYSTEM] Security Update", message) + switch(logging) + if(ARES_LOG_MAIN) + log_ares_announcement("[MAIN_AI_SYSTEM] Comms Update", message) + if(ARES_LOG_SECURITY) + log_ares_security("[MAIN_AI_SYSTEM] Security Update", message) /proc/ai_silent_announcement(message, channel_prefix, bypass_cooldown = FALSE) if(!message) @@ -135,13 +131,11 @@ if(!isnull(signature)) message += "

Signed by,
[signature]
" - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - switch(ares_logging) - if(ARES_LOG_MAIN) - link.log_ares_announcement(title, message) - if(ARES_LOG_SECURITY) - link.log_ares_security(title, message) + switch(ares_logging) + if(ARES_LOG_MAIN) + log_ares_announcement(title, message) + if(ARES_LOG_SECURITY) + log_ares_security(title, message) announcement_helper(message, title, targets, sound_to_play) @@ -154,9 +148,7 @@ if(!ishuman(T) || isyautja(T) || !is_mainship_level(T.z)) targets.Remove(T) - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - link.log_ares_announcement("[title] Shipwide Update", message) + log_ares_announcement("[title] Shipwide Update", message) announcement_helper(message, title, targets, sound_to_play) diff --git a/code/game/bioscans.dm b/code/game/bioscans.dm index 62c801a02d29..ff6e00ec430e 100644 --- a/code/game/bioscans.dm +++ b/code/game/bioscans.dm @@ -109,24 +109,21 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) to_chat(ghost, ghost_scan) -/// This will do something after Project ARES. /datum/bioscan_data/proc/ares_can_bioscan() var/datum/ares_link/link = GLOB.ares_link if(!istype(link)) return FALSE - if(link.p_bioscan && !link.p_bioscan.inoperable()) + if(link.processor_bioscan && !link.processor_bioscan.inoperable()) return TRUE return FALSE /// The announcement to all Humans. Slightly off for the planet and elsewhere, accurate for the ship. /datum/bioscan_data/proc/ares_bioscan(forced = FALSE, variance = 2) - var/datum/ares_link/link = GLOB.ares_link if(!forced && !ares_can_bioscan()) message_admins("An ARES Bioscan has failed.") var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan failed. \n\nInvestigation into Bioscan subsystem recommended." - if(ares_can_log()) - link.log_ares_bioscan(name, input) + log_ares_bioscan(name, input) if(ares_can_interface()) marine_announcement(input, name, 'sound/misc/interference.ogg', logging = ARES_LOG_NONE) return @@ -137,8 +134,7 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) log_game("BIOSCAN: ARES bioscan completed. [input]") - if(forced || ares_can_log()) - link.log_ares_bioscan(name, input) //if interface is down, bioscan still logged, just have to go read it. + log_ares_bioscan(name, input) //if interface is down, bioscan still logged, just have to go read it. if(forced || ares_can_interface()) marine_announcement(input, name, 'sound/AI/bioscan.ogg', logging = ARES_LOG_NONE) else diff --git a/code/game/cas_manager/datums/cas_fire_envelope.dm b/code/game/cas_manager/datums/cas_fire_envelope.dm index d7c939b76e16..330521f34e36 100644 --- a/code/game/cas_manager/datums/cas_fire_envelope.dm +++ b/code/game/cas_manager/datums/cas_fire_envelope.dm @@ -181,7 +181,7 @@ apply_upgrade(user) if(!(user in guidance.users)) guidance.users += user - RegisterSignal(usr, COMSIG_MOB_RESISTED, PROC_REF(exit_cam_resist)) + RegisterSignal(user, COMSIG_MOB_RESISTED, PROC_REF(exit_cam_resist)) /datum/cas_fire_envelope/proc/apply_upgrade(user) @@ -220,6 +220,7 @@ M.reset_view() remove_upgrades(user) guidance.users -= user + UnregisterSignal(user, COMSIG_MOB_RESISTED) /datum/cas_fire_envelope/proc/exit_cam_resist(mob/user) SIGNAL_HANDLER diff --git a/code/game/gamemodes/cm_self_destruct.dm b/code/game/gamemodes/cm_self_destruct.dm index b86de24eed74..07c9c43a4768 100644 --- a/code/game/gamemodes/cm_self_destruct.dm +++ b/code/game/gamemodes/cm_self_destruct.dm @@ -259,12 +259,12 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi var/list/alive_mobs = list() //Everyone who will be destroyed on the zlevel(s). var/list/dead_mobs = list() //Everyone who only needs to see the cinematic. for(var/mob/current_mob as anything in GLOB.mob_list) //This only does something cool for the people about to die, but should prove pretty interesting. - if(!current_mob || !current_mob.loc) + var/turf/current_turf = get_turf(current_mob) + if(!current_mob || !current_mob.loc || !current_turf) continue //In case something changes when we sleep(). if(current_mob.stat == DEAD) dead_mobs |= current_mob continue - var/turf/current_turf = get_turf(current_mob) if(current_turf.z in z_levels) alive_mobs |= current_mob shake_camera(current_mob, 110, 4) @@ -286,6 +286,8 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi for(var/mob/current_mob in alive_mobs) if(current_mob && current_mob.loc) //Who knows, maybe they escaped, or don't exist anymore. var/turf/current_mob_turf = get_turf(current_mob) + if(!current_mob_turf) + continue if(current_mob_turf.z in z_levels) if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) continue diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index 258a1a962713..df04873ac140 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -265,7 +265,7 @@ continue if(groundside_humans > (groundside_xenos * GROUNDSIDE_XENO_MULTIPLIER)) - SSticker.mode.get_specific_call("Xenomorphs Groundside (Forsaken)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Xenomorphs Groundside (Forsaken)", TRUE, FALSE) TIMER_COOLDOWN_START(src, COOLDOWN_HIJACK_GROUND_CHECK, 1 MINUTES) diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index 3d856f35ce77..e7d7b7a67edf 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -193,7 +193,7 @@ announce_xeno_wave(wave) if(xeno_wave == 7) //Wave when Marines get reinforcements! - get_specific_call("Marine Reinforcements (Squad)", FALSE, TRUE, FALSE) + get_specific_call("Marine Reinforcements (Squad)", FALSE, TRUE) xeno_wave = min(xeno_wave + 1, WO_MAX_WAVE) diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 80f00c540383..d984aaa72c8a 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -604,7 +604,7 @@ if(JOB_SQUAD_MEDIC) old_lead.comm_title = "HM" if(JOB_SQUAD_TEAM_LEADER) - old_lead.comm_title = "TL" + old_lead.comm_title = "FTL" if(JOB_SQUAD_SMARTGUN) old_lead.comm_title = "SG" if(JOB_SQUAD_LEADER) diff --git a/code/game/machinery/ARES/ARES.dm b/code/game/machinery/ARES/ARES.dm index ed4391c89c24..1ecbb4a5d7d6 100644 --- a/code/game/machinery/ARES/ARES.dm +++ b/code/game/machinery/ARES/ARES.dm @@ -8,7 +8,6 @@ unslashable = TRUE unacidable = TRUE - var/link_id = MAIN_SHIP_DEFAULT_NAME var/datum/ares_link/link /obj/structure/machinery/ares/ex_act(severity) @@ -40,14 +39,12 @@ log_debug("Error: link_systems called without a link datum") if(link && !override) return FALSE - if(new_link.link_id == link_id) + if(new_link) link = new_link - log_debug("[name] linked to Ares Link [link_id]") new_link.linked_systems += src return TRUE /obj/structure/machinery/ares/proc/delink() - log_debug("[name] delinked from Ares Link [link.link_id]") link.linked_systems -= src link = null @@ -63,11 +60,11 @@ /obj/structure/machinery/ares/processor/apollo/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) ..() - new_link.p_apollo = src + new_link.processor_apollo = src /obj/structure/machinery/ares/processor/apollo/delink() - if(link && link.p_apollo == src) - link.p_apollo = null + if(link && link.processor_apollo == src) + link.processor_apollo = null ..() /obj/structure/machinery/ares/processor/interface @@ -77,11 +74,11 @@ /obj/structure/machinery/ares/processor/interface/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) ..() - new_link.p_interface = src + new_link.processor_interface = src /obj/structure/machinery/ares/processor/interface/delink() - if(link && link.p_interface == src) - link.p_interface = null + if(link && link.processor_interface == src) + link.processor_interface = null ..() /obj/structure/machinery/ares/processor/bioscan @@ -91,11 +88,11 @@ /obj/structure/machinery/ares/processor/bioscan/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) ..() - new_link.p_bioscan = src + new_link.processor_bioscan = src /obj/structure/machinery/ares/processor/bioscan/delink() - if(link && link.p_bioscan == src) - link.p_bioscan = null + if(link && link.processor_bioscan == src) + link.processor_bioscan = null ..() /// Central Core @@ -104,130 +101,17 @@ desc = "This is ARES' central processor. Made of a casing designed to withstand nuclear blasts, the CPU also contains ARES' blackbox recorder." icon_state = "CPU" +/obj/structure/machinery/ares/cpu/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + ..() + new_link.central_processor = src + +/obj/structure/machinery/ares/cpu/delink() + if(link && link.central_processor == src) + link.central_processor = null + ..() + /// Memory Substrate, /obj/structure/machinery/ares/substrate name = "ARES Substrate" desc = "The memory substrate of ARES, containing complex protocols and information. Limited capabilities can operate on substrate alone, without the main ARES Unit operational." icon_state = "substrate" - -// #################### ARES Interface Console ##################### -/obj/structure/machinery/computer/ares_console - name = "ARES Interface" - desc = "A console built to interface with ARES, allowing for 1:1 communication." - icon = 'icons/obj/structures/machinery/ares.dmi' - icon_state = "console" - exproof = TRUE - - var/current_menu = "login" - var/last_menu = "" - - var/authentication = ARES_ACCESS_BASIC - - /// The last person to login. - var/last_login - /// The person pretending to be last_login - var/sudo_holder - /// A record of who logged in and when. - var/list/access_list = list() - - /// The ID used to link all devices. - var/link_id = MAIN_SHIP_DEFAULT_NAME - var/datum/ares_link/link - - /// The current deleted chat log of 1:1 conversations being read. - var/list/deleted_1to1 = list() - - /// Holds all (/datum/ares_record/announcement)s - var/list/records_announcement = list() - /// Holds all (/datum/ares_record/bioscan)s - var/list/records_bioscan = list() - /// Holds all (/datum/ares_record/bombardment)s - var/list/records_bombardment = list() - /// Holds all (/datum/ares_record/deletion)s - var/list/records_deletion = list() - /// Holds all (/datum/ares_record/talk_log)s - var/list/records_talking = list() - /// Holds all (/datum/ares_record/requisition_log)s - var/list/records_asrs = list() - /// Holds all (/datum/ares_record/security)s (including AA) - var/list/records_security = list() - /// Holds all (/datum/ares_record/flight)s - var/list/records_flight = list() - /// Is nuke request usable or not? - var/nuke_available = TRUE - - - COOLDOWN_DECLARE(ares_distress_cooldown) - COOLDOWN_DECLARE(ares_nuclear_cooldown) - COOLDOWN_DECLARE(ares_quarters_cooldown) - -/obj/structure/machinery/computer/ares_console/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) - if(link && !override) - return FALSE - if(new_link.link_id == link_id) - new_link.interface = src - link = new_link - log_debug("[name] linked to Ares Link [link_id]") - new_link.linked_systems += src - return TRUE - -/obj/structure/machinery/computer/ares_console/Initialize(mapload, ...) - link_systems(override = FALSE) - . = ..() - -/obj/structure/machinery/computer/ares_console/proc/delink() - if(link && link.interface == src) - link.interface = null - link.linked_systems -= src - link = null - -/obj/structure/machinery/computer/ares_console/Destroy() - delink() - return ..() - -// #################### Working Joe Ticket Console ##################### -/obj/structure/machinery/computer/working_joe - name = "APOLLO Maintenance Controller" - desc = "A console built to facilitate Working Joes and their operation, allowing for simple allocation of resources." - icon = 'icons/obj/structures/machinery/ares.dmi' - icon_state = "console" - exproof = TRUE - - /// The ID used to link all devices. - var/link_id = MAIN_SHIP_DEFAULT_NAME - var/datum/ares_link/link - var/obj/structure/machinery/ares/processor/interface/processor - - var/current_menu = "login" - var/last_menu = "" - - var/authentication = ARES_ACCESS_BASIC - /// The last person to login. - var/last_login - /// A record of who logged in and when. - var/list/login_list = list() - - -/obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) - if(link && !override) - return FALSE - if(new_link.link_id == link_id) - new_link.ticket_computers += src - link = new_link - log_debug("[name] linked to Ares Link [link_id]") - new_link.linked_systems += src - return TRUE - -/obj/structure/machinery/computer/working_joe/Initialize(mapload, ...) - link_systems(override = FALSE) - . = ..() - -/obj/structure/machinery/computer/working_joe/proc/delink() - if(link) - link.ticket_computers -= src - link.linked_systems -= src - link = null - -/obj/structure/machinery/computer/working_joe/Destroy() - delink() - return ..() diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm new file mode 100644 index 000000000000..64755897bc8e --- /dev/null +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -0,0 +1,471 @@ +// #################### ARES Interface Console ##################### +/obj/structure/machinery/computer/ares_console + name = "ARES Interface" + desc = "A console built to interface with ARES, allowing for 1:1 communication." + icon = 'icons/obj/structures/machinery/ares.dmi' + icon_state = "console" + exproof = TRUE + + var/current_menu = "login" + var/last_menu = "" + + var/authentication = ARES_ACCESS_BASIC + + /// The last person to login. + var/last_login + /// The person pretending to be last_login + var/sudo_holder + + /// The current deleted chat log of 1:1 conversations being read. + var/list/deleted_1to1 = list() + + /// The ID used to link all devices. + var/datum/ares_link/link + /// The datacore storing all the information. + var/datum/ares_datacore/datacore + +/obj/structure/machinery/computer/ares_console/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link) + new_link.interface = src + link = new_link + new_link.linked_systems += src + if(!datacore) + datacore = GLOB.ares_datacore + return TRUE + +/obj/structure/machinery/computer/ares_console/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/computer/ares_console/proc/delink() + if(link) + if(link.interface == src) + link.interface = null + link.linked_systems -= src + link = null + datacore = null + +/obj/structure/machinery/computer/ares_console/Destroy() + delink() + return ..() + +// ------ ARES Interface UI ------ // + +/obj/structure/machinery/computer/ares_console/attack_hand(mob/user as mob) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/ares_console/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AresInterface", name) + ui.open() + +/obj/structure/machinery/computer/ares_console/ui_data(mob/user) + var/list/data = list() + + data["current_menu"] = current_menu + data["last_page"] = last_menu + + data["logged_in"] = last_login + data["sudo"] = sudo_holder ? TRUE : FALSE + + data["access_text"] = "[sudo_holder ? "(SUDO)," : ""] access level [authentication], [ares_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = security_level + data["evac_status"] = EvacuationAuthority.evac_status + data["worldtime"] = world.time + + data["access_log"] = datacore.interface_access_list + data["apollo_log"] = datacore.apollo_log + + data["deleted_conversation"] = deleted_1to1 + + data["distresstime"] = datacore.ares_distress_cooldown + data["distresstimelock"] = DISTRESS_TIME_LOCK + data["quarterstime"] = datacore.ares_quarters_cooldown + data["mission_failed"] = SSticker.mode.is_in_endgame + data["nuketimelock"] = NUCLEAR_TIME_LOCK + data["nuke_available"] = datacore.nuke_available + + var/list/logged_announcements = list() + for(var/datum/ares_record/announcement/broadcast as anything in datacore.records_announcement) + var/list/current_broadcast = list() + current_broadcast["time"] = broadcast.time + current_broadcast["title"] = broadcast.title + current_broadcast["details"] = broadcast.details + current_broadcast["ref"] = "\ref[broadcast]" + logged_announcements += list(current_broadcast) + data["records_announcement"] = logged_announcements + + var/list/logged_alerts = list() + for(var/datum/ares_record/security/security_alert as anything in datacore.records_security) + var/list/current_alert = list() + current_alert["time"] = security_alert.time + current_alert["title"] = security_alert.title + current_alert["details"] = security_alert.details + current_alert["ref"] = "\ref[security_alert]" + logged_alerts += list(current_alert) + data["records_security"] = logged_alerts + + var/list/logged_flights = list() + for(var/datum/ares_record/flight/flight_log as anything in datacore.records_flight) + var/list/current_flight = list() + current_flight["time"] = flight_log.time + current_flight["title"] = flight_log.title + current_flight["details"] = flight_log.details + current_flight["user"] = flight_log.user + current_flight["ref"] = "\ref[flight_log]" + logged_flights += list(current_flight) + data["records_flight"] = logged_flights + + var/list/logged_bioscans = list() + for(var/datum/ares_record/bioscan/scan as anything in datacore.records_bioscan) + var/list/current_scan = list() + current_scan["time"] = scan.time + current_scan["title"] = scan.title + current_scan["details"] = scan.details + current_scan["ref"] = "\ref[scan]" + logged_bioscans += list(current_scan) + data["records_bioscan"] = logged_bioscans + + var/list/logged_bombs = list() + for(var/datum/ares_record/bombardment/bomb as anything in datacore.records_bombardment) + var/list/current_bomb = list() + current_bomb["time"] = bomb.time + current_bomb["title"] = bomb.title + current_bomb["details"] = bomb.details + current_bomb["user"] = bomb.user + current_bomb["ref"] = "\ref[bomb]" + logged_bombs += list(current_bomb) + data["records_bombardment"] = logged_bombs + + var/list/logged_deletes = list() + for(var/datum/ares_record/deletion/deleted as anything in datacore.records_deletion) + if(!istype(deleted)) + continue + var/list/current_delete = list() + current_delete["time"] = deleted.time + current_delete["title"] = deleted.title + current_delete["details"] = deleted.details + current_delete["user"] = deleted.user + current_delete["ref"] = "\ref[deleted]" + logged_deletes += list(current_delete) + data["records_deletion"] = logged_deletes + + var/list/logged_discussions = list() + for(var/datum/ares_record/deleted_talk/deleted_convo as anything in datacore.records_deletion) + if(!istype(deleted_convo)) + continue + var/list/deleted_disc = list() + deleted_disc["time"] = deleted_convo.time + deleted_disc["title"] = deleted_convo.title + deleted_disc["ref"] = "\ref[deleted_convo]" + logged_discussions += list(deleted_disc) + data["deleted_discussions"] = logged_discussions + + var/list/logged_orders = list() + for(var/datum/ares_record/requisition_log/req_order as anything in datacore.records_asrs) + if(!istype(req_order)) + continue + var/list/current_order = list() + current_order["time"] = req_order.time + current_order["details"] = req_order.details + current_order["title"] = req_order.title + current_order["user"] = req_order.user + current_order["ref"] = "\ref[req_order]" + logged_orders += list(current_order) + data["records_requisition"] = logged_orders + + var/list/logged_convos = list() + var/list/active_convo = list() + var/active_ref + for(var/datum/ares_record/talk_log/log as anything in datacore.records_talking) + if(!istype(log)) + continue + if(log.user == last_login) + active_convo = log.conversation + active_ref = "\ref[log]" + + var/list/current_convo = list() + current_convo["user"] = log.user + current_convo["ref"] = "\ref[log]" + current_convo["conversation"] = log.conversation + logged_convos += list(current_convo) + + data["active_convo"] = active_convo + data["active_ref"] = active_ref + data["conversations"] = logged_convos + + return data + +/obj/structure/machinery/computer/ares_console/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/ares_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + playsound(src, "keyboard_alt", 15, 1) + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + var/temp_holder = current_menu + current_menu = last_menu + last_menu = temp_holder + + if("login") + var/mob/living/carbon/human/operator = usr + var/obj/item/card/id/idcard = operator.get_active_hand() + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else + to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + datacore.interface_access_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." + current_menu = "main" + + if("sudo") + var/new_user = tgui_input_text(usr, "Enter Sudo Username", "Sudo User", encode = FALSE) + if(new_user) + if(new_user == sudo_holder) + last_login = sudo_holder + sudo_holder = null + return FALSE + if(new_user == last_login) + to_chat(usr, SPAN_WARNING("Already remote logged in as this user.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + sudo_holder = last_login + last_login = new_user + datacore.interface_access_list += "[last_login] at [worldtime2text()], Sudo Access." + return TRUE + if("sudo_logout") + datacore.interface_access_list += "[last_login] at [worldtime2text()], Sudo Logout." + last_login = sudo_holder + sudo_holder = null + return + // -- Page Changers -- // + if("logout") + last_menu = current_menu + current_menu = "login" + if(sudo_holder) + datacore.interface_access_list += "[last_login] at [worldtime2text()], Sudo Logout." + last_login = sudo_holder + sudo_holder = null + datacore.interface_access_list += "[last_login] logged out at [worldtime2text()]." + + if("home") + last_menu = current_menu + current_menu = "main" + if("page_1to1") + last_menu = current_menu + current_menu = "talking" + if("page_announcements") + last_menu = current_menu + current_menu = "announcements" + if("page_bioscans") + last_menu = current_menu + current_menu = "bioscans" + if("page_bombardments") + last_menu = current_menu + current_menu = "bombardments" + if("page_apollo") + last_menu = current_menu + current_menu = "apollo" + if("page_access") + last_menu = current_menu + current_menu = "access_log" + if("page_security") + last_menu = current_menu + current_menu = "security" + if("page_flight") + last_menu = current_menu + current_menu = "flight_log" + if("page_requisitions") + last_menu = current_menu + current_menu = "requisitions" + if("page_emergency") + last_menu = current_menu + current_menu = "emergency" + if("page_deleted") + last_menu = current_menu + current_menu = "delete_log" + if("page_deleted_1to1") + last_menu = current_menu + current_menu = "deleted_talks" + + // -- Delete Button -- // + if("delete_record") + var/datum/ares_record/record = locate(params["record"]) + if(record.record_name == ARES_RECORD_DELETED) + return FALSE + var/datum/ares_record/deletion/new_delete = new + var/new_details = "Error" + var/new_title = "Error" + switch(record.record_name) + if(ARES_RECORD_ANNOUNCE) + new_title = "[record.title] at [record.time]" + new_details = record.details + datacore.records_announcement -= record + if(ARES_RECORD_SECURITY, ARES_RECORD_ANTIAIR) + new_title = "[record.title] at [record.time]" + new_details = record.details + datacore.records_security -= record + if(ARES_RECORD_BIOSCAN) + new_title = "[record.title] at [record.time]" + new_details = record.details + datacore.records_bioscan -= record + if(ARES_RECORD_BOMB) + new_title = "[record.title] at [record.time]" + new_details = "[record.details] Launched by [record.user]." + datacore.records_bombardment -= record + + new_delete.details = new_details + new_delete.user = last_login + new_delete.title = new_title + + datacore.records_deletion += new_delete + + // -- 1:1 Conversation -- // + if("new_conversation") + var/datum/ares_record/talk_log/convo = new(last_login) + convo.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], 'New 1:1 link initiated. Greetings, [last_login].'" + datacore.records_talking += convo + + if("clear_conversation") + var/datum/ares_record/talk_log/conversation = locate(params["active_convo"]) + if(!istype(conversation)) + return FALSE + var/datum/ares_record/deleted_talk/deleted = new + deleted.title = conversation.title + deleted.conversation = conversation.conversation + deleted.user = conversation.user + datacore.records_deletion += deleted + datacore.records_talking -= conversation + + if("message_ares") + var/message = tgui_input_text(usr, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) + if(message) + message_ares(message, usr, params["active_convo"]) + + if("read_record") + var/datum/ares_record/deleted_talk/conversation = locate(params["record"]) + deleted_1to1 = conversation.conversation + last_menu = current_menu + current_menu = "read_deleted" + + // -- Emergency Buttons -- // + if("general_quarters") + if(!COOLDOWN_FINISHED(datacore, ares_quarters_cooldown)) + to_chat(usr, SPAN_WARNING("It has not been long enough since the last General Quarters call!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(security_level < SEC_LEVEL_RED) + set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE) + shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') + log_game("[key_name(usr)] has called for general quarters via ARES.") + message_admins("[key_name_admin(usr)] has called for general quarters via ARES.") + log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.") + COOLDOWN_START(datacore, ares_quarters_cooldown, 10 MINUTES) + . = TRUE + + if("evacuation_start") + if(security_level < SEC_LEVEL_RED) + to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + if(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) + to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + if(!EvacuationAuthority.initiate_evacuation()) + to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + log_game("[key_name(usr)] has called for an emergency evacuation via ARES.") + message_admins("[key_name_admin(usr)] has called for an emergency evacuation via ARES.") + log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.") + . = TRUE + + if("distress") + if(!SSticker.mode) + return FALSE //Not a game mode? + if(world.time < DISTRESS_TIME_LOCK) + to_chat(usr, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(!COOLDOWN_FINISHED(datacore, ares_distress_cooldown)) + to_chat(usr, SPAN_WARNING("The distress launcher is cooling down!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(security_level == SEC_LEVEL_DELTA) + to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + else if(security_level < SEC_LEVEL_RED) + to_chat(usr, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + for(var/client/admin in GLOB.admins) + if((R_ADMIN|R_MOD) & admin.admin_holder.rights) + playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) + SSticker.mode.request_ert(usr, TRUE) + to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) + COOLDOWN_START(datacore, ares_distress_cooldown, COOLDOWN_COMM_REQUEST) + return TRUE + + if("nuclearbomb") + if(!SSticker.mode) + return FALSE //Not a game mode? + if(world.time < NUCLEAR_TIME_LOCK) + to_chat(usr, SPAN_WARNING("It is too soon to request Nuclear Ordnance!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(!COOLDOWN_FINISHED(datacore, ares_nuclear_cooldown)) + to_chat(usr, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame) + to_chat(usr, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + var/reason = tgui_input_text(usr, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance") + if(!reason) + return FALSE + for(var/client/admin in GLOB.admins) + if((R_ADMIN|R_MOD) & admin.admin_holder.rights) + playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) + message_admins("[key_name(usr)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(usr)] (APPROVE) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + to_chat(usr, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]")) + log_ares_security("Nuclear Ordnance Request", "[last_login] has sent a request for nuclear ordnance for the following reason: [reason]") + if(ares_can_interface()) + ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V") + ai_silent_announcement("Reason given: [reason].", ".V") + COOLDOWN_START(datacore, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT) + return TRUE diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm new file mode 100644 index 000000000000..ad4df31c35a8 --- /dev/null +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -0,0 +1,414 @@ +// #################### Working Joe Ticket Console ##################### +/obj/structure/machinery/computer/working_joe + name = "APOLLO Maintenance Controller" + desc = "A console built to facilitate Working Joes and their operation, allowing for simple allocation of resources." + icon = 'icons/obj/structures/machinery/ares.dmi' + icon_state = "console" + exproof = TRUE + + /// The ID used to link all devices. + var/datum/ares_link/link + /// The datacore storing all the information. + var/datum/ares_datacore/datacore + + var/current_menu = "login" + var/last_menu = "" + + var/authentication = ARES_ACCESS_BASIC + /// The last person to login. + var/last_login + + +/obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link) + new_link.ticket_computers += src + link = new_link + new_link.linked_systems += src + if(!datacore) + datacore = GLOB.ares_datacore + return TRUE + +/obj/structure/machinery/computer/working_joe/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/computer/working_joe/proc/delink() + if(link) + link.ticket_computers -= src + link.linked_systems -= src + link = null + datacore = null + +/obj/structure/machinery/computer/working_joe/Destroy() + delink() + return ..() + +// ------ Maintenance Controller UI ------ // +/obj/structure/machinery/computer/working_joe/attack_hand(mob/user as mob) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/working_joe/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "WorkingJoe", name) + ui.open() + +/obj/structure/machinery/computer/working_joe/ui_data(mob/user) + var/list/data = list() + + data["current_menu"] = current_menu + data["last_page"] = last_menu + + data["logged_in"] = last_login + + data["access_text"] = "access level [authentication], [ares_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = security_level + data["worldtime"] = world.time + + data["access_log"] = list() + data["access_log"] += datacore.apollo_login_list + + data["apollo_log"] = list() + data["apollo_log"] += datacore.apollo_log + + var/list/logged_maintenance = list() + for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) + if(!istype(maint_ticket)) + continue + var/lock_status = TICKET_OPEN + switch(maint_ticket.ticket_status) + if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_COMPLETED) + lock_status = TICKET_CLOSED + + var/list/current_maint = list() + current_maint["id"] = maint_ticket.ticket_id + current_maint["time"] = maint_ticket.ticket_time + current_maint["priority_status"] = maint_ticket.ticket_priority + current_maint["category"] = maint_ticket.ticket_name + current_maint["details"] = maint_ticket.ticket_details + current_maint["status"] = maint_ticket.ticket_status + current_maint["submitter"] = maint_ticket.ticket_submitter + current_maint["assignee"] = maint_ticket.ticket_assignee + current_maint["lock_status"] = lock_status + current_maint["ref"] = "\ref[maint_ticket]" + logged_maintenance += list(current_maint) + data["maintenance_tickets"] = logged_maintenance + + var/list/logged_access = list() + var/list/requesting_access = list() + for(var/datum/ares_ticket/access/access_ticket as anything in link.tickets_access) + var/lock_status = TICKET_OPEN + switch(access_ticket.ticket_status) + if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED) + lock_status = TICKET_CLOSED + + var/list/current_ticket = list() + current_ticket["id"] = access_ticket.ticket_id + current_ticket["time"] = access_ticket.ticket_time + current_ticket["priority_status"] = access_ticket.ticket_priority + current_ticket["title"] = access_ticket.ticket_name + current_ticket["details"] = access_ticket.ticket_details + current_ticket["status"] = access_ticket.ticket_status + current_ticket["submitter"] = access_ticket.ticket_submitter + current_ticket["assignee"] = access_ticket.ticket_assignee + current_ticket["lock_status"] = lock_status + current_ticket["ref"] = "\ref[access_ticket]" + logged_access += list(current_ticket) + + if(lock_status == TICKET_OPEN) + requesting_access += access_ticket.ticket_name + data["access_tickets"] = logged_access + + return data + +/obj/structure/machinery/computer/working_joe/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/working_joe/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/playsound = TRUE + var/mob/living/carbon/human/operator = usr + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + var/temp_holder = current_menu + current_menu = last_menu + last_menu = temp_holder + + if("login") + + var/obj/item/card/id/idcard = operator.get_active_hand() + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else + to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + datacore.apollo_login_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." + current_menu = "main" + + if("logout") + last_menu = current_menu + current_menu = "login" + datacore.apollo_login_list += "[last_login] logged out at [worldtime2text()]." + + if("home") + last_menu = current_menu + current_menu = "main" + if("page_logins") + last_menu = current_menu + current_menu = "login_records" + if("page_apollo") + last_menu = current_menu + current_menu = "apollo" + if("page_request") + last_menu = current_menu + current_menu = "access_requests" + if("page_report") + last_menu = current_menu + current_menu = "maint_reports" + if("page_tickets") + last_menu = current_menu + current_menu = "access_tickets" + if("page_maintenance") + last_menu = current_menu + current_menu = "maint_claim" + + if("new_report") + var/priority_report = FALSE + var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) + switch(maint_type) + if("Major Structural Damage", "Fire", "Communications Failure", "Power Generation Failure") + priority_report = TRUE + + if(!maint_type) + return FALSE + var/details = tgui_input_text(operator, "What are the details for this report?", "Ticket Details", encode = FALSE) + if(!details) + return FALSE + + if((authentication >= APOLLO_ACCESS_REPORTER) && !priority_report) + var/is_priority = tgui_alert(operator, "Is this a priority report?", "Priority designation", list("Yes", "No")) + if(is_priority == "Yes") + priority_report = TRUE + + var/confirm = alert(operator, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"]\n Category: '[maint_type]'\n Details: '[details]'\n\n Is this correct?", "Confirmation", "Yes", "No") + if(confirm == "Yes") + if(link) + var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, maint_type, details, priority_report) + link.tickets_maintenance += maint_ticket + if(priority_report) + ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") + log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") + return TRUE + return FALSE + + if("claim_ticket") + var/datum/ares_ticket/ticket = locate(params["ticket"]) + if(!istype(ticket)) + return FALSE + var/claim = TRUE + var/assigned = ticket.ticket_assignee + if(assigned) + if(assigned == last_login) + var/prompt = tgui_alert(usr, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) + if(prompt != "Yes") + return FALSE + /// set ticket back to pending + ticket.ticket_assignee = null + ticket.ticket_status = TICKET_PENDING + return claim + var/choice = tgui_alert(usr, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) + if(choice != "Yes") + claim = FALSE + if(claim) + ticket.ticket_assignee = last_login + ticket.ticket_status = TICKET_ASSIGNED + return claim + + if("cancel_ticket") + var/datum/ares_ticket/ticket = locate(params["ticket"]) + if(!istype(ticket)) + return FALSE + if(ticket.ticket_submitter != last_login) + to_chat(usr, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) + return FALSE + to_chat(usr, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) + ticket.ticket_status = TICKET_CANCELLED + if(ticket.ticket_priority) + ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") + return TRUE + + if("mark_ticket") + var/datum/ares_ticket/ticket = locate(params["ticket"]) + if(!istype(ticket)) + return FALSE + if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) + to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + return FALSE + var/choice = tgui_alert(usr, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) + switch(choice) + if(TICKET_COMPLETED) + ticket.ticket_status = TICKET_COMPLETED + if(TICKET_REJECTED) + ticket.ticket_status = TICKET_REJECTED + else + return FALSE + if(ticket.ticket_priority) + ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") + to_chat(usr, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) + return TRUE + + if("new_access") + var/obj/item/card/id/idcard = operator.get_active_hand() + var/has_id = FALSE + if(istype(idcard)) + has_id = TRUE + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + has_id = TRUE + if(!has_id) + to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(idcard.registered_name != last_login) + to_chat(operator, SPAN_WARNING("This ID card does not match the active login!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + var/details = tgui_input_text(operator, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) + if(!details) + return FALSE + + var/confirm = alert(operator, "Please confirm the submission of your access ticket request.\n\nHolder: '[last_login]'\nDetails: '[details]'\n\nIs this correct?", "Confirmation", "Yes", "No") + if(confirm != "Yes" || !link) + return FALSE + var/datum/ares_ticket/access/access_ticket = new(last_login, details, FALSE, idcard.registered_gid) + link.waiting_ids += idcard + link.tickets_access += access_ticket + log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Details of '[details]'.") + message_admins(SPAN_STAFF_IC("[key_name_admin(operator)] created a new ARES Access Ticket."), 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] requesting access for '[details].") + return TRUE + + if("return_access") + playsound = FALSE + var/datum/ares_ticket/access/access_ticket + for(var/datum/ares_ticket/access/possible_ticket in link.tickets_access) + if(possible_ticket.ticket_status != TICKET_GRANTED) + continue + if(possible_ticket.ticket_name != last_login) + continue + access_ticket = possible_ticket + break + + for(var/obj/item/card/id/identification in link.active_ids) + if(!istype(identification)) + continue + if(identification.registered_gid != access_ticket.user_id_num) + continue + + access_ticket.ticket_status = TICKET_RETURNED + identification.access -= ACCESS_MARINE_AI_TEMP + identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]." + + to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered.")) + playsound(src, 'sound/machines/chime.ogg', 15, 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] surrendered their access.") + + authentication = get_ares_access(identification) + if(authentication) + datacore.apollo_login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket." + return TRUE + + to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + if("auth_access") + playsound = FALSE + var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) + if(!access_ticket) + return FALSE + for(var/obj/item/card/id/identification in link.waiting_ids) + if(!istype(identification)) + continue + if(identification.registered_gid != access_ticket.user_id_num) + continue + identification.handle_ares_access(last_login, operator) + access_ticket.ticket_status = TICKET_GRANTED + playsound(src, 'sound/machines/chime.ogg', 15, 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was granted access by [last_login].") + return TRUE + for(var/obj/item/card/id/identification in link.active_ids) + if(!istype(identification)) + continue + if(identification.registered_gid != access_ticket.user_id_num) + continue + identification.handle_ares_access(last_login, operator) + access_ticket.ticket_status = TICKET_REVOKED + playsound(src, 'sound/machines/chime.ogg', 15, 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] had access revoked by [last_login].") + return TRUE + return FALSE + + if("reject_access") + var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) + if(!istype(access_ticket)) + return FALSE + if(access_ticket.ticket_assignee != last_login && access_ticket.ticket_assignee) //must be claimed by you or unclaimed.) + to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + return FALSE + access_ticket.ticket_status = TICKET_REJECTED + to_chat(usr, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was rejected access by [last_login].") + return TRUE + + if(playsound) + playsound(src, "keyboard_alt", 15, 1) + +/obj/item/card/id/proc/handle_ares_access(logged_in, mob/user) + var/operator = key_name(user) + var/datum/ares_link/link = GLOB.ares_link + if(logged_in == MAIN_AI_SYSTEM) + if(!user) + operator = "[MAIN_AI_SYSTEM] (Sensor Trip)" + else + operator = "[user.ckey]/([MAIN_AI_SYSTEM])" + if(ACCESS_MARINE_AI_TEMP in access) + access -= ACCESS_MARINE_AI_TEMP + link.active_ids -= src + modification_log += "Temporary AI access revoked by [operator]" + to_chat(user, SPAN_NOTICE("Access revoked from [registered_name].")) + else + access += ACCESS_MARINE_AI_TEMP + modification_log += "Temporary AI access granted by [operator]" + to_chat(user, SPAN_NOTICE("Access granted to [registered_name].")) + link.waiting_ids -= src + link.active_ids += src + return TRUE diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index e03f218f0f34..4dbcf794f7be 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -1,4 +1,5 @@ GLOBAL_DATUM_INIT(ares_link, /datum/ares_link, new) +GLOBAL_DATUM_INIT(ares_datacore, /datum/ares_datacore, new) GLOBAL_LIST_INIT(maintenance_categories, list( "Broken Light", "Shattered Glass", @@ -15,26 +16,56 @@ GLOBAL_LIST_INIT(maintenance_categories, list( )) /datum/ares_link - var/link_id = MAIN_SHIP_DEFAULT_NAME /// All motion triggers for the link var/list/linked_alerts = list() /// All machinery for the link var/list/linked_systems = list() - var/obj/structure/machinery/ares/processor/interface/p_interface - var/obj/structure/machinery/ares/processor/apollo/p_apollo - var/obj/structure/machinery/ares/processor/bioscan/p_bioscan + var/obj/structure/machinery/ares/cpu/central_processor + var/obj/structure/machinery/ares/processor/interface/processor_interface + var/obj/structure/machinery/ares/processor/apollo/processor_apollo + var/obj/structure/machinery/ares/processor/bioscan/processor_bioscan var/obj/structure/machinery/computer/ares_console/interface var/list/obj/structure/machinery/computer/working_joe/ticket_computers = list() - /// The chat log of the apollo link. Timestamped. - var/list/apollo_log = list() - /// Working Joe stuff var/list/tickets_maintenance = list() var/list/tickets_access = list() var/list/waiting_ids = list() var/list/active_ids = list() +/datum/ares_datacore + /// A record of who logged in and when. + var/list/interface_access_list = list() + /// Access list for Apollo Maintenance Console + var/list/apollo_login_list = list() + + /// The chat log of the apollo link. Timestamped. + var/list/apollo_log = list() + + /// Holds all (/datum/ares_record/announcement)s + var/list/records_announcement = list() + /// Holds all (/datum/ares_record/bioscan)s + var/list/records_bioscan = list() + /// Holds all (/datum/ares_record/bombardment)s + var/list/records_bombardment = list() + /// Holds all (/datum/ares_record/deletion)s + var/list/records_deletion = list() + /// Holds all (/datum/ares_record/talk_log)s + var/list/records_talking = list() + /// Holds all (/datum/ares_record/requisition_log)s + var/list/records_asrs = list() + /// Holds all (/datum/ares_record/security)s (including AA) + var/list/records_security = list() + /// Holds all (/datum/ares_record/flight)s + var/list/records_flight = list() + /// Is nuke request usable or not? + var/nuke_available = TRUE + + + COOLDOWN_DECLARE(ares_distress_cooldown) + COOLDOWN_DECLARE(ares_nuclear_cooldown) + COOLDOWN_DECLARE(ares_quarters_cooldown) + /datum/ares_link/Destroy() for(var/obj/structure/machinery/ares/link in linked_systems) link.delink() @@ -46,38 +77,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( // ------ ARES Logging Procs ------ // -/proc/log_ares_apollo(speaker, message) - if(!speaker) - speaker = "Unknown" - var/datum/ares_link/link = GLOB.ares_link - if(!link.p_apollo || link.p_apollo.inoperable()) - return FALSE - if(!link.p_interface || link.p_interface.inoperable()) - return FALSE - link.apollo_log.Add("[worldtime2text()]: [speaker], '[message]'") - -/datum/ares_link/proc/log_ares_bioscan(title, input) - interface.records_bioscan.Add(new /datum/ares_record/bioscan(title, input)) - -/datum/ares_link/proc/log_ares_bombardment(user_name, ob_name, coordinates) - interface.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user_name)) - -/datum/ares_link/proc/log_ares_announcement(title, message) - interface.records_announcement.Add(new /datum/ares_record/announcement(title, message)) - -/datum/ares_link/proc/log_ares_requisition(source, details, user_name) - interface.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user_name)) - -/datum/ares_link/proc/log_ares_security(title, details) - interface.records_security.Add(new /datum/ares_record/security(title, details)) - -/datum/ares_link/proc/log_ares_antiair(details) - interface.records_security.Add(new /datum/ares_record/security/antiair(details)) - -/datum/ares_link/proc/log_ares_flight(user_name, details) - interface.records_flight.Add(new /datum/ares_record/flight(details, user_name)) -// ------ End ARES Logging Procs ------ // - /proc/ares_apollo_talk(broadcast_message) var/datum/language/apollo/apollo = GLOB.all_languages[LANGUAGE_APOLLO] for(var/mob/living/silicon/decoy/ship_ai/ai in ai_mob_list) @@ -89,7 +88,7 @@ GLOBAL_LIST_INIT(maintenance_categories, list( playsound_client(listener.client, sound('sound/misc/interference.ogg'), listener, vol = 45) /proc/ares_can_interface() - var/obj/structure/machinery/ares/processor/interface/processor = GLOB.ares_link.p_interface + var/obj/structure/machinery/ares/processor/interface/processor = GLOB.ares_link.processor_interface if(!istype(GLOB.ares_link)) return FALSE if(processor && !processor.inoperable()) @@ -97,12 +96,66 @@ GLOBAL_LIST_INIT(maintenance_categories, list( return FALSE //interface processor not found or is broken /proc/ares_can_log() - var/obj/structure/machinery/computer/ares_console/interface = GLOB.ares_link.interface - if(!istype(GLOB.ares_link)) + if(!istype(GLOB.ares_link) || !istype(GLOB.ares_datacore)) return FALSE - if(interface && !interface.inoperable()) + var/obj/structure/machinery/ares/cpu/central_processor = GLOB.ares_link.central_processor + if(central_processor && !central_processor.inoperable()) return TRUE - return FALSE //ares interface not found or is broken + return FALSE //CPU not found or is broken + +/proc/log_ares_apollo(speaker, message) + if(!ares_can_log()) + return FALSE + var/datum/ares_link/link = GLOB.ares_link + if(!link.processor_apollo || link.processor_apollo.inoperable()) + return FALSE + if(!speaker) + speaker = "Unknown" + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.apollo_log.Add("[worldtime2text()]: [speaker], '[message]'") + +/proc/log_ares_bioscan(title, input) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_bioscan.Add(new /datum/ares_record/bioscan(title, input)) + +/proc/log_ares_bombardment(user_name, ob_name, coordinates) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user_name)) + +/proc/log_ares_announcement(title, message) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_announcement.Add(new /datum/ares_record/announcement(title, message)) + +/proc/log_ares_requisition(source, details, user_name) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user_name)) + +/proc/log_ares_security(title, details) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_security.Add(new /datum/ares_record/security(title, details)) + +/proc/log_ares_antiair(details) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_security.Add(new /datum/ares_record/security/antiair(details)) + +/proc/log_ares_flight(user_name, details) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_flight.Add(new /datum/ares_record/flight(details, user_name)) +// ------ End ARES Logging Procs ------ // // ------ ARES Interface Procs ------ // /obj/structure/machinery/computer/proc/get_ares_access(obj/item/card/id/card) @@ -172,440 +225,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( conversation.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], '[text]'" // ------ End ARES Interface Procs ------ // -// ------ ARES Interface UI ------ // - -/obj/structure/machinery/computer/ares_console/attack_hand(mob/user as mob) - if(..() || !allowed(usr) || inoperable()) - return FALSE - - tgui_interact(user) - return TRUE - -/obj/structure/machinery/computer/ares_console/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AresInterface", name) - ui.open() - -/obj/structure/machinery/computer/ares_console/ui_data(mob/user) - var/list/data = list() - - data["current_menu"] = current_menu - data["last_page"] = last_menu - - data["logged_in"] = last_login - data["sudo"] = sudo_holder ? TRUE : FALSE - - data["access_text"] = "[sudo_holder ? "(SUDO)," : ""] access level [authentication], [ares_auth_to_text(authentication)]." - data["access_level"] = authentication - - data["alert_level"] = security_level - data["evac_status"] = EvacuationAuthority.evac_status - data["worldtime"] = world.time - - data["access_log"] = list() - data["access_log"] += access_list - data["apollo_log"] = list() - data["apollo_log"] += link.apollo_log - - data["deleted_conversation"] = list() - data["deleted_conversation"] += deleted_1to1 - - data["distresstime"] = ares_distress_cooldown - data["distresstimelock"] = DISTRESS_TIME_LOCK - data["quarterstime"] = ares_quarters_cooldown - data["mission_failed"] = SSticker.mode.is_in_endgame - data["nuketimelock"] = NUCLEAR_TIME_LOCK - data["nuke_available"] = nuke_available - - var/list/logged_announcements = list() - for(var/datum/ares_record/announcement/broadcast as anything in records_announcement) - var/list/current_broadcast = list() - current_broadcast["time"] = broadcast.time - current_broadcast["title"] = broadcast.title - current_broadcast["details"] = broadcast.details - current_broadcast["ref"] = "\ref[broadcast]" - logged_announcements += list(current_broadcast) - data["records_announcement"] = logged_announcements - - var/list/logged_alerts = list() - for(var/datum/ares_record/security/security_alert as anything in records_security) - var/list/current_alert = list() - current_alert["time"] = security_alert.time - current_alert["title"] = security_alert.title - current_alert["details"] = security_alert.details - current_alert["ref"] = "\ref[security_alert]" - logged_alerts += list(current_alert) - data["records_security"] = logged_alerts - - var/list/logged_flights = list() - for(var/datum/ares_record/flight/flight_log as anything in records_flight) - var/list/current_flight = list() - current_flight["time"] = flight_log.time - current_flight["title"] = flight_log.title - current_flight["details"] = flight_log.details - current_flight["user"] = flight_log.user - current_flight["ref"] = "\ref[flight_log]" - logged_flights += list(current_flight) - data["records_flight"] = logged_flights - - var/list/logged_bioscans = list() - for(var/datum/ares_record/bioscan/scan as anything in records_bioscan) - var/list/current_scan = list() - current_scan["time"] = scan.time - current_scan["title"] = scan.title - current_scan["details"] = scan.details - current_scan["ref"] = "\ref[scan]" - logged_bioscans += list(current_scan) - data["records_bioscan"] = logged_bioscans - - var/list/logged_bombs = list() - for(var/datum/ares_record/bombardment/bomb as anything in records_bombardment) - var/list/current_bomb = list() - current_bomb["time"] = bomb.time - current_bomb["title"] = bomb.title - current_bomb["details"] = bomb.details - current_bomb["user"] = bomb.user - current_bomb["ref"] = "\ref[bomb]" - logged_bombs += list(current_bomb) - data["records_bombardment"] = logged_bombs - - var/list/logged_deletes = list() - for(var/datum/ares_record/deletion/deleted as anything in records_deletion) - if(!istype(deleted)) - continue - var/list/current_delete = list() - current_delete["time"] = deleted.time - current_delete["title"] = deleted.title - current_delete["details"] = deleted.details - current_delete["user"] = deleted.user - current_delete["ref"] = "\ref[deleted]" - logged_deletes += list(current_delete) - data["records_deletion"] = logged_deletes - - var/list/logged_discussions = list() - for(var/datum/ares_record/deleted_talk/deleted_convo as anything in records_deletion) - if(!istype(deleted_convo)) - continue - var/list/deleted_disc = list() - deleted_disc["time"] = deleted_convo.time - deleted_disc["title"] = deleted_convo.title - deleted_disc["ref"] = "\ref[deleted_convo]" - logged_discussions += list(deleted_disc) - data["deleted_discussions"] = logged_discussions - - var/list/logged_orders = list() - for(var/datum/ares_record/requisition_log/req_order as anything in records_asrs) - if(!istype(req_order)) - continue - var/list/current_order = list() - current_order["time"] = req_order.time - current_order["details"] = req_order.details - current_order["title"] = req_order.title - current_order["user"] = req_order.user - current_order["ref"] = "\ref[req_order]" - logged_orders += list(current_order) - data["records_requisition"] = logged_orders - - var/list/logged_convos = list() - var/list/active_convo = list() - var/active_ref - for(var/datum/ares_record/talk_log/log as anything in records_talking) - if(!istype(log)) - continue - if(log.user == last_login) - active_convo = log.conversation - active_ref = "\ref[log]" - - var/list/current_convo = list() - current_convo["user"] = log.user - current_convo["ref"] = "\ref[log]" - current_convo["conversation"] = log.conversation - logged_convos += list(current_convo) - - data["active_convo"] = active_convo - data["active_ref"] = active_ref - data["conversations"] = logged_convos - - return data - -/obj/structure/machinery/computer/ares_console/ui_static_data(mob/user) - var/list/data = list() - - data["link_id"] = link_id - - return data - -/obj/structure/machinery/computer/ares_console/ui_status(mob/user, datum/ui_state/state) - . = ..() - if(!allowed(user)) - return UI_UPDATE - if(inoperable()) - return UI_DISABLED - -/obj/structure/machinery/computer/ares_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - playsound(src, "keyboard_alt", 15, 1) - - switch (action) - if("go_back") - if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) - var/temp_holder = current_menu - current_menu = last_menu - last_menu = temp_holder - - if("login") - var/mob/living/carbon/human/operator = usr - var/obj/item/card/id/idcard = operator.get_active_hand() - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else - to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(authentication) - access_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." - current_menu = "main" - - if("sudo") - var/new_user = tgui_input_text(usr, "Enter Sudo Username", "Sudo User", encode = FALSE) - if(new_user) - if(new_user == sudo_holder) - last_login = sudo_holder - sudo_holder = null - return FALSE - if(new_user == last_login) - to_chat(usr, SPAN_WARNING("Already remote logged in as this user.")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - sudo_holder = last_login - last_login = new_user - access_list += "[last_login] at [worldtime2text()], Sudo Access." - return TRUE - if("sudo_logout") - access_list += "[last_login] at [worldtime2text()], Sudo Logout." - last_login = sudo_holder - sudo_holder = null - return - // -- Page Changers -- // - if("logout") - last_menu = current_menu - current_menu = "login" - if(sudo_holder) - access_list += "[last_login] at [worldtime2text()], Sudo Logout." - last_login = sudo_holder - sudo_holder = null - access_list += "[last_login] logged out at [worldtime2text()]." - - if("home") - last_menu = current_menu - current_menu = "main" - if("page_1to1") - last_menu = current_menu - current_menu = "talking" - if("page_announcements") - last_menu = current_menu - current_menu = "announcements" - if("page_bioscans") - last_menu = current_menu - current_menu = "bioscans" - if("page_bombardments") - last_menu = current_menu - current_menu = "bombardments" - if("page_apollo") - last_menu = current_menu - current_menu = "apollo" - if("page_access") - last_menu = current_menu - current_menu = "access_log" - if("page_security") - last_menu = current_menu - current_menu = "security" - if("page_flight") - last_menu = current_menu - current_menu = "flight_log" - if("page_requisitions") - last_menu = current_menu - current_menu = "requisitions" - if("page_emergency") - last_menu = current_menu - current_menu = "emergency" - if("page_deleted") - last_menu = current_menu - current_menu = "delete_log" - if("page_deleted_1to1") - last_menu = current_menu - current_menu = "deleted_talks" - - // -- Delete Button -- // - if("delete_record") - var/datum/ares_record/record = locate(params["record"]) - if(record.record_name == ARES_RECORD_DELETED) - return FALSE - var/datum/ares_record/deletion/new_delete = new - var/new_details = "Error" - var/new_title = "Error" - switch(record.record_name) - if(ARES_RECORD_ANNOUNCE) - new_title = "[record.title] at [record.time]" - new_details = record.details - records_announcement -= record - if(ARES_RECORD_SECURITY, ARES_RECORD_ANTIAIR) - new_title = "[record.title] at [record.time]" - new_details = record.details - records_security -= record - if(ARES_RECORD_BIOSCAN) - new_title = "[record.title] at [record.time]" - new_details = record.details - records_bioscan -= record - if(ARES_RECORD_BOMB) - new_title = "[record.title] at [record.time]" - new_details = "[record.details] Launched by [record.user]." - records_bombardment -= record - - new_delete.details = new_details - new_delete.user = last_login - new_delete.title = new_title - - records_deletion += new_delete - - // -- 1:1 Conversation -- // - if("new_conversation") - var/datum/ares_record/talk_log/convo = new(last_login) - convo.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], 'New 1:1 link initiated. Greetings, [last_login].'" - records_talking += convo - - if("clear_conversation") - var/datum/ares_record/talk_log/conversation = locate(params["active_convo"]) - if(!istype(conversation)) - return FALSE - var/datum/ares_record/deleted_talk/deleted = new - deleted.title = conversation.title - deleted.conversation = conversation.conversation - deleted.user = conversation.user - records_deletion += deleted - records_talking -= conversation - - if("message_ares") - var/message = tgui_input_text(usr, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) - if(message) - message_ares(message, usr, params["active_convo"]) - - if("read_record") - var/datum/ares_record/deleted_talk/conversation = locate(params["record"]) - deleted_1to1 = conversation.conversation - last_menu = current_menu - current_menu = "read_deleted" - - // -- Emergency Buttons -- // - if("general_quarters") - if(!COOLDOWN_FINISHED(src, ares_quarters_cooldown)) - to_chat(usr, SPAN_WARNING("It has not been long enough since the last General Quarters call!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(security_level < SEC_LEVEL_RED) - set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE) - shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') - log_game("[key_name(usr)] has called for general quarters via ARES.") - message_admins("[key_name_admin(usr)] has called for general quarters via ARES.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.") - COOLDOWN_START(src, ares_quarters_cooldown, 10 MINUTES) - . = TRUE - - if("evacuation_start") - if(security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - if(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) - to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - if(!EvacuationAuthority.initiate_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - log_game("[key_name(usr)] has called for an emergency evacuation via ARES.") - message_admins("[key_name_admin(usr)] has called for an emergency evacuation via ARES.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.") - . = TRUE - - if("distress") - if(!SSticker.mode) - return FALSE //Not a game mode? - if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(!COOLDOWN_FINISHED(src, ares_distress_cooldown)) - to_chat(usr, SPAN_WARNING("The distress launcher is cooling down!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - else if(security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - for(var/client/admin in GLOB.admins) - if((R_ADMIN|R_MOD) & admin.admin_holder.rights) - playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) - SSticker.mode.request_ert(usr, TRUE) - to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) - COOLDOWN_START(src, ares_distress_cooldown, COOLDOWN_COMM_REQUEST) - return TRUE - - if("nuclearbomb") - if(!SSticker.mode) - return FALSE //Not a game mode? - if(world.time < NUCLEAR_TIME_LOCK) - to_chat(usr, SPAN_WARNING("It is too soon to request Nuclear Ordnance!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(!COOLDOWN_FINISHED(src, ares_nuclear_cooldown)) - to_chat(usr, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame) - to_chat(usr, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - var/reason = tgui_input_text(usr, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance") - if(!reason) - return FALSE - for(var/client/admin in GLOB.admins) - if((R_ADMIN|R_MOD) & admin.admin_holder.rights) - playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(usr)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(usr)] (APPROVE) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") - to_chat(usr, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]")) - if(ares_can_log()) - link.log_ares_security("Nuclear Ordnance Request", "[last_login] has sent a request for nuclear ordnance for the following reason: [reason]") - if(ares_can_interface()) - ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V") - ai_silent_announcement("Reason given: [reason].", ".V") - COOLDOWN_START(src, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT) - return TRUE -// ------ End ARES Interface UI ------ // - - /obj/structure/machinery/computer/working_joe/get_ares_access(obj/item/card/id/card) if(ACCESS_ARES_DEBUG in card.access) return APOLLO_ACCESS_DEBUG @@ -639,369 +258,3 @@ GLOBAL_LIST_INIT(maintenance_categories, list( return "Working Joe" if(APOLLO_ACCESS_DEBUG)//6 return "AI Service Technician" - -// ------ Maintenance Controller UI ------ // -/obj/structure/machinery/computer/working_joe/attack_hand(mob/user as mob) - if(..() || !allowed(usr) || inoperable()) - return FALSE - - tgui_interact(user) - return TRUE - -/obj/structure/machinery/computer/working_joe/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "WorkingJoe", name) - ui.open() - -/obj/structure/machinery/computer/working_joe/ui_data(mob/user) - var/list/data = list() - - data["current_menu"] = current_menu - data["last_page"] = last_menu - - data["logged_in"] = last_login - - data["access_text"] = "access level [authentication], [ares_auth_to_text(authentication)]." - data["access_level"] = authentication - - data["alert_level"] = security_level - data["worldtime"] = world.time - - data["access_log"] = list() - data["access_log"] += login_list - - data["apollo_log"] = list() - data["apollo_log"] += link.apollo_log - - var/list/logged_maintenance = list() - for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) - if(!istype(maint_ticket)) - continue - var/lock_status = TICKET_OPEN - switch(maint_ticket.ticket_status) - if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_COMPLETED) - lock_status = TICKET_CLOSED - - var/list/current_maint = list() - current_maint["id"] = maint_ticket.ticket_id - current_maint["time"] = maint_ticket.ticket_time - current_maint["priority_status"] = maint_ticket.ticket_priority - current_maint["category"] = maint_ticket.ticket_name - current_maint["details"] = maint_ticket.ticket_details - current_maint["status"] = maint_ticket.ticket_status - current_maint["submitter"] = maint_ticket.ticket_submitter - current_maint["assignee"] = maint_ticket.ticket_assignee - current_maint["lock_status"] = lock_status - current_maint["ref"] = "\ref[maint_ticket]" - logged_maintenance += list(current_maint) - data["maintenance_tickets"] = logged_maintenance - - var/list/logged_access = list() - var/list/requesting_access = list() - for(var/datum/ares_ticket/access/access_ticket as anything in link.tickets_access) - var/lock_status = TICKET_OPEN - switch(access_ticket.ticket_status) - if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED) - lock_status = TICKET_CLOSED - - var/list/current_ticket = list() - current_ticket["id"] = access_ticket.ticket_id - current_ticket["time"] = access_ticket.ticket_time - current_ticket["priority_status"] = access_ticket.ticket_priority - current_ticket["title"] = access_ticket.ticket_name - current_ticket["details"] = access_ticket.ticket_details - current_ticket["status"] = access_ticket.ticket_status - current_ticket["submitter"] = access_ticket.ticket_submitter - current_ticket["assignee"] = access_ticket.ticket_assignee - current_ticket["lock_status"] = lock_status - current_ticket["ref"] = "\ref[access_ticket]" - logged_access += list(current_ticket) - - if(lock_status == TICKET_OPEN) - requesting_access += access_ticket.ticket_name - data["access_tickets"] = logged_access - - return data - -/obj/structure/machinery/computer/working_joe/ui_static_data(mob/user) - var/list/data = list() - - data["link_id"] = link_id - - return data - -/obj/structure/machinery/computer/working_joe/ui_status(mob/user, datum/ui_state/state) - . = ..() - if(!allowed(user)) - return UI_UPDATE - if(inoperable()) - return UI_DISABLED - -/obj/structure/machinery/computer/working_joe/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - var/playsound = TRUE - var/mob/living/carbon/human/operator = usr - - switch (action) - if("go_back") - if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) - var/temp_holder = current_menu - current_menu = last_menu - last_menu = temp_holder - - if("login") - - var/obj/item/card/id/idcard = operator.get_active_hand() - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else - to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(authentication) - login_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." - current_menu = "main" - - if("logout") - last_menu = current_menu - current_menu = "login" - login_list += "[last_login] logged out at [worldtime2text()]." - - if("home") - last_menu = current_menu - current_menu = "main" - if("page_logins") - last_menu = current_menu - current_menu = "login_records" - if("page_apollo") - last_menu = current_menu - current_menu = "apollo" - if("page_request") - last_menu = current_menu - current_menu = "access_requests" - if("page_report") - last_menu = current_menu - current_menu = "maint_reports" - if("page_tickets") - last_menu = current_menu - current_menu = "access_tickets" - if("page_maintenance") - last_menu = current_menu - current_menu = "maint_claim" - - if("new_report") - var/priority_report = FALSE - var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) - switch(maint_type) - if("Major Structural Damage", "Fire", "Communications Failure", "Power Generation Failure") - priority_report = TRUE - - if(!maint_type) - return FALSE - var/details = tgui_input_text(operator, "What are the details for this report?", "Ticket Details", encode = FALSE) - if(!details) - return FALSE - - if((authentication >= APOLLO_ACCESS_REPORTER) && !priority_report) - var/is_priority = tgui_alert(operator, "Is this a priority report?", "Priority designation", list("Yes", "No")) - if(is_priority == "Yes") - priority_report = TRUE - - var/confirm = alert(operator, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"] \n Category: '[maint_type]' \n Details: '[details]' \n\n Is this correct?", "Confirmation", "Yes", "No") - if(confirm == "Yes") - if(link) - var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, maint_type, details, priority_report) - link.tickets_maintenance += maint_ticket - if(priority_report) - ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") - log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") - return TRUE - return FALSE - - if("claim_ticket") - var/datum/ares_ticket/ticket = locate(params["ticket"]) - if(!istype(ticket)) - return FALSE - var/claim = TRUE - var/assigned = ticket.ticket_assignee - if(assigned) - if(assigned == last_login) - var/prompt = tgui_alert(usr, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) - if(prompt != "Yes") - return FALSE - /// set ticket back to pending - ticket.ticket_assignee = null - ticket.ticket_status = TICKET_PENDING - return claim - var/choice = tgui_alert(usr, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) - if(choice != "Yes") - claim = FALSE - if(claim) - ticket.ticket_assignee = last_login - ticket.ticket_status = TICKET_ASSIGNED - return claim - - if("cancel_ticket") - var/datum/ares_ticket/ticket = locate(params["ticket"]) - if(!istype(ticket)) - return FALSE - if(ticket.ticket_submitter != last_login) - to_chat(usr, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) - return FALSE - to_chat(usr, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) - ticket.ticket_status = TICKET_CANCELLED - if(ticket.ticket_priority) - ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") - return TRUE - - if("mark_ticket") - var/datum/ares_ticket/ticket = locate(params["ticket"]) - if(!istype(ticket)) - return FALSE - if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) - return FALSE - var/choice = tgui_alert(usr, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) - switch(choice) - if(TICKET_COMPLETED) - ticket.ticket_status = TICKET_COMPLETED - if(TICKET_REJECTED) - ticket.ticket_status = TICKET_REJECTED - else - return FALSE - if(ticket.ticket_priority) - ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") - to_chat(usr, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) - return TRUE - - if("new_access") - var/obj/item/card/id/idcard = operator.get_active_hand() - var/has_id = FALSE - if(istype(idcard)) - has_id = TRUE - else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) - has_id = TRUE - if(!has_id) - to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(idcard.registered_name != last_login) - to_chat(operator, SPAN_WARNING("This ID card does not match the active login!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - var/ticket_holder = last_login - if(!ticket_holder) - return FALSE - var/details = tgui_input_text(operator, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) - if(!details) - return FALSE - - var/confirm = alert(operator, "Please confirm the submission of your access ticket request. \n\nHolder: '[ticket_holder]' \n Details: '[details]' \n\n Is this correct?", "Confirmation", "Yes", "No") - if(confirm != "Yes" || !link) - return FALSE - var/datum/ares_ticket/access/access_ticket = new(last_login, ticket_holder, details, FALSE, idcard.registered_gid) - link.waiting_ids += idcard - link.tickets_access += access_ticket - log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Holder '[ticket_holder]' and Details of '[details]'.") - message_admins(SPAN_STAFF_IC("[key_name_admin(operator)] created a new ARES Access Ticket."), 1) - return TRUE - - if("return_access") - playsound = FALSE - var/datum/ares_ticket/access/access_ticket - for(var/datum/ares_ticket/access/possible_ticket in link.tickets_access) - if(possible_ticket.ticket_status != TICKET_GRANTED) - continue - if(possible_ticket.ticket_name != last_login) - continue - access_ticket = possible_ticket - break - - for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue - if(identification.registered_gid != access_ticket.user_id_num) - continue - - access_ticket.ticket_status = TICKET_RETURNED - identification.access -= ACCESS_MARINE_AI_TEMP - identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]." - - to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered.")) - playsound(src, 'sound/machines/chime.ogg', 15, 1) - ares_apollo_talk("[last_login] surrendered their access ticket.") - - authentication = get_ares_access(identification) - if(authentication) - login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket." - return TRUE - - to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - if("auth_access") - playsound = FALSE - var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) - if(!access_ticket) - return FALSE - for(var/obj/item/card/id/identification in link.waiting_ids) - if(!istype(identification)) - continue - if(identification.registered_gid != access_ticket.user_id_num) - continue - identification.handle_ares_access(last_login, operator) - access_ticket.ticket_status = TICKET_GRANTED - playsound(src, 'sound/machines/chime.ogg', 15, 1) - return TRUE - for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue - if(identification.registered_gid != access_ticket.user_id_num) - continue - identification.handle_ares_access(last_login, operator) - access_ticket.ticket_status = TICKET_REVOKED - playsound(src, 'sound/machines/chime.ogg', 15, 1) - return TRUE - return FALSE - - if(playsound) - playsound(src, "keyboard_alt", 15, 1) - -/obj/item/card/id/proc/handle_ares_access(logged_in, mob/user) - var/announce_text = "[logged_in] revoked core access from [registered_name]'s ID card." - var/operator = key_name(user) - var/datum/ares_link/link = GLOB.ares_link - if(logged_in == MAIN_AI_SYSTEM) - if(!user) - operator = "[MAIN_AI_SYSTEM] (Sensor Trip)" - else - operator = "[user.ckey]/([MAIN_AI_SYSTEM])" - if(ACCESS_MARINE_AI_TEMP in access) - access -= ACCESS_MARINE_AI_TEMP - link.active_ids -= src - modification_log += "Temporary AI access revoked by [operator]" - to_chat(user, SPAN_NOTICE("Access revoked from [registered_name].")) - else - access += ACCESS_MARINE_AI_TEMP - modification_log += "Temporary AI access granted by [operator]" - announce_text = "[logged_in] granted core access to [registered_name]'s ID card." - to_chat(user, SPAN_NOTICE("Access granted to [registered_name].")) - link.waiting_ids -= src - link.active_ids += src - ares_apollo_talk(announce_text) - return TRUE diff --git a/code/game/machinery/ARES/ARES_records.dm b/code/game/machinery/ARES/ARES_records.dm index 19751462bc37..f89b2c120e05 100644 --- a/code/game/machinery/ARES/ARES_records.dm +++ b/code/game/machinery/ARES/ARES_records.dm @@ -102,6 +102,7 @@ var/ref_holder = "\ref[src]" var/pos = length(ref_holder) var/new_id = "#[copytext("\ref[src]", pos - 4, pos)]" + new_id = uppertext(new_id) ticket_time = worldtime2text() ticket_submitter = user @@ -115,17 +116,18 @@ /datum/ares_ticket/access ticket_type = ARES_RECORD_ACCESS + ticket_name = ARES_RECORD_ACCESS var/user_id_num -/datum/ares_ticket/access/New(user, name, details, priority, global_id_num) +/datum/ares_ticket/access/New(user, details, priority, global_id_num) var/ref_holder = "\ref[src]" var/pos = length(ref_holder) var/new_id = "#[copytext("\ref[src]", pos - 4, pos)]" + new_id = uppertext(new_id) ticket_time = worldtime2text() ticket_submitter = user ticket_details = details - ticket_name = name ticket_priority = priority ticket_id = new_id user_id_num = global_id_num diff --git a/code/game/machinery/ARES/ARES_step_triggers.dm b/code/game/machinery/ARES/ARES_step_triggers.dm index 51480371be51..fdf7b26b2e65 100644 --- a/code/game/machinery/ARES/ARES_step_triggers.dm +++ b/code/game/machinery/ARES/ARES_step_triggers.dm @@ -3,7 +3,6 @@ layer = 5 /// Link alerts to ARES Link var/datum/ares_link/link - var/link_id = MAIN_SHIP_DEFAULT_NAME /// Alert message to report unless area based. var/alert_message = "ALERT: Unauthorized movement detected in ARES Core!" /// Connect alerts to use same cooldowns @@ -53,7 +52,7 @@ /obj/effect/step_trigger/ares_alert/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) if(link && !override) return FALSE - if(new_link.link_id == link_id) + if(new_link) link = new_link new_link.linked_alerts += src return TRUE @@ -70,7 +69,7 @@ broadcast_message = "ALERT: Unauthorized movement detected in [area_name]!" var/datum/ares_link/link = GLOB.ares_link - if(link.p_apollo.inoperable()) + if(link.processor_apollo.inoperable()) return FALSE to_chat(passer, SPAN_BOLDWARNING("You hear a soft beeping sound as you cross the threshold.")) @@ -113,8 +112,6 @@ /obj/effect/step_trigger/ares_alert/access_control/Crossed(atom/passer as mob|obj) if(isobserver(passer) || isxeno(passer)) return FALSE - if(!COOLDOWN_FINISHED(src, sensor_cooldown))//Don't want alerts spammed. - return FALSE if(!passer) return FALSE if(HAS_TRAIT(passer, TRAIT_CLOAKED))//Can't be seen/detected to trigger alert. @@ -157,11 +154,12 @@ var/broadcast_message = get_broadcast(passer, idcard, failure) var/datum/ares_link/link = GLOB.ares_link - if(link.p_apollo.inoperable()) + if(link.processor_apollo.inoperable()) return FALSE to_chat(passer, SPAN_BOLDWARNING("You hear a harsh buzzing sound as you cross the threshold!")) - ares_apollo_talk(broadcast_message) + if(COOLDOWN_FINISHED(src, sensor_cooldown))//Don't want alerts spammed. + ares_apollo_talk(broadcast_message) if(idcard) /// Removes the access from the ID and updates the ID's modification log. for(var/obj/item/card/id/identification in link.active_ids) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 3c4104b6c283..c9092a750f73 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -59,8 +59,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/optable/get_examine_text(mob/user) . = ..() diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 16512a944be1..e6fc0c8de76e 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -431,8 +431,6 @@ var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function AAlarmwires |= wireFlag switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - if(AALARM_WIRE_POWER) shorted = 0 shock(usr, 50) diff --git a/code/game/machinery/biohazard_lockdown.dm b/code/game/machinery/biohazard_lockdown.dm index fd6205baa1d9..2e3cbf6de234 100644 --- a/code/game/machinery/biohazard_lockdown.dm +++ b/code/game/machinery/biohazard_lockdown.dm @@ -102,8 +102,7 @@ GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) shipwide_ai_announcement(message, MAIN_AI_SYSTEM, 'sound/effects/biohazard.ogg') message_admins(log) - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Containment Lockdown", ares_log) + log_ares_security("Containment Lockdown", ares_log) #undef LOCKDOWN_READY #undef LOCKDOWN_ACTIVE diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 81d498ba02e2..65f6fe1842f4 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -113,6 +113,10 @@ switch(action) if("print") + if(working) + //If we're already printing something then we're too busy to multi task. + to_chat(usr, SPAN_NOTICE("[src] is busy at the moment.")) + return FALSE var/recipe = params["recipe_id"] var/valid_recipe = FALSE for(var/datum/bioprinter_recipe/product_recipes in products) @@ -124,6 +128,10 @@ message_admins("[key_name(usr)] attempted to print an invalid recipe on \the [src].") return FALSE var/datum/bioprinter_recipe/recipe_datum = new recipe + if(stored_metal < recipe_datum.metal) + to_chat(usr, SPAN_NOTICE("[src] does not have enough stored metal.")) + QDEL_NULL(recipe_datum) + return FALSE stored_metal -= recipe_datum.metal to_chat(usr, SPAN_NOTICE("\The [src] is now printing the selected organ. Please hold.")) working = TRUE @@ -146,6 +154,8 @@ /obj/structure/machinery/bioprinter/proc/print_limb(limb_path) if(inoperable()) + //In case we lose power or anything between the print and the callback we don't want to permenantly break the printer + working = FALSE return new limb_path(get_turf(src)) working = FALSE diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index b70829c708ed..d82591994e7b 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -551,7 +551,7 @@ var/speed = ((wires & WIRE_MOTOR1) ? 1:0) + ((wires & WIRE_MOTOR2) ? 2:0) switch(speed) if(0) - // do nothing + pass() if(1) process_bot() spawn(2) diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index c3b17dbf8090..145d0d278cb6 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -108,7 +108,6 @@ . = ..() if(.) return - switch(action) if("award") print_medal(usr, src) @@ -131,8 +130,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") . = TRUE if("evacuation_cancel") @@ -144,8 +142,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") . = TRUE // evac stuff end \\ @@ -167,8 +164,7 @@ set_security_level(seclevel2num(level_selected), log = ARES_LOG_NONE) log_game("[key_name(usr)] has changed the security level to [get_security_level()].") message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Manual Security Update", "[usr] has changed the security level to [get_security_level()].") + log_ares_security("Manual Security Update", "[usr] has changed the security level to [get_security_level()].") . = TRUE if("messageUSCM") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f7ea31fba36a..d4d45de8db4e 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -65,7 +65,6 @@ if(..()) return FALSE usr.set_interaction(src) - var/datum/ares_link/link = GLOB.ares_link switch(href_list["operation"]) if("mapview") tacmap.tgui_interact(usr) @@ -149,7 +148,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") return TRUE state = STATE_EVACUATION @@ -169,7 +168,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") return TRUE state = STATE_EVACUATION_CANCEL diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index adce72f7d8b6..304b24a14f04 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -53,8 +53,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/computer/bullet_act(obj/projectile/Proj) if(exproof) diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 60bf17388db8..6218bf0cdedb 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -594,14 +594,21 @@ return var/targ_id = text2num(href_list["cas_camera"]) + + var/datum/cas_signal/new_signal for(var/datum/cas_signal/LT as anything in cas_group.cas_signals) if(LT.target_id == targ_id && LT.valid_signal()) - selected_cas_signal = LT + new_signal = LT break - if(!selected_cas_signal) + if(!new_signal) to_chat(usr, SPAN_WARNING("Target lost or obstructed.")) return + + if(usr in selected_cas_signal?.linked_cam?.viewing_users) // Reset previous cam + remove_from_view(usr) + + selected_cas_signal = new_signal if(selected_cas_signal && selected_cas_signal.linked_cam) selected_cas_signal.linked_cam.view_directly(usr) else diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index b68ca41d6f09..fe85599018ae 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -123,7 +123,6 @@ else dat += "
[bdat]" - else else dat += text("{Log In}", src) show_browser(user, dat, "Medical Records", "med_rec") @@ -365,8 +364,6 @@ for(var/datum/data/record/E in GLOB.data_core.medical) if ((E.fields["ref"] == R.fields["ref"] || E.fields["id"] == R.fields["id"])) M = E - else - //Foreach continue //goto(2540) src.active1 = R src.active2 = M src.screen = 4 @@ -417,16 +414,12 @@ for(var/datum/data/record/R as anything in GLOB.data_core.medical) if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]))) src.active2 = R - else - //Foreach continue //goto(3229) if (!active2) temp = "Could not locate record [t1]." else for(var/datum/data/record/E in GLOB.data_core.general) if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) src.active1 = E - else - //Foreach continue //goto(3334) src.screen = 4 if (href_list["print_p"]) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 3858230a089c..f6adaa8edd4e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -20,7 +20,6 @@ for(var/obj/structure/machinery/mass_driver/M in machines) if(M.id == id) connected = M - else return return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 12f4faedc979..c5a13e2c3e74 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -55,8 +55,7 @@ dat += " Locked Down |" else dat += " Operating Normally |" - if (!R.canmove) - else if(R.cell) + if(R.canmove && R.cell) dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" else dat += " No Cell Installed |" diff --git a/code/game/machinery/computer/sentencing.dm b/code/game/machinery/computer/sentencing.dm index 52a4159a2a90..3aa9b5a032a8 100644 --- a/code/game/machinery/computer/sentencing.dm +++ b/code/game/machinery/computer/sentencing.dm @@ -78,6 +78,7 @@ data["laws"] += list(create_law_data("Major Laws", SSlaw_init.major_law)) data["laws"] += list(create_law_data("Capital Laws", SSlaw_init.capital_law)) data["laws"] += list(create_law_data("Optional Laws", SSlaw_init.optional_law)) + data["laws"] += list(create_law_data("Precautionary Laws", SSlaw_init.precautionary_law)) return data diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index f891d46bc36b..a20d344b53a9 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -43,16 +43,16 @@ var/dat if (temp) - dat = text("[]

Clear Screen", temp, src) + dat = "[temp]

Clear Screen" else - dat = text("Confirm Identity: []
", src, (scan ? text("[]", scan.name) : "----------")) + dat = "Confirm Identity: [scan ? scan.name : "----------"]
" if (authenticated) switch(screen) if(1.0) dat += {"

"} - dat += text("Search Records
", src) - dat += text("New Record
", src) + dat += "Search Records
" + dat += "New Record
" dat += {"

@@ -70,20 +70,19 @@ if(!isnull(GLOB.data_core.general)) for(var/datum/data/record/R in sortRecord(GLOB.data_core.general, sortBy, order)) for(var/datum/data/record/E in GLOB.data_core.security) - var/background - dat += text("", background, src, R, R.fields["name"]) - dat += text("", R.fields["id"]) - dat += text("", R.fields["rank"]) + dat += "" + dat += "" + dat += "" dat += "
[][][]
[R.fields["name"]][R.fields["id"]][R.fields["rank"]]

" - dat += text("Record Maintenance

", src) - dat += text("{Log Out}",src) + dat += "Record Maintenance

" + dat += "{Log Out}" if(2.0) dat += "Records Maintenance
" dat += "
Delete All Records

Back" if(3.0) dat += "
Employment Record

" if ((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))) - dat += text("
\ + dat += " \
\ Name: [active1.fields["name"]]
\ ID: [active1.fields["id"]]
\n \ Sex: [active1.fields["sex"]]
\n \ @@ -93,18 +92,18 @@ Mental Status: [active1.fields["m_stat"]]

\n \ Employment/skills summary:
[decode(active1.fields["notes"])]
Photo:
\ -
") +
" else dat += "General Record Lost!
" - dat += text("\nDelete Record (ALL)

\nPrint Record
\nBack
", src, src, src) + dat += "\nDelete Record (ALL)

\nPrint Record
\nBack
" if(4.0) if(!Perp.len) - dat += text("ERROR. String could not be located.

Back", src) + dat += "ERROR. String could not be located.

Back" else dat += {" "} - dat += text("", tempname) + dat += "" dat += {"
Search Results for '[]':Search Results for '[tempname]':
@@ -121,17 +120,14 @@ if(istype(Perp[i+1],/datum/data/record/)) var/datum/data/record/E = Perp[i+1] crimstat = E.fields["criminal"] - var/background - background = "'background-color:#00FF7F;'" - dat += text("[]", background, src, R, R.fields["name"]) - dat += text("[]", R.fields["id"]) - dat += text("[]", R.fields["rank"]) - dat += text("[]", crimstat) + dat += "[R.fields["name"]]" + dat += "[R.fields["id"]]" + dat += "[R.fields["rank"]]" + dat += "[crimstat]" dat += "
" - dat += text("
Return to index.", src) - else + dat += "
Return to index." else - dat += text("{Log In}", src) + dat += "{Log In}" show_browser(user, dat, "Employment Records", "secure_rec", "size=600x400") onclose(user, "secure_rec") return @@ -342,7 +338,6 @@ What a mess.*/ if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) GLOB.data_core.medical -= R qdel(R) - else QDEL_NULL(active1) else temp = "This function does not appear to be working at the moment. Our apologies." diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index eb9aed4f71e4..86bb5f79a035 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li //Lifted from Unity stasis.dm and refactored. ~Zuhayr /obj/structure/machinery/cryopod/process() - if(occupant && !(WEAKREF(occupant) in GLOB.freed_mob_list)) //ignore freed mobs + if(occupant && !(occupant in GLOB.freed_mob_list)) //ignore freed mobs //if occupant ghosted, time till despawn is severely shorter if(!occupant.key && time_till_despawn == 10 MINUTES) time_till_despawn -= 8 MINUTES diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index e6df92d258c0..99996bea8978 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -54,7 +54,6 @@ src.health -= W.force * 0.75 if("brute") src.health -= W.force * 0.5 - else if (src.health <= 0) src.explode() ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index dc28cdca6f5c..b7257ff4e7d3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -550,13 +550,13 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( add_fingerprint(usr) update_icon() -/obj/structure/machinery/door/airlock/attackby(obj/item/C, mob/user) - if(SEND_SIGNAL(C, COMSIG_ITEM_ATTACK_AIRLOCK, src, user) & COMPONENT_CANCEL_AIRLOCK_ATTACK) +/obj/structure/machinery/door/airlock/attackby(obj/item/attacking_item, mob/user) + if(SEND_SIGNAL(attacking_item, COMSIG_ITEM_ATTACK_AIRLOCK, src, user) & COMPONENT_CANCEL_AIRLOCK_ATTACK) return - if(istype(C, /obj/item/clothing/mask/cigarette)) + if(istype(attacking_item, /obj/item/clothing/mask/cigarette)) if(isElectrified()) - var/obj/item/clothing/mask/cigarette/L = C + var/obj/item/clothing/mask/cigarette/L = attacking_item L.light(SPAN_NOTICE("[user] lights their [L] on an electrical arc from the [src]")) return @@ -567,7 +567,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( add_fingerprint(user) - if(istype(C, /obj/item/weapon/zombie_claws) && (welded || locked)) + if(istype(attacking_item, /obj/item/weapon/zombie_claws) && (welded || locked)) user.visible_message(SPAN_NOTICE("[user] starts tearing into the door on the [src]!"), \ SPAN_NOTICE("You start prying your hand into the gaps of the door with your fingers... This will take about 30 seconds."), \ SPAN_NOTICE("You hear tearing noises!")) @@ -584,8 +584,8 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( return - if((iswelder(C) && !operating && density)) - var/obj/item/tool/weldingtool/W = C + if((iswelder(attacking_item) && !operating && density)) + var/obj/item/tool/weldingtool/W = attacking_item var/weldtime = 50 if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) weldtime = 70 @@ -609,7 +609,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( update_icon() return - else if(HAS_TRAIT(C, TRAIT_TOOL_SCREWDRIVER)) + else if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER)) if(no_panel) to_chat(user, SPAN_WARNING("\The [src] has no panel to open!")) return @@ -619,17 +619,17 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( update_icon() return - else if(HAS_TRAIT(C, TRAIT_TOOL_WIRECUTTERS)) + else if(HAS_TRAIT(attacking_item, TRAIT_TOOL_WIRECUTTERS)) return attack_hand(user) - else if(HAS_TRAIT(C, TRAIT_TOOL_MULTITOOL)) + else if(HAS_TRAIT(attacking_item, TRAIT_TOOL_MULTITOOL)) return attack_hand(user) - else if(isgun(C)) - var/obj/item/weapon/gun/G = C - for(var/slot in G.attachments) - if(istype(G.attachments[slot], /obj/item/attachable/bayonet)) - var/obj/item/attachable/bayonet/a_bayonet = G.attachments[slot] + else if(isgun(attacking_item)) + var/obj/item/weapon/gun/gun_item = attacking_item + for(var/slot in gun_item.attachments) + if(istype(gun_item.attachments[slot], /obj/item/attachable/bayonet)) + var/obj/item/attachable/bayonet/a_bayonet = gun_item.attachments[slot] if(arePowerSystemsOn()) to_chat(user, SPAN_WARNING("The airlock's motors resist your efforts to force it.")) else if(locked) @@ -647,50 +647,48 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( if(do_after(user, a_bayonet.pry_delay, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) close(1) - else if(C.pry_capable) - if(C.pry_capable == IS_PRY_CAPABLE_CROWBAR && panel_open && welded) + else if(attacking_item.pry_capable) + if(attacking_item.pry_capable == IS_PRY_CAPABLE_CROWBAR && panel_open && welded) if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You don't seem to know how to deconstruct machines.")) return - if(width > 1) - to_chat(user, SPAN_WARNING("Large doors seem impossible to disassemble.")) - return playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) user.visible_message("[user] starts removing the electronics from the airlock assembly.", "You start removing electronics from the airlock assembly.") if(do_after(user, 40, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) to_chat(user, SPAN_NOTICE(" You removed the airlock electronics!")) - var/obj/structure/airlock_assembly/da = new assembly_type(loc) - if(istype(da, /obj/structure/airlock_assembly/multi_tile)) - da.setDir(dir) + var/obj/structure/airlock_assembly/doors_assembly = new assembly_type(loc) + if(istype(doors_assembly, /obj/structure/airlock_assembly/multi_tile)) + doors_assembly.setDir(dir) + doors_assembly.update_collision_box() - da.anchored = TRUE + doors_assembly.anchored = TRUE if(mineral) - da.glass = mineral + doors_assembly.glass = mineral //else if(glass) - else if(glass && !da.glass) - da.glass = 1 - da.state = 0 - da.created_name = name - da.update_icon() + else if(glass && !doors_assembly.glass) + doors_assembly.glass = TRUE + doors_assembly.state = 0 + doors_assembly.created_name = name + doors_assembly.update_icon() - var/obj/item/circuitboard/airlock/ae + var/obj/item/circuitboard/airlock/airlock_electronics if(!electronics) - ae = new/obj/item/circuitboard/airlock( loc ) + airlock_electronics = new/obj/item/circuitboard/airlock(loc) if(!req_access || !req_one_access) check_access() if(req_access.len) - ae.conf_access = req_access + airlock_electronics.conf_access = req_access else if(req_one_access.len) - ae.conf_access = req_one_access - ae.one_access = 1 + airlock_electronics.conf_access = req_one_access + airlock_electronics.one_access = TRUE else - ae = electronics + airlock_electronics = electronics electronics = null - ae.forceMove(loc) + airlock_electronics.forceMove(loc) if(operating == -1) - ae.fried = TRUE - ae.update_icon() + airlock_electronics.fried = TRUE + airlock_electronics.update_icon() operating = 0 msg_admin_niche("[key_name(user)] deconstructed [src] in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z])") @@ -698,7 +696,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( deconstruct() return - else if(arePowerSystemsOn() && C.pry_capable != IS_PRY_CAPABLE_FORCE) + else if(arePowerSystemsOn() && attacking_item.pry_capable != IS_PRY_CAPABLE_FORCE) to_chat(user, SPAN_WARNING("The airlock's motors resist your efforts to force it.")) else if(locked) @@ -707,7 +705,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( else if(welded) to_chat(user, SPAN_WARNING("The airlock is welded shut.")) - else if(C.pry_capable == IS_PRY_CAPABLE_FORCE) + else if(attacking_item.pry_capable == IS_PRY_CAPABLE_FORCE) return FALSE //handled by the item's afterattack else if(!operating) @@ -719,7 +717,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( return TRUE //no afterattack call - if(istype(C, /obj/item/large_shrapnel)) + if(istype(attacking_item, /obj/item/large_shrapnel)) return FALSE //trigger afterattack call else return ..() diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 6123d56b8f23..65ecd67a438e 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -2,19 +2,25 @@ /obj/structure/machinery/door/airlock/multi_tile width = 2 damage_cap = 650 // Bigger = more endurable + assembly_type = /obj/structure/airlock_assembly/multi_tile /obj/structure/machinery/door/airlock/multi_tile/close() //Nasty as hell O(n^2) code but unfortunately necessary - for(var/turf/T in locs) - for(var/obj/vehicle/multitile/M in T) - if(M) return 0 + for(var/turf/turf_tile in locs) + for(var/obj/vehicle/multitile/vehicle_tile in turf_tile) + if(vehicle_tile) return 0 return ..() +/obj/structure/machinery/door/airlock/multi_tile/Initialize() + . = ..() + handle_multidoor() + update_icon() + /obj/structure/machinery/door/airlock/multi_tile/glass name = "Glass Airlock" icon = 'icons/obj/structures/doors/Door2x1glass.dmi' opacity = FALSE - glass = 1 + glass = TRUE assembly_type = /obj/structure/airlock_assembly/multi_tile /obj/structure/machinery/door/airlock/multi_tile/glass/colony @@ -25,7 +31,7 @@ name = "Security Airlock" icon = 'icons/obj/structures/doors/Door2x1security.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/security/colony req_access = null @@ -35,7 +41,7 @@ name = "Command Airlock" icon = 'icons/obj/structures/doors/Door2x1command.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/command/colony req_access = null @@ -45,7 +51,7 @@ name = "Medical Airlock" icon = 'icons/obj/structures/doors/Door2x1medbay.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/medical/colony req_access = null @@ -55,7 +61,7 @@ name = "Engineering Airlock" icon = 'icons/obj/structures/doors/Door2x1engine.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/engineering/colony req_access = null @@ -65,7 +71,7 @@ name = "Research Airlock" icon = 'icons/obj/structures/doors/Door2x1research.dmi' opacity = FALSE - glass = 1 + glass = TRUE req_one_access = list(ACCESS_MARINE_RESEARCH, ACCESS_WY_RESEARCH, ACCESS_WY_EXEC) /obj/structure/machinery/door/airlock/multi_tile/research/colony @@ -103,7 +109,7 @@ name = "Secure Airlock" icon = 'icons/obj/structures/doors/Door2x1_secure2_glass.dmi' opacity = FALSE - glass = 1 + glass = TRUE openspeed = 31 req_access = null @@ -141,10 +147,10 @@ . = ..() relativewall_neighbours() -/obj/structure/machinery/door/airlock/multi_tile/almayer/take_damage(dam, mob/M) - var/damage_check = max(0, damage + dam) - if(damage_check >= damage_cap && M && is_mainship_level(z)) - SSclues.create_print(get_turf(M), M, "The fingerprint contains bits of wire and metal specks.") +/obj/structure/machinery/door/airlock/multi_tile/almayer/take_damage(taken_damage, mob/damaging_mob) + var/damage_check = max(0, damage + taken_damage) + if(damage_check >= damage_cap && damaging_mob && is_mainship_level(z)) + SSclues.create_print(get_turf(damaging_mob), damaging_mob, "The fingerprint contains bits of wire and metal specks.") ..() /obj/structure/machinery/door/airlock/multi_tile/almayer/generic @@ -156,6 +162,11 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/generic/autoname autoname = TRUE +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic/solid + icon = 'icons/obj/structures/doors/2x1generic_solid.dmi' + opacity = TRUE + glass = FALSE + /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor name = "\improper Medical Airlock" icon = 'icons/obj/structures/doors/2x1medidoor.dmi' @@ -223,15 +234,10 @@ req_one_access = list(ACCESS_CIVILIAN_BRIG, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) /obj/structure/machinery/door/airlock/multi_tile/almayer/handle_multidoor() + . = ..() if(!(width > 1)) return //Bubblewrap update_filler_turfs() - if(dir in list(NORTH, SOUTH)) - bound_height = world.icon_size * width - bound_width = world.icon_size - else if(dir in list(EAST, WEST)) - bound_width = world.icon_size * width - bound_height = world.icon_size //We have to find these again since these doors are used on shuttles a lot so the turfs changes /obj/structure/machinery/door/airlock/multi_tile/almayer/proc/update_filler_turfs() @@ -427,7 +433,7 @@ /obj/structure/machinery/door/airlock/multi_tile/elevator/access icon = 'icons/obj/structures/doors/4x1_elevator_access.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/elevator/access/research name = "\improper Research Elevator Hatch" @@ -547,7 +553,7 @@ icon = 'icons/obj/structures/doors/prepdoor.dmi' req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/alpha_bravo name = "\improper Alpha-Bravo Squads Preparations" diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm index ff26ce802b08..7bbc86681eb1 100644 --- a/code/game/machinery/fax_machine.dm +++ b/code/game/machinery/fax_machine.dm @@ -324,22 +324,22 @@ var/list/alldepartments = list() switch(target_department) if(DEPARTMENT_HC) - GLOB.USCMFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.USCMFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_PROVOST) - GLOB.ProvostFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.ProvostFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_CMB) - GLOB.CMBFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.CMBFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_WY) - GLOB.WYFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.WYFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_PRESS) - GLOB.PressFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.PressFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " else - GLOB.GeneralFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.GeneralFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " msg_admin += SPAN_STAFF_IC("Receiving fax via secure connection ... view message") diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index f52350aa8db3..903cd06c3119 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -23,7 +23,7 @@ var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" var/icon_panel = "smartfridge-panel" - var/item_quants = list() + var/list/item_quants = list() //! Assoc list of names -> list(items) var/ispowered = TRUE //starts powered var/is_secure_fridge = FALSE var/shoot_inventory = FALSE @@ -40,6 +40,24 @@ GLOB.vending_products[/obj/item/reagent_container/glass/bottle] = 1 GLOB.vending_products[/obj/item/storage/pill_bottle] = 1 +/obj/structure/machinery/smartfridge/Destroy(force) + if(is_in_network()) // Delete all contents from networked storage index + for(var/atom/movable/item as anything in contents) + delete_contents(item) + item_quants.Cut() + return ..() // parent will delete contents if we're not networked + +/// Deletes given object in contents of the smartfridge +/obj/structure/machinery/smartfridge/proc/delete_contents(obj/item/item) + if(item.loc != src) + return + contents -= item + if(item_quants[item.name]) + item_quants[item.name] -= item + if(is_in_network() && chemical_data.shared_item_storage[item.name]) + chemical_data.shared_item_storage[item.name] -= item + qdel(item) + /obj/structure/machinery/smartfridge/proc/accept_check(obj/item/O as obj) if(istype(O,/obj/item/reagent_container/food/snacks/grown/) || istype(O,/obj/item/seeds/)) return 1 diff --git a/code/game/machinery/medical_pod/bodyscanner.dm b/code/game/machinery/medical_pod/bodyscanner.dm index 4756121e50ae..fdcd0ceb62e6 100644 --- a/code/game/machinery/medical_pod/bodyscanner.dm +++ b/code/game/machinery/medical_pod/bodyscanner.dm @@ -62,8 +62,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return #ifdef OBJECTS_PROXY_SPEECH // Transfers speech to occupant @@ -124,8 +122,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/body_scanconsole/power_change() ..() diff --git a/code/game/machinery/medical_pod/sleeper.dm b/code/game/machinery/medical_pod/sleeper.dm index 805fedb29257..35d9a44863d2 100644 --- a/code/game/machinery/medical_pod/sleeper.dm +++ b/code/game/machinery/medical_pod/sleeper.dm @@ -385,7 +385,6 @@ t1 = "Unconscious" if(2) t1 = "*dead*" - else to_chat(user, "[]\t Health %: [] ([])", (occupant.health > 50 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.health, t1) to_chat(user, "[]\t -Core Temperature: []°C ([]°F)
", (occupant.bodytemperature > 50 ? "" : ""), occupant.bodytemperature-T0C, occupant.bodytemperature*1.8-459.67) to_chat(user, "[]\t -Brute Damage %: []", (occupant.getBruteLoss() < 60 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.getBruteLoss()) diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index bf7c4fffee65..861f5b37ebca 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -774,8 +774,8 @@ GLOBAL_LIST_EMPTY(vending_products) desc = "An automated closet hooked up to a colossal storage of standard-issue uniform and armor." icon_state = "clothing" use_points = TRUE + show_points = TRUE vendor_theme = VENDOR_THEME_USCM - show_points = FALSE vend_flags = VEND_CLUTTER_PROTECTION | VEND_UNIFORM_RANKS | VEND_UNIFORM_AUTOEQUIP | VEND_CATEGORY_CHECK /obj/structure/machinery/cm_vending/clothing/ui_static_data(mob/user) diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index a74dd923cbe7..414ab4a562e1 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -398,28 +398,25 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending /obj/structure/machinery/vending/proc/GetProductIndex(datum/data/vending_product/product) var/list/plist - switch(product.category) - if(CAT_NORMAL) - plist=product_records - if(CAT_HIDDEN) - plist=hidden_records - if(CAT_COIN) - plist=coin_records - else - warning("UNKNOWN CATEGORY [product.category] IN TYPE [product.product_path] INSIDE [type]!") + if(product.category == CAT_NORMAL) + plist = product_records + else if(product.category == CAT_HIDDEN) + plist = hidden_records + else if(product.category == CAT_COIN) + plist = coin_records + else + warning("UNKNOWN CATEGORY [product.category] IN TYPE [product.product_path] INSIDE [type]!") return plist.Find(product) /obj/structure/machinery/vending/proc/GetProductByID(pid, category) - switch(category) - if(CAT_NORMAL) - return product_records[pid] - if(CAT_HIDDEN) - return hidden_records[pid] - if(CAT_COIN) - return coin_records[pid] - else - warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") - return null + if(category == CAT_NORMAL) + return product_records[pid] + else if(category == CAT_HIDDEN) + return hidden_records[pid] + else if(category == CAT_COIN) + return coin_records[pid] + else + warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") /obj/structure/machinery/vending/attack_hand(mob/user) if(is_tipped_over) diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index 830511ad4b19..d7d49a8ae044 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -1,9 +1,9 @@ //------------GEAR VENDOR--------------- GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( - list("COMMANDING OFFICER'S PRIMARY (CHOOSE 1)", 0, null, null, null), - list("M46C pulse rifle", 0, /obj/effect/essentials_set/co/riflepreset, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), - list("M56C Smartgun", 0, /obj/item/storage/box/m56c_system, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("COMMANDER'S PRIMARY (CHOOSE 1)", 0, null, null, null), + list("M46C Pulse Rifle", 0, /obj/effect/essentials_set/co/riflepreset, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_MANDATORY), + list("M56C Smartgun", 0, /obj/item/storage/box/m56c_system, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_MANDATORY), list("PRIMARY AMMUNITION", 0, null, null, null), list("M41A MK1 Magazine", 30, /obj/item/ammo_magazine/rifle/m41aMK1, null, VENDOR_ITEM_RECOMMENDED), @@ -28,11 +28,19 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("M41A Rubber Shot Magazine", 10, /obj/item/ammo_magazine/rifle/rubber, null, VENDOR_ITEM_REGULAR), list("Beanbag Slugs", 10, /obj/item/ammo_magazine/shotgun/beanbag, null, VENDOR_ITEM_REGULAR), + list("EXPLOSIVES", 0, null, null, null), + list("HEDP Grenade Pack", 15, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), + list("HEFA Grenade Pack", 15, /obj/item/storage/box/packet/hefa, null, VENDOR_ITEM_REGULAR), + list("WP Grenade Pack", 15, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR), + list("RAIL ATTACHMENTS", 0, null, null, null), list("Red-Dot Sight", 15, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR), list("Reflex Sight", 15, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR), list("S4 2x Telescopic Mini-Scope", 15, /obj/item/attachable/scope/mini, null, VENDOR_ITEM_REGULAR), + list("Helmet Visors", 0, null, null, null), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_RECOMMENDED), + list("UNDERBARREL ATTACHMENTS", 0, null, null, null), list("Laser Sight", 15, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Angled Grip", 15, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), @@ -40,12 +48,13 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("Underbarrel Shotgun", 15, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR), list("Underbarrel Extinguisher", 15, /obj/item/attachable/attached_gun/extinguisher, null, VENDOR_ITEM_REGULAR), list("Underbarrel Flamethrower", 15, /obj/item/attachable/attached_gun/flamer, null, VENDOR_ITEM_REGULAR), + list("Underbarrel Grenade Launcher", 5, /obj/item/attachable/attached_gun/grenade, null, VENDOR_ITEM_REGULAR), list("BARREL ATTACHMENTS", 0, null, null, null), - list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 15, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), - )) + list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), + )) /obj/structure/machinery/cm_vending/gear/commanding_officer name = "\improper ColMarTech Commanding Officer Weapon Rack" @@ -63,9 +72,15 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("COMMANDING OFFICER ESSENTIALS KIT (TAKE ALL)", 0, null, null, null), + list("Commanding Officer Essentials Kit", 0, /obj/effect/essentials_set/commanding_officer, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + + list("BAGS (CHOOSE 1)", 0, null, null, null), + list("Commanding Officer Backpack", 0, /obj/item/storage/backpack/mcommander, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("Secure Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Commanding Officer's M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/CO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Commanding Officer's M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/CO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), @@ -84,8 +99,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), list("Security HUD Glasses", 0, /obj/item/clothing/glasses/sunglasses/sechud, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), - list("BELTS (TAKE ALL)", 0, null, null, null), + list("BELTS (CHOOSE 1)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Military Police Belt", 0, /obj/item/storage/belt/security/MP/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Medical Storage Rig", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Holster Toolrig", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -110,6 +130,15 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( /obj/structure/machinery/cm_vending/clothing/commanding_officer/get_listed_products(mob/user) return GLOB.cm_vending_clothing_commanding_officer +/obj/effect/essentials_set/commanding_officer + spawned_gear_list = list( + /obj/item/device/binoculars/range/designator, + /obj/item/map/current_map, + /obj/item/device/whistle, + /obj/item/weapon/gun/energy/taser, + /obj/item/device/megaphone, + ) + // This gets around the COs' weapon not spawning without incendiary mag. /obj/effect/essentials_set/co/riflepreset spawned_gear_list = list( diff --git a/code/game/machinery/vending/vendor_types/crew/sea.dm b/code/game/machinery/vending/vendor_types/crew/sea.dm index 0da9181beb97..cb6698c6f714 100644 --- a/code/game/machinery/vending/vendor_types/crew/sea.dm +++ b/code/game/machinery/vending/vendor_types/crew/sea.dm @@ -56,6 +56,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list( list("M3-L Pattern Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), list("M3 Pattern Padded Armor", 0, /obj/item/clothing/suit/storage/marine/padded, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("Bulletproof Vest", 0, /obj/item/clothing/suit/armor/bulletproof, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("USCM Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm index 85a8a58d162e..50b83ccdc54f 100644 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm @@ -13,13 +13,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Service Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Operations Uniform", 0, /obj/item/clothing/under/marine/officer/boiler, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), + list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), list("JACKET (CHOOSE 1)", 0, null, null, null), list("Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), @@ -33,66 +33,21 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), - list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Backpack", 0, /obj/item/storage/backpack/marine, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("Satchel", 0, /obj/item/storage/backpack/marine/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), - list("Radio Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), - list("BELT (CHOOSE 1)", 0, null, null, null), - list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - - list("POUCHES (CHOOSE 2)", 0, null, null, null), - list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), - list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - - list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), - list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), - list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - - list("MASK (CHOOSE 1)", 0, null, null, null), - list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), list("OTHER SUPPLIES", 0, null, null, null), list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), - list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), - list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), - list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), - list("Machete Scabbard (Full)", 2, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) )) diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm new file mode 100644 index 000000000000..ac7b22b4e0a0 --- /dev/null +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm @@ -0,0 +1,83 @@ +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory + name = "\improper ColMarTech Staff Officer Armory Equipment Rack" + desc = "An automated combat equipment vendor for Staff Officers." + req_access = list(ACCESS_MARINE_COMMAND) + icon_state = "mar_rack" + vendor_role = list(JOB_SO) + +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory/get_listed_products(mob/user) + return GLOB.cm_vending_clothing_staff_officer_armory + +//------------GEAR--------------- + +GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer_armory, list( + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), + list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + + list("SPECIALISATION KIT (CHOOSE 1)", 0, null, null, null), + list("Essential Engineer Set", 0, /obj/effect/essentials_set/engi, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + + list("POUCHES (CHOOSE 2)", 0, null, null, null), + list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), + list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + + list("MASK (CHOOSE 1)", 0, null, null, null), + list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + + list("OTHER SUPPLIES", 0, null, null, null), + list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), + list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_REGULAR), + list("Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_RECOMMENDED), + list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), + list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), + list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), + list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), + list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), + list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + list("Machete Scabbard (Full)", 5, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) + )) diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 07284e7f8e71..8558019839f7 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -192,7 +192,7 @@ turf_to_vent_to = H.loc return turf_to_vent_to -/obj/structure/machinery/cm_vending/sorted/cargo_guns/blend +/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend icon_state = "req_guns_wall" tiles_with = list( /obj/structure/window/framed/almayer, @@ -296,7 +296,7 @@ updateUsrDialog() return //We found our item, no reason to go on. -/obj/structure/machinery/cm_vending/sorted/cargo_ammo/blend +/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend icon_state = "req_ammo_wall" tiles_with = list( /obj/structure/window/framed/almayer, diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm index c0daad04f0ce..65397570511c 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm @@ -98,11 +98,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine/engineer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/tech, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/engineer, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/tech), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm index 9845ff9cb610..81c1941c3423 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm @@ -114,12 +114,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( GLOBAL_LIST_INIT(cm_vending_clothing_leader, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Armor", 0, /obj/item/clothing/suit/storage/marine/leader, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/leader, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/leader), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("B12 Pattern Armor", 0, /obj/item/clothing/suit/storage/marine/leader, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm index 1b634335f5d2..69399cfb1eb5 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm @@ -116,11 +116,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list( GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/medic, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/medic, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/medic), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm index 0691dfcee371..41710b477769 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm @@ -66,11 +66,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_smartgun, list( GLOBAL_LIST_INIT(cm_vending_clothing_smartgun, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm index 38c74481205d..e800fc1efd56 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm @@ -56,10 +56,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list( GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index 875f84264c0a..7bd45cb46a60 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -78,12 +78,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( GLOBAL_LIST_INIT(cm_vending_clothing_tl, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/rto), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("M4 Pattern Armor", 0, /obj/item/clothing/suit/storage/marine/rto, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/rto, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), list("Essential Fireteam Leader Utilities", 0, /obj/effect/essentials_set/tl, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 49d758b52b19..867c6924b39d 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -287,19 +287,23 @@ opacity = FALSE anchored = TRUE unacidable = TRUE + /// Target the acid is melting var/atom/acid_t - var/ticks = 0 - var/acid_strength = 1 //100% speed, normal - var/barricade_damage = 40 + /// Duration left to next acid stage + var/remaining = 0 + /// Acid stages left to complete melting + var/ticks_left = 3 + /// Factor of duration between acid progression + var/acid_delay = 1 /// How much fuel the acid drains from the flare every acid tick var/flare_damage = 500 - var/barricade_damage_ticks = 10 // tick is once per 5 seconds. This tells us how many times it will try damaging barricades + var/barricade_damage = 40 var/in_weather = FALSE //Sentinel weakest acid /obj/effect/xenomorph/acid/weak name = "weak acid" - acid_strength = 2.5 //250% normal speed + acid_delay = 2.5 //250% delay (40% speed) barricade_damage = 20 flare_damage = 150 icon_state = "acid_weak" @@ -307,24 +311,32 @@ //Superacid /obj/effect/xenomorph/acid/strong name = "strong acid" - acid_strength = 0.4 //40% normal speed + acid_delay = 0.4 //40% delay (250% speed) barricade_damage = 100 flare_damage = 1875 icon_state = "acid_strong" -/obj/effect/xenomorph/acid/New(loc, target) - ..(loc) +/obj/effect/xenomorph/acid/Initialize(mapload, atom/target) + . = ..() acid_t = target - var/strength_t = isturf(acid_t) ? 8:4 // Turf take twice as long to take down. + if(isturf(acid_t)) + ticks_left = 7 // Turf take twice as long to take down. + else if(istype(acid_t, /obj/structure/barricade)) + ticks_left = 9 handle_weather() - tick(strength_t) - RegisterSignal(SSdcs, COMSIG_GLOB_WEATHER_CHANGE, PROC_REF(handle_weather)) + RegisterSignal(acid_t, COMSIG_PARENT_QDELETING, PROC_REF(cleanup)) + START_PROCESSING(SSeffects, src) /obj/effect/xenomorph/acid/Destroy() acid_t = null + STOP_PROCESSING(SSeffects, src) . = ..() +/obj/effect/xenomorph/acid/proc/cleanup() + SIGNAL_HANDLER + qdel(src) + /obj/effect/xenomorph/acid/proc/handle_weather() SIGNAL_HANDLER @@ -333,76 +345,85 @@ return if(SSweather.is_weather_event && locate(acids_area) in SSweather.weather_areas) - acid_strength = acid_strength + (SSweather.weather_event_instance.fire_smothering_strength * 0.33) //smothering_strength is 1-10, acid strength is a multiplier + acid_delay = acid_delay + (SSweather.weather_event_instance.fire_smothering_strength * 0.33) //smothering_strength is 1-10, acid strength is a multiplier in_weather = SSweather.weather_event_instance.fire_smothering_strength else - acid_strength = initial(acid_strength) + acid_delay = initial(acid_delay) in_weather = FALSE /obj/effect/xenomorph/acid/proc/handle_barricade() + if(prob(in_weather)) + visible_message(SPAN_XENOWARNING("Acid on \The [acid_t] subsides!")) + return NONE var/obj/structure/barricade/cade = acid_t - if(istype(cade)) - cade.take_acid_damage(barricade_damage) - -/obj/effect/xenomorph/acid/proc/tick(strength_t) - set waitfor = 0 - if(!acid_t || !acid_t.loc) - qdel(src) + cade.take_acid_damage(barricade_damage) + return (5 SECONDS) + +/obj/effect/xenomorph/acid/proc/handle_flashlight() + var/obj/item/device/flashlight/flare/flare = acid_t + if(flare.fuel <= 0) + return NONE + flare.fuel -= flare_damage + return (rand(15, 25) SECONDS) * acid_delay + +/obj/effect/xenomorph/acid/process(delta_time) + remaining -= delta_time * (1 SECONDS) + if(remaining > 0) return + ticks_left -= 1 - if(istype(acid_t,/obj/structure/barricade)) - if(++ticks >= barricade_damage_ticks || prob(in_weather)) - visible_message(SPAN_XENOWARNING("Acid on \The [acid_t] subsides!")) - qdel(src) - return - handle_barricade() - sleep(50) - .() - return - if(istype(acid_t, /obj/item/device/flashlight/flare)) - var/obj/item/device/flashlight/flare/flare = acid_t - if(flare.fuel > 0) //Flares that have fuel in them lose fuel instead of melting - flare.fuel -= flare_damage - sleep(rand(150,250) * (acid_strength)) - return .() - - if(++ticks >= strength_t) - visible_message(SPAN_XENODANGER("[acid_t] collapses under its own weight into a puddle of goop and undigested debris!")) - playsound(src, "acid_hit", 25, TRUE) - - if(istype(acid_t, /turf)) - if(istype(acid_t, /turf/closed/wall)) - var/turf/closed/wall/W = acid_t - new /obj/effect/acid_hole (W) - else - var/turf/T = acid_t - T.ScrapeAway() - else if (istype(acid_t, /obj/structure/girder)) - var/obj/structure/girder/G = acid_t - G.dismantle() - else if(istype(acid_t, /obj/structure/window/framed)) - var/obj/structure/window/framed/WF = acid_t - WF.deconstruct(disassembled = FALSE) - else if(istype(acid_t,/obj/item/explosive/plastic)) - qdel(acid_t) + var/return_delay = NONE + if(istype(acid_t, /obj/structure/barricade)) + return_delay = handle_barricade() + else if(istype(acid_t, /obj/item/device/flashlight/flare)) + return_delay = handle_flashlight() + else + return_delay = (rand(20, 30) SECONDS) * acid_delay - else - if(acid_t.contents.len) //Hopefully won't auto-delete things inside melted stuff.. - for(var/mob/M in acid_t.contents) - if(acid_t.loc) M.forceMove(acid_t.loc) - QDEL_NULL(acid_t) + if(!ticks_left) + finish_melting() + return PROCESS_KILL + if(!return_delay) qdel(src) - return + return PROCESS_KILL - switch(strength_t - ticks) + remaining = return_delay + + switch(ticks_left) if(6) visible_message(SPAN_XENOWARNING("\The [acid_t] is barely holding up against the acid!")) if(4) visible_message(SPAN_XENOWARNING("\The [acid_t]\s structure is being melted by the acid!")) if(2) visible_message(SPAN_XENOWARNING("\The [acid_t] is struggling to withstand the acid!")) if(0 to 1) visible_message(SPAN_XENOWARNING("\The [acid_t] begins to crumble under the acid!")) - sleep(rand(200,300) * (acid_strength)) - .() +/obj/effect/xenomorph/acid/proc/finish_melting() + visible_message(SPAN_XENODANGER("[acid_t] collapses under its own weight into a puddle of goop and undigested debris!")) + playsound(src, "acid_hit", 25, TRUE) + + if(istype(acid_t, /turf)) + if(istype(acid_t, /turf/closed/wall)) + var/turf/closed/wall/wall = acid_t + new /obj/effect/acid_hole(wall) + else + var/turf/turf = acid_t + turf.ScrapeAway() + + else if (istype(acid_t, /obj/structure/girder)) + var/obj/structure/girder/girder = acid_t + girder.dismantle() + + else if(istype(acid_t, /obj/structure/window/framed)) + var/obj/structure/window/framed/window = acid_t + window.deconstruct(disassembled = FALSE) + + else if(istype(acid_t, /obj/structure/barricade)) + pass() // Don't delete it, just damaj + + else + for(var/mob/mob in acid_t) + mob.forceMove(loc) + qdel(acid_t) + qdel(src) /obj/effect/xenomorph/boiler_bombard name = "???" diff --git a/code/game/objects/effects/decals/cleanable/blood/tracks.dm b/code/game/objects/effects/decals/cleanable/blood/tracks.dm index 32593f6f30fa..c764259a6252 100644 --- a/code/game/objects/effects/decals/cleanable/blood/tracks.dm +++ b/code/game/objects/effects/decals/cleanable/blood/tracks.dm @@ -14,6 +14,9 @@ var/list/overlay_images = list() + /// Amount of pixels to shift either way in an attempt to make the tracks more organic + var/transverse_amplitude = 3 + /obj/effect/decal/cleanable/blood/tracks/Crossed() return @@ -21,19 +24,27 @@ return FALSE /obj/effect/decal/cleanable/blood/tracks/proc/add_tracks(direction, tcolor, out) - var/image/I = image(icon = icon, icon_state = out ? going_state : coming_state, dir = direction) - var/mutable_appearance/MA = new(I) + var/image/image = image(icon = icon, icon_state = out ? going_state : coming_state, dir = direction) + + var/mutable_appearance/MA = new(image) MA.color = tcolor MA.layer = layer MA.appearance_flags |= RESET_COLOR - I.appearance = MA + image.appearance = MA + + switch(direction) + if(NORTH, SOUTH) + image.pixel_x += rand(-transverse_amplitude, transverse_amplitude) + if(EAST, WEST) + image.pixel_y += rand(-transverse_amplitude, transverse_amplitude) + if(out) - LAZYSET(steps_out, "[direction]", I) + LAZYSET(steps_out, "[direction]", image) else - LAZYSET(steps_in, "[direction]", I) + LAZYSET(steps_in, "[direction]", image) - overlay_images += I - cleanable_turf.overlays += I + overlay_images += image + cleanable_turf.overlays += image /obj/effect/decal/cleanable/blood/tracks/clear_overlay() if(length(overlay_images)) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index bebe0ec8b27f..56c6ae45cda7 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -95,8 +95,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/effect/glowshroom/fire_act(exposed_temperature, exposed_volume) if(exposed_temperature > 300) diff --git a/code/game/objects/effects/spawners/faction_spawners.dm b/code/game/objects/effects/spawners/faction_spawners.dm new file mode 100644 index 000000000000..2daf6392e5e7 --- /dev/null +++ b/code/game/objects/effects/spawners/faction_spawners.dm @@ -0,0 +1,197 @@ +/* + * USCM weapons + */ +/obj/effect/spawner/random/gun/uscm_primary + name = "USCM primary weapon spawner" + desc = "spawns USCM primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/rifle/m41a = /obj/item/ammo_magazine/rifle, + /obj/item/weapon/gun/rifle/m41a/tactical = /obj/item/ammo_magazine/rifle, + /obj/item/weapon/gun/smg/m39 = /obj/item/ammo_magazine/smg/m39, + /obj/item/weapon/gun/smg/m39 = /obj/item/ammo_magazine/smg/m39, + /obj/item/weapon/gun/shotgun/pump = /datum/ammo/bullet/shotgun/buckshot + ) + +/obj/effect/spawner/random/gun/uscm_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/uscm_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/uscm_primary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/uscm_secondary + name = "USCM secondary weapon spawner" + desc = "spawns USCM secondary weapons" + spawn_nothing_percentage = 0 + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/m4a3 = /obj/item/ammo_magazine/pistol, + /obj/item/weapon/gun/revolver/m44 = /obj/item/ammo_magazine/handful/revolver/marksman + ) + +/obj/effect/spawner/random/gun/uscm_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/uscm_secondary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/uscm_secondary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_80" + + +/* + * UPP weapons + */ +/obj/effect/spawner/random/gun/upp_primary + name = "UPP primary weapon spawner" + desc = "spawns UPP primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/smg/bizon/upp = /obj/item/ammo_magazine/smg/bizon, + /obj/item/weapon/gun/rifle/type71 = /obj/item/ammo_magazine/rifle/type71, + /obj/item/weapon/gun/rifle/type71/carbine = /obj/item/ammo_magazine/rifle/type71 + ) + +/obj/effect/spawner/random/gun/upp_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/upp_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/upp_primary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/upp_secondary + name = "UPP secondary weapon spawner" + desc = "spawns UPP secondary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/t73 = /obj/item/ammo_magazine/pistol/t73, + /obj/item/weapon/gun/pistol/np92 = /obj/item/ammo_magazine/pistol/np92, + /obj/item/weapon/gun/revolver/upp = /obj/item/ammo_magazine/revolver/upp + ) + +/obj/effect/spawner/random/gun/upp_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/upp_secondary/medchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/upp_secondary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_pistol_80" +/* + * PMC weapons + */ +/obj/effect/spawner/random/gun/pmc_primary + name = "PMC primary weapon spawner" + desc = "spawns PMC primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/rifle/m41a/elite = /obj/item/ammo_magazine/rifle/ap, + /obj/item/weapon/gun/rifle/m41a/elite = /obj/item/ammo_magazine/rifle/extended, + /obj/item/weapon/gun/smg/m39/elite = /obj/item/ammo_magazine/smg/m39/ap, + /obj/item/weapon/gun/smg/m39/elite = /obj/item/ammo_magazine/smg/m39/extended, + /obj/item/weapon/gun/rifle/nsg23 = /obj/item/ammo_magazine/rifle/nsg23/ap, + /obj/item/weapon/gun/rifle/nsg23 = /obj/item/ammo_magazine/rifle/nsg23/extended + ) + +/obj/effect/spawner/random/gun/pmc_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/pmc_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/pmc_primary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/pmc_secondary + name = "PMC secondary weapon spawner" + desc = "spawns PMC secondary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/vp78 = /obj/item/ammo_magazine/pistol/vp78, + /obj/item/weapon/gun/pistol/mod88 = /obj/item/ammo_magazine/pistol/mod88 + ) + +/obj/effect/spawner/random/gun/pmc_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/pmc_secondary/medchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/pmc_secondary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_pistol_80" + +/* + * CLF weapons + */ +/obj/effect/spawner/random/gun/clf_primary + name = "CLF primary weapon spawner" + desc = "spawns CLF primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/rifle/m16 = /obj/item/ammo_magazine/rifle/m16, + /obj/item/weapon/gun/rifle/mar40/carbine = /obj/item/ammo_magazine/rifle/mar40 + ) + +/obj/effect/spawner/random/gun/clf_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/clf_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/clf_primary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/clf_secondary + name = "CLF secondary weapon spawner" + desc = "spawns CLF secondary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/kt42 = /obj/item/ammo_magazine/pistol/kt42, + /obj/item/weapon/gun/pistol/b92fs = /obj/item/ammo_magazine/pistol/b92fs + ) + +/obj/effect/spawner/random/gun/clf_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/clf_secondary/medchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/clf_secondary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_pistol_80" diff --git a/code/game/objects/effects/spawners/random.dm b/code/game/objects/effects/spawners/random.dm index 450981377a73..a70fb5588f84 100644 --- a/code/game/objects/effects/spawners/random.dm +++ b/code/game/objects/effects/spawners/random.dm @@ -57,10 +57,13 @@ icon_state = "atmos" /obj/effect/spawner/random/technology_scanner/item_to_spawn() - return pick(prob(5);/obj/item/device/t_scanner,\ - prob(2);/obj/item/device/radio,\ - prob(5);/obj/item/device/analyzer) - + return pick_weight(list( + "none" = 10, + /obj/item/device/t_scanner = 10, + /obj/item/device/radio = 8, + /obj/item/device/analyzer = 10, + /obj/item/device/black_market_hacking_device = 2, + )) /obj/effect/spawner/random/powercell name = "Random Powercell" diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 1f52901c21a6..82566c80302f 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -149,7 +149,7 @@ explosion resistance exactly as much as their health switch(angle) //this reduces power when the explosion is going around corners if (0) - //no change + pass() if (45) if(spread_power >= 0) spread_power *= 0.75 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 077c0a463aaa..bf24b0758262 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -156,6 +156,11 @@ var/list/inherent_traits + /// How much to offset the item randomly either way alongside X visually + var/ground_offset_x = 0 + /// How much to offset the item randomly either way alongside Y visually + var/ground_offset_y = 0 + /obj/item/Initialize(mapload, ...) . = ..() @@ -175,6 +180,8 @@ if(flags_item & MOB_LOCK_ON_EQUIP) AddComponent(/datum/component/id_lock) + scatter_item() + /obj/item/Destroy() flags_item &= ~DELONDROP //to avoid infinite loop of unequip, delete, unequip, delete. flags_item &= ~NODROP //so the item is properly unequipped if on a mob. @@ -268,7 +275,6 @@ cases. Override_icon_state should be a list.*/ size = "huge" if(SIZE_MASSIVE) size = "massive" - else . += "This is a [blood_color ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." if(desc) . += desc @@ -459,6 +465,11 @@ cases. Override_icon_state should be a list.*/ /obj/item/proc/item_action_slot_check(mob/user, slot) return TRUE +/obj/item/proc/scatter_item() + if(!pixel_x && !pixel_y) + pixel_x = rand(-ground_offset_x, ground_offset_x) + pixel_y = rand(-ground_offset_y, ground_offset_y) + // The mob M is attempting to equip this item into the slot passed through as 'slot'. return TRUE if it can do this and 0 if it can't. // If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. // Set disable_warning to TRUE if you wish it to not give you outputs. @@ -824,6 +835,8 @@ cases. Override_icon_state should be a list.*/ unzoom(user) /obj/item/proc/unzoom(mob/living/user) + if(user.interactee == src) + user.unset_interaction() var/zoom_device = zoomdevicename ? "\improper [zoomdevicename] of [src]" : "\improper [src]" INVOKE_ASYNC(user, TYPE_PROC_REF(/atom, visible_message), SPAN_NOTICE("[user] looks up from [zoom_device]."), SPAN_NOTICE("You look up from [zoom_device].")) diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm index db19b79ac0fd..7276e8a7f051 100644 --- a/code/game/objects/items/circuitboards/computer.dm +++ b/code/game/objects/items/circuitboards/computer.dm @@ -177,7 +177,11 @@ /obj/item/circuitboard/computer/supplycomp/attackby(obj/item/tool, mob/user) if(HAS_TRAIT(tool, TRAIT_TOOL_MULTITOOL)) - to_chat(user, SPAN_WARNING("You start messing around with the electronics of \the [src]...")) + to_chat(user, SPAN_WARNING("You try to pulse the circuit board, but nothing happens. Maybe you need something more specialized?")) + return + + else if(HAS_TRAIT(tool, TRAIT_TOOL_BLACKMARKET_HACKER)) + to_chat(user, SPAN_WARNING("You start messing around with the electronics of [src]...")) if(do_after(user, 8 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You have no idea what you're doing.")) @@ -191,8 +195,7 @@ to_chat(user, SPAN_WARNING("You weaken the broadcasting function with \the [tool], and the red light stops blinking, turning off. It's probably good now.")) contraband_enabled = FALSE - if(HAS_TRAIT(tool, TRAIT_TOOL_TRADEBAND)) - + else if(HAS_TRAIT(tool, TRAIT_TOOL_TRADEBAND)) if(!skillcheck(user, SKILL_POLICE, SKILL_POLICE_SKILLED)) to_chat(user, SPAN_NOTICE("You do not know how to use [tool]")) return diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index a4589fb1dd78..2d44ce076f30 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -38,10 +38,14 @@ /obj/item/device/binoculars/on_set_interaction(mob/user) flags_atom |= RELAY_CLICK - + RegisterSignal(user, COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION, PROC_REF(interaction_handler)) /obj/item/device/binoculars/on_unset_interaction(mob/user) flags_atom &= ~RELAY_CLICK + UnregisterSignal(user, COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION) + +/obj/item/device/binoculars/proc/interaction_handler() + return COMPONENT_HUMAN_MOVEMENT_KEEP_USING /obj/item/device/binoculars/civ desc = "A pair of binoculars." diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index fc9bb015ece0..f355b39c468a 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -145,8 +145,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") . = TRUE if("distress") diff --git a/code/game/objects/items/devices/coins.dm b/code/game/objects/items/devices/coins.dm index 6ab79e3216d4..7343d14ad199 100644 --- a/code/game/objects/items/devices/coins.dm +++ b/code/game/objects/items/devices/coins.dm @@ -11,11 +11,8 @@ black_market_value = 10 var/string_attached var/sides = 2 - -/obj/item/coin/Initialize() - . = ..() - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 + ground_offset_x = 8 + ground_offset_y = 4 /obj/item/coin/gold name = "gold coin" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index e795f4e28de4..114964464a25 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -12,6 +12,8 @@ light_range = 5 light_power = 1 + ground_offset_x = 2 + ground_offset_y = 6 actions_types = list(/datum/action/item_action) var/on = FALSE @@ -33,6 +35,11 @@ else icon_state = initial(icon_state) +/obj/item/device/flashlight/animation_spin(speed = 5, loop_amount = -1, clockwise = TRUE, sections = 3, angular_offset = 0, pixel_fuzz = 0) + clockwise = pick(TRUE, FALSE) + angular_offset = rand(360) + return ..() + /obj/item/device/flashlight/proc/update_brightness(mob/user = null) if(on) set_light_range(light_range) @@ -296,8 +303,6 @@ // Causes flares to stop with a rotation offset for visual purposes /obj/item/device/flashlight/flare/animation_spin(speed = 5, loop_amount = -1, clockwise = TRUE, sections = 3, angular_offset = 0, pixel_fuzz = 0) - clockwise = pick(TRUE, FALSE) - angular_offset = rand(360) pixel_fuzz = 16 return ..() /obj/item/device/flashlight/flare/pickup() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 38ff8859ef97..512ca8baad9b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -457,6 +457,16 @@ FORENSIC SCANNER playsound(user, 'sound/machines/twobeep.ogg', 15, TRUE) to_chat(user, SPAN_NOTICE("You scan [hit_atom] and notice a reading on [src]'s pad, it says: ITEM HAS [market_value] VALUE ")) +/obj/item/device/black_market_hacking_device + name = "modified security access tuner" + desc = "A security access tuner with wires and electrical pins sticking out at odd angles. A handwritten label on the bottom says something about the ASRS system." + icon_state = "bm_hacker" + item_state = "analyzer" + w_class = SIZE_SMALL + flags_atom = FPRINT + flags_equip_slot = SLOT_WAIST + inherent_traits = list(TRAIT_TOOL_BLACKMARKET_HACKER) + /obj/item/device/cmb_black_market_tradeband name = "\improper CMB Tradeband Compliance Device" desc = "A device used to reset any tampering done to trading devices' signal range. Occasionally used to fix any signal chips damaged in an accident, but often for malpractice in trading. Use this with caution, as it will also reset any evidence of potential illicit trade. Created to fulfill a joint-organization requirement for CMB-ICC teams on the frontier, where tampered machinery was difficult to move and refurbish. Smugglers beware." diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 01567084d5c7..a4247c90a5b3 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -168,7 +168,7 @@ mytape.timestamp += mytape.used_capacity var/language_known = (M.universal_speak || (speaking && (speaking.name in known_languages))) var/mob_name = language_known ? M.GetVoice() : "Unknown" - var/message = language_known ? msg : speaking.scramble(msg) + var/message = (!speaking || language_known) ? msg : speaking.scramble(msg) mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [mob_name] [verb], \"[italics ? "" : null][message][italics ? "" : null]\"" diff --git a/code/game/objects/items/explosives/grenades/grenade.dm b/code/game/objects/items/explosives/grenades/grenade.dm index 7e98e9819931..6b793233678d 100644 --- a/code/game/objects/items/explosives/grenades/grenade.dm +++ b/code/game/objects/items/explosives/grenades/grenade.dm @@ -20,12 +20,12 @@ var/hand_throwable = TRUE harmful = TRUE //Is it harmful? Are they banned for synths? antigrief_protection = TRUE //Should it be checked by antigrief? + ground_offset_x = 7 + ground_offset_y = 6 /obj/item/explosive/grenade/Initialize() . = ..() det_time = max(0, rand(det_time - 5, det_time + 5)) - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) /obj/item/explosive/grenade/proc/can_use_grenade(mob/living/carbon/human/user) if(!hand_throwable) diff --git a/code/game/objects/items/explosives/warhead.dm b/code/game/objects/items/explosives/warhead.dm index 5dfdf2a41eac..9825d7483193 100644 --- a/code/game/objects/items/explosives/warhead.dm +++ b/code/game/objects/items/explosives/warhead.dm @@ -2,11 +2,8 @@ icon = 'icons/obj/items/weapons/grenade.dmi' customizable = TRUE allowed_sensors = list() //We only need a detonator - -/obj/item/explosive/warhead/Initialize(mapload, ...) - . = ..() - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) + ground_offset_x = 7 + ground_offset_y = 6 /obj/item/explosive/warhead/rocket name = "84mm rocket warhead" diff --git a/code/game/objects/items/handheld_distress_beacon.dm b/code/game/objects/items/handheld_distress_beacon.dm index 699c45c256b2..c11a7a57c350 100644 --- a/code/game/objects/items/handheld_distress_beacon.dm +++ b/code/game/objects/items/handheld_distress_beacon.dm @@ -1,12 +1,21 @@ ///handheld distress beacons used by goon chem retrieval team to call for PMC back up /obj/item/handheld_distress_beacon - name = "handheld distress beacon" + name = "\improper PMC handheld distress beacon" desc = "A standard handheld distress beacon. Generally used by teams who may be out of regular communications range but must signal for assistance. This one is branded with a Weyland Yutani symbol and sold en masse to colonies across the Neroid Sector." icon = 'icons/obj/items/handheld_distress_beacon.dmi' icon_state = "beacon_inactive" w_class = SIZE_SMALL + ///The beacons faction that will be sent in message_admins + var/beacon_type = "PMC beacon" + ///Tells the user who the beacon will be sent to IC + var/recipient = "the USCSS Royce" + ///The name of the ERT that will be passed to get_specific_call + var/list/ert_full_name = list("Weyland-Yutani PMC (Chemical Investigation Squad)") + ///The clickable version that will be sent in message_admins + var/list/ert_short_name = list("SEND PMCs") + ///Whether beacon can be used, or has already been used var/active = FALSE /obj/item/handheld_distress_beacon/get_examine_text(mob/user) @@ -20,8 +29,8 @@ if(active) icon_state = "beacon_active" - else - icon_state = initial(icon_state) + return + icon_state = initial(icon_state) /obj/item/handheld_distress_beacon/attack_self(mob/user) . = ..() @@ -29,53 +38,29 @@ if(active) to_chat(user, "[src] is already active!") return - - for(var/client/C in GLOB.admins) - if((R_ADMIN|R_MOD) & C.admin_holder.rights) - playsound_client(C,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(user)] has requested a PMC Distress Beacon! [CC_MARK(user)] (SEND) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") - to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to the USCSS Royce.")) - active = TRUE update_icon() -/// CMB distress beacon held by CMB Marshal for signalling distress to Anchorpoint Station -/obj/item/handheld_distress_beacon_CMB - name = "\improper CMB handheld distress beacon" - desc = "An emergency beacon. This one is branded with a Colonial Marshal Bureau star and 'ANCHORPOINT STATION' is etched in stencil on the side. This device is issued to CMB Marshals and features an extended relay antenna." - icon = 'icons/obj/items/handheld_distress_beacon.dmi' - icon_state = "beacon_inactive" - w_class = SIZE_SMALL - -/// whether or not the beacon is turned on, when activated sends message to admins requesting Anchorpoint ERT and changes sprite - var/active = FALSE - -/obj/item/handheld_distress_beacon_CMB/get_examine_text(mob/user) - . = ..() - - if(active) - . += "The beacon has been activated!" - -/obj/item/handheld_distress_beacon_CMB/update_icon() - . = ..() + if(!ert_full_name || !ert_short_name || (length(ert_full_name) != length(ert_short_name))) //Make sure they are greater than 0, and both are same length + to_chat(user, SPAN_BOLDWARNING("[src] is broken!")) + CRASH("[src] was improperly set, and has been disabled.") //For the runtime logs - if(active) - icon_state = "beacon_active" - else - icon_state = initial(icon_state) + var/beacon_call_buttons + for(var/current_ert_num in 1 to length(ert_full_name)) + beacon_call_buttons += "([ert_short_name[current_ert_num]]) " -/obj/item/handheld_distress_beacon_CMB/attack_self(mob/user) - . = ..() + for(var/client/admin_client in GLOB.admins) + if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) + playsound_client(admin_client,'sound/effects/sos-morse-code.ogg',10) + message_admins("[key_name(user)] has used a [beacon_type]! [CC_MARK(user)] [beacon_call_buttons](DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") + to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to [recipient].")) - if(active) - to_chat(user, "[src] is already active!") - return - - for(var/client/client in GLOB.admins) - if((R_ADMIN|R_MOD) & client.admin_holder.rights) - playsound_client(client,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(user)] has signalled CMB in distress, and requests reinforcements! [CC_MARK(user)] (SEND MARINE QRF) (SEND CMB TEAM) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") - to_chat(user, SPAN_NOTICE("The CMB distress beacon flashes red, indicating that the device has been activated and is transmitting.")) +/// CMB distress beacon held by CMB Marshal for signalling distress to Anchorpoint Station +/obj/item/handheld_distress_beacon/cmb + name = "\improper CMB handheld distress beacon" + desc = "An emergency beacon. This one is branded with a Colonial Marshal Bureau star and 'ANCHORPOINT STATION' is etched in stencil on the side. This device is issued to CMB Marshals and features an extended relay antenna." - active = TRUE - update_icon() + beacon_type = "CMB beacon" + recipient = "Anchorpoint Station" + ert_full_name = list("CMB - Patrol Team - Marshals in Distress (Friendly)", "CMB - Anchorpoint Station Colonial Marine QRF (Friendly)") + ert_short_name = list("SEND CMB", "SEND QRF") diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 06a4d785e677..2892eb1113e7 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -182,10 +182,9 @@ return 0 var/inaccurate = 0 - if(W.sharp == IS_SHARP_ITEM_ACCURATE) - else if(W.sharp == IS_SHARP_ITEM_BIG) + if(W.sharp == IS_SHARP_ITEM_BIG) inaccurate = 1 - else + else if(W.sharp != IS_SHARP_ITEM_ACCURATE) return 1 if ( !istype(loc, /obj/structure/surface/table) && \ (!isturf(src.loc) || \ @@ -206,7 +205,7 @@ SPAN_NOTICE("[user] crudely slices \the [src] with [W]!"), \ SPAN_NOTICE("You crudely slice \the [src] with your [W]!") \ ) - slices_lost = rand(1,min(1,round(slices_num/2))) + slices_lost = rand(1,max(1,round(slices_num/2))) var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) var/obj/slice = new slice_path (src.loc) diff --git a/code/game/objects/items/reagent_containers/glass.dm b/code/game/objects/items/reagent_containers/glass.dm index 240809b7851f..df344506c72c 100644 --- a/code/game/objects/items/reagent_containers/glass.dm +++ b/code/game/objects/items/reagent_containers/glass.dm @@ -363,11 +363,8 @@ matter = list() possible_transfer_amounts = list(5,10,15,25,30) flags_atom = FPRINT|OPENCONTAINER - -/obj/item/reagent_container/glass/beaker/vial/Initialize() - . = ..() - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) + ground_offset_x = 9 + ground_offset_y = 8 /obj/item/reagent_container/glass/beaker/vial/tricordrazine name = "tricordrazine vial" diff --git a/code/game/objects/items/reagent_containers/pill.dm b/code/game/objects/items/reagent_containers/pill.dm index de86ad07f53a..6c71d8be3c0c 100644 --- a/code/game/objects/items/reagent_containers/pill.dm +++ b/code/game/objects/items/reagent_containers/pill.dm @@ -23,6 +23,8 @@ w_class = SIZE_TINY volume = 60 reagent_desc_override = TRUE //it has a special examining mechanic + ground_offset_x = 7 + ground_offset_y = 7 var/identificable = TRUE //can medically trained people tell what's in it? var/pill_desc = "An unknown pill." // The real description of the pill, shown when examined by a medically trained person var/pill_icon_class = "random" // Pills with the same icon class share icons diff --git a/code/game/objects/items/reagent_containers/reagent_container.dm b/code/game/objects/items/reagent_containers/reagent_container.dm index eddbf5197a9e..e0561d5a7e3d 100644 --- a/code/game/objects/items/reagent_containers/reagent_container.dm +++ b/code/game/objects/items/reagent_containers/reagent_container.dm @@ -14,6 +14,8 @@ var/transparent = FALSE //can we see what's in it? var/reagent_desc_override = FALSE //does it have a special examining mechanic that should override the normal /reagent_containers examine proc? actions_types = list(/datum/action/item_action/reagent_container/set_transfer_amount) + ground_offset_x = 7 + ground_offset_y = 7 /obj/item/reagent_container/Initialize() if(!possible_transfer_amounts) diff --git a/code/game/objects/items/stacks/cable_coil.dm b/code/game/objects/items/stacks/cable_coil.dm index 9135c793cd00..e846979c00b4 100644 --- a/code/game/objects/items/stacks/cable_coil.dm +++ b/code/game/objects/items/stacks/cable_coil.dm @@ -20,14 +20,14 @@ attack_verb = list("whipped", "lashed", "disciplined", "flogged") stack_id = "cable coil" attack_speed = 3 + ground_offset_x = 2 + ground_offset_y = 2 /obj/item/stack/cable_coil/Initialize(mapload, length = MAXCOIL, param_color = null) . = ..() src.amount = length if (param_color) // It should be red by default, so only recolor it if parameter was specified. color = param_color - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) updateicon() update_wclass() @@ -276,8 +276,6 @@ /obj/item/stack/cable_coil/cut/Initialize() . = ..() src.amount = rand(1,2) - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) updateicon() update_wclass() diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 32e9a030462e..754a36c6012a 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -40,7 +40,7 @@ H.pain.recalculate_pain() H.updatehealth() use(1) - var/others_msg = "\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"] [S.display_name] with \the [src]." // Needs to create vars for these messages because macro doesn't work otherwise + var/others_msg = "\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " the"] [S.display_name] with \the [src]." // Needs to create vars for these messages because macro doesn't work otherwise var/user_msg = "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name]." user.visible_message(SPAN_NOTICE("[others_msg]"),\ SPAN_NOTICE("[user_msg]")) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 98a7ab036f06..07345dcdc09f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -69,6 +69,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ sheettype = "metal" stack_id = "metal" + /obj/item/stack/sheet/metal/small_stack amount = STACK_10 @@ -114,6 +115,8 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ amount_sprites = TRUE sheettype = "plasteel" stack_id = "plasteel" + ground_offset_x = 4 + ground_offset_y = 5 /obj/item/stack/sheet/plasteel/New(loc, amount=null) recipes = plasteel_recipes @@ -208,6 +211,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \ new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ + new/datum/stack_recipe("dartboard", /obj/item/dartboard), \ null, \ new/datum/stack_recipe_list("folders",list( \ new/datum/stack_recipe("blue folder", /obj/item/folder/blue), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index ac778c0569ed..d85e615bc1c8 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -202,13 +202,21 @@ Also change the icon to reflect the amount of sheets, if possible.*/ if(check_one_per_turf(R,usr)) return - var/atom/O = new R.result_type(usr.loc, usr) - usr.visible_message(SPAN_NOTICE("[usr] assembles \a [O]."), - SPAN_NOTICE("You assemble \a [O].")) - O.setDir(usr.dir) + var/atom/new_item + if(ispath(R.result_type, /turf)) + var/turf/current_turf = get_turf(usr) + if(!current_turf) + return + new_item = current_turf.ChangeTurf(R.result_type) + else + new_item = new R.result_type(usr.loc, usr) + + usr.visible_message(SPAN_NOTICE("[usr] assembles \a [new_item]."), + SPAN_NOTICE("You assemble \a [new_item].")) + new_item.setDir(usr.dir) if(R.max_res_amount > 1) - var/obj/item/stack/new_item = O - new_item.amount = R.res_amount * multiplier + var/obj/item/stack/new_stack = new_item + new_stack.amount = R.res_amount * multiplier amount -= R.req_amount * multiplier update_icon() @@ -218,25 +226,25 @@ Also change the icon to reflect the amount of sheets, if possible.*/ usr.drop_inv_item_on_ground(oldsrc) qdel(oldsrc) - if(istype(O,/obj/item/stack)) //floor stacking convenience - var/obj/item/stack/S = O - for(var/obj/item/stack/F in usr.loc) - if(S.stack_id == F.stack_id && S != F) - var/diff = F.max_amount - F.amount - if (S.amount < diff) - F.amount += S.amount - qdel(S) + if(istype(new_item,/obj/item/stack)) //floor stacking convenience + var/obj/item/stack/stack_item = new_item + for(var/obj/item/stack/found_item in usr.loc) + if(stack_item.stack_id == found_item.stack_id && stack_item != found_item) + var/diff = found_item.max_amount - found_item.amount + if (stack_item.amount < diff) + found_item.amount += stack_item.amount + qdel(stack_item) else - S.amount -= diff - F.amount += diff + stack_item.amount -= diff + found_item.amount += diff break - O?.add_fingerprint(usr) + new_item?.add_fingerprint(usr) //BubbleWrap - so newly formed boxes are empty - if(isstorage(O)) - for (var/obj/item/I in O) - qdel(I) + if(isstorage(new_item)) + for (var/obj/item/found_item in new_item) + qdel(found_item) //BubbleWrap END if(src && usr.interactee == src) //do not reopen closed window INVOKE_ASYNC(src, PROC_REF(interact), usr) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 301f6de2bc70..71edc21e29f9 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -151,7 +151,7 @@ storage_slots = 14 max_w_class = SIZE_MEDIUM max_storage_space = 28 - var/mode = 0 //Pill picking mode + var/mode = 1 //Picking from pill bottle mode can_hold = list( /obj/item/device/healthanalyzer, diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 509690a8dc2a..2514e2e5f10c 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -98,6 +98,11 @@ /obj/item/storage/firstaid/regular/empty/fill_preset_inventory() return +/obj/item/storage/firstaid/regular/response + desc = "It's an emergency medical kit containing basic medication and equipment. No training required to use. This one is simpler and requires no training to store." + required_skill_for_nest_opening = SKILL_MEDICAL + required_skill_level_for_nest_opening = SKILL_MEDICAL_DEFAULT + /obj/item/storage/firstaid/robust icon_state = "firstaid" diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index ef2bcfb7216a..b4a6c3a8c1af 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -326,7 +326,7 @@ /obj/item/storage/large_holster/fuelpack/get_examine_text(mob/user) . = ..() if(contents.len) - . += "It is storing \a M240-T incinerator unit." + . += "It is storing a M240-T incinerator unit." if (get_dist(user, src) <= 1) if(fuel) . += "The [fuel.caliber] currently contains: [round(fuel.get_ammo_percent())]% fuel." diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index ee274aaab32b..48eb322f2093 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -142,9 +142,9 @@ /obj/item/storage/pouch/survival name = "survival pouch" - desc = "It can carry flashlights, a pill, a crowbar, metal sheets, and some bandages." + desc = "A pouch given to colonists in the event of an emergency." icon_state = "tools" - storage_slots = 6 + storage_slots = 7 max_w_class = SIZE_MEDIUM can_hold = list( /obj/item/device/flashlight, @@ -153,6 +153,7 @@ /obj/item/stack/medical/bruise_pack, /obj/item/device/radio, /obj/item/attachable/bayonet, + /obj/item/stack/medical/splint, ) /obj/item/storage/pouch/survival/full/fill_preset_inventory() @@ -162,12 +163,12 @@ new /obj/item/stack/medical/bruise_pack(src) new /obj/item/device/radio(src) new /obj/item/attachable/bayonet(src) - + new /obj/item/stack/medical/splint(src) /obj/item/storage/pouch/survival/synth name = "synth survival pouch" desc = "An emergency pouch given to synthetics in the event of an emergency." icon_state = "tools" - storage_slots = 7 + storage_slots = 6 max_w_class = SIZE_MEDIUM can_hold = list( /obj/item/device/flashlight, @@ -180,7 +181,6 @@ ) /obj/item/storage/pouch/survival/synth/full/fill_preset_inventory() - new /obj/item/device/flashlight(src) new /obj/item/tool/crowbar/red(src) new /obj/item/tool/weldingtool(src) new /obj/item/stack/cable_coil(src) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 184fc51bd507..3fa16af05875 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -226,9 +226,14 @@ /obj/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled handle_rotation() SEND_SIGNAL(src, COSMIG_OBJ_AFTER_BUCKLE, buckled_mob) + if(!buckled_mob) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) + else + RegisterSignal(buckled_mob, COMSIG_PARENT_QDELETING, PROC_REF(unbuckle)) return buckled_mob /obj/proc/unbuckle() + SIGNAL_HANDLER if(buckled_mob && buckled_mob.buckled == src) buckled_mob.buckled = null buckled_mob.anchored = initial(buckled_mob.anchored) diff --git a/code/game/objects/structures/airlock_assembly.dm b/code/game/objects/structures/airlock_assembly.dm index 0679e1287ff7..d9e55e868016 100644 --- a/code/game/objects/structures/airlock_assembly.dm +++ b/code/game/objects/structures/airlock_assembly.dm @@ -22,9 +22,11 @@ var/airlock_type = "generic" //the type path of the airlock once completed var/glass = AIRLOCK_NOGLASS // see defines var/created_name = null + /// Used for multitile assemblies + var/width = 1 + /obj/structure/airlock_assembly/Initialize(mapload, ...) . = ..() - update_icon() /obj/structure/airlock_assembly/get_examine_text(mob/user) @@ -35,23 +37,26 @@ switch(state) if(STATE_STANDARD) if(anchored) - helpmessage += "It looks like a [SPAN_HELPFUL("wrench")] will unsecure it. Insert a [SPAN_HELPFUL("airlock circuit")]." + var/temp = "" + if(width == 1) + temp += "It looks like a [SPAN_HELPFUL("wrench")] will unsecure it. " + helpmessage += "[temp]You can insert an [SPAN_HELPFUL("airlock circuit")]. " if(!glass) - helpmessage += "Insert some [SPAN_HELPFUL("glass sheets")] to add windows to it." + helpmessage += "Insert some [SPAN_HELPFUL("glass sheets")] to add windows to it. " else if(glass == AIRLOCK_GLASSIN) - helpmessage += "You can take out the windows with a [SPAN_HELPFUL("screwdriver")]." + helpmessage += "You can take out the windows with a [SPAN_HELPFUL("screwdriver")]. " else - helpmessage += "It looks like a [SPAN_HELPFUL("wrench")] will secure it." + helpmessage += "It looks like a [SPAN_HELPFUL("wrench")] will secure it. " if(STATE_CIRCUIT) - helpmessage += "Add [SPAN_HELPFUL("cable coil")] to the circuit." + helpmessage += "Add [SPAN_HELPFUL("cable coil")] to the circuit. " if(STATE_WIRES) - helpmessage += "Secure the circuit with a [SPAN_HELPFUL("screwdriver")]." + helpmessage += "Secure the circuit with a [SPAN_HELPFUL("screwdriver")]. " if(STATE_SCREWDRIVER) - helpmessage += "[SPAN_HELPFUL("Weld")] it all in place." + helpmessage += "[SPAN_HELPFUL("Weld")] it all in place. " helpmessage += "You can name it with a [SPAN_HELPFUL("pen")]." . += SPAN_NOTICE(helpmessage) -/obj/structure/airlock_assembly/attackby(obj/item/W as obj, mob/user as mob) +/obj/structure/airlock_assembly/attackby(obj/item/attacking_item as obj, mob/user as mob) if(user.action_busy) return TRUE //no afterattack @@ -59,16 +64,16 @@ to_chat(user, SPAN_WARNING("You are not trained to configure \the [src]...")) return - if(HAS_TRAIT(W, TRAIT_TOOL_PEN)) - var/t = copytext(stripped_input(user, "Enter the name for the airlock.", name, created_name), 1, MAX_NAME_LEN) - if(!t || !in_range(src, usr) && loc != usr) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_PEN)) + var/input_text = copytext(stripped_input(user, "Enter the name for the airlock.", name, created_name), 1, MAX_NAME_LEN) + if(!input_text || !in_range(src, usr) && loc != usr) return - created_name = t + created_name = input_text playsound(src, "paper_writing", 15, TRUE) return - if(istype(W, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = W + if(istype(attacking_item, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_sheet = attacking_item if(!anchored) to_chat(user, SPAN_NOTICE("The airlock is not secured!")) return @@ -83,7 +88,7 @@ return if(!do_after(user, 20 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(G.use(5)) + if(glass_sheet.use(5)) playsound(loc, 'sound/items/Deconstruct.ogg', 25, 1) glass = AIRLOCK_GLASSIN to_chat(user, SPAN_NOTICE("You insert some glass into \the [src], adding windows to it.")) @@ -93,7 +98,7 @@ to_chat(user, SPAN_WARNING("You need five sheets of glass to add windows to \the [src]!")) return - if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_CROWBAR)) to_chat(user, SPAN_NOTICE("You start pulling \the [src] apart.")) playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) if(!do_after(user, 20 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) @@ -108,10 +113,14 @@ switch(state) if(STATE_STANDARD) - if(HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_WRENCH)) + //Moving wide doors is wonky and doesn't work properly, if it's fixed we could make it unwrenchable again + if(width > 1 && anchored) + to_chat(user, SPAN_WARNING("[src] cannot be unwrenched.")) + return if(!anchored) - var/turf/open/T = loc - if(!(istype(T) && T.allow_construction)) + var/turf/open/checked_turf = loc + if(!(istype(checked_turf) && checked_turf.allow_construction)) to_chat(user, SPAN_WARNING("\The [src] cannot be secured here!")) return playsound(loc, 'sound/items/Ratchet.ogg', 25, 1) @@ -127,10 +136,10 @@ to_chat(user, SPAN_NOTICE("The airlock is not secured!")) return ..() - if(istype(W, /obj/item/circuitboard/airlock)) - var/obj/item/circuitboard/airlock/C = W - if(C.fried) // guess what this used to check? ICON STATE!! - to_chat(user, SPAN_WARNING("\The [C] are totally broken!")) + if(istype(attacking_item, /obj/item/circuitboard/airlock)) + var/obj/item/circuitboard/airlock/airlock_circuit = attacking_item + if(airlock_circuit.fried) // guess what this used to check? ICON STATE!! + to_chat(user, SPAN_WARNING("\The [airlock_circuit] are totally broken!")) return playsound(loc, 'sound/items/Screwdriver.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You start installing the airlock electronics.")) @@ -138,14 +147,14 @@ return playsound(loc, 'sound/items/Screwdriver.ogg', 25, 1) user.drop_held_item() - W.forceMove(src) + attacking_item.forceMove(src) to_chat(user, SPAN_NOTICE("You installed the airlock electronics!")) state = STATE_CIRCUIT - electronics = W + electronics = attacking_item update_icon() return - if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER)) if(!anchored) to_chat(user, SPAN_NOTICE("The airlock is not secured!")) return @@ -163,22 +172,22 @@ if(STATE_CIRCUIT) - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if (C.get_amount() < 1) + if(istype(attacking_item, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/airlock_circuit = attacking_item + if (airlock_circuit.get_amount() < 1) to_chat(user, SPAN_WARNING("You need one length of coil to wire the airlock assembly.")) return to_chat(user, SPAN_NOTICE("You start to wire the circuit.")) if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(C.use(1)) + if(airlock_circuit.use(1)) state = STATE_WIRES to_chat(user, SPAN_NOTICE("You wire the circuit.")) update_icon() return if(STATE_WIRES) - if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER)) playsound(loc, 'sound/items/Screwdriver.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You start securing the circuit")) if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) @@ -190,27 +199,23 @@ return if(STATE_SCREWDRIVER) - if(iswelder(W)) - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(iswelder(attacking_item)) + if(!HAS_TRAIT(attacking_item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return - var/obj/item/tool/weldingtool/WT = W - if(!WT.remove_fuel(5, user)) + var/obj/item/tool/weldingtool/welder = attacking_item + if(!welder.remove_fuel(5, user)) return playsound(loc, 'sound/items/Welder2.ogg', 25, 1) to_chat(user, SPAN_NOTICE("Now finishing the airlock.")) if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - WT.remove_fuel(-5) + welder.remove_fuel(-5) return playsound(loc, 'sound/items/Welder2.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You finish the airlock!")) - var/path - if (glass == AIRLOCK_GLASSIN) - path = text2path("/obj/structure/machinery/door/airlock/almayer/[airlock_type]/glass") - else - path = text2path("/obj/structure/machinery/door/airlock/almayer/[airlock_type]") + var/path = get_airlock_path() var/obj/structure/machinery/door/airlock/door = new path(loc) door.assembly_type = type door.electronics = electronics @@ -225,7 +230,7 @@ door.name = created_name else door.name = base_name - + door.handle_multidoor() electronics.forceMove(door) qdel(src) return @@ -238,107 +243,107 @@ else icon_state = "door_as_[base_icon_state][state]" +/obj/structure/airlock_assembly/proc/get_airlock_path() + //For some reason multi_tile doors have different paths... can't say it isn't annoying + if (width > 1) + return "/obj/structure/machinery/door/airlock/multi_tile/almayer/[airlock_type][glass ? "" : "/solid"]" + return "/obj/structure/machinery/door/airlock/almayer/[airlock_type][glass ? "/glass" : ""]" + +/// Used for overloading proc in multi_tile +/obj/structure/airlock_assembly/proc/update_collision_box() + return + /obj/structure/airlock_assembly/airlock_assembly_com base_icon_state = "com" base_name = "Command Airlock" - airlock_type = "/command" + airlock_type = "command" /obj/structure/airlock_assembly/airlock_assembly_sec base_icon_state = "sec" base_name = "Security Airlock" - airlock_type = "/security" + airlock_type = "security" /obj/structure/airlock_assembly/airlock_assembly_eng base_icon_state = "eng" base_name = "Engineering Airlock" - airlock_type = "/engineering" + airlock_type = "engineering" /obj/structure/airlock_assembly/airlock_assembly_min base_icon_state = "min" base_name = "Mining Airlock" - airlock_type = "/mining" + airlock_type = "mining" /obj/structure/airlock_assembly/airlock_assembly_atmo base_icon_state = "atmo" base_name = "Atmospherics Airlock" - airlock_type = "/atmos" + airlock_type = "atmos" /obj/structure/airlock_assembly/airlock_assembly_research base_icon_state = "res" base_name = "Research Airlock" - airlock_type = "/research" + airlock_type = "research" /obj/structure/airlock_assembly/airlock_assembly_science base_icon_state = "sci" base_name = "Science Airlock" - airlock_type = "/science" + airlock_type = "science" /obj/structure/airlock_assembly/airlock_assembly_med base_icon_state = "med" base_name = "Medical Airlock" - airlock_type = "/medical" + airlock_type = "medical" /obj/structure/airlock_assembly/airlock_assembly_mai base_icon_state = "mai" base_name = "Maintenance Airlock" - airlock_type = "/maintenance" + airlock_type = "maintenance" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_ext base_icon_state = "ext" base_name = "External Airlock" - airlock_type = "/external" + airlock_type = "external" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_fre base_icon_state = "fre" base_name = "Freezer Airlock" - airlock_type = "/freezer" + airlock_type = "freezer" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_hatch base_icon_state = "hatch" base_name = "Airtight Hatch" - airlock_type = "/hatch" + airlock_type = "hatch" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_mhatch base_icon_state = "mhatch" base_name = "Maintenance Hatch" - airlock_type = "/maintenance_hatch" + airlock_type = "maintenance_hatch" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly base_icon_state = "highsec" base_name = "High Security Airlock" - airlock_type = "/highsecurity" + airlock_type = "highsecurity" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/multi_tile icon = 'icons/obj/structures/doors/airlock_assembly2x1.dmi' - icon_state = "door_as_g0" - dir = EAST - var/width = 1 - -/*Temporary until we get sprites. - airlock_type = "/multi_tile/maint" - glass = 1*/ - base_icon_state = "g" //Remember to delete this line when reverting "glass" var to 1. - airlock_type = "/multi_tile/glass" - glass = AIRLOCK_CANTGLASS //To prevent bugs in deconstruction process. + icon_state = "door_as_0" + width = 2 /obj/structure/airlock_assembly/multi_tile/Initialize(mapload, ...) . = ..() - if(dir in list(EAST, WEST)) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size + update_collision_box() update_icon() /obj/structure/airlock_assembly/multi_tile/Move() . = ..() + update_collision_box() + +/obj/structure/airlock_assembly/multi_tile/update_collision_box() if(dir in list(EAST, WEST)) bound_width = width * world.icon_size bound_height = world.icon_size diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 0ca2ccb1ddbc..5a72ec33ea2a 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -78,7 +78,7 @@ switch(dir) if(SOUTH) layer = ABOVE_MOB_LAYER - else if(NORTH) + if(NORTH) layer = initial(layer) - 0.01 else layer = initial(layer) diff --git a/code/game/objects/structures/barricade/handrail.dm b/code/game/objects/structures/barricade/handrail.dm index ea10dc7256de..ae166dbbf985 100644 --- a/code/game/objects/structures/barricade/handrail.dm +++ b/code/game/objects/structures/barricade/handrail.dm @@ -24,7 +24,7 @@ switch(dir) if(SOUTH) layer = ABOVE_MOB_LAYER - else if(NORTH) + if(NORTH) layer = initial(layer) - 0.01 else layer = initial(layer) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index c71b2853ea07..becb0906e3c6 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -58,8 +58,6 @@ contents_explosion(severity) deconstruct(FALSE) return - else - return /obj/structure/bookcase/update_icon() if(contents.len < 5) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 7848aaba4897..b000fd5733a2 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -51,8 +51,6 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas(src) new /obj/item/storage/firstaid/o2(src) - if ("nothing") - // doot // teehee - Ah, tg coders... if ("delete") diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7c9faaf1a027..9f0417ccb372 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -130,8 +130,6 @@ contents_explosion(severity) deconstruct(FALSE) return - else - return /obj/structure/closet/crate/alpha name = "alpha squad crate" diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 38201e052c50..d2b3d36b5920 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -43,8 +43,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob) diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index d290925d4cdf..89bc3da6ab23 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -189,3 +189,126 @@ /obj/structure/computer3frame/laptop name = "laptop frame" + +// Dartboard +#define DOUBLE_BAND 2 +#define TRIPLE_BAND 3 + +/obj/structure/dartboard + name = "dartboard" + desc = "A dartboard, loosely secured." + icon = 'icons/obj/structures/props/props.dmi' + icon_state = "dart_board" + density = TRUE + unslashable = TRUE + +/obj/structure/dartboard/get_examine_text() + . = ..() + if(length(contents)) + var/is_are = "is" + if(length(contents) != 1) + is_are = "are" + + . += SPAN_NOTICE("There [is_are] [length(contents)] item\s embedded into [src].") + +/obj/structure/dartboard/initialize_pass_flags(datum/pass_flags_container/pass_flags) + ..() + if(pass_flags) + pass_flags.flags_can_pass_all = PASS_MOB_IS + +/obj/structure/dartboard/get_projectile_hit_boolean(obj/projectile/projectile) + . = ..() + visible_message(SPAN_DANGER("[projectile] hits [src], collapsing it!")) + collapse() + +/obj/structure/dartboard/proc/flush_contents() + for(var/atom/movable/embedded_items as anything in contents) + embedded_items.forceMove(loc) + +/obj/structure/dartboard/proc/collapse() + playsound(src, 'sound/effects/thud1.ogg', 50) + new /obj/item/dartboard/(loc) + qdel(src) + +/obj/structure/dartboard/attack_hand(mob/user) + if(length(contents)) + user.visible_message(SPAN_NOTICE("[user] starts recovering items from [src]..."), SPAN_NOTICE("You start recovering items from [src]...")) + if(do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, user, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) + flush_contents() + else + to_chat(user, SPAN_WARNING("[src] has nothing embedded!")) + +/obj/structure/dartboard/Destroy() + flush_contents() + . = ..() + +/obj/structure/dartboard/hitby(obj/item/thrown_item) + if(thrown_item.sharp != IS_SHARP_ITEM_ACCURATE && !istype(thrown_item, /obj/item/weapon/dart)) + visible_message(SPAN_DANGER("[thrown_item] hits [src], collapsing it!")) + collapse() + return + + contents += thrown_item + playsound(src, 'sound/weapons/tablehit1.ogg', 50) + var/score = rand(1,21) + if(score == 21) + visible_message(SPAN_DANGER("[thrown_item] embeds into [src], striking the bullseye! 50 points.")) + return + + var/band = "single" + var/band_number = rand(1,3) + score *= band_number + switch(band_number) + if(DOUBLE_BAND) + band = "double" + if(TRIPLE_BAND) + band = "triple" + visible_message(SPAN_DANGER("[thrown_item] embeds into [src], striking [band] for [score] point\s.")) + +/obj/structure/dartboard/attackby(obj/item/item, mob/user) + user.visible_message(SPAN_DANGER("[user] hits [src] with [item], collapsing it!"), SPAN_DANGER("You collapse [src] with [item]!")) + collapse() + +/obj/structure/dartboard/MouseDrop(over_object, src_location, over_location) + . = ..() + if(over_object != usr || !Adjacent(usr)) + return + + if(!ishuman(usr)) + return + + visible_message(SPAN_NOTICE("[usr] unsecures [src].")) + var/obj/item/dartboard/unsecured_board = new(loc) + usr.put_in_hands(unsecured_board) + qdel(src) + +/obj/item/dartboard + name = "dartboard" + desc = "A dartboard for darts." + icon = 'icons/obj/structures/props/props.dmi' + icon_state = "dart_board" + +/obj/item/dartboard/attack_self(mob/user) + . = ..() + + var/turf_ahead = get_step(user, user.dir) + if(!istype(turf_ahead, /turf/closed)) + to_chat(user, SPAN_WARNING("[src] needs a wall to be secured to!")) + return + + var/obj/structure/dartboard/secured_board = new(user.loc) + switch(user.dir) + if(NORTH) + secured_board.pixel_y = 32 + if(EAST) + secured_board.pixel_x = 32 + if(SOUTH) + secured_board.pixel_y = -32 + if(WEST) + secured_board.pixel_x = -32 + + to_chat(user, SPAN_NOTICE("You secure [secured_board] to [turf_ahead].")) + qdel(src) + +#undef DOUBLE_BAND +#undef TRIPLE_BAND diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index 7dc6d883a2d5..6471dfa21520 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -119,8 +119,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/reagent_dispensers/attack_hand() if(!reagents || reagents.locked) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index fbd6920875ad..ec277929facb 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -17,6 +17,7 @@ S.desc = desc S.icon_state = icon_state S.sign_state = icon_state + S.icon = icon deconstruct(FALSE) else ..() @@ -45,6 +46,7 @@ S.name = name S.desc = desc S.icon_state = sign_state + S.icon = icon to_chat(user, "You fasten \the [S] with your [tool].") qdel(src) else ..() @@ -592,9 +594,3 @@ desc = "An unbelievably creepy cat clock that surveys the room with every tick and every tock." icon = 'icons/obj/structures/props/catclock.dmi' icon_state = "cat_clock_motion" - -/obj/structure/sign/dartboard - name = "dartboard" - desc = "A dartboard, secured with a nail and a string. It has bullet holes and knife stab marks over and around it." - icon = 'icons/obj/structures/props/props.dmi' - icon_state = "dart_board" diff --git a/code/game/objects/structures/surface.dm b/code/game/objects/structures/surface.dm index 3a2dbd3e8d5c..efc69002424f 100644 --- a/code/game/objects/structures/surface.dm +++ b/code/game/objects/structures/surface.dm @@ -61,8 +61,7 @@ draw_item_overlays() /obj/structure/surface/proc/detach_item(obj/item/O) - O.pixel_x = initial(O.pixel_x) - O.pixel_y = initial(O.pixel_y) + O.scatter_item() UnregisterSignal(O, COMSIG_ATOM_DECORATED) draw_item_overlays() return diff --git a/code/game/runtimes.dm b/code/game/runtimes.dm index 1332309168a3..2cdc955aa426 100644 --- a/code/game/runtimes.dm +++ b/code/game/runtimes.dm @@ -11,7 +11,6 @@ GLOBAL_REAL(stui_init_runtimes, /list) //! Shorthand of Static Initializer errors only, for use in STUI GLOBAL_REAL(full_init_runtimes, /list) //! Full text of all Static Initializer + World Init errors, for log backfilling GLOBAL_REAL_VAR(runtime_logging_ready) //! Truthy when init is done and we don't need these shenanigans anymore -GLOBAL_REAL_VAR(init_runtimes_count) //! Count of runtimes that occured before logging is ready, for in-game reporting // Deduplication of errors via hash to reduce spamming GLOBAL_REAL(runtime_hashes, /list) @@ -24,8 +23,6 @@ GLOBAL_REAL_VAR(total_runtimes) if(!total_runtimes) total_runtimes = 0 total_runtimes += 1 - if(!init_runtimes_count) - init_runtimes_count = 0 if(!stui_init_runtimes) stui_init_runtimes = list() if(!full_init_runtimes) @@ -33,7 +30,6 @@ GLOBAL_REAL_VAR(total_runtimes) // If this occured during early init, we store the full error to write it to world.log when it's available if(!runtime_logging_ready) - init_runtimes_count += 1 full_init_runtimes += E.desc // Runtime was already reported once, dedup it for STUI diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 3d774cedc616..e8f40c1d52b3 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1020,7 +1020,6 @@ var/datum/controller/supply/supply_controller = new() to_chat(usr, SPAN_DANGER("Current retrieval load has reached maximum capacity.")) return - var/datum/ares_link/link = GLOB.ares_link for(var/i=1, i<=supply_controller.requestlist.len, i++) var/datum/supply_order/SO = supply_controller.requestlist[i] if(SO.ordernum == ordernum) @@ -1046,7 +1045,7 @@ var/datum/controller/supply/supply_controller = new() pack_source = "Unknown" if(prob(90)) pack_name = "Unknown" - link.log_ares_requisition(pack_source, pack_name, usr.name) + log_ares_requisition(pack_source, pack_name, usr.name) else temp = "Not enough money left.
" temp += "
Back Main Menu" @@ -1252,7 +1251,7 @@ var/datum/controller/supply/supply_controller = new() /datum/controller/supply/proc/black_market_investigation() black_market_heat = -1 - SSticker.mode.get_specific_call("Inspection - Colonial Marshal Ledger Investigation Team", TRUE, TRUE, FALSE) + SSticker.mode.get_specific_call("Inspection - Colonial Marshal Ledger Investigation Team", TRUE, TRUE) log_game("Black Market Inspection auto-triggered.") /obj/structure/machinery/computer/supplycomp/proc/is_buyable(datum/supply_packs/supply_pack) diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 22979858ce62..1b4091eb2aab 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -24,8 +24,8 @@ /obj/structure/girder, /obj/structure/machinery/door, /obj/structure/machinery/cm_vending/sorted/attachments/blend, - /obj/structure/machinery/cm_vending/sorted/cargo_ammo/blend, - /obj/structure/machinery/cm_vending/sorted/cargo_guns/blend, + /obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend, + /obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend, ) /turf/closed/wall/almayer/update_icon() diff --git a/code/game/verbs/records.dm b/code/game/verbs/records.dm index f09de72da2e6..18ed35ee6321 100644 --- a/code/game/verbs/records.dm +++ b/code/game/verbs/records.dm @@ -143,7 +143,7 @@ dat += "" var/color = "#008800" - var/add_dat = "Add Admin Note
Add Confidential Admin Note
" + var/add_dat = "Add Admin Note
Add Confidential Admin Note
" switch(note_category) if(NOTE_MERIT) color = "#9e3dff" diff --git a/code/modules/admin/player_panel/actions/antag.dm b/code/modules/admin/player_panel/actions/antag.dm index b3b62243c812..b1c2da6be123 100644 --- a/code/modules/admin/player_panel/actions/antag.dm +++ b/code/modules/admin/player_panel/actions/antag.dm @@ -56,9 +56,8 @@ if(params["leader"]) preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist/leader] - - preset.load_race(H, params["hivenumber"]) - preset.load_status(H) + preset.load_race(H) + preset.load_status(H, params["hivenumber"]) var/title = params["leader"]? "xeno cultist leader" : "cultist" diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index a5975bb02274..8bcd15cb04a9 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -218,14 +218,17 @@ if(!istype(chosen_ert)) return - var/quiet_launch = tgui_alert(usr, "Would you like to announce the distress beacon to the server population? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(!quiet_launch) - qdel(chosen_ert) - return - if(quiet_launch == "No") - quiet_launch = TRUE - if (quiet_launch == "Yes") - quiet_launch = FALSE + var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(launch_broadcast == "Yes") + launch_broadcast = TRUE + else + launch_broadcast = FALSE + + var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(announce_receipt == "Yes") + announce_receipt = TRUE + else + announce_receipt = FALSE var/turf/override_spawn_loc var/prompt = tgui_alert(usr, "Spawn at their assigned spawn, or at your location?", "Spawnpoint Selection", list("Spawn", "Current Location"), 0) @@ -235,7 +238,7 @@ if(prompt == "Current Location") override_spawn_loc = get_turf(usr) - chosen_ert.activate(quiet_launch = quiet_launch, announce = !quiet_launch, override_spawn_loc = override_spawn_loc) + chosen_ert.activate(quiet_launch = launch_broadcast, announce_incoming = announce_receipt, override_spawn_loc = override_spawn_loc) message_admins("[key_name_admin(usr)] admin-called a [choice == "Randomize" ? "randomized ":""]distress beacon: [chosen_ert.name]") @@ -322,7 +325,7 @@ if(!admin_holder) return - var/list/options = list("Weyland-Yutani", "High Command", "Provost", "Press", "Other", "Cancel") + var/list/options = list("Weyland-Yutani", "High Command", "Provost", "Press", "CMB", "Other", "Cancel") var/answer = tgui_input_list(src, "Which kind of faxes would you like to see?", "Faxes", options) switch(answer) if("Weyland-Yutani") @@ -597,9 +600,9 @@ return FALSE var/datum/ares_link/link = GLOB.ares_link - if(link.p_apollo.inoperable()) + if(link.processor_apollo.inoperable()) var/prompt = tgui_alert(src, "ARES APOLLO processor is offline or destroyed, send the message anyways?", "Choose.", list("Yes", "No"), 20 SECONDS) - if(prompt == "No") + if(prompt != "Yes") to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It's APOLLO processor may be offline or destroyed.")) return FALSE @@ -931,13 +934,8 @@ message_admins("[key_name(usr)] has fired \an [warhead.name] at ([target.x],[target.y],[target.z]).") warhead.warhead_impact(target) - if(istype(warhead, /obj/structure/ob_ammo/warhead/cluster)) - // so the user's screen can shake for the duration of the cluster, otherwise we get a runtime. - QDEL_IN(warhead, OB_CLUSTER_DURATION) - else - QDEL_IN(warhead, OB_CRASHING_DOWN) else - warhead.loc = target + warhead.forceMove(target) /client/proc/change_taskbar_icon() set name = "Set Taskbar Icon" diff --git a/code/modules/admin/tabs/server_tab.dm b/code/modules/admin/tabs/server_tab.dm index 6e5ded23206a..84c9426dfa3f 100644 --- a/code/modules/admin/tabs/server_tab.dm +++ b/code/modules/admin/tabs/server_tab.dm @@ -6,10 +6,6 @@ if (!usr.client.admin_holder || !(usr.client.admin_holder.rights & R_MOD)) return - if(!check_rights(R_DEBUG, FALSE) && SSticker.current_state != GAME_STATE_FINISHED) - to_chat(usr, "You can't restart the world until the round has ended!") - return - var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel") if(confirm == "Cancel") return diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 31f99870fe43..f78b6a844d4b 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -336,86 +336,6 @@ /////////////////////////////////////new ban stuff - else if(href_list["jobban2"]) -// if(!check_rights(R_BAN)) return - /* - var/mob/M = locate(href_list["jobban2"]) - if(!ismob(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(!M.ckey) //sanity - to_chat(usr, "This mob has no ckey") - return - if(!RoleAuthority) - to_chat(usr, "The Role Authority is not set up!") - return - - var/datum/entity/player/P = get_player_from_key(M.ckey) - - var/dat = "" - var/body - var/jobs = "" - - /***********************************WARNING!************************************ - The jobban stuff looks mangled and disgusting - But it looks beautiful in-game - -Nodrak - ************************************WARNING!***********************************/ -//Regular jobs - //Command (Blue) - jobs += generate_job_ban_list(M, ROLES_CIC, "CIC", "ddddff") - jobs += "
" - // SUPPORT - jobs += generate_job_ban_list(M, ROLES_AUXIL_SUPPORT, "Support", "ccccff") - jobs += "
" - // MPs - jobs += generate_job_ban_list(M, ROLES_POLICE, "Police", "ffdddd") - jobs += "
" - //Engineering (Yellow) - jobs += generate_job_ban_list(M, ROLES_ENGINEERING, "Engineering", "fff5cc") - jobs += "
" - //Cargo (Yellow) //Copy paste, yada, yada. Hopefully Snail can rework this in the future. - jobs += generate_job_ban_list(M, ROLES_REQUISITION, "Requisition", "fff5cc") - jobs += "
" - //Medical (White) - jobs += generate_job_ban_list(M, ROLES_MEDICAL, "Medical", "ffeef0") - jobs += "
" - //Marines - jobs += generate_job_ban_list(M, ROLES_MARINES, "Marines", "ffeeee") - jobs += "
" - // MISC - jobs += generate_job_ban_list(M, ROLES_MISC, "Misc", "aaee55") - jobs += "
" - // Xenos (Orange) - jobs += generate_job_ban_list(M, ROLES_XENO, "Xenos", "a268b1") - jobs += "
" - //Extra (Orange) - var/isbanned_dept = jobban_isbanned(M, "Syndicate", P) - jobs += "" - jobs += "" - - //ERT - if(jobban_isbanned(M, "Emergency Response Team", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - //Survivor - if(jobban_isbanned(M, "Survivor", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - if(jobban_isbanned(M, "Agent", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - body = "[jobs]" - dat = "[body]" - show_browser(usr, dat, "Job-Ban Panel: [M.name]", "jobban2", "size=800x490") - return*/ // DEPRECATED //JOBBAN'S INNARDS else if(href_list["jobban3"]) if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return @@ -697,7 +617,6 @@ to_world(SPAN_NOTICE("The mode is now: [GLOB.master_mode]!")) Game() // updates the main game menu SSticker.save_mode(GLOB.master_mode) - .(href, list("c_mode"=1)) else if(href_list["f_secret2"]) @@ -836,14 +755,14 @@ if(href_list["makecultist"]) var/datum/equipment_preset/preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist] - preset.load_race(H, hive.hivenumber) - preset.load_status(H) + preset.load_race(H) + preset.load_status(H, hive.hivenumber) message_admins("[key_name_admin(usr)] has made [key_name_admin(H)] into a cultist for [hive.name].") else if(href_list["makecultistleader"]) var/datum/equipment_preset/preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist/leader] - preset.load_race(H, hive.hivenumber) - preset.load_status(H) + preset.load_race(H) + preset.load_status(H, hive.hivenumber) message_admins("[key_name_admin(usr)] has made [key_name_admin(H)] into a cultist leader for [hive.name].") H.faction = hive.internal_faction @@ -1310,11 +1229,10 @@ if(send_choice != "Send") return GLOB.fax_contents += fax_message // save a copy - - GLOB.USCMFaxes.Add("\[view reply at [world.timeofday]\]") - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null + GLOB.USCMFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") + var/msg_ghost = SPAN_NOTICE("PRESS REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1393,10 +1311,10 @@ return GLOB.fax_contents += fax_message // save a copy - GLOB.USCMFaxes.Add("\[view reply at [world.timeofday]\]") - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null + GLOB.USCMFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") + var/msg_ghost = SPAN_NOTICE("USCM FAX REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1472,12 +1390,12 @@ return GLOB.fax_contents += fax_message // save a copy - GLOB.WYFaxes.Add("\[view reply at [world.timeofday]\]") //Add replies so that mods know what the hell is goin on with the RP - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null if(!customname) return + GLOB.WYFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") //Add replies so that mods know what the hell is goin on with the RP + var/msg_ghost = SPAN_NOTICE("WEYLAND-YUTANI FAX REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1554,12 +1472,12 @@ return GLOB.fax_contents += fax_message // save a copy - GLOB.CMBFaxes.Add("\[view reply at [world.timeofday]\]") //Add replies so that mods know what the hell is goin on with the RP - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null if(!customname) return + GLOB.CMBFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") //Add replies so that mods know what the hell is goin on with the RP + var/msg_ghost = SPAN_NOTICE("COLONIAL MARSHAL BUREAU FAX REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1904,32 +1822,18 @@ addtimer(CALLBACK(src, PROC_REF(accept_ert), usr, locate(href_list["distress"])), 10 SECONDS) //unanswered_distress -= ref_person - if(href_list["distress_cmb"]) //CMB distress signal, activates Anchorpoint Marine QRF to assist/rescue Colonial Marshals in distress - distress_cancel = FALSE - message_admins("[key_name_admin(usr)] has opted to SEND the Anchorpoint Station Colonial Marine QRF to assist the CMB! Launching in 10 seconds... (CANCEL)") - addtimer(CALLBACK(src, PROC_REF(accept_cmb_ert), usr, locate(href_list["distress"])), 10 SECONDS) - - if(href_list["distress_cmb_alt"]) //CMB distress signal, activates a nearby CMB Patrol Team to assist/rescue Colonial Marshals in distress - distress_cancel = FALSE - message_admins("[key_name_admin(usr)] has opted to SEND a nearby CMB Patrol Team to assist the CMB! Launching in 10 seconds... (CANCEL)") - addtimer(CALLBACK(src, PROC_REF(accept_cmb_alt_ert), usr, locate(href_list["distress"])), 10 SECONDS) - - if(href_list["deny_cmb"]) // Anchorpoint-deny. The distress call is denied, citing unavailable forces - var/mob/ref_person = locate(href_list["deny_cmb"]) - to_chat(ref_person, "A voice barely crackles through the static: CMB Team, this is Anchorpoint Station. No can do, QRF currently dispatched elsewhere, relaying distress. Sorry. Good luck, out.") - log_game("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]", 1) - - if(href_list["distress_pmc"]) //Wey-Yu specific PMC distress signal for chem retrieval ERT + if(href_list["distress_handheld"]) //Prepares to call and logs accepted handheld distress beacons + var/mob/ref_person = href_list["distress_handheld"] + var/ert_name = href_list["ert_name"] distress_cancel = FALSE - message_admins("[key_name_admin(usr)] has opted to SEND the distress beacon! Launching in 10 seconds... (CANCEL)") - addtimer(CALLBACK(src, PROC_REF(accept_pmc_ert), usr, locate(href_list["distress"])), 10 SECONDS) + message_admins("[key_name_admin(usr)] has opted to SEND [ert_name]! Launching in 10 seconds... (CANCEL)") + addtimer(CALLBACK(src, PROC_REF(accept_handheld_ert), usr, ref_person, ert_name), 10 SECONDS) - if(href_list["ccdeny_pmc"]) // CentComm-deny. The distress call is denied, without any further conditions - var/mob/ref_person = locate(href_list["ccdeny_pmc"]) + if(href_list["deny_distress_handheld"]) //Logs denied handheld distress beacons + var/mob/ref_person = href_list["deny_distress_handheld"] to_chat(ref_person, "The distress signal has not received a response.") log_game("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]", 1) + message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") if(href_list["destroyship"]) //Distress Beacon, sends a random distress beacon when pressed destroy_cancel = FALSE @@ -1964,7 +1868,7 @@ supply_controller.shoppinglist += new_order //Can no longer request a nuke - GLOB.ares_link.interface.nuke_available = FALSE + GLOB.ares_datacore.nuke_available = FALSE marine_announcement("A nuclear device has been authorized by High Command and will be delivered to requisitions via ASRS.", "NUCLEAR ORDNANCE AUTHORIZED", 'sound/misc/notice2.ogg', logging = ARES_LOG_MAIN) log_game("[key_name_admin(usr)] has authorized a [nuketype], requested by [key_name_admin(ref_person)]") @@ -2108,31 +2012,14 @@ log_game("[key_name_admin(approver)] has sent a randomized distress beacon, requested by [key_name_admin(ref_person)]") message_admins("[key_name_admin(approver)] has sent a randomized distress beacon, requested by [key_name_admin(ref_person)]") -/// tells admins which admin has sent the Anchorpoint ERT in response to CMB distress -/datum/admins/proc/accept_cmb_ert(mob/approver, mob/ref_person) - if(distress_cancel) - return - distress_cancel = TRUE - SSticker.mode.get_specific_call("CMB - Anchorpoint Station Colonial Marine QRF (Friendly)", FALSE, FALSE) - log_game("[key_name_admin(approver)] has sent an Anchorpoint Station Colonial Marine QRF response, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(approver)] has sent an Anchorpoint Station Colonial Marine QRF response, requested by [key_name_admin(ref_person)]") - -/// tells admins which admin has sent the CMB ERT in response to CMB distress -/datum/admins/proc/accept_cmb_alt_ert(mob/approver, mob/ref_person) - if(distress_cancel) - return - distress_cancel = TRUE - SSticker.mode.get_specific_call("CMB - Patrol Team - Marshals in Distress (Friendly)", FALSE, FALSE) - log_game("[key_name_admin(approver)] has sent a CMB Patrol Team distress response, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(approver)] has sent a CMB Patrol Team distress response, requested by [key_name_admin(ref_person)]") - -/datum/admins/proc/accept_pmc_ert(mob/approver, mob/ref_person) +///Handles calling the ERT sent by handheld distress beacons +/datum/admins/proc/accept_handheld_ert(mob/approver, mob/ref_person, ert_called) if(distress_cancel) return distress_cancel = TRUE - SSticker.mode.get_specific_call("Weyland-Yutani PMC (Chemical Investigation Squad)", TRUE, FALSE, FALSE) - log_game("[key_name_admin(approver)] has sent a PMC distress beacon, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(approver)] has sent a PMC distress beacon, requested by [key_name_admin(ref_person)]") + SSticker.mode.get_specific_call("[ert_called]", TRUE, FALSE) + log_game("[key_name_admin(approver)] has sent [ert_called], requested by [key_name_admin(ref_person)]") + message_admins("[key_name_admin(approver)] has sent [ert_called], requested by [key_name_admin(ref_person)]") /datum/admins/proc/generate_job_ban_list(mob/M, datum/entity/player/P, list/roles, department, color = "ccccff") var/counter = 0 diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 45d826668d4b..c38f715d93bf 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -206,7 +206,19 @@ em_call.players_to_offer = humans em_call.owner = owner - em_call.activate(announce = FALSE) + var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(launch_broadcast == "Yes") + launch_broadcast = TRUE + else + launch_broadcast = FALSE + + var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(announce_receipt == "Yes") + announce_receipt = TRUE + else + announce_receipt = FALSE + + em_call.activate(launch_broadcast, announce_receipt) message_admins("[key_name_admin(usr)] created [humans_to_spawn] humans as [job_name] at [get_area(initial_spot)]") @@ -284,7 +296,19 @@ em_call.players_to_offer = xenos em_call.owner = owner - em_call.activate(announce = FALSE) + var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(launch_broadcast == "Yes") + launch_broadcast = TRUE + else + launch_broadcast = FALSE + + var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(announce_receipt == "Yes") + announce_receipt = TRUE + else + announce_receipt = FALSE + + em_call.activate(launch_broadcast, announce_receipt) message_admins("[key_name_admin(usr)] created [xenos_to_spawn] xenos as [xeno_caste] at [get_area(initial_spot)]") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 758fd2327e77..5f10b8d24d22 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -753,6 +753,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) // /client/proc/giveadminhelpverb() + if(!src) + return add_verb(src, /client/verb/adminhelp) deltimer(adminhelptimerid) adminhelptimerid = 0 diff --git a/code/modules/admin/verbs/freeforghosts.dm b/code/modules/admin/verbs/freeforghosts.dm index 24c261ee18f3..4bf5549f30f0 100644 --- a/code/modules/admin/verbs/freeforghosts.dm +++ b/code/modules/admin/verbs/freeforghosts.dm @@ -20,7 +20,7 @@ if(mind || client) ghostize(FALSE) - GLOB.freed_mob_list |= WEAKREF(src) + GLOB.freed_mob_list |= src if(!notify) return diff --git a/code/modules/admin/verbs/mob_verbs.dm b/code/modules/admin/verbs/mob_verbs.dm index 4809d9b2e6ee..351d281e1881 100644 --- a/code/modules/admin/verbs/mob_verbs.dm +++ b/code/modules/admin/verbs/mob_verbs.dm @@ -164,7 +164,7 @@ if(!H.get_type_in_ears(/obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") return - to_chat(H, SPAN_DANGER("Message received through headset. [message_option] Transmission \"[msg]\"")) + to_chat(H, SPAN_ANNOUNCEMENT_HEADER_BLUE("Message received through headset. [message_option] Transmission \"[msg]\"")) var/message = WRAP_STAFF_LOG(usr, SPAN_STAFF_IC("subtle messaged [key_name(M)] as [message_option], saying \"[msg]\" in [get_area(M)] ([M.x],[M.y],[M.z]).")) message_admins(message, M.x, M.y, M.z) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index d5d44a047947..d1e7f83dacb1 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -321,7 +321,7 @@ I = icon(icon_file, icon_state, SOUTH) var/c = initial(item.color) if (!isnull(c) && c != "#FFFFFF") - I.Blend(initial(c), ICON_MULTIPLY) + I.Blend(c, ICON_MULTIPLY) else if (ispath(k, /obj/effect/essentials_set)) var/obj/effect/essentials_set/es_set = new k() diff --git a/code/modules/character_traits/biology_traits.dm b/code/modules/character_traits/biology_traits.dm index 87fb0b70ec36..a269aabede9f 100644 --- a/code/modules/character_traits/biology_traits.dm +++ b/code/modules/character_traits/biology_traits.dm @@ -85,14 +85,14 @@ /datum/character_trait/biology/bad_leg/New() . = ..() // Not on definition as several lists are added - inapplicable_roles = list(JOB_NURSE, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_INTEL, JOB_MAINT_TECH, JOB_ORDNANCE_TECH, JOB_CARGO_TECH, JOB_MARINE) + JOB_SQUAD_ROLES_LIST + JOB_MARINE_RAIDER_ROLES_LIST + JOB_ERT_GRUNT_LIST + inapplicable_roles = list(JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_INTEL, JOB_ORDNANCE_TECH, JOB_MARINE) + JOB_SQUAD_ROLES_LIST + JOB_MARINE_RAIDER_ROLES_LIST + JOB_ERT_GRUNT_LIST bad_cane_roles = list(JOB_SURVIVOR, JOB_STOWAWAY) fancy_cane_roles = list(JOB_CO_SURVIVOR, CORPORATE_SURVIVOR, JOB_CMO, JOB_CORPORATE_LIAISON, JOB_SEA, JOB_CHIEF_ENGINEER) + JOB_COMMAND_ROLES_LIST inapplicable_species = list(SPECIES_SYNTHETIC, SPECIES_YAUTJA) /datum/character_trait/biology/bad_leg/apply_trait(mob/living/carbon/human/target, datum/equipment_preset/preset) if(target.job in inapplicable_roles) - to_chat(target, SPAN_WARNING("Your office is too combat-geared or starter for you to be able to recieve the bad leg trait.")) + to_chat(target, SPAN_WARNING("Your office is too combat-geared for you to be able to recieve the bad leg trait.")) return if(target.species.group in inapplicable_species) to_chat(target, SPAN_WARNING("Your species is too sophisticated for you be able to recieve the bad leg trait.")) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 3cfb08b8dac0..82540d6cbf5e 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -330,13 +330,8 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning fps = prefs.fps - xeno_prefix = prefs.xeno_prefix - xeno_postfix = prefs.xeno_postfix - xeno_name_ban = prefs.xeno_name_ban - if(!xeno_prefix || xeno_name_ban) - xeno_prefix = "XX" - if(!xeno_postfix || xeno_name_ban) - xeno_postfix = "" + + load_xeno_name() human_name_ban = prefs.human_name_ban @@ -790,3 +785,12 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( if(admin_holder) admin_holder.particle_test = new /datum/particle_editor(in_atom) admin_holder.particle_test.tgui_interact(mob) + +/client/proc/load_xeno_name() + xeno_prefix = prefs.xeno_prefix + xeno_postfix = prefs.xeno_postfix + xeno_name_ban = prefs.xeno_name_ban + if(!xeno_prefix || xeno_name_ban) + xeno_prefix = "XX" + if(!xeno_postfix || xeno_name_ban) + xeno_postfix = "" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 554ba28e417f..04b82628e3c6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1409,17 +1409,16 @@ var/const/MAX_SAVE_SLOTS = 10 if(length(new_xeno_prefix)==0) xeno_prefix = "XX" + owner.load_xeno_name() else var/all_ok = TRUE for(var/i=1, i<=length(new_xeno_prefix), i++) var/ascii_char = text2ascii(new_xeno_prefix,i) - switch(ascii_char) - // A .. Z - if(65 to 90) //Uppercase Letters will work - else - all_ok = FALSE //everything else - won't + if(ascii_char < 65 || ascii_char > 90) + all_ok = FALSE //everything else - won't if(all_ok) xeno_prefix = new_xeno_prefix + owner.load_xeno_name() else to_chat(user, "Invalid Xeno Prefix. Your Prefix can contain either single letter or two letters.") @@ -1444,6 +1443,7 @@ var/const/MAX_SAVE_SLOTS = 10 return else if(length(new_xeno_postfix)==0) xeno_postfix = "" + owner.load_xeno_name() else var/all_ok = TRUE var/first_char = TRUE @@ -1469,6 +1469,7 @@ var/const/MAX_SAVE_SLOTS = 10 first_char = FALSE if(all_ok) xeno_postfix = new_xeno_postfix + owner.load_xeno_name() else to_chat(user, "Invalid Xeno Postfix. Your Postfix can contain single letter and an optional digit after it.") @@ -1697,6 +1698,8 @@ var/const/MAX_SAVE_SLOTS = 10 if("origin") var/choice = tgui_input_list(user, "Please choose your character's origin.", "Origin Selection", GLOB.player_origins) var/datum/origin/picked_choice = GLOB.origins[choice] + if(!picked_choice) + return if(tgui_alert(user, "You've selected [picked_choice.name]. [picked_choice.desc]", "Selected Origin", list("Confirm", "Cancel")) == "Cancel") return if(choice) diff --git a/code/modules/clothing/glasses/night.dm b/code/modules/clothing/glasses/night.dm index afb711c3ca15..2a3780832e2a 100644 --- a/code/modules/clothing/glasses/night.dm +++ b/code/modules/clothing/glasses/night.dm @@ -187,7 +187,7 @@ if(target) var/obj/item/clothing/glasses/night/m56_goggles/G = target G.set_far_sight(owner, !G.far_sight) - to_chat(owner, SPAN_NOTICE("You [G.far_sight ? "enable" : "disable"] \the [src]'s far sight system.")) + to_chat(owner, SPAN_NOTICE("You [G.far_sight ? "enable" : "disable"] \the [G]'s far sight system.")) /datum/action/item_action/m56_goggles/far_sight/update_button_icon() if(!target) diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm index f16b6ff42c9d..4871a008dd6d 100644 --- a/code/modules/clothing/head/head.dm +++ b/code/modules/clothing/head/head.dm @@ -308,8 +308,8 @@ /obj/item/clothing/head/cmcap/get_mob_overlay(mob/user_mob, slot) var/image/return_image = ..() - if(!slot == WEAR_HEAD) - return + if(slot != WEAR_HEAD) + return return_image if(length(pockets.contents) && (flags_marine_hat & HAT_GARB_OVERLAY)) for(var/obj/garb_object in pockets.contents) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index d969587e32e5..cc7fee7724f4 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -423,7 +423,7 @@ return var/obj/item/weapon/gun/W = usr.get_active_hand() if (W.w_class > SIZE_MEDIUM) - to_chat(usr, SPAN_DANGER("This gun won't fit in \the belt!")) + to_chat(usr, SPAN_DANGER("This gun won't fit in the belt!")) return holstered = usr.get_active_hand() usr.drop_held_item() diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 96ded23c8ac7..bee8e009ab28 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -284,7 +284,7 @@ linked_hive.stored_larva++ linked_hive.hijack_burrowed_left-- if(GLOB.xeno_queue_candidate_count < 1 + count_spawned) - notify_ghosts(header = "Claim Xeno", message = "The Hive has gained another burrowed larva! Click to take it.", source = src, action = NOTIFY_JOIN_XENO, enter_link = "join_xeno") + notify_ghosts(header = "Claim Xeno", message = "The Hive has gained another burrowed larva! Click to take it.", source = src, action = NOTIFY_JOIN_XENO, enter_link = "join_xeno=1") if(surge_cooldown > 30 SECONDS) //mostly for sanity purposes surge_cooldown = surge_cooldown - surge_incremental_reduction //ramps up over time if(linked_hive.hijack_burrowed_left < 1) diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm index 1c7281114c01..bcebad4661b0 100644 --- a/code/modules/cm_marines/Donator_Items.dm +++ b/code/modules/cm_marines/Donator_Items.dm @@ -126,6 +126,9 @@ /obj/item/storage/backpack/marine/fluff xeno_types = null +/obj/item/storage/backpack/marine/satchel/fluff + xeno_types = null + /obj/item/clothing/gloves/marine/fluff //MARINE GLOVES TEMPLATE name = "ITEM NAME" desc = "ITEM DESCRIPTION. DONOR ITEM" //Add UNIQUE if Unique @@ -211,10 +214,10 @@ item_state = "armor_reflec" /obj/item/clothing/suit/storage/marine/fluff/sas_juggernaut //CKEY=sasoperative (UNIQUE) - name = "Juggernaut Armor" + name = "juggernaut armor" desc = "Some fancy looking armor. DONOR ITEM" - icon_state = "rig-syndi" - item_state = "syndie_hardsuit" + icon_state = "skinnerarmor" + item_state = "skinnerarmor" /obj/item/clothing/suit/storage/marine/fluff/penguin //CKEY=tophatpenguin name = "Trenchcoat" @@ -589,8 +592,8 @@ flags_inv_hide = HIDEEARS|HIDEALLHAIR /obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut //CKEY=sasoperative (UNIQUE) - name = "Juggernaut Helmet" - icon_state = "rig0-syndi" + name = "juggernaut helmet" + icon_state = "skinnerhelmet" desc = "A red helmet, for pairing with JuggerNaut Armor. DONOR ITEM" /obj/item/clothing/head/helmet/marine/fluff/tristan //CKEY=tristan63 @@ -613,13 +616,6 @@ flags_inventory = BLOCKSHARPOBJ flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR -/obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut_alt //CKEY=sasoperative (UNIQUE) - name = "Juggernaut Helmet" - icon_state = "ncrhelmet" - desc = "A red helmet, for pairing with JuggerNaut Armor. DONOR ITEM" - flags_inventory = BLOCKSHARPOBJ - flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR - /obj/item/clothing/head/helmet/marine/fluff/sadokist //CKEY=sadokist name = "Tanya's Beret" desc = "A bright red beret, owned by Tanya Edenia." @@ -1366,6 +1362,12 @@ icon_state = "securitypack" item_state = "securitypack" +/obj/item/storage/backpack/marine/satchel/fluff/sas_juggernaut //CKEY=sasoperative (UNIQUE) + name = "tactical radiopack" + desc = "A Radio backpack for use with the Juggernaut armor. DONOR ITEM" + icon_state = "skinnerpack" + item_state = "skinnerpack" + /obj/item/clothing/glasses/fluff/alexwarhammer name = "Black Jack's Dank Shades" desc = "+20 Badass points. Donor item" diff --git a/code/modules/cm_marines/Donator_Kits.dm b/code/modules/cm_marines/Donator_Kits.dm index 6c8347f3280e..01acf638c2cd 100644 --- a/code/modules/cm_marines/Donator_Kits.dm +++ b/code/modules/cm_marines/Donator_Kits.dm @@ -427,7 +427,7 @@ donor_key = "sasoperative" kit_variant = "Juggernaut" donor_gear = list( - /obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut_alt, + /obj/item/storage/backpack/marine/satchel/fluff/sas_juggernaut, /obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut, /obj/item/clothing/suit/storage/marine/fluff/sas_juggernaut, ) diff --git a/code/modules/cm_marines/anti_air.dm b/code/modules/cm_marines/anti_air.dm index cdb162cddfa3..8c8cab302e19 100644 --- a/code/modules/cm_marines/anti_air.dm +++ b/code/modules/cm_marines/anti_air.dm @@ -102,7 +102,6 @@ var/obj/structure/anti_air_cannon/almayer_aa_cannon if(!almayer_aa_cannon) return - var/datum/ares_link/link = GLOB.ares_link switch(action) if("protect") almayer_aa_cannon.protecting_section = params["section_id"] @@ -110,12 +109,12 @@ var/obj/structure/anti_air_cannon/almayer_aa_cannon almayer_aa_cannon.protecting_section = "" return message_admins("[key_name(usr)] has set the AA to [html_encode(almayer_aa_cannon.protecting_section)].") - link.log_ares_antiair("[usr] Set AA to cover [html_encode(almayer_aa_cannon.protecting_section)].") + log_ares_antiair("[usr] Set AA to cover [html_encode(almayer_aa_cannon.protecting_section)].") . = TRUE if("deactivate") almayer_aa_cannon.protecting_section = "" message_admins("[key_name(usr)] has deactivated the AA cannon.") - link.log_ares_antiair("[usr] Deactivated Anti Air systems.") + log_ares_antiair("[usr] Deactivated Anti Air systems.") . = TRUE add_fingerprint(usr) diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm index 507d6140666d..ddf010547ba4 100644 --- a/code/modules/cm_marines/equipment/guncases.dm +++ b/code/modules/cm_marines/equipment/guncases.dm @@ -9,6 +9,7 @@ can_hold = list()//define on a per case basis for the original firearm. foldable = TRUE foldable = /obj/item/stack/sheet/mineral/plastic//it makes sense + ground_offset_y = 5 /obj/item/storage/box/guncase/update_icon() if(LAZYLEN(contents)) diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index 43cf733adb75..4a7864dbe0f5 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -274,12 +274,12 @@ slowdown = 1 can_hold = list() //Nada. Once you take the stuff out it doesn't fit back in. foldable = TRUE + ground_offset_x = 5 + ground_offset_y = 5 var/pro_case_overlay /obj/item/storage/box/kit/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) if(pro_case_overlay) overlays += image('icons/obj/items/storage.dmi', "+[pro_case_overlay]") diff --git a/code/modules/cm_marines/equipment/mortar/mortar_shells.dm b/code/modules/cm_marines/equipment/mortar/mortar_shells.dm index 7fd05322f1c7..45b3a6859d4a 100644 --- a/code/modules/cm_marines/equipment/mortar/mortar_shells.dm +++ b/code/modules/cm_marines/equipment/mortar/mortar_shells.dm @@ -6,11 +6,9 @@ w_class = SIZE_HUGE flags_atom = FPRINT|CONDUCT var/datum/cause_data/cause_data + ground_offset_x = 7 + ground_offset_y = 6 -/obj/item/mortar_shell/Initialize(mapload, ...) - . = ..() - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) /obj/item/mortar_shell/Destroy() . = ..() diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 8d80f80860f3..1d49c42f5e0d 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -217,15 +217,16 @@ var/list/ob_type_fuel_requirements if(user) tray.warhead.source_mob = user - tray.warhead.warhead_impact(target) + var/obj/structure/ob_ammo/warhead/warhead = tray.warhead + tray.warhead = null + warhead.moveToNullspace() + warhead.warhead_impact(target) sleep(OB_CRASHING_DOWN) ob_cannon_busy = FALSE - chambered_tray = FALSE tray.fuel_amt = 0 - QDEL_NULL(tray.warhead) tray.update_icon() update_icon() @@ -357,6 +358,9 @@ var/list/ob_type_fuel_requirements var/max_shake_factor var/max_knockdown_time + // Note that the warhead should be cleared of location by the firing proc, + // then auto-delete at the end of the warhead_impact implementation + /obj/structure/ob_ammo/warhead/proc/warhead_impact(turf/target) // make damn sure everyone hears it playsound(target, 'sound/weapons/gun_orbital_travel.ogg', 100, 1, 75) @@ -366,7 +370,7 @@ var/list/ob_type_fuel_requirements message_admins(FONT_SIZE_XL("CLICK TO CANCEL THIS OB")) var/relative_dir - for(var/mob/M in range(30, target)) + for(var/mob/M in urange(30, target)) if(get_turf(M) == target) relative_dir = 0 else @@ -377,7 +381,7 @@ var/list/ob_type_fuel_requirements ) sleep(OB_TRAVEL_TIMING/3) - for(var/mob/M in range(25, target)) + for(var/mob/M in urange(25, target)) if(get_turf(M) == target) relative_dir = 0 else @@ -388,7 +392,7 @@ var/list/ob_type_fuel_requirements ) sleep(OB_TRAVEL_TIMING/3) - for(var/mob/M in range(15, target)) + for(var/mob/M in urange(15, target)) M.show_message( \ SPAN_HIGHDANGER("OH GOD THE SKY WILL EXPLODE!!!"), SHOW_MESSAGE_VISIBLE, \ SPAN_HIGHDANGER("YOU SHOULDN'T BE HERE!"), SHOW_MESSAGE_AUDIBLE \ @@ -455,6 +459,7 @@ var/list/ob_type_fuel_requirements handle_ob_shake(target) sleep(double_explosion_delay) cell_explosion(target, standard_power, standard_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data) + qdel(src) return // Checks turf around the target @@ -464,8 +469,11 @@ var/list/ob_type_fuel_requirements handle_ob_shake(target) sleep(double_explosion_delay) cell_explosion(target, standard_power, standard_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data) + qdel(src) return + qdel(src) + /obj/structure/ob_ammo/warhead/incendiary name = "\improper Incendiary orbital warhead" warhead_kind = "incendiary" @@ -497,6 +505,7 @@ var/list/ob_type_fuel_requirements sleep(clear_delay) fire_spread(target, cause_data, distance, fire_level, burn_level, fire_color, fire_type, TURF_PROTECTION_OB) + qdel(src) /obj/structure/ob_ammo/warhead/cluster name = "\improper Cluster orbital warhead" @@ -529,12 +538,16 @@ var/list/ob_type_fuel_requirements for(var/i = 1 to total_amount) for(var/k = 1 to instant_amount) - var/turf/U = pick(turf_list) - if(protected_by_pylon(TURF_PROTECTION_OB, U)) //If the turf somehow gained OB protection while the cluster was firing + var/turf/selected_turf = pick(turf_list) + if(protected_by_pylon(TURF_PROTECTION_OB, selected_turf)) continue - fire_in_a_hole(U) + var/area/selected_area = get_area(selected_turf) + if(CEILING_IS_PROTECTED(selected_area?.ceiling, CEILING_PROTECTION_TIER_4)) + continue + fire_in_a_hole(selected_turf) sleep(delay_between_clusters) + QDEL_IN(src, 5 SECONDS) // Leave time for last handle_ob_shake below /obj/structure/ob_ammo/warhead/cluster/proc/fire_in_a_hole(turf/loc) new /obj/effect/overlay/temp/blinking_laser (loc) @@ -546,8 +559,8 @@ var/list/ob_type_fuel_requirements icon_state = "ob_fuel" is_solid_fuel = 1 -/obj/structure/ob_ammo/ob_fuel/New() - ..() +/obj/structure/ob_ammo/ob_fuel/Initialize() + . = ..() pixel_x = rand(-5,5) pixel_y = rand(-5,5) diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm index d2d55a8cadb1..66d83f9e73b8 100644 --- a/code/modules/cm_marines/overwatch.dm +++ b/code/modules/cm_marines/overwatch.dm @@ -798,7 +798,7 @@ log_attack("[key_name(user)] fired an orbital bombardment in [A.name] for squad '[current_squad]'") /// Project ARES interface log. - GLOB.ares_link.log_ares_bombardment(user.name, ob_name, "X[x_bomb], Y[y_bomb] in [A.name]") + log_ares_bombardment(user.name, ob_name, "X[x_bomb], Y[y_bomb] in [A.name]") busy = FALSE var/turf/target = locate(T.x + rand(-3, 3), T.y + rand(-3, 3), T.z) diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index 272882779d57..c10d148a2136 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -116,6 +116,9 @@ var/mob/living/carbon/human/human_owner = owner var/turf/wearer_turf = get_turf(owner) SSminimaps.remove_marker(owner) + if(!wearer_turf) + return + if(!isyautja(owner)) if(owner.stat >= DEAD) if(human_owner.undefibbable) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm index d6c849e883af..16f0f26576a3 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm @@ -21,4 +21,4 @@ /datum/tech/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", TRUE, FALSE) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm index 575ffe67b85b..49b4eea8f525 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm @@ -23,4 +23,4 @@ /datum/tech/repeatable/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", TRUE, FALSE) diff --git a/code/modules/desert_dam/filtration/consoles.dm b/code/modules/desert_dam/filtration/consoles.dm index 038b96eb4713..8c2814fafde7 100644 --- a/code/modules/desert_dam/filtration/consoles.dm +++ b/code/modules/desert_dam/filtration/consoles.dm @@ -35,8 +35,6 @@ var/global/river_activated = FALSE if (prob(10)) get_broken() return - else - return /obj/structure/machinery/filtration/console/proc/get_broken() if(damaged) diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index bba80f85762a..ad09eaf3fa09 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -87,7 +87,7 @@ /obj/item/spacecash/bundle/attack_self(mob/user) ..() var/oldloc = loc - var/amount = tgui_input_number(user, "How many dollars do you want to take? (0 to [src.worth])", "Take Money", 20, src.worth, 0) + var/amount = tgui_input_number(user, "How many dollars do you want to take? (0 to [src.worth])", "Take Money", 0, src.worth, 0) amount = round(Clamp(amount, 0, src.worth)) if(amount == 0) return diff --git a/code/modules/flufftext/Chinese.dm b/code/modules/flufftext/Chinese.dm index 36da1d307a5b..6b19dd61fcf5 100644 --- a/code/modules/flufftext/Chinese.dm +++ b/code/modules/flufftext/Chinese.dm @@ -62,12 +62,12 @@ //remove complex/simple -u- glide final_syllables if(initial.initial_sound_flags & SIMPLE_U_ONLY) for(var/datum/chinese_sound/final_syllable/final_syllable as anything in possible_final_syllables) - if(initial(initial(final_syllable.vowel_class)) == VOWEL_CLASS_BACK_CLOSE) + if(initial(final_syllable.vowel_class) == VOWEL_CLASS_BACK_CLOSE) possible_final_syllables -= final_syllable possible_final_syllables += /datum/chinese_sound/final_syllable/u else if(initial.initial_sound_flags & HALF_U) for(var/datum/chinese_sound/final_syllable/final_syllable as anything in possible_final_syllables) - if(initial(initial(final_syllable.vowel_class)) == VOWEL_CLASS_BACK_CLOSE && initial(final_syllable.final_syllable_sound_flags) & U_GROUP_FULL) + if(initial(final_syllable.vowel_class) == VOWEL_CLASS_BACK_CLOSE && initial(final_syllable.final_syllable_sound_flags) & U_GROUP_FULL) possible_final_syllables -= final_syllable //check for if the sound is alveolo-palatal or sibilant/retroflex - then remove or keep front close vowels accordingly diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index 39a7b648b999..9afc89ab65c6 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -181,7 +181,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/low_grade_full, WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert, WEAR_R_STORE) @@ -377,7 +377,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -462,7 +462,7 @@ //standard backpack stuff new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_BACK) //specialist backpack stuff new_human.equip_to_slot_or_del(new /obj/item/prop/folded_anti_tank_sadar(new_human), WEAR_IN_BACK) @@ -591,7 +591,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_R_STORE) @@ -843,7 +843,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index 3ce7a6ec281d..756e3f5d9647 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -185,7 +185,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/holdout, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15/rubber, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon_CMB, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon/cmb, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/radio, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/camera, WEAR_IN_BACK) diff --git a/code/modules/gear_presets/contractor.dm b/code/modules/gear_presets/contractor.dm index 9a4497e071ed..0436772a0590 100644 --- a/code/modules/gear_presets/contractor.dm +++ b/code/modules/gear_presets/contractor.dm @@ -87,7 +87,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -192,7 +192,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE) //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -244,7 +244,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) @@ -339,7 +339,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/m717/hacked/contractor, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -468,7 +468,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -574,7 +574,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE) //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -627,7 +627,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) @@ -724,7 +724,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/m717/hacked/contractor, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index f0ad6f85a8b4..b66f3b236e3b 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -891,7 +891,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/dutch(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/dutch(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/full(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_L_STORE) diff --git a/code/modules/gear_presets/dutch.dm b/code/modules/gear_presets/dutch.dm index a88d282b1e91..c83e8384f57a 100644 --- a/code/modules/gear_presets/dutch.dm +++ b/code/modules/gear_presets/dutch.dm @@ -47,7 +47,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/empgrenade/dutch(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/empgrenade/dutch(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/empgrenade/dutch(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked/dutch(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911(new_human), WEAR_IN_ACCESSORY) diff --git a/code/modules/gear_presets/other.dm b/code/modules/gear_presets/other.dm index 837af5ac6677..b60e3f0314e2 100644 --- a/code/modules/gear_presets/other.dm +++ b/code/modules/gear_presets/other.dm @@ -112,7 +112,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/stick, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/ied_incendiary, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/ied_incendiary, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, WEAR_IN_BACK) @@ -122,11 +122,11 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/upp, WEAR_R_STORE) spawn_merc_weapon(new_human) //backpack stuff - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/stick, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/stick, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) //*****************************************************************************************************/ @@ -295,7 +295,7 @@ //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/hefa, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) @@ -332,7 +332,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/autoinjector/full, WEAR_R_STORE) //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/phosphorus, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/minigun(new_human), WEAR_IN_BACK) @@ -391,7 +391,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) //gun spawn_merc_elite_weapon(new_human, 9, 100, 0) //only shotguns @@ -475,7 +475,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/phosphorus/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked/elite_merc, WEAR_IN_BACK) //gun spawn_merc_elite_weapon(new_human, 7, 25, 1) //lower shotgun chance, but not zero diff --git a/code/modules/gear_presets/pmc.dm b/code/modules/gear_presets/pmc.dm index 1e8baa9182cf..127731656220 100644 --- a/code/modules/gear_presets/pmc.dm +++ b/code/modules/gear_presets/pmc.dm @@ -441,7 +441,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -619,7 +619,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -1119,7 +1119,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/sniper/elite, WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/sniper/elite, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/sniper/elite, WEAR_IN_JACKET) @@ -1593,7 +1593,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -1992,7 +1992,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/royal_marines.dm b/code/modules/gear_presets/royal_marines.dm index 373c41df49d8..c990f19fdb27 100644 --- a/code/modules/gear_presets/royal_marines.dm +++ b/code/modules/gear_presets/royal_marines.dm @@ -89,7 +89,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/rmc/rmc_f90_ammo, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -143,7 +143,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/rmc/rmc_f90_ammo/marksman, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -187,7 +187,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/rmc_f90/shotgun, WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/general_belt/rmc, WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BELT) @@ -229,7 +229,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/l905/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -277,7 +277,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/l905/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -326,7 +326,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/l905/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) diff --git a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm index c5c85a0a7441..35a9b8e5eaba 100644 --- a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm +++ b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm @@ -6,12 +6,26 @@ flags = EQUIPMENT_PRESET_START_OF_ROUND assignment = "Weyland-Yutani PMC" faction = FACTION_SURVIVOR - faction_group = list(FACTION_SURVIVOR) + faction_group = list(FACTION_WY, FACTION_SURVIVOR) paygrade = "PMC-OP" idtype = /obj/item/card/id/pmc skills = /datum/skills/civilian/survivor/pmc languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) - access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND) + access = list( + ACCESS_WY_GENERAL, + ACCESS_WY_COLONIAL, + ACCESS_WY_MEDICAL, + ACCESS_WY_SECURITY, + ACCESS_WY_RESEARCH, + ACCESS_WY_ARMORY, + ACCESS_CIVILIAN_PUBLIC, + ACCESS_CIVILIAN_RESEARCH, + ACCESS_CIVILIAN_ENGINEERING, + ACCESS_CIVILIAN_LOGISTICS, + ACCESS_CIVILIAN_BRIG, + ACCESS_CIVILIAN_MEDBAY, + ACCESS_CIVILIAN_COMMAND, + ) /datum/equipment_preset/survivor/pmc/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/hvh, WEAR_L_EAR) @@ -77,12 +91,17 @@ access = list( ACCESS_WY_GENERAL, ACCESS_WY_COLONIAL, - ACCESS_WY_LEADERSHIP, + ACCESS_WY_MEDICAL, ACCESS_WY_SECURITY, - ACCESS_WY_EXEC, ACCESS_WY_RESEARCH, - ACCESS_WY_ENGINEERING, - ACCESS_WY_MEDICAL, + ACCESS_WY_ARMORY, + ACCESS_CIVILIAN_PUBLIC, + ACCESS_CIVILIAN_RESEARCH, + ACCESS_CIVILIAN_ENGINEERING, + ACCESS_CIVILIAN_LOGISTICS, + ACCESS_CIVILIAN_BRIG, + ACCESS_CIVILIAN_MEDBAY, + ACCESS_CIVILIAN_COMMAND, ACCESS_ILLEGAL_PIRATE, ) languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) @@ -95,11 +114,12 @@ if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) add_ice_colony_survivor_equipment(new_human) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable/liaison, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/beaker/vial/random/good(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/paper/research_notes/grant, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/manager(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/dress, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/manager(new_human), WEAR_HEAD) - new_human.equip_to_slot_or_del(new /obj/item/paper/research_notes/good(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/beaker/vial/random/good(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_R_STORE) add_pmc_survivor_weapon(new_human) @@ -110,8 +130,22 @@ /datum/equipment_preset/synth/survivor/pmc name = "Survivor - Synthetic - PMC Support Synth" faction = FACTION_SURVIVOR - faction_group = list(FACTION_SURVIVOR) - access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND) + faction_group = list(FACTION_WY, FACTION_SURVIVOR) + access = list( + ACCESS_WY_GENERAL, + ACCESS_WY_COLONIAL, + ACCESS_WY_MEDICAL, + ACCESS_WY_SECURITY, + ACCESS_WY_RESEARCH, + ACCESS_WY_ARMORY, + ACCESS_CIVILIAN_PUBLIC, + ACCESS_CIVILIAN_RESEARCH, + ACCESS_CIVILIAN_ENGINEERING, + ACCESS_CIVILIAN_LOGISTICS, + ACCESS_CIVILIAN_BRIG, + ACCESS_CIVILIAN_MEDBAY, + ACCESS_CIVILIAN_COMMAND, + ) idtype = /obj/item/card/id/pmc assignment = JOB_PMC_SYNTH rank = JOB_PMC_SYNTH @@ -122,15 +156,16 @@ /datum/equipment_preset/synth/survivor/pmc/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/pmc, WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/surg_vest/equipped, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/scalpel/manager, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/weylandyutani, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/command/hvh, WEAR_L_EAR) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/experimental_mesons, WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm index 147e40a24314..c1ca81683c4b 100644 --- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm +++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm @@ -64,7 +64,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/sapper name = "Survivor - UPP Sapper" - paygrade = "UE3S" + paygrade = "UE3" assignment = JOB_UPP_ENGI rank = JOB_UPP_ENGI skills = /datum/skills/military/survivor/upp_sapper @@ -92,7 +92,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/medic name = "Survivor - UPP Medic" - paygrade = "UE3M" + paygrade = "UE3" assignment = JOB_UPP_MEDIC rank = JOB_UPP_MEDIC skills = /datum/skills/military/survivor/upp_medic @@ -166,8 +166,8 @@ name = "Survivor - Synthetic - UPP Synth" flags = EQUIPMENT_PRESET_EXTRA languages = ALL_SYNTH_LANGUAGES_UPP - assignment = JOB_UPP_COMBAT_SYNTH - rank = JOB_UPP_COMBAT_SYNTH + assignment = JOB_UPP_SUPPORT_SYNTH + rank = JOB_UPP_SUPPORT_SYNTH faction = FACTION_UPP faction_group = list(FACTION_UPP, FACTION_SURVIVOR) skills = /datum/skills/colonial_synthetic diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index dc5d3b7217c8..c686ae91bb78 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -143,6 +143,10 @@ . = ..() access = get_access(ACCESS_LIST_COLONIAL_ALL) + get_region_accesses(2) + get_region_accesses(4) + ACCESS_MARINE_RESEARCH //Access to civillians stuff + medbay stuff + engineering stuff + research +/datum/equipment_preset/synth/survivor/pmc/New() + . = ..() + access = get_access(ACCESS_LIST_WY_PMC) + /datum/equipment_preset/synth/survivor/load_gear(mob/living/carbon/human/new_human) for(var/equipment in equipment_to_spawn) var/equipment_path = islist(equipment_to_spawn[equipment]) ? pick(equipment_to_spawn[equipment]) : equipment_to_spawn[equipment] diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index 1322cd79c4f3..2d5876fe9af8 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -331,7 +331,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -2743,7 +2743,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -3139,7 +3139,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -3568,7 +3568,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index ec0195e928c5..d4d10f7452e9 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -464,6 +464,9 @@ minimap_icon = "private" +/datum/equipment_preset/uscm/private_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + /datum/equipment_preset/uscm/private_equipped/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) @@ -500,6 +503,9 @@ name = "USCM Squad Leader (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/leader_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER @@ -539,6 +545,9 @@ name = "USCM Squad Smartgunner (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/smartgunner_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN @@ -573,6 +582,9 @@ name = "USCM Squad Combat Technician (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/engineer_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI @@ -616,6 +628,9 @@ name = "USCM Squad Hospital Corpsman (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/medic_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC @@ -667,6 +682,9 @@ name = "USCM Squad Weapons Specialist (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/specialist_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST @@ -734,6 +752,9 @@ name = "USCM Fireteam Leader (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/tl_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP) assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index 80520eb05e9a..8bd2468c78dc 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -221,7 +221,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large/slug(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/weapon/shield/riot(new_human), WEAR_L_HAND) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/flashbangs(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/taser(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) @@ -264,7 +264,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/shield/riot(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/storage/box/nade_box/tear_gas(new_human), WEAR_R_HAND) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/flashbangs(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/taser(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 4c383cfed6d9..d34137a1c36b 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -458,7 +458,6 @@ new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/pistol/command(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_L_HAND) if(kit) new_human.equip_to_slot_or_del(new kit(new_human), WEAR_IN_BACK) diff --git a/code/modules/gear_presets/wo.dm b/code/modules/gear_presets/wo.dm index c330bbc76502..3b4671a6517f 100644 --- a/code/modules/gear_presets/wo.dm +++ b/code/modules/gear_presets/wo.dm @@ -281,7 +281,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/bayonet(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) //*****************************************************************************************************/ @@ -766,7 +766,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/medic(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(new_human), WEAR_FACE) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST) diff --git a/code/modules/hydroponics/botany_disks.dm b/code/modules/hydroponics/botany_disks.dm index fda43b6f164e..602003b19ccc 100644 --- a/code/modules/hydroponics/botany_disks.dm +++ b/code/modules/hydroponics/botany_disks.dm @@ -4,14 +4,12 @@ icon = 'icons/obj/items/disk.dmi' icon_state = "botanydisk" w_class = SIZE_TINY + ground_offset_x = 5 + ground_offset_y = 5 var/list/genes = list() var/genesource = "unknown" -/obj/item/disk/botany/Initialize() - . = ..() - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) /obj/item/disk/botany/attack_self(mob/user) ..() diff --git a/code/modules/law/law.dm b/code/modules/law/law.dm index 7d5906047021..20245beda35d 100644 --- a/code/modules/law/law.dm +++ b/code/modules/law/law.dm @@ -13,13 +13,14 @@ var/special_punishment = "" //This is for special punishments //These are bitflags to indicate the type of crime it is. -#define OPTIONAL_CRIME 1 -#define MINOR_CRIME 2 -#define MAJOR_CRIME 4 -#define CAPITAL_CRIME 8 +#define OPTIONAL_CRIME (1<<0) +#define MINOR_CRIME (1<<1) +#define MAJOR_CRIME (1<<2) +#define CAPITAL_CRIME (1<<3) +#define PRECAUTIONARY_CHARGE (1<<4) //These are bitflags for special punishments -#define PERMABRIG 1 -#define DOUBLE_TIME 2 -#define SAME_AS_ACCUSED 4 -#define DEMOTION 8 +#define PERMABRIG (1<<0) +#define DOUBLE_TIME (1<<1) +#define SAME_AS_ACCUSED (1<<2) +#define DEMOTION (1<<3) diff --git a/code/modules/law/laws/capital_crime.dm b/code/modules/law/laws/capital_crime.dm index 8329374e91db..687c483c6593 100644 --- a/code/modules/law/laws/capital_crime.dm +++ b/code/modules/law/laws/capital_crime.dm @@ -10,10 +10,6 @@ name = "Desertion" desc = "Refusing to carry out the duties essential to one’s post or abandoning post unauthorized, without intent to return. (Retreating from the planet when the FOB is breached is not Desertion, refusing to return when ordered is)." -/datum/law/capital_law/insanity - name = "Insanity" - desc = "Acting in such a manner which makes the offender not sound clear of mind. The CMO or Synthetic can declare insanity on a Marine if the Marine is believed to not be of sound mind. The Marine once cleared to be of sound mind may be released from this particular charge." - /datum/law/capital_law/jailbreak_escape name = "Jailbreak/Escape" desc = "To escape, assist in an escape, attempt escape, or be willfully and knowingly broken out." @@ -30,7 +26,3 @@ /datum/law/capital_law/crimes_against_humanity name = "Crimes against Humanity" desc = "To engage in actions that violate human rights or otherwise are heinous acts against humans. Examples are torture, cannibalism and forced infection with Xenomorph larva." - -/datum/law/capital_law/prisoner_of_war - name = "Prisoner of War" - desc = "Being a member of a currently hostile faction to the USCM." diff --git a/code/modules/law/laws/precautionary_charge.dm b/code/modules/law/laws/precautionary_charge.dm new file mode 100644 index 000000000000..c06cd6ca5287 --- /dev/null +++ b/code/modules/law/laws/precautionary_charge.dm @@ -0,0 +1,18 @@ +/datum/law/precautionary_charge + severity = PRECAUTIONARY_CHARGE + brig_time = PERMABRIG_SENTENCE + special_punishment = "Not inclusive for execution criteria." + +/datum/law/precautionary_charge/discretionary_arrest + name = "Discretionary Detainment" + desc = "A discretionary charge used by Commanding Officers to detain personnel for any reason, for the safety and benefit of the operation or security. The duration of this charge is variable and may be pardoned/lifted at any time by the Commanding Officer." + special_punishment = "Not inclusive for execution criteria. May only be appealed to the Acting Commander or Provost/USCM HC." + +/datum/law/precautionary_charge/insanity + name = "Insanity" + desc = "Acting in such a manner which makes the offender not sound clear of mind. The CMO or Synthetic can declare insanity on a Marine if the Marine is believed to not be of sound mind. The Marine once cleared to be of sound mind may be released from this particular charge." + +/datum/law/precautionary_charge/prisoner_of_war + name = "Prisoner of War" + desc = "Being a member of a legitimate and recognised faction currently hostile to the USCM." + special_punishment = "Execution is forbidden barring exceptional circumstances." diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index 7746e90d960d..695ec604631e 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -169,10 +169,7 @@ if(sender == author) message_title = "MentorHelp" // If there's a mentor, let them mark it. If not, let them unmark it - if(mentor) - message_sender_options = " (Unmark" - else - message_sender_options = " (Mark" + message_sender_options = " (Mark/Unmark" message_sender_options += " | Close | AutoResponse)" var/message_header = SPAN_MENTORHELP("[message_title] from [message_sender_key]:[message_sender_options]
") @@ -274,9 +271,10 @@ if("autorespond") autoresponse(C) if("mark") - mark(C) - if("unmark") - unmark(C) + if(!mentor) + mark(C) + else + unmark(C) if("close") if(C == author || C == mentor || CLIENT_IS_STAFF(C)) close(C) @@ -327,7 +325,7 @@ var/msg = SPAN_MENTORSAY("Autoresponse:[choice]") switch(choice) if("L: Discord") - msg += "You can join our Discord server by using this link!" + msg += "You can join our Discord server by using this link!" if("L: Xeno Quickstart Guide") msg += "Your answer can be found on the Xeno Quickstart Guide on our wiki. Check it out here." if("L: Marine Quickstart Guide") diff --git a/code/modules/mob/camera/imaginary_friend.dm b/code/modules/mob/camera/imaginary_friend.dm index 3d6d5d5a0aa2..5d205dd17e4f 100644 --- a/code/modules/mob/camera/imaginary_friend.dm +++ b/code/modules/mob/camera/imaginary_friend.dm @@ -261,7 +261,7 @@ icon = friend_image mouse_opacity = MOUSE_OPACITY_ICON var/mob/ghost = ..() - if(ghost.mind) + if(ghost?.mind) ghost.mind.original = aghosted_original_mob return ghost diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 130a8a923edc..4d06d1e07142 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1012,13 +1012,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return var/list/mobs_by_role = list() // the list the mobs are assigned to first, for sorting purposes - for(var/datum/weakref/ref as anything in GLOB.freed_mob_list) - var/mob/living/resolved_mob = ref.resolve() - var/role_name = resolved_mob.get_role_name() + for(var/mob/freed_mob as anything in GLOB.freed_mob_list) + var/role_name = freed_mob.get_role_name() if(!role_name) role_name = "No Role" LAZYINITLIST(mobs_by_role[role_name]) - mobs_by_role[role_name] += resolved_mob + mobs_by_role[role_name] += freed_mob var/list/freed_mob_choices = list() // the list we'll be choosing from for(var/role in mobs_by_role) @@ -1034,18 +1033,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp handle_joining_as_freed_mob(L) /mob/dead/proc/handle_joining_as_freed_mob(mob/living/freed_mob) - if(!freed_mob || !(WEAKREF(freed_mob) in GLOB.freed_mob_list)) - return - - if(!istype(freed_mob)) + if(!istype(freed_mob) || !(freed_mob in GLOB.freed_mob_list)) return if(QDELETED(freed_mob) || freed_mob.client) - GLOB.freed_mob_list -= WEAKREF(freed_mob) + GLOB.freed_mob_list -= freed_mob to_chat(src, SPAN_WARNING("Something went wrong.")) return - GLOB.freed_mob_list -= WEAKREF(freed_mob) + GLOB.freed_mob_list -= freed_mob mind.transfer_to(freed_mob, TRUE) /mob/dead/verb/join_as_hellhound() diff --git a/code/modules/mob/living/carbon/human/exercise.dm b/code/modules/mob/living/carbon/human/exercise.dm index 7a83fd2886e3..3a2976da9130 100644 --- a/code/modules/mob/living/carbon/human/exercise.dm +++ b/code/modules/mob/living/carbon/human/exercise.dm @@ -102,7 +102,7 @@ Verbs related to getting fucking jacked, bro //humans have 100 stamina //default loss per pushup = 5 stamina var/stamina_loss = 5 - if(issynth(src)) + if(!skills || issynth(src)) return 0 switch(skills.get_skill_level(SKILL_ENDURANCE)) if(SKILL_ENDURANCE_NONE) diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index 502dd77a063d..fda4cea20ad1 100644 --- a/code/modules/mob/living/carbon/human/human_abilities.dm +++ b/code/modules/mob/living/carbon/human/human_abilities.dm @@ -414,8 +414,8 @@ CULT return var/datum/equipment_preset/preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist] - preset.load_race(chosen, H.hivenumber) - preset.load_status(chosen) + preset.load_race(chosen) + preset.load_status(chosen, H.hivenumber) to_chat(chosen, SPAN_ROLE_HEADER("You are now a Xeno Cultist!")) to_chat(chosen, SPAN_ROLE_BODY("Worship the Xenomorphs and listen to the Cult Leader for orders. The Cult Leader is typically the person who transformed you. Do not kill anyone unless you are wearing your black robes, you may defend yourself.")) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index e4ed65107f03..1a906dfa5c11 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -4,7 +4,8 @@ recalculate_move_delay = FALSE if(interactee)// moving stops any kind of interaction - unset_interaction() + if(!(SEND_SIGNAL(src, COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION) & COMPONENT_HUMAN_MOVEMENT_KEEP_USING)) + unset_interaction() if(species.slowdown) . += species.slowdown diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 4b86c827a069..28e45dcb2f5e 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -132,7 +132,6 @@ for(var/message_mode in parsed["modes"]) var/list/obj/item/used_radios = list() switch(message_mode) - if(MESSAGE_MODE_LOCAL) if(RADIO_MODE_WHISPER) whisper_say(message, speaking, alt_name) return @@ -142,9 +141,10 @@ used_radios += I break // remove this if we EVER have two different intercomms with DIFFERENT frequencies IN ONE ROOM else - var/earpiece = get_type_in_ears(/obj/item/device/radio) - if(earpiece) - used_radios += earpiece + if(message_mode != MESSAGE_MODE_LOCAL) + var/earpiece = get_type_in_ears(/obj/item/device/radio) + if(earpiece) + used_radios += earpiece var/sound/speech_sound var/sound_vol diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm index eb5a629760ee..0a6e0ff2ca26 100644 --- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm @@ -207,9 +207,9 @@ if(msg) log_say("PsychicWhisper: [key_name(X)]->[M.key] : [msg]") if(!istype(M, /mob/living/carbon/xenomorph)) - to_chat(M, SPAN_XENO("You hear a strange, alien voice in your head. \"[msg]\"")) + to_chat(M, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[msg]\"")) else - to_chat(M, SPAN_XENO("You hear the voice of [X] resonate in your head. \"[msg]\"")) + to_chat(M, SPAN_XENOQUEEN("You hear the voice of [X] resonate in your head. \"[msg]\"")) to_chat(X, SPAN_XENONOTICE("You said: \"[msg]\" to [M]")) return ..() @@ -234,9 +234,9 @@ continue target_list += possible_target if(!istype(possible_target, /mob/living/carbon/xenomorph)) - to_chat(possible_target, SPAN_XENO("You hear a strange, alien voice in your head. \"[msg]\"")) + to_chat(possible_target, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[msg]\"")) else - to_chat(possible_target, SPAN_XENO("You hear the voice of [X] resonate in your head. \"[msg]\"")) + to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [X] resonate in your head. \"[msg]\"")) if(!length(target_list)) return var/targetstring = english_list(target_list) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index fa9036bd8305..3fd8e53024d5 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -357,8 +357,8 @@ /mob/living/carbon/xenomorph/proc/pounced_turf(turf/T) if(!T.density) - for(var/mob/M in T) - pounced_mob(M) + for(var/mob/living/mob in T) + pounced_mob(mob) break else turf_launch_collision(T) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index af8f33cf1c76..705837699275 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -135,7 +135,7 @@ if(istype(O, /obj/vehicle/multitile)) var/obj/vehicle/multitile/R = O - R.take_damage_type((1 / A.acid_strength) * 40, "acid", src) + R.take_damage_type(40 / A.acid_delay, "acid", src) visible_message(SPAN_XENOWARNING("[src] vomits globs of vile stuff at \the [O]. It sizzles under the bubbling mess of acid!"), \ SPAN_XENOWARNING("You vomit globs of vile stuff at [O]. It sizzles under the bubbling mess of acid!"), null, 5) playsound(loc, "sound/bullets/acid_impact1.ogg", 25) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index 3975a229bbc1..e926349af60d 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -1,74 +1,76 @@ -/datum/action/xeno_action/activable/pierce/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner +/datum/action/xeno_action/activable/pierce/use_ability(atom/targetted_atom) + var/mob/living/carbon/xenomorph/source_xeno = owner if (!action_cooldown_check()) return - if (!X.check_state()) + if (!source_xeno.check_state()) return - if(!A || A.layer >= FLY_LAYER || !isturf(X.loc)) + if(!targetted_atom || targetted_atom.layer >= FLY_LAYER || !isturf(source_xeno.loc)) return if (!check_and_use_plasma_owner()) return + //X = xeno user, A = target atom + var/list/turf/target_turfs = getline2(source_xeno, targetted_atom, include_from_atom = FALSE) + var/length_of_line = LAZYLEN(target_turfs) + if(length_of_line > 3) + target_turfs = target_turfs.Copy(1, 4) + // Get list of target mobs var/list/target_mobs = list() + var/blocked = FALSE - - var/list/target_turfs = list() - var/facing = Get_Compass_Dir(X, A) - var/turf/T = X.loc - var/turf/temp = X.loc - - for(var/x in 0 to 2) - temp = get_step(T, facing) - if(!temp || temp.density || temp.opacity) - break - - var/blocked = FALSE - for(var/obj/structure/S in temp) - if(istype(S, /obj/structure/window/framed)) - var/obj/structure/window/framed/W = S - if(!W.unslashable) - W.deconstruct(disassembled = FALSE) - - if(S.opacity) - blocked = TRUE - break + for(var/turf/path_turf as anything in target_turfs) if(blocked) break + //Check for walls etc and stop if we encounter one + if(path_turf.density) + break - T = temp - target_turfs += T - - for(var/turf/target_turf in target_turfs) - for(var/mob/living/carbon/H in target_turf) - if (!isxeno_human(H) || X.can_not_harm(H)) - continue - - if(!(H in target_mobs)) - target_mobs += H - - X.visible_message(SPAN_XENODANGER("[X] slashes its claws through the area in front of it!"), SPAN_XENODANGER("You slash your claws through the area in front of you!")) - X.animation_attack_on(A, 15) - - X.emote("roar") - - // Loop through our turfs, finding any humans there and dealing damage to them - for (var/mob/living/carbon/H in target_mobs) - if (!isxeno_human(H) || X.can_not_harm(H)) + //Check for structures such as doors + for(var/atom/path_content as anything in path_turf.contents) + if(isobj(path_content)) + var/obj/object = path_content + //If we shouldn't be able to pass through it then stop at this turf + if(object.density && !object.throwpass) + blocked = TRUE + break + + if(istype(object, /obj/structure/window/framed)) + var/obj/structure/window/framed/framed_window = object + if(!framed_window.unslashable) + framed_window.deconstruct(disassembled = FALSE) + + //Check for mobs and add them to our target list for damage + if(iscarbon(path_content)) + var/mob/living/carbon/mob_to_act = path_content + if(!isxeno_human(mob_to_act) || source_xeno.can_not_harm(mob_to_act)) + continue + + if(!(mob_to_act in target_mobs)) + target_mobs += mob_to_act + + source_xeno.visible_message(SPAN_XENODANGER("[source_xeno] slashes its tail through the area in front of it!"), SPAN_XENODANGER("You slash your tail through the area in front of you!")) + source_xeno.animation_attack_on(targetted_atom, 15) + + source_xeno.emote("roar") + + // Loop through our mob list, finding any humans there and dealing damage to them + for (var/mob/living/carbon/current_mob in target_mobs) + if (!isxeno_human(current_mob) || source_xeno.can_not_harm(current_mob)) continue - if (H.stat == DEAD) + if (current_mob.stat == DEAD) continue - X.flick_attack_overlay(H, "slash") - H.apply_armoured_damage(get_xeno_damage_slash(H, damage), ARMOR_MELEE, BRUTE, null, 20) + current_mob.flick_attack_overlay(current_mob, "slash") + current_mob.apply_armoured_damage(get_xeno_damage_slash(current_mob, damage), ARMOR_MELEE, BRUTE, null, 20) if (target_mobs.len >= shield_regen_threshold) - if (X.mutation_type == PRAETORIAN_VANGUARD) - var/datum/behavior_delegate/praetorian_vanguard/BD = X.behavior_delegate + if (source_xeno.mutation_type == PRAETORIAN_VANGUARD) + var/datum/behavior_delegate/praetorian_vanguard/BD = source_xeno.behavior_delegate if (istype(BD)) BD.regen_shield() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm index 708334d31a96..9a29e2cb6da0 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm @@ -130,7 +130,7 @@ if(istype(O, /obj/vehicle/multitile)) var/obj/vehicle/multitile/R = O - R.take_damage_type((1 / A.acid_strength) * 20, "acid", src) + R.take_damage_type(20 / A.acid_delay, "acid", src) visible_message(SPAN_XENOWARNING("[src] vomits globs of vile stuff at \the [O]. It sizzles under the bubbling mess of acid!"), \ SPAN_XENOWARNING("You vomit globs of vile stuff at [O]. It sizzles under the bubbling mess of acid!"), null, 5) playsound(loc, "sound/bullets/acid_impact1.ogg", 25) diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index d81413b68651..0374b21c6f36 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -124,8 +124,7 @@ // Tell the marines where the last one is. var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan complete.\n\nSensors indicate one remaining unknown lifeform signature in [get_area(X)]." - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_bioscan(name, input) + log_ares_bioscan(name, input) marine_announcement(input, name, 'sound/AI/bioscan.ogg', logging = ARES_LOG_NONE) // Tell the xeno she is the last one. if(X.client) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 58933b8ca312..3d74673c5308 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -576,12 +576,14 @@ var/global/list/limb_types_by_name = list( var/iheight = source_icon.Height() var/iwidth = source_icon.Width() var/higher_power = (iheight > iwidth) ? iheight : iwidth + alert_overlay.pixel_y = initial(source.pixel_y) + alert_overlay.pixel_x = initial(source.pixel_x) if(higher_power > 32) var/diff = 32 / higher_power alert_overlay.transform = alert_overlay.transform.Scale(diff, diff) if(higher_power > 48) - alert_overlay.pixel_y = -(iheight / 2) * diff - alert_overlay.pixel_x = -(iwidth / 2) * diff + alert_overlay.pixel_y = -(iheight * 0.5) * diff + alert_overlay.pixel_x = -(iwidth * 0.5) * diff alert_overlay.layer = FLOAT_LAYER diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c3266982b20d..64253fbac5df 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -187,7 +187,7 @@ return //now crawl mob.crawling = TRUE - if(!do_after(mob, 3 SECONDS, INTERRUPT_MOVED|INTERRUPT_UNCONSCIOUS|INTERRUPT_STUNNED|INTERRUPT_RESIST|INTERRUPT_CHANGED_LYING, BUSY_ICON_GENERIC)) + if(!do_after(mob, 1 SECONDS, INTERRUPT_MOVED|INTERRUPT_UNCONSCIOUS|INTERRUPT_STUNNED|INTERRUPT_RESIST|INTERRUPT_CHANGED_LYING, NO_BUSY_ICON)) mob.crawling = FALSE next_movement = world.time + MINIMAL_MOVEMENT_INTERVAL mob.move_intentionally = FALSE diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 5da499dabc52..dda2487c24d9 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -34,8 +34,8 @@ return var/tempnumber = rand(1, 999) - var/postfix_text = (client.prefs && client.prefs.xeno_postfix) ? ("-"+client.prefs.xeno_postfix) : "" - var/prefix_text = (client.prefs && client.prefs.xeno_prefix) ? client.prefs.xeno_prefix : "XX" + var/postfix_text = (client.xeno_postfix) ? ("-"+client.xeno_postfix) : "" + var/prefix_text = (client.xeno_prefix) ? client.xeno_prefix : "XX" var/xeno_text = "[prefix_text]-[tempnumber][postfix_text]" var/round_start = !SSticker || !SSticker.mode || SSticker.current_state <= GAME_STATE_PREGAME diff --git a/code/modules/mob/new_player/sprite_accessories/hair.dm b/code/modules/mob/new_player/sprite_accessories/hair.dm index 0a112cadb11b..3dfe8bebd5af 100644 --- a/code/modules/mob/new_player/sprite_accessories/hair.dm +++ b/code/modules/mob/new_player/sprite_accessories/hair.dm @@ -734,3 +734,24 @@ /datum/sprite_accessory/hair/croft name = "Croft" icon_state = "hair_croft" + +/datum/sprite_accessory/hair/aviator + name = "Aviator" + icon_state = "hair_aviator" + +/datum/sprite_accessory/hair/gantleponytail + name = "Gentle Ponytail" + icon_state = "hair_gantleponytail" + gender = FEMALE + +/datum/sprite_accessory/hair/edgar + name = "Edgar" + icon_state = "hair_edgar" + +/datum/sprite_accessory/hair/emobun + name = "Emo Little Bun" + icon_state = "hair_emobun" + +/datum/sprite_accessory/hair/taper + name = "Taper" + icon_state = "hair_taper" diff --git a/code/modules/objectives/data_retrieval.dm b/code/modules/objectives/data_retrieval.dm index 955d2cc8e63e..01689a18d081 100644 --- a/code/modules/objectives/data_retrieval.dm +++ b/code/modules/objectives/data_retrieval.dm @@ -177,6 +177,8 @@ var/datum/cm_objective/retrieve_item/document/retrieve_objective var/display_color = "white" var/disk_color = "White" + ground_offset_x = 9 + ground_offset_y = 8 /obj/item/disk/objective/Initialize(mapload, ...) . = ..() @@ -210,8 +212,6 @@ name = "[disk_color] computer disk [label]" objective = new /datum/cm_objective/retrieve_data/disk(src) retrieve_objective = new /datum/cm_objective/retrieve_item/document(src) - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) w_class = SIZE_TINY /obj/item/disk/objective/Destroy() diff --git a/code/modules/objectives/documents.dm b/code/modules/objectives/documents.dm index 14bef02245f0..5c6041a406c2 100644 --- a/code/modules/objectives/documents.dm +++ b/code/modules/objectives/documents.dm @@ -122,6 +122,8 @@ unacidable = TRUE indestructible = 1 is_objective = TRUE + ground_offset_x = 9 + ground_offset_y = 8 var/label // label on the document var/renamed = FALSE //Once someone reads a document the item gets renamed based on the objective they are linked to) @@ -131,8 +133,6 @@ objective = new objective_type(src) retrieve_objective = new /datum/cm_objective/retrieve_item/document(src) LAZYADD(objective.enables_objectives, retrieve_objective) - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) /obj/item/document_objective/Destroy() qdel(objective) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 71d1090b20e0..e18c1ce3c2e7 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -19,6 +19,8 @@ flags_equip_slot = SLOT_HEAD flags_armor_protection = BODY_FLAG_HEAD attack_verb = list("bapped") + ground_offset_x = 9 + ground_offset_y = 8 var/info //What's actually written on the paper. var/info_links //A different version of the paper which includes html links at fields and EOF @@ -42,8 +44,6 @@ /obj/item/paper/Initialize(mapload, photo_list) . = ..() - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) stamps = "" src.photo_list = photo_list @@ -382,9 +382,6 @@ /obj/item/paper/attackby(obj/item/P, mob/user) ..() - var/clown = 0 - if(user.mind && (user.job == "Clown")) - clown = 1 if(istype(P, /obj/item/paper) || istype(P, /obj/item/photo)) if (istype(P, /obj/item/paper/carbon)) @@ -424,6 +421,7 @@ return stamps += (stamps=="" ? "
" : "
") + "This paper has been stamped with the [P.name]." + playsound(src, 'sound/effects/alien_footstep_medium3.ogg', 20, TRUE, 6) var/image/stampoverlay = image('icons/obj/items/paper.dmi') var/x @@ -439,11 +437,6 @@ stampoverlay.pixel_x = x stampoverlay.pixel_y = y - if(istype(P, /obj/item/tool/stamp/clown)) - if(!clown) - to_chat(user, SPAN_NOTICE("You are totally unable to use the stamp. HONK!")) - return - if(!ico) ico = new ico += "paper_[P.icon_state]" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 70d6bf3898a6..b47f630974e6 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -82,8 +82,6 @@ p.update_icon() p.icon_state = "paper_words" p.name = bundle.name - p.pixel_y = rand(-8, 8) - p.pixel_x = rand(-9, 9) sleep(15*j) updateUsrDialog() else if(href_list["remove"]) diff --git a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm index 831923415453..df8a7d7bdd76 100644 --- a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm @@ -85,6 +85,8 @@ var/handful = "shells" //used for 'magazine' boxes that give handfuls to determine what kind for the sprite can_explode = TRUE limit_per_tile = 2 + ground_offset_x = 5 + ground_offset_y = 5 /obj/item/ammo_box/magazine/empty empty = TRUE @@ -102,8 +104,6 @@ while(i < num_of_magazines) contents += new magazine_type(src) i++ - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) update_icon() /obj/item/ammo_box/magazine/update_icon() diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm deleted file mode 100644 index 783b982f10bd..000000000000 --- a/code/modules/projectiles/ammo_datums.dm +++ /dev/null @@ -1,3447 +0,0 @@ -/datum/ammo - var/name = "generic bullet" - var/headshot_state = null //Icon state when a human is permanently killed with it by execution/suicide. - var/icon = 'icons/obj/items/weapons/projectiles.dmi' - var/icon_state = "bullet" - var/ping = "ping_b" //The icon that is displayed when the bullet bounces off something. - var/sound_hit //When it deals damage. - var/sound_armor //When it's blocked by human armor. - var/sound_miss //When it misses someone. - var/sound_bounce //When it bounces off something. - var/sound_shield_hit //When the bullet is absorbed by a xeno_shield - - var/accurate_range_min = 0 // Snipers use this to simulate poor accuracy at close ranges - var/scatter = 0 // How much the ammo scatters when burst fired, added to gun scatter, along with other mods - var/stamina_damage = 0 - var/damage = 0 // This is the base damage of the bullet as it is fired - var/damage_type = BRUTE // BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here - var/penetration = 0 // How much armor it ignores before calculations take place - var/shrapnel_chance = 0 // The % chance it will imbed in a human - var/shrapnel_type = 0 // The shrapnel type the ammo will embed, if the chance rolls - var/bonus_projectiles_type // Type path of the extra projectiles - var/bonus_projectiles_amount = 0 // How many extra projectiles it shoots out. Works kind of like firing on burst, but all of the projectiles travel together - var/debilitate[] = null // Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony - var/pen_armor_punch = 0.5 // how much armor breaking will be done per point of penetration. This is for weapons that penetrate with their shape (like needle bullets) - var/damage_armor_punch = 0.5 // how much armor breaking is done by sheer weapon force. This is for big blunt weapons - var/sound_override = null // if we should play a special sound when firing. - var/flags_ammo_behavior = NO_FLAGS - - var/accuracy = HIT_ACCURACY_TIER_1 // This is added to the bullet's base accuracy. - var/accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 // How much the accuracy varies when fired. // This REDUCES the lower bound of accuracy variance by 2%, to 96%. - var/accuracy_var_high = PROJECTILE_VARIANCE_TIER_9 // This INCREASES the upper bound of accuracy variance by 2%, to 107%. - var/accurate_range = 6 // For most guns, this is where the bullet dramatically looses accuracy. Not for snipers though. - var/max_range = 22 // This will de-increment a counter on the bullet. - var/damage_var_low = PROJECTILE_VARIANCE_TIER_9 // Same as with accuracy variance. - var/damage_var_high = PROJECTILE_VARIANCE_TIER_9 // This INCREASES the upper bound of damage variance by 2%, to 107%. - var/damage_falloff = DAMAGE_FALLOFF_TIER_10 // How much damage the bullet loses per turf traveled after the effective range - var/damage_buildup = DAMAGE_BUILDUP_TIER_1 // How much damage the bullet loses per turf away before the effective range - var/effective_range_min = EFFECTIVE_RANGE_OFF //What minimum range the ammo deals full damage, builds up the closer you get. 0 for no minimum. Added onto gun range as a modifier. - var/effective_range_max = EFFECTIVE_RANGE_OFF //What maximum range the ammo deals full damage, tapers off using damage_falloff after hitting this value. 0 for no maximum. Added onto gun range as a modifier. - var/shell_speed = AMMO_SPEED_TIER_1 // How fast the projectile moves. - - var/handful_type = /obj/item/ammo_magazine/handful - var/handful_color - var/handful_state = "bullet" //custom handful sprite, for shotgun shells or etc. - var/multiple_handful_name //so handfuls say 'buckshot shells' not 'shell' - - /// Does this apply xenomorph behaviour delegate? - var/apply_delegate = TRUE - - /// An assoc list in the format list(/datum/element/bullet_trait_to_give = list(...args)) - /// that will be given to a projectile with the current ammo datum - var/list/list/traits_to_give - - var/flamer_reagent_type = /datum/reagent/napalm/ut - - /// The flicker that plays when a bullet hits a target. Usually red. Can be nulled so it doesn't show up at all. - var/hit_effect_color = "#FF0000" - -/datum/ammo/New() - set_bullet_traits() - -/datum/ammo/proc/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) //NOT used on New(), applied to the projectiles. - return - -/// Populate traits_to_give in this proc -/datum/ammo/proc/set_bullet_traits() - return - -/datum/ammo/can_vv_modify() - return FALSE - -/datum/ammo/proc/do_at_half_range(obj/projectile/P) - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) - return - -/datum/ammo/proc/do_at_max_range(obj/projectile/P) - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_shield_block(mob/M, obj/projectile/P) //Does it do something special when shield blocked? Ie. a flare or grenade that still blows up. - return - -/datum/ammo/proc/on_hit_turf(turf/T, obj/projectile/P) //Special effects when hitting dense turfs. - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_hit_mob(mob/M, obj/projectile/P, mob/user) //Special effects when hitting mobs. - SHOULD_NOT_SLEEP(TRUE) - return - -///Special effects when pointblanking mobs. Ultimately called from /living/attackby(). Return TRUE to end the PB attempt. -/datum/ammo/proc/on_pointblank(mob/living/L, obj/projectile/P, mob/living/user, obj/item/weapon/gun/fired_from) - return - -/datum/ammo/proc/on_hit_obj(obj/O, obj/projectile/P) //Special effects when hitting objects. - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_near_target(turf/T, obj/projectile/P) //Special effects when passing near something. Range of things that triggers it is controlled by other ammo flags. - return 0 //return 0 means it flies even after being near something. Return 1 means it stops - -/datum/ammo/proc/knockback(mob/living/living_mob, obj/projectile/fired_projectile, max_range = 2) - if(!living_mob || living_mob == fired_projectile.firer) - return - if(fired_projectile.distance_travelled > max_range || living_mob.lying) - return //Two tiles away or more, basically. - - if(living_mob.mob_size >= MOB_SIZE_BIG) - return //Big xenos are not affected. - - shake_camera(living_mob, 3, 4) - knockback_effects(living_mob, fired_projectile) - slam_back(living_mob, fired_projectile) - -/datum/ammo/proc/slam_back(mob/living/living_mob, obj/projectile/fired_projectile) - //Either knockback or slam them into an obstacle. - var/direction = Get_Compass_Dir(fired_projectile.z ? fired_projectile : fired_projectile.firer, living_mob) //More precise than get_dir. - if(!direction) //Same tile. - return - if(!step(living_mob, direction)) - living_mob.animation_attack_on(get_step(living_mob, direction)) - playsound(living_mob.loc, "punch", 25, 1) - living_mob.visible_message(SPAN_DANGER("[living_mob] slams into an obstacle!"), - isxeno(living_mob) ? SPAN_XENODANGER("You slam into an obstacle!") : SPAN_HIGHDANGER("You slam into an obstacle!"), null, 4, CHAT_TYPE_TAKING_HIT) - living_mob.apply_damage(MELEE_FORCE_TIER_2) - -///The applied effects for knockback(), overwrite to change slow/stun amounts for different ammo datums -/datum/ammo/proc/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - target.apply_effect(0.7, WEAKEN) // 0.9 seconds of stun, per agreement from Balance Team when switched from MC stuns to exact stuns - target.apply_effect(1, SUPERSLOW) - target.apply_effect(2, SLOW) - to_chat(target, SPAN_XENODANGER("You are shaken by the sudden impact!")) - else - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) - if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) - return - - if(target_mob.mob_size >= MOB_SIZE_BIG) - return //too big to push - - to_chat(target_mob, isxeno(target_mob) ? SPAN_XENODANGER("You are pushed back by the sudden impact!") : SPAN_HIGHDANGER("You are pushed back by the sudden impact!"), null, 4, CHAT_TYPE_TAKING_HIT) - slam_back(target_mob, fired_projectile, max_range) - -/datum/ammo/proc/burst(atom/target, obj/projectile/P, damage_type = BRUTE, range = 1, damage_div = 2, show_message = SHOW_MESSAGE_VISIBLE) //damage_div says how much we divide damage - if(!target || !P) return - for(var/mob/living/carbon/M in orange(range,target)) - if(P.firer == M) - continue - if(show_message) - var/msg = "You are hit by backlash from \a [P.name]!" - M.visible_message(SPAN_DANGER("[M] is hit by backlash from \a [P.name]!"),isxeno(M) ? SPAN_XENODANGER("[msg]"):SPAN_HIGHDANGER("[msg]")) - var/damage = P.damage/damage_div - - var/mob/living/carbon/xenomorph/XNO = null - - if(isxeno(M)) - XNO = M - var/total_explosive_resistance = XNO.caste.xeno_explosion_resistance + XNO.armor_explosive_buff - damage = armor_damage_reduction(GLOB.xeno_explosive, damage, total_explosive_resistance , 60, 0, 0.5, XNO.armor_integrity) - var/armor_punch = armor_break_calculation(GLOB.xeno_explosive, damage, total_explosive_resistance, 60, 0, 0.5, XNO.armor_integrity) - XNO.apply_armorbreak(armor_punch) - - M.apply_damage(damage,damage_type) - - if(XNO && XNO.xeno_shields.len) - P.play_shielded_hit_effect(M) - else - P.play_hit_effect(M) - -/datum/ammo/proc/fire_bonus_projectiles(obj/projectile/original_P) - set waitfor = 0 - - var/turf/curloc = get_turf(original_P.shot_from) - var/initial_angle = Get_Angle(curloc, original_P.target_turf) - - for(var/i in 1 to bonus_projectiles_amount) //Want to run this for the number of bonus projectiles. - var/final_angle = initial_angle - - var/obj/projectile/P = new /obj/projectile(curloc, original_P.weapon_cause_data) - P.generate_bullet(GLOB.ammo_list[bonus_projectiles_type]) //No bonus damage or anything. - P.accuracy = round(P.accuracy * original_P.accuracy/initial(original_P.accuracy)) //if the gun changes the accuracy of the main projectile, it also affects the bonus ones. - original_P.give_bullet_traits(P) - - var/total_scatter_angle = P.scatter - final_angle += rand(-total_scatter_angle, total_scatter_angle) - var/turf/new_target = get_angle_target_turf(curloc, final_angle, 30) - - P.fire_at(new_target, original_P.firer, original_P.shot_from, P.ammo.max_range, P.ammo.shell_speed, original_P.original) //Fire! - -/datum/ammo/proc/drop_flame(turf/T, datum/cause_data/cause_data) // ~Art updated fire 20JAN17 - if(!istype(T)) - return - if(locate(/obj/flamer_fire) in T) - return - - var/datum/reagent/R = new flamer_reagent_type() - new /obj/flamer_fire(T, cause_data, R) - - -/* -//====== - Default Ammo -//====== -*/ -//Only when things screw up do we use this as a placeholder. -/datum/ammo/bullet - name = "default bullet" - icon_state = "bullet" - headshot_state = HEADSHOT_OVERLAY_LIGHT - flags_ammo_behavior = AMMO_BALLISTIC - sound_hit = "ballistic_hit" - sound_armor = "ballistic_armor" - sound_miss = "ballistic_miss" - sound_bounce = "ballistic_bounce" - sound_shield_hit = "ballistic_shield_hit" - - accurate_range_min = 0 - damage = 10 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_1 - shrapnel_type = /obj/item/shard/shrapnel - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/proc/handle_battlefield_execution(datum/ammo/firing_ammo, mob/living/hit_mob, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) - SIGNAL_HANDLER - - if(!user || hit_mob == user || user.zone_selected != "head" || user.a_intent != INTENT_HARM || !ishuman_strict(hit_mob)) - return - - if(!skillcheck(user, SKILL_EXECUTION, SKILL_EXECUTION_TRAINED)) - to_chat(user, SPAN_DANGER("You don't know how to execute someone correctly.")) - return - - var/mob/living/carbon/human/execution_target = hit_mob - - if(execution_target.status_flags & PERMANENTLY_DEAD) - to_chat(user, SPAN_DANGER("[execution_target] has already been executed!")) - return - - INVOKE_ASYNC(src, PROC_REF(attempt_battlefield_execution), src, execution_target, firing_projectile, user, fired_from) - - return COMPONENT_CANCEL_AMMO_POINT_BLANK - -/datum/ammo/bullet/proc/attempt_battlefield_execution(datum/ammo/firing_ammo, mob/living/carbon/human/execution_target, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) - user.affected_message(execution_target, - SPAN_HIGHDANGER("You aim \the [fired_from] at [execution_target]'s head!"), - SPAN_HIGHDANGER("[user] aims \the [fired_from] directly at your head!"), - SPAN_DANGER("[user] aims \the [fired_from] at [execution_target]'s head!")) - - user.next_move += 1.1 SECONDS //PB has no click delay; readding it here to prevent people accidentally queuing up multiple executions. - - if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE) || !user.Adjacent(execution_target)) - fired_from.delete_bullet(firing_projectile, TRUE) - return - - if(!(fired_from.flags_gun_features & GUN_SILENCED)) - playsound(user, fired_from.fire_sound, fired_from.firesound_volume, FALSE) - else - playsound(user, fired_from.fire_sound, 25, FALSE) - - shake_camera(user, 1, 2) - - execution_target.apply_damage(damage * 3, BRUTE, "head", no_limb_loss = TRUE, permanent_kill = TRUE) //Apply gobs of damage and make sure they can't be revived later... - execution_target.apply_damage(200, OXY) //...fill out the rest of their health bar with oxyloss... - execution_target.death(create_cause_data("execution", user)) //...make certain they're properly dead... - shake_camera(execution_target, 3, 4) - execution_target.update_headshot_overlay(headshot_state) //...and add a gory headshot overlay. - - execution_target.visible_message(SPAN_HIGHDANGER(uppertext("[execution_target] WAS EXECUTED!")), \ - SPAN_HIGHDANGER("You WERE EXECUTED!")) - - user.count_niche_stat(STATISTICS_NICHE_EXECUTION, 1, firing_projectile.weapon_cause_data?.cause_name) - - var/area/execution_area = get_area(execution_target) - - msg_admin_attack(FONT_SIZE_HUGE("[key_name(usr)] has battlefield executed [key_name(execution_target)] in [get_area(usr)] ([usr.loc.x],[usr.loc.y],[usr.loc.z])."), usr.loc.x, usr.loc.y, usr.loc.z) - log_attack("[key_name(usr)] battlefield executed [key_name(execution_target)] at [execution_area.name].") - - if(flags_ammo_behavior & AMMO_EXPLOSIVE) - execution_target.gib() - - -/* -//====== - Pistol Ammo -//====== -*/ - -// Used by M4A3, M4A3 Custom and B92FS -/datum/ammo/bullet/pistol - name = "pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - damage = 40 - penetration= ARMOR_PENETRATION_TIER_2 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pistol/tiny - name = "light pistol bullet" - -/datum/ammo/bullet/pistol/tranq - name = "tranquilizer bullet" - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST - stamina_damage = 30 - damage = 15 - -//2020 rebalance: is supposed to counter runners and lurkers, dealing high damage to the only castes with no armor. -//Limited by its lack of versatility and lower supply, so marines finally have an answer for flanker castes that isn't just buckshot. - -/datum/ammo/bullet/pistol/hollow - name = "hollowpoint pistol bullet" - - damage = 55 //hollowpoint is strong - penetration = 0 //hollowpoint can't pierce armor! - shrapnel_chance = SHRAPNEL_CHANCE_TIER_3 //hollowpoint causes shrapnel - -// Used by M4A3 AP and mod88 -/datum/ammo/bullet/pistol/ap - name = "armor-piercing pistol bullet" - - damage = 25 - accuracy = HIT_ACCURACY_TIER_2 - penetration= ARMOR_PENETRATION_TIER_8 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pistol/ap/penetrating - name = "wall-penetrating pistol bullet" - shrapnel_chance = 0 - - damage = 30 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/pistol/ap/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/pistol/ap/toxin - name = "toxic pistol bullet" - var/acid_per_hit = 10 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/pistol/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/pistol/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/le - name = "armor-shredding pistol bullet" - - damage = 15 - penetration = ARMOR_PENETRATION_TIER_4 - pen_armor_punch = 3 - -/datum/ammo/bullet/pistol/rubber - name = "rubber pistol bullet" - sound_override = 'sound/weapons/gun_c99.ogg' - - damage = 0 - stamina_damage = 25 - shrapnel_chance = 0 - -// Reskinned rubber bullet used for the ES-4 CL pistol. -/datum/ammo/bullet/pistol/rubber/stun - name = "stun pistol bullet" - sound_override = null - -// Used by M1911, Deagle and KT-42 -/datum/ammo/bullet/pistol/heavy - name = "heavy pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - damage = 55 - penetration = ARMOR_PENETRATION_TIER_3 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pistol/heavy/super //Commander's variant - name = ".50 heavy pistol bullet" - damage = 60 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/pistol/heavy/super/highimpact - name = ".50 high-impact pistol bullet" - penetration = ARMOR_PENETRATION_TIER_1 - debilitate = list(0,1.5,0,0,0,1,0,0) - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/pistol/heavy/super/highimpact/ap - name = ".50 high-impact armor piercing pistol bullet" - penetration = ARMOR_PENETRATION_TIER_10 - damage = 45 - -/datum/ammo/bullet/pistol/heavy/super/highimpact/upp - name = "high-impact pistol bullet" - sound_override = 'sound/weapons/gun_DE50.ogg' - penetration = ARMOR_PENETRATION_TIER_6 - debilitate = list(0,1.5,0,0,0,1,0,0) - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/pistol/heavy/super/highimpact/New() - ..() - RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) - -/datum/ammo/bullet/pistol/heavy/super/highimpact/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) - -/datum/ammo/bullet/pistol/deagle - name = ".50 heavy pistol bullet" - damage = 45 - headshot_state = HEADSHOT_OVERLAY_HEAVY - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_5 - -/datum/ammo/bullet/pistol/incendiary - name = "incendiary pistol bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = HIT_ACCURACY_TIER_3 - damage = 20 - -/datum/ammo/bullet/pistol/incendiary/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -// Used by the hipower -// I know that the 'high power' in the name is supposed to mean its 'impressive' magazine capacity -// but this is CM, half our guns have baffling misconceptions and mistakes (how do you grab the type-71?) so it's on-brand. -// maybe in the far flung future of 2280 someone screwed up the design. - -/datum/ammo/bullet/pistol/highpower - name = "high-powered pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = HIT_ACCURACY_TIER_3 - damage = 36 - penetration = ARMOR_PENETRATION_TIER_5 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - -// Used by VP78 and Auto 9 -/datum/ammo/bullet/pistol/squash - name = "squash-head pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - debilitate = list(0,0,0,0,0,0,0,2) - - accuracy = HIT_ACCURACY_TIER_4 - damage = 45 - penetration= ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_6 //"VP78 - the only pistol viable as a primary."-Vampmare, probably. - -/datum/ammo/bullet/pistol/squash/toxin - name = "toxic squash-head pistol bullet" - var/acid_per_hit = 10 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/pistol/squash/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/pistol/squash/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/squash/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/squash/penetrating - name = "wall-penetrating squash-head pistol bullet" - shrapnel_chance = 0 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/pistol/squash/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/pistol/squash/incendiary - name = "incendiary squash-head pistol bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - accuracy = HIT_ACCURACY_TIER_3 - damage = 35 - -/datum/ammo/bullet/pistol/squash/incendiary/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - - -/datum/ammo/bullet/pistol/mankey - name = "live monkey" - icon_state = "monkey1" - ping = null //no bounce off. - damage_type = BURN - debilitate = list(4,4,0,0,0,0,0,0) - flags_ammo_behavior = AMMO_IGNORE_ARMOR - - damage = 15 - damage_var_high = PROJECTILE_VARIANCE_TIER_5 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/bullet/pistol/mankey/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/pistol/mankey/on_hit_mob(mob/M,obj/projectile/P) - if(P && P.loc && !M.stat && !istype(M,/mob/living/carbon/human/monkey)) - P.visible_message(SPAN_DANGER("The [src] chimpers furiously!")) - new /mob/living/carbon/human/monkey(P.loc) - -/datum/ammo/bullet/pistol/smart - name = "smartpistol bullet" - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = HIT_ACCURACY_TIER_8 - damage = 30 - penetration = 20 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/* -//====== - Revolver Ammo -//====== -*/ - -/datum/ammo/bullet/revolver - name = "revolver bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - damage = 55 - penetration = ARMOR_PENETRATION_TIER_1 - accuracy = HIT_ACCURACY_TIER_1 - -/datum/ammo/bullet/revolver/marksman - name = "marksman revolver bullet" - - shrapnel_chance = 0 - damage_falloff = 0 - accurate_range = 12 - penetration = ARMOR_PENETRATION_TIER_7 - -/datum/ammo/bullet/revolver/heavy - name = "heavy revolver bullet" - - damage = 35 - penetration = ARMOR_PENETRATION_TIER_4 - accuracy = HIT_ACCURACY_TIER_3 - -/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) - -/datum/ammo/bullet/revolver/incendiary - name = "incendiary revolver bullet" - damage = 40 - -/datum/ammo/bullet/revolver/incendiary/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/revolver/marksman/toxin - name = "toxic revolver bullet" - var/acid_per_hit = 10 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/revolver/penetrating - name = "wall-penetrating revolver bullet" - shrapnel_chance = 0 - - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/revolver/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/revolver/upp - name = "heavy revolver bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - penetration = ARMOR_PENETRATION_TIER_4 - damage = 70 - - -/datum/ammo/bullet/revolver/upp/shrapnel - name = "shrapnel shot" - headshot_state = HEADSHOT_OVERLAY_HEAVY //Gol-dang shotgun blow your fething head off. - debilitate = list(0,0,0,0,0,0,0,0) - icon_state = "shrapnelshot" - handful_state = "shrapnel" - bonus_projectiles_type = /datum/ammo/bullet/revolver/upp/shrapnel_bits - - max_range = 6 - damage = 40 // + TIER_4 * 3 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - penetration = ARMOR_PENETRATION_TIER_8 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - shrapnel_chance = 100 - shrapnel_type = /obj/item/shard/shrapnel/upp - //roughly 90 or so damage with the additional shrapnel, around 130 in total with primary round - -/datum/ammo/bullet/revolver/upp/shrapnel/on_hit_mob(mob/M, obj/projectile/P) - pushback(M, P, 1) - -/datum/ammo/bullet/revolver/upp/shrapnel_bits - name = "small shrapnel" - icon_state = "shrapnelshot_bit" - - max_range = 6 - damage = 30 - penetration = ARMOR_PENETRATION_TIER_4 - scatter = SCATTER_AMOUNT_TIER_1 - bonus_projectiles_amount = 0 - shrapnel_type = /obj/item/shard/shrapnel/upp/bits - -/datum/ammo/bullet/revolver/small - name = "small revolver bullet" - headshot_state = HEADSHOT_OVERLAY_LIGHT - - damage = 45 - - penetration = ARMOR_PENETRATION_TIER_3 - -/datum/ammo/bullet/revolver/small/hollowpoint - name = "small hollowpoint revolver bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - damage = 75 // way too strong because it's hard to make a good balance between HP and normal with this system, but the damage falloff is really strong - penetration = 0 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - -/datum/ammo/bullet/revolver/mateba - name = ".454 heavy revolver bullet" - - damage = 60 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/revolver/mateba/highimpact - name = ".454 heavy high-impact revolver bullet" - debilitate = list(0,2,0,0,0,1,0,0) - penetration = ARMOR_PENETRATION_TIER_1 - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/revolver/mateba/highimpact/ap - name = ".454 heavy high-impact armor piercing revolver bullet" - penetration = ARMOR_PENETRATION_TIER_10 - damage = 45 - -/datum/ammo/bullet/revolver/mateba/highimpact/New() - ..() - RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) - -/datum/ammo/bullet/revolver/mateba/highimpact/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive //if you ever put this in normal gameplay, i am going to scream - name = ".454 heavy explosive revolver bullet" - damage = 100 - damage_var_low = PROJECTILE_VARIANCE_TIER_10 - damage_var_high = PROJECTILE_VARIANCE_TIER_1 - penetration = ARMOR_PENETRATION_TIER_10 - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_BALLISTIC - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_mob(mob/M, obj/projectile/P) - ..() - cell_explosion(get_turf(M), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_obj(obj/O, obj/projectile/P) - ..() - cell_explosion(get_turf(O), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_turf(turf/T, obj/projectile/P) - ..() - cell_explosion(T, 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/revolver/webley //Mateba round without the knockdown. - name = ".455 Webley bullet" - damage = 60 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_2 - -/* -//====== - SMG Ammo -//====== -*/ -//2020 SMG/ammo rebalance. default ammo actually has penetration so it can be useful, by 4khan: should be meh against t3s, better under 15 armor. Perfectly does this right now (oct 2020) -//has reduced falloff compared to the m39. this means it is best for kiting castes (mostly t2s and below admittedly) -//while the m39 ap is better for shredding them at close range, but has reduced velocity, so it's better for just running in and erasing armor-centric castes (defender, crusher) -// which i think is really interesting and good balance, giving both ammo types a reason to exist even against ravagers. -//i feel it is necessary to reflavor the default bullet, because otherwise, people won't be able to notice it has less falloff and faster bullet speed. even with a changelog, -//way too many people don't read the changelog, and after one or two months the changelog entry is all but archive, so there needs to be an ingame description of what the ammo does -//in comparison to armor-piercing rounds. - -/datum/ammo/bullet/smg - name = "submachinegun bullet" - damage = 34 - accurate_range = 4 - effective_range_max = 4 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_6 - damage_falloff = DAMAGE_FALLOFF_TIER_5 - scatter = SCATTER_AMOUNT_TIER_6 - accuracy = HIT_ACCURACY_TIER_3 - -/datum/ammo/bullet/smg/m39 - name = "high-velocity submachinegun bullet" //i don't want all smgs to inherit 'high velocity' - -/datum/ammo/bullet/smg/ap - name = "armor-piercing submachinegun bullet" - - damage = 26 - penetration = ARMOR_PENETRATION_TIER_6 - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/smg/heap - name = "high-explosive armor-piercing submachinegun bullet" - - damage = 45 - headshot_state = HEADSHOT_OVERLAY_MEDIUM - penetration = ARMOR_PENETRATION_TIER_6 - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/smg/ap/toxin - name = "toxic submachinegun bullet" - var/acid_per_hit = 5 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/smg/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/smg/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/smg/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/smg/nail - name = "7x45mm plasteel nail" - icon_state = "nail-projectile" - - damage = 25 - penetration = ARMOR_PENETRATION_TIER_5 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - accurate_range = 5 - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/smg/incendiary - name = "incendiary submachinegun bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 25 - accuracy = -HIT_ACCURACY_TIER_2 - -/datum/ammo/bullet/smg/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/smg/ap/penetrating - name = "wall-penetrating submachinegun bullet" - shrapnel_chance = 0 - - damage = 30 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/smg/ap/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/smg/le - name = "armor-shredding submachinegun bullet" - - scatter = SCATTER_AMOUNT_TIER_10 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_4 - shell_speed = AMMO_SPEED_TIER_3 - damage_falloff = DAMAGE_FALLOFF_TIER_10 - pen_armor_punch = 4 - -/datum/ammo/bullet/smg/rubber - name = "rubber submachinegun bullet" - sound_override = 'sound/weapons/gun_c99.ogg' - - damage = 0 - stamina_damage = 10 - shrapnel_chance = 0 - -/datum/ammo/bullet/smg/mp27 - name = "simple submachinegun bullet" - damage = 40 - accurate_range = 5 - effective_range_max = 7 - penetration = 0 - shell_speed = AMMO_SPEED_TIER_6 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - scatter = SCATTER_AMOUNT_TIER_6 - accuracy = HIT_ACCURACY_TIER_2 - -// less damage than the m39, but better falloff, range, and AP - -/datum/ammo/bullet/smg/ppsh - name = "crude submachinegun bullet" - damage = 26 - accurate_range = 7 - effective_range_max = 7 - penetration = ARMOR_PENETRATION_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - scatter = SCATTER_AMOUNT_TIER_5 - -/datum/ammo/bullet/smg/pps43 - name = "simple submachinegun bullet" - damage = 35 - accurate_range = 7 - effective_range_max = 10 - penetration = ARMOR_PENETRATION_TIER_4 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - scatter = SCATTER_AMOUNT_TIER_6 - -/* -//====== - Rifle Ammo -//====== -*/ - -/datum/ammo/bullet/rifle - name = "rifle bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - damage = 40 - penetration = ARMOR_PENETRATION_TIER_1 - accurate_range = 16 - accuracy = HIT_ACCURACY_TIER_4 - scatter = SCATTER_AMOUNT_TIER_10 - shell_speed = AMMO_SPEED_TIER_6 - effective_range_max = 7 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - max_range = 24 //So S8 users don't have their bullets magically disappaer at 22 tiles (S8 can see 24 tiles) - -/datum/ammo/bullet/rifle/holo_target - name = "holo-targeting rifle bullet" - damage = 30 - var/holo_stacks = 10 - -/datum/ammo/bullet/rifle/holo_target/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) - -/datum/ammo/bullet/rifle/holo_target/hunting - name = "holo-targeting hunting bullet" - damage = 25 - holo_stacks = 15 - -/datum/ammo/bullet/rifle/explosive - name = "explosive rifle bullet" - - damage = 25 - accurate_range = 22 - accuracy = 0 - shell_speed = AMMO_SPEED_TIER_4 - damage_falloff = DAMAGE_FALLOFF_TIER_9 - -/datum/ammo/bullet/rifle/explosive/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(get_turf(M), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/rifle/explosive/on_hit_obj(obj/O, obj/projectile/P) - cell_explosion(get_turf(O), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/rifle/explosive/on_hit_turf(turf/T, obj/projectile/P) - if(T.density) - cell_explosion(T, 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/rifle/ap - name = "armor-piercing rifle bullet" - - damage = 30 - penetration = ARMOR_PENETRATION_TIER_8 - -// Basically AP but better. Focused at taking out armour temporarily -/datum/ammo/bullet/rifle/ap/toxin - name = "toxic rifle bullet" - var/acid_per_hit = 7 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/rifle/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/rifle/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/rifle/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - - -/datum/ammo/bullet/rifle/ap/penetrating - name = "wall-penetrating rifle bullet" - shrapnel_chance = 0 - - damage = 35 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/rifle/ap/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/rifle/le - name = "armor-shredding rifle bullet" - - damage = 20 - penetration = ARMOR_PENETRATION_TIER_4 - pen_armor_punch = 5 - -/datum/ammo/bullet/rifle/heap - name = "high-explosive armor-piercing rifle bullet" - - headshot_state = HEADSHOT_OVERLAY_HEAVY - damage = 55//big damage, doesn't actually blow up because thats stupid. - penetration = ARMOR_PENETRATION_TIER_8 - -/datum/ammo/bullet/rifle/rubber - name = "rubber rifle bullet" - sound_override = 'sound/weapons/gun_c99.ogg' - - damage = 0 - stamina_damage = 15 - shrapnel_chance = 0 - -/datum/ammo/bullet/rifle/incendiary - name = "incendiary rifle bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 30 - shell_speed = AMMO_SPEED_TIER_4 - accuracy = -HIT_ACCURACY_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_10 - -/datum/ammo/bullet/rifle/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/rifle/m4ra - name = "A19 high velocity bullet" - shrapnel_chance = 0 - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC - accurate_range_min = 4 - - damage = 55 - scatter = -SCATTER_AMOUNT_TIER_8 - penetration= ARMOR_PENETRATION_TIER_7 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/rifle/m4ra/incendiary - name = "A19 high velocity incendiary bullet" - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 40 - accuracy = HIT_ACCURACY_TIER_4 - scatter = -SCATTER_AMOUNT_TIER_8 - penetration= ARMOR_PENETRATION_TIER_5 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/rifle/m4ra/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/rifle/m4ra/impact - name = "A19 high velocity impact bullet" - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 40 - accuracy = -HIT_ACCURACY_TIER_2 - scatter = -SCATTER_AMOUNT_TIER_8 - penetration = ARMOR_PENETRATION_TIER_10 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/rifle/m4ra/impact/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 32) // Can knockback basically at max range - -/datum/ammo/bullet/rifle/m4ra/impact/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(2, SUPERSLOW) - target.apply_effect(5, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/rifle/mar40 - name = "heavy rifle bullet" - - damage = 55 - -/datum/ammo/bullet/rifle/type71 - name = "heavy rifle bullet" - - damage = 55 - penetration = ARMOR_PENETRATION_TIER_3 - -/datum/ammo/bullet/rifle/type71/ap - name = "heavy armor-piercing rifle bullet" - - damage = 40 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/rifle/type71/heap - name = "heavy high-explosive armor-piercing rifle bullet" - - headshot_state = HEADSHOT_OVERLAY_HEAVY - damage = 65 - penetration = ARMOR_PENETRATION_TIER_10 - -/* -//====== - Shotgun Ammo -//====== -*/ - -/datum/ammo/bullet/shotgun - headshot_state = HEADSHOT_OVERLAY_HEAVY - -/datum/ammo/bullet/shotgun/slug - name = "shotgun slug" - handful_state = "slug_shell" - - accurate_range = 6 - max_range = 8 - damage = 70 - penetration = ARMOR_PENETRATION_TIER_4 - damage_armor_punch = 2 - handful_state = "slug_shell" - -/datum/ammo/bullet/shotgun/slug/on_hit_mob(mob/M,obj/projectile/P) - knockback(M, P, 6) - -/datum/ammo/bullet/shotgun/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(1, SUPERSLOW) - target.apply_effect(3, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/shotgun/beanbag - name = "beanbag slug" - headshot_state = HEADSHOT_OVERLAY_LIGHT //It's not meant to kill people... but if you put it in your mouth, it will. - handful_state = "beanbag_slug" - icon_state = "beanbag" - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST - sound_override = 'sound/weapons/gun_shotgun_riot.ogg' - - max_range = 12 - shrapnel_chance = 0 - damage = 0 - stamina_damage = 45 - accuracy = HIT_ACCURACY_TIER_3 - shell_speed = AMMO_SPEED_TIER_3 - handful_state = "beanbag_slug" - -/datum/ammo/bullet/shotgun/beanbag/on_hit_mob(mob/M, obj/projectile/P) - if(!M || M == P.firer) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - shake_camera(H, 2, 1) - - -/datum/ammo/bullet/shotgun/incendiary - name = "incendiary slug" - handful_state = "incendiary_slug" - damage_type = BURN - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = -HIT_ACCURACY_TIER_2 - max_range = 12 - damage = 55 - penetration= ARMOR_PENETRATION_TIER_1 - handful_state = "incendiary_slug" - -/datum/ammo/bullet/shotgun/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shotgun/incendiary/on_hit_mob(mob/M,obj/projectile/P) - burst(get_turf(M),P,damage_type) - knockback(M,P) - -/datum/ammo/bullet/shotgun/incendiary/on_hit_obj(obj/O,obj/projectile/P) - burst(get_turf(P),P,damage_type) - -/datum/ammo/bullet/shotgun/incendiary/on_hit_turf(turf/T,obj/projectile/P) - burst(get_turf(T),P,damage_type) - - -/datum/ammo/bullet/shotgun/flechette - name = "flechette shell" - icon_state = "flechette" - handful_state = "flechette_shell" - bonus_projectiles_type = /datum/ammo/bullet/shotgun/flechette_spread - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - max_range = 12 - damage = 30 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_7 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - handful_state = "flechette_shell" - multiple_handful_name = TRUE - -/datum/ammo/bullet/shotgun/flechette_spread - name = "additional flechette" - icon_state = "flechette" - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - max_range = 12 - damage = 30 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_7 - scatter = SCATTER_AMOUNT_TIER_5 - -/datum/ammo/bullet/shotgun/buckshot - name = "buckshot shell" - icon_state = "buckshot" - handful_state = "buckshot_shell" - multiple_handful_name = TRUE - bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_5 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_5 - accurate_range = 4 - max_range = 4 - damage = 65 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_1 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - shell_speed = AMMO_SPEED_TIER_2 - damage_armor_punch = 0 - pen_armor_punch = 0 - handful_state = "buckshot_shell" - multiple_handful_name = TRUE - -/datum/ammo/bullet/shotgun/buckshot/incendiary - name = "incendiary buckshot shell" - handful_state = "incen_buckshot" - handful_type = /obj/item/ammo_magazine/handful/shotgun/buckshot/incendiary - -/datum/ammo/bullet/shotgun/buckshot/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shotgun/buckshot/on_hit_mob(mob/M,obj/projectile/P) - knockback(M,P) - -//buckshot variant only used by the masterkey shotgun attachment. -/datum/ammo/bullet/shotgun/buckshot/masterkey - bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread/masterkey - - damage = 55 - -/datum/ammo/bullet/shotgun/spread - name = "additional buckshot" - icon_state = "buckshot" - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 4 - max_range = 6 - damage = 65 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_2 - scatter = SCATTER_AMOUNT_TIER_1 - damage_armor_punch = 0 - pen_armor_punch = 0 - -/datum/ammo/bullet/shotgun/spread/masterkey - damage = 20 - -/* - 8 GAUGE SHOTGUN AMMO -*/ - -/datum/ammo/bullet/shotgun/heavy/buckshot - name = "heavy buckshot shell" - icon_state = "buckshot" - handful_state = "heavy_buckshot" - multiple_handful_name = TRUE - bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/spread - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - accurate_range = 3 - max_range = 3 - damage = 75 - penetration = 0 - shell_speed = AMMO_SPEED_TIER_2 - damage_armor_punch = 0 - pen_armor_punch = 0 - -/datum/ammo/bullet/shotgun/heavy/buckshot/on_hit_mob(mob/M,obj/projectile/P) - knockback(M,P) - -/datum/ammo/bullet/shotgun/heavy/buckshot/spread - name = "additional heavy buckshot" - max_range = 4 - scatter = SCATTER_AMOUNT_TIER_1 - bonus_projectiles_amount = 0 - -//basically the same -/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath - name = "dragon's breath shell" - handful_state = "heavy_dragonsbreath" - multiple_handful_name = TRUE - damage_type = BURN - damage = 60 - accurate_range = 3 - max_range = 4 - bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread - -/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread - name = "additional dragon's breath" - bonus_projectiles_amount = 0 - accurate_range = 4 - max_range = 5 //make use of the ablaze property - shell_speed = AMMO_SPEED_TIER_4 // so they hit before the main shell stuns - - -/datum/ammo/bullet/shotgun/heavy/slug - name = "heavy shotgun slug" - handful_state = "heavy_slug" - - accurate_range = 7 - max_range = 8 - damage = 90 //ouch. - penetration = ARMOR_PENETRATION_TIER_6 - damage_armor_punch = 2 - -/datum/ammo/bullet/shotgun/heavy/slug/on_hit_mob(mob/M,obj/projectile/P) - knockback(M, P, 7) - -/datum/ammo/bullet/shotgun/heavy/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(2, SUPERSLOW) - target.apply_effect(5, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/shotgun/heavy/beanbag - name = "heavy beanbag slug" - icon_state = "beanbag" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - handful_state = "heavy_beanbag" - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST - sound_override = 'sound/weapons/gun_shotgun_riot.ogg' - - max_range = 7 - shrapnel_chance = 0 - damage = 0 - stamina_damage = 100 - accuracy = HIT_ACCURACY_TIER_2 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/bullet/shotgun/heavy/beanbag/on_hit_mob(mob/M, obj/projectile/P) - if(!M || M == P.firer) - return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - shake_camera(H, 2, 1) - -/datum/ammo/bullet/shotgun/heavy/flechette - name = "heavy flechette shell" - icon_state = "flechette" - handful_state = "heavy_flechette" - multiple_handful_name = TRUE - bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/flechette_spread - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_3 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_3 - max_range = 12 - damage = 45 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_10 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_2 - -/datum/ammo/bullet/shotgun/heavy/flechette_spread - name = "additional heavy flechette" - icon_state = "flechette" - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - max_range = 12 - damage = 45 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_10 - scatter = SCATTER_AMOUNT_TIER_4 - -//Enormous shell for Van Bandolier's superheavy double-barreled hunting gun. -/datum/ammo/bullet/shotgun/twobore - name = "two bore bullet" - icon_state = "autocannon" - handful_state = "twobore" - - accurate_range = 8 //Big low-velocity projectile; this is for blasting dangerous game at close range. - max_range = 14 //At this range, it's lost all its damage anyway. - damage = 300 //Hits like a buckshot PB. - penetration = ARMOR_PENETRATION_TIER_3 - damage_falloff = DAMAGE_FALLOFF_TIER_1 * 3 //It has a lot of energy, but the 26mm bullet drops off fast. - effective_range_max = EFFECTIVE_RANGE_MAX_TIER_2 //Full damage up to this distance, then falloff for each tile beyond. - var/hit_messages = list() - -/datum/ammo/bullet/shotgun/twobore/on_hit_mob(mob/living/M, obj/projectile/P) - var/mob/shooter = P.firer - if(shooter && ismob(shooter) && HAS_TRAIT(shooter, TRAIT_TWOBORE_TRAINING) && M.stat != DEAD && prob(40)) //Death is handled by periodic life() checks so this should have a chance to fire on a killshot. - if(!length(hit_messages)) //Pick and remove lines, refill on exhaustion. - hit_messages = list("Got you!", "Aha!", "Bullseye!", "It's curtains for you, Sonny Jim!", "Your head will look fantastic on my wall!", "I have you now!", "You miserable coward! Come and fight me like a man!", "Tally ho!") - var/message = pick_n_take(hit_messages) - shooter.say(message) - - if(P.distance_travelled > 8) - knockback(M, P, 12) - - else if(!M || M == P.firer || M.lying) //These checks are included in knockback and would be redundant above. - return - - shake_camera(M, 3, 4) - M.apply_effect(2, WEAKEN) - M.apply_effect(4, SLOW) - if(iscarbonsizexeno(M)) - to_chat(M, SPAN_XENODANGER("The impact knocks you off your feet!")) - else //This will hammer a Yautja as hard as a human. - to_chat(M, SPAN_HIGHDANGER("The impact knocks you off your feet!")) - - step(M, get_dir(P.firer, M)) - -/datum/ammo/bullet/shotgun/twobore/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(2, SUPERSLOW) - target.apply_effect(5, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/lever_action - name = "lever-action bullet" - - damage = 80 - penetration = 0 - accuracy = HIT_ACCURACY_TIER_1 - shell_speed = AMMO_SPEED_TIER_6 - accurate_range = 14 - handful_state = "lever_action_bullet" - -//unused and not working. need to refactor MD code. Unobtainable. -//intended mechanic is to have xenos hit with it show up very frequently on any MDs around -/datum/ammo/bullet/lever_action/tracker - name = "tracking lever-action bullet" - icon_state = "redbullet" - damage = 70 - penetration = ARMOR_PENETRATION_TIER_3 - accuracy = HIT_ACCURACY_TIER_1 - handful_state = "tracking_lever_action_bullet" - -/datum/ammo/bullet/lever_action/tracker/on_hit_mob(mob/M, obj/projectile/P, mob/user) - //SEND_SIGNAL(user, COMSIG_BULLET_TRACKING, user, M) - M.visible_message(SPAN_DANGER("You hear a faint beep under [M]'s [M.mob_size > MOB_SIZE_HUMAN ? "chitin" : "skin"].")) - -/datum/ammo/bullet/lever_action/training - name = "lever-action blank" - icon_state = "blank" - damage = 70 //blanks CAN hurt you if shot very close - penetration = 0 - accuracy = HIT_ACCURACY_TIER_1 - damage_falloff = DAMAGE_FALLOFF_BLANK //not much, though (comparatively) - shell_speed = AMMO_SPEED_TIER_5 - handful_state = "training_lever_action_bullet" - -//unused, and unobtainable... for now -/datum/ammo/bullet/lever_action/marksman - name = "marksman lever-action bullet" - shrapnel_chance = 0 - damage_falloff = 0 - accurate_range = 12 - damage = 70 - penetration = ARMOR_PENETRATION_TIER_6 - shell_speed = AMMO_SPEED_TIER_6 - handful_state = "marksman_lever_action_bullet" - -/datum/ammo/bullet/lever_action/xm88 - name = ".458 SOCOM round" - - damage = 80 - penetration = ARMOR_PENETRATION_TIER_2 - accuracy = HIT_ACCURACY_TIER_1 - shell_speed = AMMO_SPEED_TIER_6 - accurate_range = 14 - handful_state = "boomslang_bullet" - -/datum/ammo/bullet/lever_action/xm88/pen20 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/lever_action/xm88/pen30 - penetration = ARMOR_PENETRATION_TIER_6 - -/datum/ammo/bullet/lever_action/xm88/pen40 - penetration = ARMOR_PENETRATION_TIER_8 - -/datum/ammo/bullet/lever_action/xm88/pen50 - penetration = ARMOR_PENETRATION_TIER_10 - -/* -//====== - Sniper Ammo -//====== -*/ - -/datum/ammo/bullet/sniper - name = "sniper bullet" - headshot_state = HEADSHOT_OVERLAY_HEAVY - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER - accurate_range_min = 4 - - accuracy = HIT_ACCURACY_TIER_8 - accurate_range = 32 - max_range = 32 - scatter = 0 - damage = 70 - penetration= ARMOR_PENETRATION_TIER_10 - shell_speed = AMMO_SPEED_TIER_6 - damage_falloff = 0 - -/datum/ammo/bullet/sniper/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - L.apply_armoured_damage(damage*2, ARMOR_BULLET, BRUTE, null, penetration) - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/sniper/incendiary - name = "incendiary sniper bullet" - damage_type = BRUTE - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER - - //Removed accuracy = 0, accuracy_var_high = Variance Tier 6, and scatter = 0. -Kaga - damage = 60 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/sniper/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/sniper/incendiary/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - var/blind_duration = 5 - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_BIG) - blind_duration = 2 - L.AdjustEyeBlur(blind_duration) - L.adjust_fire_stacks(10) - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/sniper/flak - name = "flak sniper bullet" - damage_type = BRUTE - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER - - accuracy = HIT_ACCURACY_TIER_8 - scatter = SCATTER_AMOUNT_TIER_8 - damage = 55 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 //Documenting old code: This converts to a variance of 96-109% damage. -Kaga - penetration = 0 - -/datum/ammo/bullet/sniper/flak/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/slow_duration = 7 - var/mob/living/L = M - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_BIG) - slow_duration = 4 - M.adjust_effect(slow_duration, SUPERSLOW) - L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - else - burst(get_turf(M),P,damage_type, 2 , 2) - burst(get_turf(M),P,damage_type, 1 , 2 , 0) - -/datum/ammo/bullet/sniper/flak/on_near_target(turf/T, obj/projectile/P) - burst(T,P,damage_type, 2 , 2) - burst(T,P,damage_type, 1 , 2, 0) - return 1 - -/datum/ammo/bullet/sniper/crude - name = "crude sniper bullet" - damage = 42 - penetration = ARMOR_PENETRATION_TIER_6 - -/datum/ammo/bullet/sniper/crude/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - pushback(M, P, 3) - -/datum/ammo/bullet/sniper/upp - name = "armor-piercing sniper bullet" - damage = 80 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/sniper/anti_materiel - name = "anti-materiel sniper bullet" - - shrapnel_chance = 0 // This isn't leaving any shrapnel. - accuracy = HIT_ACCURACY_TIER_8 - damage = 125 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - var/size_damage_mod = 0.8 - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_XENO) - size_damage_mod += 0.6 - if(target.mob_size >= MOB_SIZE_BIG) - size_damage_mod += 0.6 - L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) - // 180% damage to all targets (225), 240% (300) against non-Runner xenos, and 300% against Big xenos (375). -Kaga - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/sniper/anti_materiel/vulture - damage = 400 // Fully intended to vaporize anything smaller than a mini cooper - accurate_range_min = 10 - handful_state = "vulture_bullet" - sound_hit = 'sound/bullets/bullet_vulture_impact.ogg' - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER|AMMO_ANTIVEHICLE - -/datum/ammo/bullet/sniper/anti_materiel/vulture/on_hit_mob(mob/hit_mob, obj/projectile/bullet) - . = ..() - knockback(hit_mob, bullet, 30) - hit_mob.apply_effect(3, SLOW) - -/datum/ammo/bullet/sniper/anti_materiel/vulture/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating/heavy) - )) - -/datum/ammo/bullet/sniper/elite - name = "supersonic sniper bullet" - - shrapnel_chance = 0 // This isn't leaving any shrapnel. - accuracy = HIT_ACCURACY_TIER_8 - damage = 150 - shell_speed = AMMO_SPEED_TIER_6 + AMMO_SPEED_TIER_2 - -/datum/ammo/bullet/sniper/elite/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/sniper/elite/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - var/size_damage_mod = 0.5 - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_XENO) - size_damage_mod += 0.5 - if(target.mob_size >= MOB_SIZE_BIG) - size_damage_mod += 1 - L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) - else - L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) - // 150% damage to runners (225), 300% against Big xenos (450), and 200% against all others (300). -Kaga - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/tank/flak - name = "flak autocannon bullet" - icon_state = "autocannon" - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC - accurate_range_min = 4 - - accuracy = HIT_ACCURACY_TIER_8 - scatter = 0 - damage = 60 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_6 - accurate_range = 32 - max_range = 32 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/tank/flak/on_hit_mob(mob/M,obj/projectile/P) - burst(get_turf(M),P,damage_type, 2 , 3) - burst(get_turf(M),P,damage_type, 1 , 3 , 0) - -/datum/ammo/bullet/tank/flak/on_near_target(turf/T, obj/projectile/P) - burst(get_turf(T),P,damage_type, 2 , 3) - burst(get_turf(T),P,damage_type, 1 , 3, 0) - return 1 - -/datum/ammo/bullet/tank/flak/on_hit_obj(obj/O,obj/projectile/P) - burst(get_turf(P),P,damage_type, 2 , 3) - burst(get_turf(P),P,damage_type, 1 , 3 , 0) - -/datum/ammo/bullet/tank/flak/on_hit_turf(turf/T,obj/projectile/P) - burst(get_turf(T),P,damage_type, 2 , 3) - burst(get_turf(T),P,damage_type, 1 , 3 , 0) - -/datum/ammo/bullet/tank/dualcannon - name = "dualcannon bullet" - icon_state = "autocannon" - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = HIT_ACCURACY_TIER_8 - scatter = 0 - damage = 50 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_3 - accurate_range = 10 - max_range = 12 - shell_speed = AMMO_SPEED_TIER_5 - -/datum/ammo/bullet/tank/dualcannon/on_hit_mob(mob/M,obj/projectile/P) - for(var/mob/living/carbon/L in get_turf(M)) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - -/datum/ammo/bullet/tank/dualcannon/on_near_target(turf/T, obj/projectile/P) - for(var/mob/living/carbon/L in T) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - return 1 - -/datum/ammo/bullet/tank/dualcannon/on_hit_obj(obj/O,obj/projectile/P) - for(var/mob/living/carbon/L in get_turf(O)) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - -/datum/ammo/bullet/tank/dualcannon/on_hit_turf(turf/T,obj/projectile/P) - for(var/mob/living/carbon/L in T) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - -/* -//====== - Special Ammo -//====== -*/ - -/datum/ammo/bullet/smartgun - name = "smartgun bullet" - icon_state = "redbullet" - flags_ammo_behavior = AMMO_BALLISTIC - - max_range = 12 - accuracy = HIT_ACCURACY_TIER_4 - damage = 30 - penetration = 0 - -/datum/ammo/bullet/smartgun/armor_piercing - name = "armor-piercing smartgun bullet" - icon_state = "bullet" - - accurate_range = 12 - accuracy = HIT_ACCURACY_TIER_2 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_8 - damage_armor_punch = 1 - -/datum/ammo/bullet/smartgun/dirty - name = "irradiated smartgun bullet" - debilitate = list(0,0,0,3,0,0,0,1) - - shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 - accurate_range = 32 - accuracy = HIT_ACCURACY_TIER_3 - damage = 40 - penetration = 0 - -/datum/ammo/bullet/smartgun/dirty/armor_piercing - debilitate = list(0,0,0,3,0,0,0,1) - - accurate_range = 22 - accuracy = HIT_ACCURACY_TIER_3 - damage = 30 - penetration = ARMOR_PENETRATION_TIER_7 - damage_armor_punch = 3 - -/datum/ammo/bullet/smartgun/holo_target //Royal marines smartgun bullet has only diff between regular ammo is this one does holostacks - name = "holo-targeting smartgun bullet" - damage = 30 -///Stuff for the HRP holotargetting stacks - var/holo_stacks = 15 - -/datum/ammo/bullet/smartgun/holo_target/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) - -/datum/ammo/bullet/smartgun/holo_target/ap - name = "armor-piercing smartgun bullet" - icon_state = "bullet" - - accurate_range = 12 - accuracy = HIT_ACCURACY_TIER_2 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_8 - damage_armor_punch = 1 - -/datum/ammo/bullet/smartgun/m56_fpw - name = "\improper M56 FPW bullet" - icon_state = "redbullet" - flags_ammo_behavior = AMMO_BALLISTIC - - max_range = 7 - accuracy = HIT_ACCURACY_TIER_7 - damage = 35 - penetration = ARMOR_PENETRATION_TIER_1 - -/datum/ammo/bullet/turret - name = "autocannon bullet" - icon_state = "redbullet" //Red bullets to indicate friendly fire restriction - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_COVER - - accurate_range = 22 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 - max_range = 22 - damage = 30 - penetration = ARMOR_PENETRATION_TIER_7 - damage_armor_punch = 0 - pen_armor_punch = 0 - shell_speed = 2*AMMO_SPEED_TIER_6 - accuracy = HIT_ACCURACY_TIER_5 - -/datum/ammo/bullet/turret/dumb - icon_state = "bullet" - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/machinegun //Adding this for the MG Nests (~Art) - name = "machinegun bullet" - icon_state = "bullet" // Keeping it bog standard with the turret but allows it to be changed - - accurate_range = 12 - damage = 35 - penetration= ARMOR_PENETRATION_TIER_10 //Bumped the penetration to serve a different role from sentries, MGs are a bit more offensive - accuracy = HIT_ACCURACY_TIER_3 - -/datum/ammo/bullet/machinegun/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) - )) - -/datum/ammo/bullet/machinegun/auto // for M2C, automatic variant for M56D, stats for bullet should always be moderately overtuned to fulfill its ultra-offense + flank-push purpose - name = "heavy machinegun bullet" - - accurate_range = 10 - damage = 50 - penetration = ARMOR_PENETRATION_TIER_6 - accuracy = -HIT_ACCURACY_TIER_2 // 75 accuracy - shell_speed = AMMO_SPEED_TIER_2 - max_range = 15 - effective_range_max = 7 - damage_falloff = DAMAGE_FALLOFF_TIER_8 - -/datum/ammo/bullet/machinegun/auto/set_bullet_traits() - return - -/datum/ammo/bullet/minigun - name = "minigun bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 12 - damage = 35 - penetration = ARMOR_PENETRATION_TIER_6 - -/datum/ammo/bullet/minigun/New() - ..() - if(SSticker.mode && MODE_HAS_FLAG(MODE_FACTION_CLASH)) - damage = 15 - else if(SSticker.current_state < GAME_STATE_PLAYING) - RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(setup_hvh_damage)) - -/datum/ammo/bullet/minigun/proc/setup_hvh_damage() - if(MODE_HAS_FLAG(MODE_FACTION_CLASH)) - damage = 15 - -/datum/ammo/bullet/minigun/tank - accuracy = -HIT_ACCURACY_TIER_1 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 - accurate_range = 12 - -/datum/ammo/bullet/m60 - name = "M60 bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = HIT_ACCURACY_TIER_2 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 12 - damage = 45 //7.62x51 is scary - penetration= ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pkp - name = "machinegun bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = HIT_ACCURACY_TIER_1 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 14 - damage = 35 - penetration= ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/* -//====== - Rocket Ammo -//====== -*/ - -/datum/ammo/rocket - name = "high explosive rocket" - icon_state = "missile" - ping = null //no bounce off. - sound_bounce = "rocket_bounce" - damage_falloff = 0 - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE - var/datum/effect_system/smoke_spread/smoke - - accuracy = HIT_ACCURACY_TIER_2 - accurate_range = 7 - max_range = 7 - damage = 15 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/rocket/New() - ..() - smoke = new() - -/datum/ammo/rocket/Destroy() - qdel(smoke) - smoke = null - . = ..() - -/datum/ammo/rocket/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(get_turf(M), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, get_turf(M)) - if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. - M.ex_act(350, P.dir, P.weapon_cause_data, 100) - smoke.start() - -/datum/ammo/rocket/on_hit_obj(obj/O, obj/projectile/P) - cell_explosion(get_turf(O), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, get_turf(O)) - smoke.start() - -/datum/ammo/rocket/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(T, 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, get_turf(P)) - smoke.start() - -/datum/ammo/rocket/ap - name = "anti-armor rocket" - damage_falloff = 0 - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET - - accuracy = HIT_ACCURACY_TIER_8 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 - accurate_range = 6 - max_range = 6 - damage = 10 - penetration= ARMOR_PENETRATION_TIER_10 - -/datum/ammo/rocket/ap/on_hit_mob(mob/M, obj/projectile/P) - var/turf/T = get_turf(M) - M.ex_act(150, P.dir, P.weapon_cause_data, 100) - M.apply_effect(2, WEAKEN) - M.apply_effect(2, PARALYZE) - if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. - M.ex_act(300, P.dir, P.weapon_cause_data, 100) - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/on_hit_obj(obj/O, obj/projectile/P) - var/turf/T = get_turf(O) - O.ex_act(150, P.dir, P.weapon_cause_data, 100) - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/on_hit_turf(turf/T, obj/projectile/P) - var/hit_something = 0 - for(var/mob/M in T) - M.ex_act(150, P.dir, P.weapon_cause_data, 100) - M.apply_effect(4, WEAKEN) - M.apply_effect(4, PARALYZE) - hit_something = 1 - continue - if(!hit_something) - for(var/obj/O in T) - if(O.density) - O.ex_act(150, P.dir, P.weapon_cause_data, 100) - hit_something = 1 - continue - if(!hit_something) - T.ex_act(150, P.dir, P.weapon_cause_data, 200) - - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/do_at_max_range(obj/projectile/P) - var/turf/T = get_turf(P) - var/hit_something = 0 - for(var/mob/M in T) - M.ex_act(250, P.dir, P.weapon_cause_data, 100) - M.apply_effect(2, WEAKEN) - M.apply_effect(2, PARALYZE) - hit_something = 1 - continue - if(!hit_something) - for(var/obj/O in T) - if(O.density) - O.ex_act(250, P.dir, P.weapon_cause_data, 100) - hit_something = 1 - continue - if(!hit_something) - T.ex_act(250, P.dir, P.weapon_cause_data) - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/anti_tank - name = "anti-tank rocket" - damage = 100 - var/vehicle_slowdown_time = 5 SECONDS - shrapnel_chance = 5 - shrapnel_type = /obj/item/large_shrapnel/at_rocket_dud - -/datum/ammo/rocket/ap/anti_tank/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/vehicle/multitile)) - var/obj/vehicle/multitile/M = O - M.next_move = world.time + vehicle_slowdown_time - playsound(M, 'sound/effects/meteorimpact.ogg', 35) - M.at_munition_interior_explosion_effect(cause_data = create_cause_data("Anti-Tank Rocket")) - M.interior_crash_effect() - var/turf/T = get_turf(M.loc) - M.ex_act(150, P.dir, P.weapon_cause_data, 100) - smoke.set_up(1, T) - smoke.start() - return - return ..() - - -/datum/ammo/rocket/ltb - name = "cannon round" - icon_state = "ltb" - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE - - accuracy = HIT_ACCURACY_TIER_3 - accurate_range = 32 - max_range = 32 - damage = 25 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/rocket/ltb/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(get_turf(M), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(M), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/ltb/on_hit_obj(obj/O, obj/projectile/P) - cell_explosion(get_turf(O), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(O), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/ltb/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(get_turf(T), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(T), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/ltb/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(P), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/wp - name = "white phosphorous rocket" - flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE - damage_type = BURN - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 8 - damage = 90 - max_range = 8 - -/datum/ammo/rocket/wp/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/rocket/wp/drop_flame(turf/T, datum/cause_data/cause_data) - playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) - if(!istype(T)) return - smoke.set_up(1, T) - smoke.start() - var/datum/reagent/napalm/blue/R = new() - new /obj/flamer_fire(T, cause_data, R, 3) - - var/datum/effect_system/smoke_spread/phosphorus/landingSmoke = new /datum/effect_system/smoke_spread/phosphorus - landingSmoke.set_up(3, 0, T, null, 6, cause_data) - landingSmoke.start() - landingSmoke = null - -/datum/ammo/rocket/wp/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - -/datum/ammo/rocket/wp/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - -/datum/ammo/rocket/wp/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - -/datum/ammo/rocket/wp/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp - name = "extreme-intensity incendiary rocket" - flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE - damage_type = BURN - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 8 - damage = 150 - max_range = 10 - -/datum/ammo/rocket/wp/upp/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/rocket/wp/upp/drop_flame(turf/T, datum/cause_data/cause_data) - playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) - if(!istype(T)) return - smoke.set_up(1, T) - smoke.start() - var/datum/reagent/napalm/upp/R = new() - new /obj/flamer_fire(T, cause_data, R, 3) - -/datum/ammo/rocket/wp/upp/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad - name = "thermobaric rocket" - flags_ammo_behavior = AMMO_ROCKET|AMMO_STRIKES_SURFACE - - damage = 100 - max_range = 32 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/rocket/wp/quad/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/custom - name = "custom rocket" - -/datum/ammo/rocket/custom/proc/prime(atom/A, obj/projectile/P) - var/obj/item/weapon/gun/launcher/rocket/launcher = P.shot_from - var/obj/item/ammo_magazine/rocket/custom/rocket = launcher.current_mag - if(rocket.locked && rocket.warhead && rocket.warhead.detonator) - if(rocket.fuel && rocket.fuel.reagents.get_reagent_amount(rocket.fuel_type) >= rocket.fuel_requirement) - rocket.forceMove(P.loc) - rocket.warhead.cause_data = P.weapon_cause_data - rocket.warhead.prime() - qdel(rocket) - smoke.set_up(1, get_turf(A)) - smoke.start() - -/datum/ammo/rocket/custom/on_hit_mob(mob/M, obj/projectile/P) - prime(M, P) - -/datum/ammo/rocket/custom/on_hit_obj(obj/O, obj/projectile/P) - prime(O, P) - -/datum/ammo/rocket/custom/on_hit_turf(turf/T, obj/projectile/P) - prime(T, P) - -/datum/ammo/rocket/custom/do_at_max_range(obj/projectile/P) - prime(null, P) - -/* -//====== - Energy Ammo -//====== -*/ - -/datum/ammo/energy - ping = null //no bounce off. We can have one later. - sound_hit = "energy_hit" - sound_miss = "energy_miss" - sound_bounce = "energy_bounce" - - damage_type = BURN - flags_ammo_behavior = AMMO_ENERGY - - accuracy = HIT_ACCURACY_TIER_4 - -/datum/ammo/energy/emitter //Damage is determined in emitter.dm - name = "emitter bolt" - icon_state = "emitter" - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_ARMOR - - accurate_range = 6 - max_range = 6 - -/datum/ammo/energy/taser - name = "taser bolt" - icon_state = "stun" - damage_type = OXY - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_ALWAYS_FF //Not that ignoring will do much right now. - - stamina_damage = 45 - accuracy = HIT_ACCURACY_TIER_8 - shell_speed = AMMO_SPEED_TIER_1 // Slightly faster - hit_effect_color = "#FFFF00" - -/datum/ammo/energy/taser/on_hit_mob(mob/M, obj/projectile/P) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.disable_special_items() // Disables scout cloak - -/datum/ammo/energy/taser/precise - name = "precise taser bolt" - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_MP - -/datum/ammo/energy/rxfm_eva - name = "laser blast" - icon_state = "laser_new" - flags_ammo_behavior = AMMO_LASER - accurate_range = 14 - max_range = 22 - damage = 45 - stamina_damage = 25 //why not - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/energy/rxfm_eva/on_hit_mob(mob/living/M, obj/projectile/P) - ..() - if(prob(10)) //small chance for one to ignite on hit - M.fire_act() - -/datum/ammo/energy/laz_uzi - name = "laser bolt" - icon_state = "laser_new" - flags_ammo_behavior = AMMO_ENERGY - damage = 40 - accurate_range = 5 - effective_range_max = 7 - max_range = 10 - shell_speed = AMMO_SPEED_TIER_4 - scatter = SCATTER_AMOUNT_TIER_6 - accuracy = HIT_ACCURACY_TIER_3 - damage_falloff = DAMAGE_FALLOFF_TIER_8 - -/datum/ammo/energy/yautja - headshot_state = HEADSHOT_OVERLAY_MEDIUM - accurate_range = 12 - shell_speed = AMMO_SPEED_TIER_3 - damage_type = BURN - flags_ammo_behavior = AMMO_IGNORE_RESIST - -/datum/ammo/energy/yautja/pistol - name = "plasma pistol bolt" - icon_state = "ion" - - damage = 40 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/energy/yautja/pistol/incendiary - damage = 10 - -/datum/ammo/energy/yautja/pistol/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shrapnel/plasma - name = "plasma wave" - shrapnel_chance = 0 - penetration = ARMOR_PENETRATION_TIER_10 - accuracy = HIT_ACCURACY_TIER_MAX - damage = 15 - icon_state = "shrapnel_plasma" - damage_type = BURN - -/datum/ammo/bullet/shrapnel/plasma/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) - hit_mob.apply_effect(2, WEAKEN) - -/datum/ammo/energy/yautja/caster - name = "root caster bolt" - icon_state = "ion" - -/datum/ammo/energy/yautja/caster/stun - name = "low power stun bolt" - debilitate = list(2,2,0,0,0,1,0,0) - - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - -/datum/ammo/energy/yautja/caster/bolt - name = "plasma bolt" - icon_state = "pulse1" - flags_ammo_behavior = AMMO_IGNORE_RESIST - shell_speed = AMMO_SPEED_TIER_6 - damage = 35 - -/datum/ammo/energy/yautja/caster/bolt/stun - name = "high power stun bolt" - var/stun_time = 2 - - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - -/datum/ammo/energy/yautja/caster/bolt/stun/on_hit_mob(mob/M, obj/projectile/P) - var/mob/living/carbon/C = M - var/stun_time = src.stun_time - if(istype(C)) - if(isyautja(C) || ispredalien(C)) - return - to_chat(C, SPAN_DANGER("An electric shock ripples through your body, freezing you in place!")) - log_attack("[key_name(C)] was stunned by a high power stun bolt from [key_name(P.firer)] at [get_area(P)]") - - if(ishuman(C)) - var/mob/living/carbon/human/H = C - stun_time++ - H.apply_effect(stun_time, WEAKEN) - else - M.apply_effect(stun_time, WEAKEN) - - C.apply_effect(stun_time, STUN) - ..() - -/datum/ammo/energy/yautja/caster/sphere - name = "plasma eradicator" - icon_state = "bluespace" - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_HITS_TARGET_TURF - shell_speed = AMMO_SPEED_TIER_4 - accuracy = HIT_ACCURACY_TIER_8 - - damage = 55 - - accurate_range = 8 - max_range = 8 - - var/vehicle_slowdown_time = 5 SECONDS - -/datum/ammo/energy/yautja/caster/sphere/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/vehicle/multitile)) - var/obj/vehicle/multitile/multitile_vehicle = O - multitile_vehicle.next_move = world.time + vehicle_slowdown_time - playsound(multitile_vehicle, 'sound/effects/meteorimpact.ogg', 35) - multitile_vehicle.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Eradicator", P.firer)) - multitile_vehicle.interior_crash_effect() - multitile_vehicle.ex_act(150, P.dir, P.weapon_cause_data, 100) - cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - - -/datum/ammo/energy/yautja/caster/sphere/stun - name = "plasma immobilizer" - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - accurate_range = 20 - max_range = 20 - - var/stun_range = 4 // Big - var/stun_time = 6 - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_mob(mob/M, obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_turf(turf/T,obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_obj(obj/O,obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/do_at_max_range(obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/proc/do_area_stun(obj/projectile/P) - playsound(P, 'sound/weapons/wave.ogg', 75, 1, 25) - for (var/mob/living/carbon/M in view(src.stun_range, get_turf(P))) - var/stun_time = src.stun_time - log_attack("[key_name(M)] was stunned by a plasma immobilizer from [key_name(P.firer)] at [get_area(P)]") - if (isyautja(M)) - stun_time -= 2 - if(ispredalien(M)) - continue - to_chat(M, SPAN_DANGER("A powerful electric shock ripples through your body, freezing you in place!")) - M.apply_effect(stun_time, STUN) - - if (ishuman(M)) - var/mob/living/carbon/human/H = M - H.apply_effect(stun_time, WEAKEN) - else - M.apply_effect(stun_time, WEAKEN) - -/datum/ammo/energy/yautja/rifle/bolt - name = "plasma rifle bolt" - icon_state = "ion" - damage_type = BURN - debilitate = list(0,2,0,0,0,0,0,0) - flags_ammo_behavior = AMMO_IGNORE_RESIST - - damage = 55 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/energy/yautja/rifle/bolt/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) - if(isxeno(hit_mob)) - var/mob/living/carbon/xenomorph/xeno = hit_mob - xeno.apply_damage(damage * 0.75, BURN) - xeno.interference = 30 - -/* -//====== - Xeno Spits -//====== -*/ -/datum/ammo/xeno - icon_state = "neurotoxin" - ping = "ping_x" - damage_type = TOX - flags_ammo_behavior = AMMO_XENO - - ///used to make cooldown of the different spits vary. - var/added_spit_delay = 0 - var/spit_cost - - /// Should there be a windup for this spit? - var/spit_windup = FALSE - - /// Should there be an additional warning while winding up? (do not put to true if there is not a windup) - var/pre_spit_warn = FALSE - accuracy = HIT_ACCURACY_TIER_8*2 - max_range = 12 - -/datum/ammo/xeno/toxin - name = "neurotoxic spit" - damage_falloff = 0 - flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST - spit_cost = 25 - var/effect_power = XENO_NEURO_TIER_4 - var/datum/callback/neuro_callback - - shell_speed = AMMO_SPEED_TIER_3 - max_range = 7 - -/datum/ammo/xeno/toxin/New() - ..() - - neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_neuro)) - -/proc/apply_neuro(mob/M, power, insta_neuro) - if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX) && !insta_neuro) - M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) - return //endurance 5 makes you immune to weak neurotoxin - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) - H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) - return //species like zombies or synths are immune to neurotoxin - - if(!isxeno(M)) - if(insta_neuro) - if(M.knocked_down < 3) - M.adjust_effect(1 * power, WEAKEN) - return - - if(ishuman(M)) - M.apply_effect(2.5, SUPERSLOW) - M.visible_message(SPAN_DANGER("[M]'s movements are slowed.")) - - var/no_clothes_neuro = FALSE - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.wear_suit || H.wear_suit.slowdown == 0) - no_clothes_neuro = TRUE - - if(no_clothes_neuro) - if(M.knocked_down < 5) - M.adjust_effect(1 * power, WEAKEN) // KD them a bit more - M.visible_message(SPAN_DANGER("[M] falls prone.")) - -/proc/apply_scatter_neuro(mob/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX)) - M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) - return //endurance 5 makes you immune to weak neuro - if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) - H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) - return - - if(M.knocked_down < 0.7) // apply knockdown only if current knockdown is less than 0.7 second - M.apply_effect(0.7, WEAKEN) - M.visible_message(SPAN_DANGER("[M] falls prone.")) - -/datum/ammo/xeno/toxin/on_hit_mob(mob/M,obj/projectile/P) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.status_flags & XENO_HOST) - neuro_callback.Invoke(H, effect_power, TRUE) - return - - neuro_callback.Invoke(M, effect_power, FALSE) - -/datum/ammo/xeno/toxin/medium //Spitter - name = "neurotoxic spatter" - spit_cost = 50 - effect_power = 1 - - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/xeno/toxin/queen - name = "neurotoxic spit" - spit_cost = 50 - effect_power = 2 - - accuracy = HIT_ACCURACY_TIER_5*2 - max_range = 6 - 1 - -/datum/ammo/xeno/toxin/queen/on_hit_mob(mob/M,obj/projectile/P) - neuro_callback.Invoke(M, effect_power, TRUE) - -/datum/ammo/xeno/toxin/shotgun - name = "neurotoxic droplet" - flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST - bonus_projectiles_type = /datum/ammo/xeno/toxin/shotgun/additional - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 5 - max_range = 5 - scatter = SCATTER_AMOUNT_NEURO - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_4 - -/datum/ammo/xeno/toxin/shotgun/New() - ..() - - neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_scatter_neuro)) - -/datum/ammo/xeno/toxin/shotgun/additional - name = "additional neurotoxic droplets" - - bonus_projectiles_amount = 0 - -/*proc/neuro_flak(turf/T, obj/projectile/P, datum/callback/CB, power, insta_neuro, radius) - if(!T) return FALSE - var/firer = P.firer - var/hit_someone = FALSE - for(var/mob/living/carbon/M in orange(radius,T)) - if(isxeno(M) && isxeno(firer) && M:hivenumber == firer:hivenumber) - continue - - if(HAS_TRAIT(M, TRAIT_NESTED)) - continue - - hit_someone = TRUE - CB.Invoke(M, power, insta_neuro) - - P.play_hit_effect(M) - - return hit_someone - -/datum/ammo/xeno/toxin/burst //sentinel burst - name = "neurotoxic air splash" - effect_power = XENO_NEURO_TIER_1 - spit_cost = 50 - flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST - -/datum/ammo/xeno/toxin/burst/on_hit_mob(mob/M, obj/projectile/P) - if(isxeno(M) && isxeno(P.firer) && M:hivenumber == P.firer:hivenumber) - neuro_callback.Invoke(M, effect_power*1.5, TRUE) - - neuro_flak(get_turf(M), P, neuro_callback, effect_power, FALSE, 1) - -/datum/ammo/xeno/toxin/burst/on_near_target(turf/T, obj/projectile/P) - return neuro_flak(T, P, neuro_callback, effect_power, FALSE, 1) - -/datum/ammo/xeno/sticky - name = "sticky resin spit" - icon_state = "sticky" - ping = null - flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE - added_spit_delay = 5 - spit_cost = 40 - - shell_speed = AMMO_SPEED_TIER_3 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 - max_range = 32 - -/datum/ammo/xeno/sticky/on_hit_mob(mob/M,obj/projectile/P) - drop_resin(get_turf(P)) - -/datum/ammo/xeno/sticky/on_hit_obj(obj/O,obj/projectile/P) - drop_resin(get_turf(P)) - -/datum/ammo/xeno/sticky/on_hit_turf(turf/T,obj/projectile/P) - drop_resin(T) - -/datum/ammo/xeno/sticky/do_at_max_range(obj/projectile/P) - drop_resin(get_turf(P)) - -/datum/ammo/xeno/sticky/proc/drop_resin(turf/T) - if(T.density) - return - - for(var/obj/O in T.contents) - if(istype(O, /obj/item/clothing/mask/facehugger)) - return - if(istype(O, /obj/effect/alien/egg)) - return - if(istype(O, /obj/structure/mineral_door) || istype(O, /obj/effect/alien/resin) || istype(O, /obj/structure/bed)) - return - if(O.density && !(O.flags_atom & ON_BORDER)) - return - - new /obj/effect/alien/resin/sticky/thin(T) */ - -/datum/ammo/xeno/acid - name = "acid spit" - icon_state = "xeno_acid" - sound_hit = "acid_hit" - sound_bounce = "acid_bounce" - damage_type = BURN - spit_cost = 25 - flags_ammo_behavior = AMMO_ACIDIC|AMMO_XENO - accuracy = HIT_ACCURACY_TIER_5 - damage = 20 - max_range = 8 // 7 will disappear on diagonals. i love shitcode - penetration = ARMOR_PENETRATION_TIER_2 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/xeno/acid/on_shield_block(mob/M, obj/projectile/P) - burst(M,P,damage_type) - -/datum/ammo/xeno/acid/on_hit_mob(mob/M, obj/projectile/P) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(C.status_flags & XENO_HOST && HAS_TRAIT(C, TRAIT_NESTED) || C.stat == DEAD) - return FALSE - ..() - -/datum/ammo/xeno/acid/spatter - name = "acid spatter" - - damage = 30 - max_range = 6 - -/datum/ammo/xeno/acid/spatter/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - if(. == FALSE) - return - - new /datum/effects/acid(M, P.firer) - -/datum/ammo/xeno/acid/praetorian - name = "acid splash" - - accuracy = HIT_ACCURACY_TIER_10 + HIT_ACCURACY_TIER_5 - max_range = 8 - damage = 30 - shell_speed = AMMO_SPEED_TIER_2 - added_spit_delay = 0 - -/datum/ammo/xeno/acid/dot - name = "acid spit" - -/datum/ammo/xeno/acid/prae_nade // Used by base prae's acid nade - name = "acid scatter" - - flags_ammo_behavior = AMMO_STOPPED_BY_COVER - accuracy = HIT_ACCURACY_TIER_5 - accurate_range = 32 - max_range = 4 - damage = 25 - shell_speed = AMMO_SPEED_TIER_1 - scatter = SCATTER_AMOUNT_TIER_6 - - apply_delegate = FALSE - -/datum/ammo/xeno/acid/prae_nade/on_hit_mob(mob/M, obj/projectile/P) - if (!ishuman(M)) - return - - var/mob/living/carbon/human/H = M - - var/datum/effects/prae_acid_stacks/PAS = null - for (var/datum/effects/prae_acid_stacks/prae_acid_stacks in H.effects_list) - PAS = prae_acid_stacks - break - - if (PAS == null) - PAS = new /datum/effects/prae_acid_stacks(H) - else - PAS.increment_stack_count() - -/*datum/ammo/xeno/prae_skillshot - name = "blob of acid" - icon_state = "boiler_gas2" - ping = "ping_x" - flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE|AMMO_IGNORE_RESIST - - accuracy = HIT_ACCURACY_TIER_5 - accurate_range = 32 - max_range = 8 - damage = 20 - damage_falloff = DAMAGE_FALLOFF_TIER_10 - shell_speed = AMMO_SPEED_TIER_1 - scatter = SCATTER_AMOUNT_TIER_10 - -/datum/ammo/xeno/prae_skillshot/on_hit_mob(mob/M, obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/on_hit_obj(obj/O, obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/on_hit_turf(turf/T, obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/do_at_max_range(obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/proc/acid_stacks_aoe(turf/T) - - if (!istype(T)) - return - - for (var/mob/living/carbon/human/H in orange(1, T)) - to_chat(H, SPAN_XENODANGER("You are spattered with acid!")) - animation_flash_color(H) - var/datum/effects/prae_acid_stacks/PAS = null - for (var/datum/effects/prae_acid_stacks/prae_acid_stacks in H.effects_list) - PAS = prae_acid_stacks - break - - if (PAS == null) - PAS = new /datum/effects/prae_acid_stacks(H) - PAS.increment_stack_count() - else - PAS.increment_stack_count() - PAS.increment_stack_count() */ - -/datum/ammo/xeno/boiler_gas - name = "glob of neuro gas" - icon_state = "neuro_glob" - ping = "ping_x" - debilitate = list(2,2,0,1,11,12,1,10) // Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony - flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE|AMMO_IGNORE_RESIST|AMMO_HITS_TARGET_TURF|AMMO_ACIDIC - var/datum/effect_system/smoke_spread/smoke_system - spit_cost = 200 - pre_spit_warn = TRUE - spit_windup = 5 SECONDS - accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_4 - accuracy = HIT_ACCURACY_TIER_2 - scatter = SCATTER_AMOUNT_TIER_4 - shell_speed = 0.75 - max_range = 16 - /// range on the smoke in tiles from center - var/smokerange = 4 - var/lifetime_mult = 1.0 - -/datum/ammo/xeno/boiler_gas/New() - ..() - set_xeno_smoke() - -/datum/ammo/xeno/boiler_gas/Destroy() - qdel(smoke_system) - smoke_system = null - . = ..() - -/datum/ammo/xeno/boiler_gas/on_hit_mob(mob/moob, obj/projectile/proj) - if(iscarbon(moob)) - var/mob/living/carbon/carbon = moob - if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) - return - var/datum/effects/neurotoxin/neuro_effect = locate() in moob.effects_list - if(!neuro_effect) - neuro_effect = new /datum/effects/neurotoxin(moob, proj.firer) - neuro_effect.duration += 5 - moob.apply_effect(3, DAZE) - to_chat(moob, SPAN_HIGHDANGER("Neurotoxic liquid spreads all over you and immediately soaks into your pores and orifices! Oh fuck!")) // Fucked up but have a chance to escape rather than being game-ended - drop_nade(get_turf(proj), proj,TRUE) - -/datum/ammo/xeno/boiler_gas/on_hit_obj(obj/outbacksteakhouse, obj/projectile/proj) - drop_nade(get_turf(proj), proj) - -/datum/ammo/xeno/boiler_gas/on_hit_turf(turf/Turf, obj/projectile/proj) - if(Turf.density && isturf(proj.loc)) - drop_nade(proj.loc, proj) //we don't want the gas globs to land on dense turfs, they block smoke expansion. - else - drop_nade(Turf, proj) - -/datum/ammo/xeno/boiler_gas/do_at_max_range(obj/projectile/proj) - drop_nade(get_turf(proj), proj) - -/datum/ammo/xeno/boiler_gas/proc/set_xeno_smoke(obj/projectile/proj) - smoke_system = new /datum/effect_system/smoke_spread/xeno_weaken() - -/datum/ammo/xeno/boiler_gas/proc/drop_nade(turf/turf, obj/projectile/proj) - var/lifetime_mult = 1.0 - var/datum/cause_data - if(isboiler(proj.firer)) - cause_data = proj.weapon_cause_data - smoke_system.set_up(smokerange, 0, turf, new_cause_data = cause_data) - smoke_system.lifetime = 12 * lifetime_mult - smoke_system.start() - turf.visible_message(SPAN_DANGER("A glob of acid lands with a splat and explodes into noxious fumes!")) - - -/datum/ammo/xeno/boiler_gas/acid - name = "glob of acid gas" - icon_state = "acid_glob" - ping = "ping_x" - accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 - smokerange = 3 - - -/datum/ammo/xeno/boiler_gas/acid/set_xeno_smoke(obj/projectile/proj) - smoke_system = new /datum/effect_system/smoke_spread/xeno_acid() - -/datum/ammo/xeno/boiler_gas/acid/on_hit_mob(mob/moob, obj/projectile/proj) - if(iscarbon(moob)) - var/mob/living/carbon/carbon = moob - if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) - return - to_chat(moob,SPAN_HIGHDANGER("Acid covers your body! Oh fuck!")) - playsound(moob,"acid_strike",75,1) - INVOKE_ASYNC(moob, TYPE_PROC_REF(/mob, emote), "pain") // why do I need this bullshit - new /datum/effects/acid(moob, proj.firer) - drop_nade(get_turf(proj), proj,TRUE) - -/datum/ammo/xeno/bone_chips - name = "bone chips" - icon_state = "shrapnel_light" - ping = null - flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR - damage_type = BRUTE - bonus_projectiles_type = /datum/ammo/xeno/bone_chips/spread - - damage = 8 - max_range = 6 - accuracy = HIT_ACCURACY_TIER_8 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_7 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_7 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_7 - shrapnel_type = /obj/item/shard/shrapnel/bone_chips - shrapnel_chance = 60 - -/datum/ammo/xeno/bone_chips/on_hit_mob(mob/M, obj/projectile/P) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) - return - if(ishuman_strict(M) || isxeno(M)) - playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) - if(M.slowed < 3) - M.apply_effect(3, SLOW) - -/datum/ammo/xeno/bone_chips/spread - name = "small bone chips" - - scatter = 30 // We want a wild scatter angle - max_range = 5 - bonus_projectiles_amount = 0 - -/datum/ammo/xeno/bone_chips/spread/short_range - name = "small bone chips" - - max_range = 3 // Very short range - -/datum/ammo/xeno/bone_chips/spread/runner_skillshot - name = "bone chips" - - scatter = 0 - max_range = 5 - damage = 10 - shrapnel_chance = 0 - -/datum/ammo/xeno/bone_chips/spread/runner/on_hit_mob(mob/M, obj/projectile/P) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) - return - if(ishuman_strict(M) || isxeno(M)) - playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) - if(M.slowed < 6) - M.apply_effect(6, SLOW) - -/datum/ammo/xeno/oppressor_tail - name = "tail hook" - icon_state = "none" - ping = null - flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR - damage_type = BRUTE - - damage = XENO_DAMAGE_TIER_5 - max_range = 4 - accuracy = HIT_ACCURACY_TIER_MAX - -/datum/ammo/xeno/oppressor_tail/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) - //The projectile has no icon, so the overlay shows up in FRONT of the projectile, and the beam connects to it in the middle. - var/image/hook_overlay = new(icon = 'icons/effects/beam.dmi', icon_state = "oppressor_tail_hook", layer = BELOW_MOB_LAYER) - generated_projectile.overlays += hook_overlay - -/datum/ammo/xeno/oppressor_tail/on_hit_mob(mob/target, obj/projectile/fired_proj) - var/mob/living/carbon/xenomorph/xeno_firer = fired_proj.firer - if(xeno_firer.can_not_harm(target)) - return - - shake_camera(target, 5, 0.1 SECONDS) - var/obj/effect/beam/tail_beam = fired_proj.firer.beam(target, "oppressor_tail", 'icons/effects/beam.dmi', 0.5 SECONDS, 5) - var/image/tail_image = image('icons/effects/status_effects.dmi', "hooked") - target.overlays += tail_image - - new /datum/effects/xeno_slow(target, fired_proj.firer, ttl = 0.5 SECONDS) - target.apply_effect(0.5, STUN) - INVOKE_ASYNC(target, TYPE_PROC_REF(/atom/movable, throw_atom), fired_proj.firer, get_dist(fired_proj.firer, target)-1, SPEED_VERY_FAST) - - qdel(tail_beam) - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/ammo/xeno/oppressor_tail, remove_tail_overlay), target, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. - -/datum/ammo/xeno/oppressor_tail/proc/remove_tail_overlay(mob/overlayed_mob, image/tail_image) - overlayed_mob.overlays -= tail_image - -/* -//====== - Shrapnel -//====== -*/ -/datum/ammo/bullet/shrapnel - name = "shrapnel" - icon_state = "buckshot" - accurate_range_min = 5 - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER - - accuracy = HIT_ACCURACY_TIER_3 - accurate_range = 32 - max_range = 8 - damage = 25 - damage_var_low = -PROJECTILE_VARIANCE_TIER_6 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_4 - shell_speed = AMMO_SPEED_TIER_2 - shrapnel_chance = 5 - -/datum/ammo/bullet/shrapnel/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/structure/barricade)) - var/obj/structure/barricade/B = O - B.health -= rand(2, 5) - B.update_health(1) - -/datum/ammo/bullet/shrapnel/rubber - name = "rubber pellets" - icon_state = "rubber_pellets" - flags_ammo_behavior = AMMO_STOPPED_BY_COVER - - damage = 0 - stamina_damage = 25 - shrapnel_chance = 0 - - -/datum/ammo/bullet/shrapnel/hornet_rounds - name = ".22 hornet round" - icon_state = "hornet_round" - flags_ammo_behavior = AMMO_BALLISTIC - damage = 20 - shrapnel_chance = 0 - shell_speed = AMMO_SPEED_TIER_3//she fast af boi - penetration = ARMOR_PENETRATION_TIER_5 - -/datum/ammo/bullet/shrapnel/hornet_rounds/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/bonus_damage_stack, 10, world.time) - -/datum/ammo/bullet/shrapnel/incendiary - name = "flaming shrapnel" - icon_state = "beanbag" // looks suprisingly a lot like flaming shrapnel chunks - flags_ammo_behavior = AMMO_STOPPED_BY_COVER - - shell_speed = AMMO_SPEED_TIER_1 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/shrapnel/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shrapnel/metal - name = "metal shrapnel" - icon_state = "shrapnelshot_bit" - flags_ammo_behavior = AMMO_STOPPED_BY_COVER|AMMO_BALLISTIC - shell_speed = AMMO_SPEED_TIER_1 - damage = 30 - shrapnel_chance = 15 - accuracy = HIT_ACCURACY_TIER_8 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/shrapnel/light // weak shrapnel - name = "light shrapnel" - icon_state = "shrapnel_light" - - damage = 10 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_1 - shrapnel_chance = 0 - -/datum/ammo/bullet/shrapnel/light/human - name = "human bone fragments" - icon_state = "shrapnel_human" - - shrapnel_chance = 50 - shrapnel_type = /obj/item/shard/shrapnel/bone_chips/human - -/datum/ammo/bullet/shrapnel/light/human/var1 // sprite variants - icon_state = "shrapnel_human1" - -/datum/ammo/bullet/shrapnel/light/human/var2 // sprite variants - icon_state = "shrapnel_human2" - -/datum/ammo/bullet/shrapnel/light/xeno - name = "alien bone fragments" - icon_state = "shrapnel_xeno" - - shrapnel_chance = 50 - shrapnel_type = /obj/item/shard/shrapnel/bone_chips/xeno - -/datum/ammo/bullet/shrapnel/spall // weak shrapnel - name = "spall" - icon_state = "shrapnel_light" - - damage = 10 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_1 - shrapnel_chance = 0 - -/datum/ammo/bullet/shrapnel/light/glass - name = "glass shrapnel" - icon_state = "shrapnel_glass" - -/datum/ammo/bullet/shrapnel/light/effect/ // no damage, but looks bright and neat - name = "sparks" - - damage = 1 // Tickle tickle - -/datum/ammo/bullet/shrapnel/light/effect/ver1 - icon_state = "shrapnel_bright1" - -/datum/ammo/bullet/shrapnel/light/effect/ver2 - icon_state = "shrapnel_bright2" - -/datum/ammo/bullet/shrapnel/jagged - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - accuracy = HIT_ACCURACY_TIER_MAX - -/datum/ammo/bullet/shrapnel/jagged/on_hit_mob(mob/M, obj/projectile/P) - if(isxeno(M)) - M.apply_effect(0.4, SLOW) - -/* -//======== - CAS 30mm impacters -//======== -*/ -/datum/ammo/bullet/shrapnel/gau //for the GAU to have a impact bullet instead of firecrackers - name = "30mm Multi-Purpose shell" - - damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. - damage_type = BRUTE - penetration = ARMOR_PENETRATION_TIER_2 - accuracy = HIT_ACCURACY_TIER_MAX - max_range = 0 - shrapnel_chance = 100 //the least of your problems - -/datum/ammo/bullet/shrapnel/gau/at - name = "30mm Anti-Tank shell" - - damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. - penetration = ARMOR_PENETRATION_TIER_8 - accuracy = HIT_ACCURACY_TIER_MAX -/* -//====== - Misc Ammo -//====== -*/ - -/datum/ammo/alloy_spike - name = "alloy spike" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - ping = "ping_s" - icon_state = "MSpearFlight" - sound_hit = "alloy_hit" - sound_armor = "alloy_armor" - sound_bounce = "alloy_bounce" - - accuracy = HIT_ACCURACY_TIER_8 - accurate_range = 12 - max_range = 12 - damage = 30 - penetration= ARMOR_PENETRATION_TIER_10 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 - shrapnel_type = /obj/item/shard/shrapnel - -/datum/ammo/flamethrower - name = "flame" - icon_state = "pulse0" - damage_type = BURN - flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_HITS_TARGET_TURF - - max_range = 6 - damage = 35 - -/datum/ammo/flamethrower/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/flamethrower/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - -/datum/ammo/flamethrower/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - -/datum/ammo/flamethrower/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - -/datum/ammo/flamethrower/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - -/datum/ammo/flamethrower/tank_flamer - flamer_reagent_type = /datum/reagent/napalm/blue - -/datum/ammo/flamethrower/sentry_flamer - flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME - flamer_reagent_type = /datum/reagent/napalm/blue - - accuracy = HIT_ACCURACY_TIER_8 - accurate_range = 6 - max_range = 12 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/flamethrower/sentry_flamer/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/flamethrower/sentry_flamer/glob - max_range = 14 - accurate_range = 10 - var/datum/effect_system/smoke_spread/phosphorus/smoke - -/datum/ammo/flamethrower/sentry_flamer/glob/New() - . = ..() - smoke = new() - -/datum/ammo/flamethrower/sentry_flamer/glob/drop_flame(turf/T, datum/cause_data/cause_data) - if(!istype(T)) - return - smoke.set_up(1, 0, T, new_cause_data = cause_data) - smoke.start() - -/datum/ammo/flamethrower/sentry_flamer/glob/Destroy() - qdel(smoke) - return ..() - -/datum/ammo/flamethrower/sentry_flamer/mini - name = "normal fire" - -/datum/ammo/flamethrower/sentry_flamer/mini/drop_flame(turf/T, datum/cause_data/cause_data) - if(!istype(T)) - return - var/datum/reagent/napalm/ut/R = new() - R.durationfire = BURN_TIME_INSTANT - new /obj/flamer_fire(T, cause_data, R, 0) - -/datum/ammo/flare - name = "flare" - ping = null //no bounce off. - damage_type = BURN - flags_ammo_behavior = AMMO_HITS_TARGET_TURF - icon_state = "flare" - - damage = 15 - accuracy = HIT_ACCURACY_TIER_3 - max_range = 14 - shell_speed = AMMO_SPEED_TIER_3 - - var/flare_type = /obj/item/device/flashlight/flare/on/gun - handful_type = /obj/item/device/flashlight/flare - -/datum/ammo/flare/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/flare/on_hit_mob(mob/M,obj/projectile/P) - drop_flare(get_turf(M), P, P.firer) - -/datum/ammo/flare/on_hit_obj(obj/O,obj/projectile/P) - drop_flare(get_turf(P), P, P.firer) - -/datum/ammo/flare/on_hit_turf(turf/T, obj/projectile/P) - if(T.density && isturf(P.loc)) - drop_flare(P.loc, P, P.firer) - else - drop_flare(T, P, P.firer) - -/datum/ammo/flare/do_at_max_range(obj/projectile/P, mob/firer) - drop_flare(get_turf(P), P, P.firer) - -/datum/ammo/flare/proc/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) - var/obj/item/device/flashlight/flare/G = new flare_type(T) - var/matrix/rotation = matrix() - rotation.Turn(fired_projectile.angle - 90) - G.apply_transform(rotation) - G.visible_message(SPAN_WARNING("\A [G] bursts into brilliant light nearby!")) - return G - -/datum/ammo/flare/signal - name = "signal flare" - icon_state = "flare_signal" - flare_type = /obj/item/device/flashlight/flare/signal/gun - handful_type = /obj/item/device/flashlight/flare/signal - -/datum/ammo/flare/signal/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) - var/obj/item/device/flashlight/flare/signal/gun/signal_flare = ..() - signal_flare.activate_signal(firer) - if(istype(fired_projectile.shot_from, /obj/item/weapon/gun/flare)) - var/obj/item/weapon/gun/flare/flare_gun_fired_from = fired_projectile.shot_from - flare_gun_fired_from.last_signal_flare_name = signal_flare.name - -/datum/ammo/flare/starshell - name = "starshell ash" - icon_state = "starshell_bullet" - max_range = 5 - flare_type = /obj/item/device/flashlight/flare/on/starshell_ash - -/datum/ammo/flare/starshell/set_bullet_traits() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff, /datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/souto - name = "Souto Can" - ping = null //no bounce off. - damage_type = BRUTE - shrapnel_type = /obj/item/reagent_container/food/drinks/cans/souto/classic - flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_IGNORE_ARMOR|AMMO_IGNORE_RESIST|AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER|AMMO_SPECIAL_EMBED - var/obj/item/reagent_container/food/drinks/cans/souto/can_type - icon_state = "souto_classic" - - max_range = 12 - shrapnel_chance = 10 - accuracy = HIT_ACCURACY_TIER_8 + HIT_ACCURACY_TIER_8 - accurate_range = 12 - shell_speed = AMMO_SPEED_TIER_1 - -/datum/ammo/souto/on_embed(mob/embedded_mob, obj/limb/target_organ) - if(ishuman(embedded_mob) && !isyautja(embedded_mob)) - if(istype(target_organ)) - target_organ.embed(new can_type) - -/datum/ammo/souto/on_hit_mob(mob/M, obj/projectile/P) - if(!M || M == P.firer) return - if(M.throw_mode && !M.get_active_hand()) //empty active hand and we're in throw mode. If so we catch the can. - if(!M.is_mob_incapacitated()) // People who are not able to catch cannot catch. - if(P.contents.len == 1) - for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents) - M.put_in_active_hand(S) - for(var/mob/O in viewers(world_view_size, P)) //find all people in view. - O.show_message(SPAN_DANGER("[M] catches the [S]!"), SHOW_MESSAGE_VISIBLE) //Tell them the can was caught. - return //Can was caught. - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.name == "Human") //no effect on synths or preds. - H.apply_effect(6, STUN) - H.apply_effect(8, WEAKEN) - H.apply_effect(15, DAZE) - H.apply_effect(15, SLOW) - shake_camera(H, 2, 1) - if(P.contents.len) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/on_hit_obj(obj/O,obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/on_hit_turf(turf/T, obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/do_at_max_range(obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/on_shield_block(mob/M, obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/proc/drop_can(loc, obj/projectile/P) - if(P.contents.len) - for(var/obj/item/I in P.contents) - I.forceMove(loc) - randomize_projectile(P) - -/datum/ammo/souto/proc/randomize_projectile(obj/projectile/P) - shrapnel_type = pick(typesof(/obj/item/reagent_container/food/drinks/cans/souto)-/obj/item/reagent_container/food/drinks/cans/souto) - -/datum/ammo/grenade_container - name = "grenade shell" - ping = null - damage_type = BRUTE - var/nade_type = /obj/item/explosive/grenade/high_explosive - icon_state = "grenade" - flags_ammo_behavior = AMMO_IGNORE_COVER|AMMO_SKIPS_ALIENS - - damage = 15 - accuracy = HIT_ACCURACY_TIER_3 - max_range = 6 - -/datum/ammo/grenade_container/on_hit_mob(mob/M,obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/on_hit_obj(obj/O,obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/on_hit_turf(turf/T,obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/do_at_max_range(obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/proc/drop_nade(obj/projectile/P) - var/turf/T = get_turf(P) - var/obj/item/explosive/grenade/G = new nade_type(T) - G.visible_message(SPAN_WARNING("\A [G] lands on [T]!")) - G.det_time = 10 - G.cause_data = P.weapon_cause_data - G.activate() - -/datum/ammo/grenade_container/rifle - flags_ammo_behavior = NO_FLAGS - -/datum/ammo/grenade_container/smoke - name = "smoke grenade shell" - nade_type = /obj/item/explosive/grenade/smokebomb - icon_state = "smoke_shell" - -/datum/ammo/hugger_container - name = "hugger shell" - ping = null - damage_type = BRUTE - var/hugger_hive = XENO_HIVE_NORMAL - icon_state = "smoke_shell" - - damage = 15 - accuracy = HIT_ACCURACY_TIER_3 - max_range = 6 - -/datum/ammo/hugger_container/on_hit_mob(mob/M,obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/on_hit_obj(obj/O,obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/on_hit_turf(turf/T,obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/do_at_max_range(obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/proc/spawn_hugger(turf/T) - var/obj/item/clothing/mask/facehugger/child = new(T) - child.hivenumber = hugger_hive - INVOKE_ASYNC(child, TYPE_PROC_REF(/obj/item/clothing/mask/facehugger, leap_at_nearest_target)) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index d747525f3feb..594ad6b69dce 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -18,6 +18,8 @@ They're all essentially identical when it comes to getting the job done. w_class = SIZE_SMALL throw_speed = SPEED_SLOW throw_range = 6 + ground_offset_x = 7 + ground_offset_y = 6 var/default_ammo = /datum/ammo/bullet var/caliber = null // This is used for matching handfuls to each other or whatever the mag is. Examples are" "12g" ".44" ".357" etc. var/current_rounds = -1 //Set this to something else for it not to start with different initial counts. @@ -50,8 +52,7 @@ They're all essentially identical when it comes to getting the job done. if(0) icon_state += "_e" //In case it spawns empty instead. item_state += "_e" - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) + if(ammo_band_color && ammo_band_icon) update_ammo_band() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e9ab9aecc3c2..9d16574aa9da 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -524,6 +524,10 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w if(fire_delay_group && delay_left > 0) LAZYSET(user.fire_delay_next_fire, src, world.time + delay_left) + for(var/obj/item/attachable/stock/smg/collapsible/brace/current_stock in contents) //SMG armbrace folds to stop it getting stuck on people + if(current_stock.stock_activated) + current_stock.activate_attachment(src, user, turn_off = TRUE) + unwield(user) set_gun_user(null) diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 13ccd03c3e82..d562d305c28b 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -719,12 +719,12 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/direction_angle = dir2angle(direction) var/obj/flamer_fire/foundflame = locate() in target if(!foundflame) - var/datum/reagent/R = new() - R.intensityfire = burn_lvl - R.durationfire = fire_lvl - R.burn_sprite = burn_sprite - R.burncolor = f_color - new/obj/flamer_fire(target, cause_data, R) + var/datum/reagent/fire_reag = new() + fire_reag.intensityfire = burn_lvl + fire_reag.durationfire = fire_lvl + fire_reag.burn_sprite = burn_sprite + fire_reag.burncolor = f_color + new/obj/flamer_fire(target, cause_data, fire_reag) if(target.density) return @@ -737,8 +737,6 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/angle = 180 - abs( abs( direction_angle - spread_direction_angle ) - 180 ) // the angle difference between the spread direction and initial direction switch(angle) //this reduces power when the explosion is going around corners - if (0) - //no change if (45) spread_power *= 0.75 else //turns out angles greater than 90 degrees almost never happen. This bit also prevents trying to spread backwards @@ -753,25 +751,29 @@ GLOBAL_LIST_EMPTY(flamer_particles) if (spread_power < 1) continue - var/turf/T = get_step(target, spread_direction) + var/turf/picked_turf = get_step(target, spread_direction) - if(!T) //prevents trying to spread into "null" (edge of the map?) + if(!picked_turf) //prevents trying to spread into "null" (edge of the map?) continue - if(aerial_flame_level && (T.get_pylon_protection_level() >= aerial_flame_level)) - break + if(aerial_flame_level) + if(picked_turf.get_pylon_protection_level() >= aerial_flame_level) + break + var/area/picked_area = get_area(picked_turf) + if(CEILING_IS_PROTECTED(picked_area?.ceiling, get_ceiling_protection_level(aerial_flame_level))) + break spawn(0) - fire_spread_recur(T, cause_data, spread_power, spread_direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) + fire_spread_recur(picked_turf, cause_data, spread_power, spread_direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) /proc/fire_spread(turf/target, datum/cause_data/cause_data, range, fire_lvl, burn_lvl, f_color, burn_sprite = "dynamic", aerial_flame_level = TURF_PROTECTION_NONE) - var/datum/reagent/R = new() - R.intensityfire = burn_lvl - R.durationfire = fire_lvl - R.burn_sprite = burn_sprite - R.burncolor = f_color + var/datum/reagent/fire_reag = new() + fire_reag.intensityfire = burn_lvl + fire_reag.durationfire = fire_lvl + fire_reag.burn_sprite = burn_sprite + fire_reag.burncolor = f_color - new/obj/flamer_fire(target, cause_data, R) + new/obj/flamer_fire(target, cause_data, fire_reag) for(var/direction in alldirs) var/spread_power = range switch(direction) @@ -779,7 +781,11 @@ GLOBAL_LIST_EMPTY(flamer_particles) spread_power-- else spread_power -= 1.414 //diagonal spreading - var/turf/T = get_step(target, direction) - if(aerial_flame_level && (T.get_pylon_protection_level() >= aerial_flame_level)) - continue - fire_spread_recur(T, cause_data, spread_power, direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) + var/turf/picked_turf = get_step(target, direction) + if(aerial_flame_level) + if(picked_turf.get_pylon_protection_level() >= aerial_flame_level) + continue + var/area/picked_area = get_area(picked_turf) + if(CEILING_IS_PROTECTED(picked_area?.ceiling, get_ceiling_protection_level(aerial_flame_level))) + continue + fire_spread_recur(picked_turf, cause_data, spread_power, direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index 89e6594c64e7..24eddf31597d 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -11,7 +11,7 @@ aim_slowdown = SLOWDOWN_ADS_QUICK wield_delay = WIELD_DELAY_VERY_FAST attachable_allowed = list( - /obj/item/attachable/suppressor, + /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, /obj/item/attachable/flashlight, @@ -50,7 +50,8 @@ /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, - /obj/item/attachable/angledgrip, + /obj/item/attachable/angledgrip, + /obj/item/attachable/verticalgrip, /obj/item/attachable/flashlight/grip, /obj/item/attachable/stock/smg, /obj/item/attachable/stock/smg/collapsible, diff --git a/code/modules/reagents/chemistry_machinery/autodispenser.dm b/code/modules/reagents/chemistry_machinery/autodispenser.dm index 3486e97524b8..eed96564da71 100644 --- a/code/modules/reagents/chemistry_machinery/autodispenser.dm +++ b/code/modules/reagents/chemistry_machinery/autodispenser.dm @@ -154,8 +154,7 @@ data["multiplier"] = multiplier data["cycle_limit"] = cycle_limit data["automode"] = automode - data["linked_storage"] = linked_storage - data["networked_storage"] = linked_storage.is_in_network() + data["networked_storage"] = linked_storage?.is_in_network() data["smartlink"] = smartlink data["outputmode"] = outputmode data["buffervolume"] = reagents.total_volume @@ -347,8 +346,7 @@ C.reagents.trans_to(container, amount) //We don't care about keeping empty bottles stored if(C.reagents.total_volume <= 0 && istypestrict(C,/obj/item/reagent_container/glass/bottle)) - linked_storage.item_quants[C.name]-- - qdel(C) //Might want to connect it to a disposal system later instead + linked_storage.delete_contents(C) if(stage_missing) amount = stage_missing diff --git a/code/modules/reagents/chemistry_machinery/chem_master.dm b/code/modules/reagents/chemistry_machinery/chem_master.dm index 9d2d1ff10a0c..1e7e3bb08384 100644 --- a/code/modules/reagents/chemistry_machinery/chem_master.dm +++ b/code/modules/reagents/chemistry_machinery/chem_master.dm @@ -237,8 +237,6 @@ while (count--) var/obj/item/reagent_container/pill/P = new/obj/item/reagent_container/pill(loc) P.pill_desc = "A custom pill." - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) P.icon_state = "pill"+pillsprite reagents.trans_to(P,amount_per_pill) if(loaded_pill_bottle) @@ -271,8 +269,6 @@ P.name = "[name] vial" reagents.trans_to(P, 30) - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) P.update_icon() if(href_list["store"]) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 7f476cecf2c5..971051e9bf88 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -548,7 +548,7 @@ rarity = PROPERTY_RARE category = PROPERTY_TYPE_REACTANT value = 3 - max_level = 1 + COOLDOWN_DECLARE(ghost_notif) /datum/chem_property/positive/defibrillating/on_delete(mob/living/M) ..() @@ -574,19 +574,33 @@ /datum/chem_property/positive/defibrillating/process_dead(mob/living/M, potency = 1, delta_time) if(!ishuman(M)) return - var/mob/living/carbon/human/H = M - H.apply_damage(-H.getOxyLoss(), OXY) - if(H.check_tod() && H.is_revivable() && H.health > HEALTH_THRESHOLD_DEAD) - to_chat(H, SPAN_NOTICE("You feel your heart struggling as you suddenly feel a spark, making it desperately try to continue pumping.")) - playsound_client(H.client, 'sound/effects/Heart Beat Short.ogg', 35) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, handle_revive)), 50, TIMER_UNIQUE) - else if (potency > POTENCY_MAX_TIER_1 && H.check_tod() && H.is_revivable() && H.health < HEALTH_THRESHOLD_DEAD) //Will heal if level is 7 or greater - to_chat(H, SPAN_NOTICE("You feel a faint spark in your chest.")) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BRUTE) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BURN) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, TOX) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, CLONE) - H.apply_damage(-H.getOxyLoss(), OXY) + var/mob/living/carbon/human/dead = M + var/revivable = dead.check_tod() && dead.is_revivable() + if(revivable && (dead.health > HEALTH_THRESHOLD_DEAD)) + addtimer(CALLBACK(dead, TYPE_PROC_REF(/mob/living/carbon/human, handle_revive)), 5 SECONDS) + to_chat(dead, SPAN_NOTICE("You feel your heart struggling as you suddenly feel a spark, making it desperately try to continue pumping.")) + playsound_client(dead.client, 'sound/effects/heart_beat_short.ogg', 35) + else if ((potency >= 1) && revivable && dead.health <= HEALTH_THRESHOLD_DEAD) //heals on all level above 1. This is however, minimal. + to_chat(dead, SPAN_NOTICE("You feel a faint spark in your chest.")) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, BRUTE) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, BURN) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, TOX) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, CLONE) + dead.apply_damage(-dead.getOxyLoss(), OXY) + if(potency > CREATE_MAX_TIER_1) //heal more if higher levels + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BRUTE) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BURN) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, TOX) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, CLONE) + if(dead.health < HEALTH_THRESHOLD_DEAD) + return + if(!COOLDOWN_FINISHED(src, ghost_notif)) + return + var/mob/dead/observer/ghost = dead.get_ghost() + if(ghost?.client) + COOLDOWN_START(src, ghost_notif, 30 SECONDS) + playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg') + to_chat(ghost, SPAN_BOLDNOTICE("Your heart is struggling to pump! There is a chance you might get up!(Verbs -> Ghost -> Re-enter corpse, or click here!)")) return TRUE /datum/chem_property/positive/hyperdensificating diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index 640e18426311..cec04ca66616 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -96,7 +96,7 @@ H.contract_disease(new /datum/disease/xeno_transformation(0),1) //This is the real reason PMCs are being sent to retrieve it. /datum/chem_property/special/DNA_Disintegrating/trigger() - SSticker.mode.get_specific_call("Weyland-Yutani Goon (Chemical Investigation Squad)", TRUE, FALSE, FALSE, holder.name, TRUE) + SSticker.mode.get_specific_call("Weyland-Yutani Goon (Chemical Investigation Squad)", TRUE, FALSE, holder.name) chemical_data.update_credits(10) message_admins("The research department has discovered DNA_Disintegrating in [holder.name] adding 10 bonus tech points.") var/datum/techtree/tree = GET_TREE(TREE_MARINE) diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm index 468243a0cc8d..3bd7336c32b6 100644 --- a/code/modules/reagents/chemistry_reagents/drink.dm +++ b/code/modules/reagents/chemistry_reagents/drink.dm @@ -85,13 +85,13 @@ /datum/reagent/drink/carrotjuice/on_mob_life(mob/living/M) . = ..() - if(!.) return + if(!.) + return M.ReduceEyeBlur(1) M.ReduceEyeBlind(1) - if(!data) data = 1 + if(!data) + data = 1 switch(data) - if(1 to 20) - //nothing if(21 to INFINITY) if(prob(data-10)) M.disabilities &= ~NEARSIGHTED diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 15b6a6ca6e87..4540588ca628 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -8,9 +8,6 @@ exproof = TRUE needs_power = FALSE - // True if we are doing a flyby - var/is_set_flyby = FALSE - // Admin disabled var/disabled = FALSE @@ -54,15 +51,15 @@ /obj/structure/machinery/computer/shuttle/dropship/flight/enable() disabled = FALSE -/obj/structure/machinery/computer/shuttle/dropship/flight/proc/update_equipment(optimised=FALSE) +/obj/structure/machinery/computer/shuttle/dropship/flight/proc/update_equipment(optimised=FALSE, is_flyby=FALSE) var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttleId) if(!dropship) return // initial flight time - var/flight_duration = is_set_flyby ? DROPSHIP_TRANSIT_DURATION : DROPSHIP_TRANSIT_DURATION * GLOB.ship_alt + var/flight_duration = is_flyby ? DROPSHIP_TRANSIT_DURATION : DROPSHIP_TRANSIT_DURATION * GLOB.ship_alt if(optimised) - if(is_set_flyby) + if(is_flyby) flight_duration = DROPSHIP_TRANSIT_DURATION * 1.5 else flight_duration = DROPSHIP_TRANSIT_DURATION * SHUTTLE_OPTIMIZE_FACTOR_TRAVEL @@ -76,7 +73,7 @@ for(var/obj/structure/dropship_equipment/equipment as anything in dropship.equipments) // fuel enhancer if(istype(equipment, /obj/structure/dropship_equipment/fuel/fuel_enhancer)) - if(is_set_flyby) + if(is_flyby) flight_duration = flight_duration / SHUTTLE_FUEL_ENHANCE_FACTOR_TRAVEL else flight_duration = flight_duration * SHUTTLE_FUEL_ENHANCE_FACTOR_TRAVEL @@ -179,9 +176,8 @@ return to_chat(xeno, SPAN_NOTICE("You command the metal bird to come down. Clever girl.")) xeno_announcement(SPAN_XENOANNOUNCE("Your Queen has commanded the metal bird to the hive at [linked_lz]."), xeno.hivenumber, XENO_GENERAL_ANNOUNCE) - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Unknown", "Remote launch signal for [shuttle.name] received. Authentication garbled.") - link.log_ares_security("Security Alert", "Remote launch signal for [shuttle.name] received. Authentication garbled.") + log_ares_flight("Unknown", "Remote launch signal for [shuttle.name] received. Authentication garbled.") + log_ares_security("Security Alert", "Remote launch signal for [shuttle.name] received. Authentication garbled.") return if(shuttle.destination.id != linked_lz) to_chat(xeno, "The shuttle not ready. The screen reads T-[shuttle.timeLeft(10)]. Have patience.") @@ -275,8 +271,7 @@ GLOB.alt_ctrl_disabled = TRUE marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") + log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") var/mob/living/carbon/xenomorph/xeno = user var/hivenumber = XENO_HIVE_NORMAL @@ -322,7 +317,6 @@ .["target_destination"] = shuttle.in_flyby? "Flyby" : shuttle.destination.name .["door_status"] = is_remote ? list() : shuttle.get_door_data() - .["flight_configuration"] = is_set_flyby ? "flyby" : "ferry" .["has_flyby_skill"] = skillcheck(user, SKILL_PILOT, SKILL_PILOT_EXPERT) .["destinations"] = list() @@ -364,7 +358,6 @@ to_chat(user, SPAN_WARNING("The dropship isn't responding to controls.")) return - var/datum/ares_link/link = GLOB.ares_link switch(action) if("move") if(shuttle.mode != SHUTTLE_IDLE && (shuttle.mode != SHUTTLE_CALL && !shuttle.destination)) @@ -375,20 +368,22 @@ // automatically apply optimisation if user is a pilot if(skillcheck(user, SKILL_PILOT, SKILL_PILOT_EXPERT)) is_optimised = TRUE - update_equipment(is_optimised) + var/dock_id = params["target"] if(dock_id == DROPSHIP_FLYBY_ID) if(!skillcheck(user, SKILL_PILOT, SKILL_PILOT_EXPERT)) to_chat(user, SPAN_WARNING("You don't have the skill to perform a flyby.")) return FALSE + update_equipment(is_optimised, TRUE) to_chat(user, SPAN_NOTICE("You begin the launch sequence for a flyby.")) - link.log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flyby.") + log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flyby.") var/log = "[key_name(user)] launched the dropship [src.shuttleId] on flyby." msg_admin_niche(log) log_interact(user, msg = "[log]") shuttle.send_for_flyby() return TRUE + update_equipment(is_optimised, FALSE) var/list/local_data = ui_data(user) var/found = FALSE playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) @@ -411,7 +406,7 @@ return TRUE SSshuttle.moveShuttle(shuttle.id, dock.id, TRUE) to_chat(user, SPAN_NOTICE("You begin the launch sequence to [dock].")) - link.log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flight to [dock].") + log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flight to [dock].") var/log = "[key_name(user)] launched the dropship [src.shuttleId] on transport." msg_admin_niche(log) log_interact(user, msg = "[log]") @@ -429,18 +424,6 @@ else playsound(loc, 'sound/machines/terminal_error.ogg', KEYBOARD_SOUND_VOLUME, 1) to_chat(user, SPAN_WARNING("Door controls have been overridden. Please call technical support.")) - if("set-ferry") - is_set_flyby = FALSE - link.log_ares_flight(user.name, "Set Dropship [shuttle.name] to transport runs.") - var/log = "[key_name(user)] set the dropship [src.shuttleId] into transport" - msg_admin_niche(log) - log_interact(user, msg = "[log]") - if("set-flyby") - is_set_flyby = TRUE - link.log_ares_flight(user.name, "Set Dropship [shuttle.name] to flyby runs.") - var/log = "[key_name(user)] set the dropship [src.shuttleId] into flyby." - msg_admin_niche(log) - log_interact(user, msg = "[log]") if("set-automate") var/almayer_lz = params["hangar_id"] var/ground_lz = params["ground_id"] @@ -460,7 +443,7 @@ shuttle.automated_lz_id = ground_lz shuttle.automated_delay = delay playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) - link.log_ares_flight(user.name, "Enabled autopilot for Dropship [shuttle.name].") + log_ares_flight(user.name, "Enabled autopilot for Dropship [shuttle.name].") var/log = "[key_name(user)] has enabled auto pilot on '[shuttle.name]'" message_admins(log) log_interact(user, msg = "[log]") @@ -477,7 +460,7 @@ shuttle.automated_lz_id = null shuttle.automated_delay = null playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) - link.log_ares_flight(user.name, "Disabled autopilot for Dropship [shuttle.name].") + log_ares_flight(user.name, "Disabled autopilot for Dropship [shuttle.name].") var/log = "[key_name(user)] has disabled auto pilot on '[shuttle.name]'" message_admins(log) log_interact(user, msg = "[log]") diff --git a/code/modules/shuttles/marine_ferry.dm b/code/modules/shuttles/marine_ferry.dm index 7ec4b2eb7333..6d84881fe9bf 100644 --- a/code/modules/shuttles/marine_ferry.dm +++ b/code/modules/shuttles/marine_ferry.dm @@ -102,8 +102,7 @@ automated_launch = FALSE automated_launch_timer = TIMER_ID_NULL ai_silent_announcement("Dropship '[name]' departing.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Automated", "Dropship [name] launched on an automatic flight.") + log_ares_flight("Automated", "Dropship [name] launched on an automatic flight.") /* diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 12356754872c..dccdfad920f4 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -293,8 +293,7 @@ GLOBAL_LIST_EMPTY(shuttle_controls) marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) shuttle.alerts_allowed-- - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") + log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") to_chat(Q, SPAN_DANGER("A loud alarm erupts from [src]! The fleshy hosts must know that you can access it!")) xeno_message(SPAN_XENOANNOUNCE("The Queen has commanded the metal bird to depart for the metal hive in the sky! Rejoice!"),3,Q.hivenumber) diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 41a047339452..b9a9f27a28ae 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -153,4 +153,9 @@ /world/TgsSecurityLevel() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) - api.SecurityLevel() + return api.SecurityLevel() + +/world/TgsVisibility() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.Visibility() diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 68b0330fe860..de420a2a325a 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -11,6 +11,10 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) src.event_handler = event_handler src.version = version +/datum/tgs_api/proc/TerminateWorld() + del(world) + sleep(1) // https://www.byond.com/forum/post/2894866 + /datum/tgs_api/latest parent_type = /datum/tgs_api/v5 @@ -57,3 +61,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/Visibility() + return TGS_UNIMPLEMENTED diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index b9a75c4abb48..945e2e411767 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -73,7 +73,7 @@ if(cached_json["apiValidateOnly"]) TGS_INFO_LOG("Validating API and exiting...") Export(TGS4_COMM_VALIDATE, list(TGS4_PARAMETER_DATA = "[minimum_required_security_level]")) - del(world) + TerminateWorld() security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] @@ -188,7 +188,7 @@ requesting_new_port = TRUE if(!world.OpenPort(0)) //open any port TGS_ERROR_LOG("Unable to open random port to retrieve new port![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() //request a new port export_lock = FALSE @@ -196,16 +196,16 @@ if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() var/new_port = new_port_json[TGS4_PARAMETER_DATA] if(!isnum(new_port) || new_port <= 0) TGS_ERROR_LOG("Malformed new port json ([json_encode(new_port_json)])![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() if(new_port != world.port && !world.OpenPort(new_port)) TGS_ERROR_LOG("Unable to open port [new_port]![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() requesting_new_port = FALSE while(export_lock) diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 5d3d491a7362..1b52b31d6a73 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.6.1" +"5.6.2" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index f973338daa03..bdcd4e4dd58e 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -48,6 +48,7 @@ #define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" #define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" #define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" +#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility" #define DMAPI5_CHAT_UPDATE_CHANNELS "channels" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 34cc43f8762f..7226f29bba60 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -4,6 +4,7 @@ var/instance_name var/security_level + var/visibility var/reboot_mode = TGS_REBOOT_MODE_NORMAL @@ -50,10 +51,11 @@ if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY]) TGS_INFO_LOG("DMAPI validation, exiting...") - del(world) + TerminateWorld() version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] @@ -252,3 +254,7 @@ /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level + +/datum/tgs_api/v5/Visibility() + RequireInitialBridgeResponse() + return visibility diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index c679737dfc49..f163adaaafe3 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -48,6 +48,7 @@ #undef DMAPI5_RUNTIME_INFORMATION_REVISION #undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES #undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL +#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY #undef DMAPI5_CHAT_UPDATE_CHANNELS diff --git a/colonialmarines.dme b/colonialmarines.dme index 63140be5e458..fe2fadba5c0e 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1,4 +1,4 @@ -s// DM Environment file for colonialmarines.dme. +// DM Environment file for colonialmarines.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. // BEGIN_INTERNALS @@ -11,6 +11,7 @@ s// DM Environment file for colonialmarines.dme. #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\__odlint.dm" #include "code\_byond_version_compat.dm" #include "code\_compile_options.dm" #include "code\_experiments.dm" @@ -292,7 +293,6 @@ s// DM Environment file for colonialmarines.dme. #include "code\controllers\subsystem\x_evolution.dm" #include "code\controllers\subsystem\xeno.dm" #include "code\controllers\subsystem\xenocon.dm" -#include "code\controllers\subsystem\init\earlyruntimes.dm" #include "code\controllers\subsystem\init\landmarks.dm" #include "code\controllers\subsystem\init\law.dm" #include "code\controllers\subsystem\init\lobby_art.dm" @@ -335,7 +335,6 @@ s// DM Environment file for colonialmarines.dme. #include "code\datums\quadtree.dm" #include "code\datums\recipe.dm" #include "code\datums\shuttles.dm" -#include "code\datums\skills.dm" #include "code\datums\soundOutput.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\vehicles.dm" @@ -354,6 +353,22 @@ s// DM Environment file for colonialmarines.dme. #include "code\datums\agents\tools\toolbox.dm" #include "code\datums\agents\tools\tracker.dm" #include "code\datums\agents\tools\tranq_gun.dm" +#include "code\datums\ammo\ammo.dm" +#include "code\datums\ammo\energy.dm" +#include "code\datums\ammo\misc.dm" +#include "code\datums\ammo\rocket.dm" +#include "code\datums\ammo\shrapnel.dm" +#include "code\datums\ammo\xeno.dm" +#include "code\datums\ammo\bullet\bullet.dm" +#include "code\datums\ammo\bullet\lever_action.dm" +#include "code\datums\ammo\bullet\pistol.dm" +#include "code\datums\ammo\bullet\revolver.dm" +#include "code\datums\ammo\bullet\rifle.dm" +#include "code\datums\ammo\bullet\shotgun.dm" +#include "code\datums\ammo\bullet\smg.dm" +#include "code\datums\ammo\bullet\sniper.dm" +#include "code\datums\ammo\bullet\special_ammo.dm" +#include "code\datums\ammo\bullet\tank.dm" #include "code\datums\autocells\auto_cell.dm" #include "code\datums\autocells\explosion.dm" #include "code\datums\autocells\vomit_wave.dm" @@ -569,6 +584,23 @@ s// DM Environment file for colonialmarines.dme. #include "code\datums\redis\redis_message.dm" #include "code\datums\redis\callbacks\_redis_callback.dm" #include "code\datums\redis\callbacks\asay.dm" +#include "code\datums\skills\civilian.dm" +#include "code\datums\skills\clf.dm" +#include "code\datums\skills\cmb.dm" +#include "code\datums\skills\commando.dm" +#include "code\datums\skills\contractor.dm" +#include "code\datums\skills\dutch.dm" +#include "code\datums\skills\forecon.dm" +#include "code\datums\skills\freelancer.dm" +#include "code\datums\skills\gladiator.dm" +#include "code\datums\skills\mercenary.dm" +#include "code\datums\skills\misc.dm" +#include "code\datums\skills\pmc.dm" +#include "code\datums\skills\rmc.dm" +#include "code\datums\skills\skills.dm" +#include "code\datums\skills\synthetic.dm" +#include "code\datums\skills\upp.dm" +#include "code\datums\skills\uscm.dm" #include "code\datums\stamina\_stamina.dm" #include "code\datums\stamina\none.dm" #include "code\datums\statistics\cause_data.dm" @@ -796,6 +828,8 @@ s// DM Environment file for colonialmarines.dme. #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\weather_siren.dm" #include "code\game\machinery\ARES\ARES.dm" +#include "code\game\machinery\ARES\ARES_interface.dm" +#include "code\game\machinery\ARES\ARES_interface_apollo.dm" #include "code\game\machinery\ARES\ARES_procs.dm" #include "code\game\machinery\ARES\ARES_records.dm" #include "code\game\machinery\ARES\ARES_step_triggers.dm" @@ -905,6 +939,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\game\machinery\vending\vendor_types\crew\sea.dm" #include "code\game\machinery\vending\vendor_types\crew\senior_officers.dm" #include "code\game\machinery\vending\vendor_types\crew\staff_officer.dm" +#include "code\game\machinery\vending\vendor_types\crew\staff_officer_armory.dm" #include "code\game\machinery\vending\vendor_types\crew\synthetic.dm" #include "code\game\machinery\vending\vendor_types\crew\vehicle_crew.dm" #include "code\game\machinery\vending\vendor_types\squad_prep\squad_engineer.dm" @@ -970,6 +1005,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\game\objects\effects\landmarks\structure_spawners\setup_distress.dm" #include "code\game\objects\effects\landmarks\structure_spawners\structure_spawner.dm" #include "code\game\objects\effects\landmarks\structure_spawners\xvx_hive.dm" +#include "code\game\objects\effects\spawners\faction_spawners.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\prop_gun_spawner.dm" #include "code\game\objects\effects\spawners\random.dm" @@ -1714,6 +1750,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\modules\law\laws\major_crime.dm" #include "code\modules\law\laws\minor_crime.dm" #include "code\modules\law\laws\optional.dm" +#include "code\modules\law\laws\precautionary_charge.dm" #include "code\modules\lighting\emissive_blocker.dm" #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" @@ -2120,7 +2157,6 @@ s// DM Environment file for colonialmarines.dme. #include "code\modules\power\smes_construction.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\turbine.dm" -#include "code\modules\projectiles\ammo_datums.dm" #include "code\modules\projectiles\ammunition.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\gun_attachables.dm" diff --git a/dependencies.sh b/dependencies.sh index 2889751d36e6..f88c2f9b0a4b 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -19,3 +19,5 @@ export SPACEMAN_DMM_VERSION=suite-1.7.2 # Python version for mapmerge and other tools export PYTHON_VERSION=3.7.9 + +export OPENDREAM_VERSION=0.2.0 diff --git a/html/changelogs/AutoChangeLog-pr-4636.yml b/html/changelogs/AutoChangeLog-pr-4636.yml deleted file mode 100644 index 2f26402bc864..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4636.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - refactor: "Refactored camera code to be less blocking, use typechecks less often, and provide somewhat more fluid descriptions to photos." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index a511276351e7..1afc45c37aad 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -153,3 +153,257 @@ - rscadd: origin descriptions are now displayed when selecting an origin mullenpaul: - ui: tweaked flyby controls to make them in line with other destinations +2023-10-13: + Drathek: + - refactor: Refactored camera code to be less blocking, use typechecks less often, + and provide somewhat more fluid descriptions to photos. +2023-10-14: + BeagleGaming1: + - bugfix: M39 arm brace disables when dropped + CapCamIII: + - bugfix: UPP Sapper/Medic survivor use their correct paygrade instead of UE3M/UE3S + QuickLode: + - rscadd: Colony Supervisor now has a guaranteed grant. + - balance: nerfs PMC Synthetic's gear + - bugfix: PMC Synthetic has corrected access(thx forest) + - bugfix: Colony Supervisor can now have access to his own colony(LOL). + mullenpaul: + - rscadd: adds weapon spawners for USCM, CLF, PMC and UPP +2023-10-15: + Birdtalon: + - bugfix: Limb printer can no longer double print or print without metal. + Drathek: + - ui: Fixed a duplicate Options button + Lalipar: + - qol: Readable time for when a fax was sent in fax panel + - qol: Adds ckey/character name for faxes in fax panel + - qol: Adds fax subject to fax panel + - bugfix: Added CMB faxes to Fax Panel + fira: + - bugfix: Fix nuke explosion getting canceled in some very rare cases. + - bugfix: Xeno Name preference does not require a reconnection to apply anymore. + It still won't change your current Xenomorph's name however. + - bugfix: Fixed Tape Recorder failing to record when no language information is + present. + harryob: + - admin: administrators without R_DEBUG can now restart the server without starting + the round +2023-10-16: + CapCamIII: + - balance: ERTs now have a variant of the standard medkit that has no storage lock. + - bugfix: Lots of ERTs now correctly have a medkit spawning in their gear + Drathek: + - bugfix: Fixed the hive surge join as xeno observer alert text link not actually + doing anything. + Twomoon: + - rscadd: Added new haircut + Waseemq1235: + - admin: Makes subtle messages more noticeable. + Zonespace, Wei (sprites): + - balance: Removed NSG, Type71, tactical Mar-40, and Mar-50 from the black market + - balance: Removed Ext. M4ra mags from the black market + - balance: Removed monkeycubes from the black market + - balance: Removed lunge mines from the black market + - balance: You now need a modified security access tuner to access the black market, + which can be found ship- and ground-side where scanners and radios can spawn. + fira: + - bugfix: The Turing Machine should now keep working as intended if its linked Smartfridge + is blown up. + - bugfix: Fixed xeno cultists always being created into normal hive, irrespective + of the selected hive. + - bugfix: Fixed 'Join as Freed Mob' verb crashing if freed mobs had previously been + deleted. + - bugfix: Fixed issues with turfs, notably lighting, arising when building it from + a sheets stack. +2023-10-17: + VileBeggar: + - qol: The Queen's psychic messages now use a bigger font and are harder to miss. + Warfan1815: + - mapadd: New Squad Briefings south and north of normal briefing! Feel free to use + them to your heart's content. + - maptweak: Moved long-rest bunks further north and further south of where they + were originally +2023-10-18: + mullenpaul: + - code_imp: resolves flyby issues by refactoring update_equipment logic + - refactor: removes unwanted code + realforest2001: + - code_imp: Moved most data storage from ARES Interface and APOLLO consoles to a + new ARES datacore datum. + - code_imp: Moved the two consoles to separate files for easier navigation, and + moved their respective UI data to the files. + - code_imp: Ares logging procs are now global procs with integrated can_log checks, + rather than requiring definition of ares_link for every use. + - rscadd: Added ares_can_log checks to all the places I could find missing them. + - bugfix: Fixed missing rejection button for access tickets. + - rscdel: Removed claim ticket button from Access Tickets. +2023-10-19: + BeagleGaming1: + - refactor: Refactored handheld beacons and related code + CapCamIII: + - bugfix: Equipped marine presets spawn with full food on spawn + Huffie56: + - refactor: refactor ammo_datums file. + SpartanBobby: + - maptweak: fixes lack of warning stripes under doors in squad briefing areas and + newly added maint doors onboard USS Almayer + - maptweak: fixes incorrect tiles used under window frames in new squad briefing + areas onboard USS Almayer + - maptweak: fixes pipe sections under window frames in new squad briefing areas + onboard USS Almayer + - maptweak: fixes pipes that lead nowhere in new squad briefing areas onboard USS + Almayer + - maptweak: fixes button that was being hidden by light due to recent USS Almayer + changes + - maptweak: corrects strangely laid out vent sections due to recent USS Almayer + changes + - maptweak: makes USS Almayer Bunks consistent with the rest of the ship's shower + and bathrooms + - maptweak: updates "Dusty Beret" prop item to now be the RMC Beret it was originally + referencing (now that the RMC are ingame) + VileBeggar: + - qol: All squad uniform vendors have had their standard apparel condensed into + one button. + fira: + - bugfix: Fixed caps displaying contained items on character even without being + worn. + neeshacark: + - qol: MT, CT, and Nurses can now take the bad leg trait. +2023-10-20: + Drathek: + - bugfix: Fixed a cause of bad icon operations + - bugfix: Bandaided a problem with nulls in GLOB.clients + IsProbablyCatto: + - qol: Medbelts pull from pillbottles as default + Kitsunemitsu: + - bugfix: fixed FTLs being demoted from SL erroneously having the tag TL in chat. + MrDas: + - bugfix: You can now disassemble wide airlocks. (You can't unwrench them though) + - spellcheck: Fixed a few typos in airlock assembly. + - imageadd: Added wide airlock assembly and generic solid wide airlock sprites. + SpartanBobby: + - maptweak: Removes stunprod from LV522 + VileBeggar: + - rscadd: Dartboards are now functional and can be crafted with cardboard. + - bugfix: Fixed an issue with some deconstructed signs losing their icon. +2023-10-21: + Birdtalon: + - rscadd: USCM Service Jacket to SEA Vendor + CapCamIII: + - balance: Crawling now only takes 1 second to move and no longer has an overhead + icon when doing it. + - balance: Timer on attempting to join ERT after death is now 30 seconds down from + 1 minute + - spellcheck: UPP Synth Survivor on the Trijent Dam nightmare is now called a Support + Synthetic instead of a Combat Synthetic, as its not a combat synthetic + Drathek: + - bugfix: Fixed imaginary friends not initializing correctly and throwing a runtime + - ui: Tweaked the position of some ghost alerts + SpartanBobby: + - maptweak: Fixes incorrect DIR on fireshutters in memorial + - maptweak: Corrects lack of warning stripe tile under door in north brig maint + Steelpoint: + - rscadd: UPP ERT's have a chance to be neutral to the USCM. + fira: + - bugfix: Xeno and Megaphone abovehead chat speech should now properly be centered + horizontally. + - bugfix: Fixed Rangefinders/Designators preventing you from lazing if you looked + up/down them without moving. + - bugfix: Fixed Rangefinders/Designators forcing you to look up/down again if you + had moved while using them. + foxtrot1322: + - rscadd: Added splints to the survival pouch + - rscadd: Increased survival pouch storage space by 1 + - spellcheck: Updates the survival pouch's description +2023-10-22: + Drathek: + - bugfix: Fix incend and cluster OBs not respecting ceiling OB protections. + - bugfix: Disabled code in icon2html that is causing bad icon operations + Morrow: + - server: the rustg mysql driver is now properly compatible with mariadb + Zonespace27: + - rscadd: Mentors can now unmark mhelps + fira: + - bugfix: Removed redundant double binding for F1 to AdminHelp from default keybinds. + This does not affect existing users or their settings. + - rscadd: Stamping papers now makes a noise. + - bugfix: Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in + with the walls again. + - bugfix: Re-fixed Megaphone above-head-chat drifting to the left. + harryob: + - admin: no more href token errors when changing the game mode via game panel + - bugfix: mentorhelp response no longer gives a dead discord link + - admin: view-target-records now allows you to note people properly + kiVts: + - rscadd: Ghosts get notified when they are being revived by DFB property + - balance: DFB property healing threshold lowered, You can create DFB property higher + than one. + realforest2001: + - rscadd: Added Discretionary Arrest to JAS. + - rscadd: Added a new category to JAS, Precautionary Charges. Moves Insanity and + POW to this category. +2023-10-23: + QuickLode: + - balance: Nerfs synth surv pouch by removing 1 storage slot. + SpypigDev: + - rscadd: CIC Armory SO vendor + - balance: Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor + - balance: Made RTO pack a point-buy item in CIC Armory vendor for SOs + Steelpoint: + - balance: Revolver Heavy ammo no longer stuns targets it strikes, it will instead + knock them back and slow them down for a short time. + harryob: + - server: the server now respects /string/title for late joiners + stalkerino: + - balance: m39 is able to use vertigrip +2023-10-24: + Segrain: + - bugfix: Slicing food once again works as intended. +2023-10-25: + fira: + - bugfix: Fixed Ghosts and Queen Eye occasionally "eating" pounces in place of a + mob on the same turf. + - bugfix: Re-Re-Fixed Xeno Above Head Chat offsets, for real this time + - bugfix: Fixed people talking in radios all the time. Finally some quiet. + - bugfix: deadchat death messages should now display immediately rather than being + delayed a couple seconds. +2023-10-26: + 4hands44: + - rscadd: Added more attachments, and belts to the CO arsenal. + - rscadd: CO now has an Essentials Kit like other roles, containing his Designator, + and other useful tools. + - rscadd: Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and + XO currently.) + - rscdel: Removed Laser Designator from CO spawn Preset. + - balance: CO can now vend welding Helmet visors. + - balance: Adds grenade packets to CO Vendor. + XDinka: + - rscadd: 'Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper + haircut.' +2023-10-27: + Backsea: + - bugfix: Fixed the incorrectly placed shutters at req and that one light near CIC + Birdtalon: + - refactor: Refactored praetorian pierce ability + - bugfix: Praetorian vanguard can no longer pierce through windowed doors + SASoperative: + - rscadd: Added donator item and sprites + Zonespace27: + - rscdel: Re-removed CO/XO bridge coat + fira: + - rscadd: Added about 50 new tips. + - rscadd: Bloody footprints are now slightly offset to break long visual straight + lines. + - bugfix: Items do not align back to the center of turfs anymore when picked from + a surface (table or rack) + - rscadd: Some more items now have offsets on the map display, and they all can + be slightly offset. + - code_imp: Rewrote Xeno Acid ticking code. + - bugfix: Weather updates won't cause turfs to acid melt more rapidly anymore + - bugfix: Fixed various issues in the Networking between Turing machine and Smartfridges. + realforest2001: + - bugfix: Fixes custom ERT calling broadcasting when it should not. + - code_imp: Removes unused vars from ERT procs. + - code_imp: Renames the announce var in ERT procs to be more indicative of what + it does. + - rscadd: Added a setting on custom ERTs for announcing beacon was received. diff --git a/html/statbrowser.js b/html/statbrowser.js index 78eb7d4e5716..83709e9e92f0 100644 --- a/html/statbrowser.js +++ b/html/statbrowser.js @@ -1036,6 +1036,9 @@ Byond.subscribeTo("remove_mc", remove_mc); Byond.subscribeTo("add_verb_list", add_verb_list); function createOptionsButton() { + if (document.getElementById("options")) { + return; + } var button = document.createElement("BUTTON"); button.onclick = function () { openOptionsMenu(); diff --git a/icons/mob/humans/human_hair.dmi b/icons/mob/humans/human_hair.dmi index bfe0e072f19d..9634a2543aa4 100644 Binary files a/icons/mob/humans/human_hair.dmi and b/icons/mob/humans/human_hair.dmi differ diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi index 8a51050c03c3..a6e9ef72c010 100644 Binary files a/icons/mob/humans/onmob/back.dmi and b/icons/mob/humans/onmob/back.dmi differ diff --git a/icons/mob/humans/onmob/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi index ce576bdd9cc5..51cad85586e7 100644 Binary files a/icons/mob/humans/onmob/head_0.dmi and b/icons/mob/humans/onmob/head_0.dmi differ diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi index d7dfd5394f0d..52f2c7f0a9cb 100644 Binary files a/icons/mob/humans/onmob/suit_0.dmi and b/icons/mob/humans/onmob/suit_0.dmi differ diff --git a/icons/obj/items/clothing/backpacks.dmi b/icons/obj/items/clothing/backpacks.dmi index f9c06fca4437..4119b32a09cf 100644 Binary files a/icons/obj/items/clothing/backpacks.dmi and b/icons/obj/items/clothing/backpacks.dmi differ diff --git a/icons/obj/items/clothing/hats.dmi b/icons/obj/items/clothing/hats.dmi index 7d2c45103ba6..a6a0e6fb9099 100644 Binary files a/icons/obj/items/clothing/hats.dmi and b/icons/obj/items/clothing/hats.dmi differ diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi index d158d9f6bd1f..10fbfff30d7c 100644 Binary files a/icons/obj/items/clothing/suits.dmi and b/icons/obj/items/clothing/suits.dmi differ diff --git a/icons/obj/items/devices.dmi b/icons/obj/items/devices.dmi index 8bf7634a7df4..9e0891f36170 100644 Binary files a/icons/obj/items/devices.dmi and b/icons/obj/items/devices.dmi differ diff --git a/icons/obj/structures/doors/2x1generic_solid.dmi b/icons/obj/structures/doors/2x1generic_solid.dmi new file mode 100644 index 000000000000..9c00b7b3277d Binary files /dev/null and b/icons/obj/structures/doors/2x1generic_solid.dmi differ diff --git a/icons/obj/structures/doors/airlock_assembly2x1.dmi b/icons/obj/structures/doors/airlock_assembly2x1.dmi index a8d69b6f6a2d..cafd5c415b89 100644 Binary files a/icons/obj/structures/doors/airlock_assembly2x1.dmi and b/icons/obj/structures/doors/airlock_assembly2x1.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index a37ab648b7f5..c9112160d94f 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -55,7 +55,7 @@ if(tgui_alert(src, "This will open the discord in your browser. Are you sure?", "Confirm", list("Yes", "No")) != "Yes") return - src << link("https://discord.gg/cmss13") + src << link("[CONFIG_GET(string/discordurl)]") return /client/verb/submitbug() diff --git a/interface/skin.dmf b/interface/skin.dmf index 5d06bb40e858..e31c42938cd9 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -164,7 +164,6 @@ window "mainwindow" anchor2 = -1,-1 is-default = true saved-params = "pos;size;is-minimized;is-maximized" - title = "CM-SS13 - USS Almayer" is-maximized = true statusbar = false icon = 'icons\\taskbar\\gml_distress.png' diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm index d000153afd71..429f3a446c7b 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -20717,7 +20717,7 @@ /area/lv522/atmos/cargo_intake) "iFe" = ( /obj/structure/closet/crate, -/obj/item/weapon/stunprod, +/obj/item/weapon/classic_baton, /turf/open/floor/prison{ icon_state = "darkbrownfull2" }, @@ -48141,10 +48141,7 @@ pixel_y = 6 }, /obj/item/handcuffs, -/obj/item/weapon/baton{ - pixel_x = -2; - pixel_y = 10 - }, +/obj/item/weapon/classic_baton, /turf/open/floor/prison{ icon_state = "darkredfull2" }, diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index fb842c754dd9..523f461ee94d 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -530,14 +530,12 @@ }, /area/almayer/hallways/aft_hallway) "abQ" = ( -/obj/structure/surface/rack, -/obj/item/clothing/suit/storage/marine/light/vest, -/obj/item/clothing/suit/storage/marine/light/vest, /obj/item/device/radio/intercom{ freerange = 1; name = "General Listening Channel"; pixel_y = 28 }, +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -567,6 +565,18 @@ icon_state = "tcomms" }, /area/almayer/shipboard/weapon_room) +"acc" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "acf" = ( /turf/closed/wall/almayer/outer, /area/almayer/living/starboard_garden) @@ -1973,6 +1983,24 @@ "agu" = ( /turf/open/floor/almayer, /area/almayer/living/officer_study) +"agv" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/almayer/glass{ + access_modified = 1; + dir = 2; + name = "\improper Requisitions Break Room"; + req_one_access_txt = "19;21" + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/squads/req) "agw" = ( /obj/structure/machinery/light{ dir = 8 @@ -2370,19 +2398,6 @@ icon_state = "bluecorner" }, /area/almayer/living/offices/flight) -"ahX" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "SE-out" - }, -/obj/effect/decal/warning_stripes{ - icon_state = "NE-out"; - pixel_y = 1 - }, -/obj/structure/machinery/door/airlock/almayer/maint, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/upper_hull/u_a_s) "ahY" = ( /obj/structure/machinery/light, /obj/structure/surface/table/woodentable/fancy, @@ -3352,12 +3367,6 @@ icon_state = "red" }, /area/almayer/living/starboard_garden) -"akX" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "akY" = ( /obj/structure/cable/heavyduty{ icon_state = "4-8" @@ -3449,13 +3458,6 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/hallways/aft_hallway) -"alm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "alo" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_18" @@ -3489,15 +3491,6 @@ /obj/item/device/radio, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) -"alv" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 8; - name = "ship-grade camera" - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_p) "alw" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 2; @@ -5867,14 +5860,6 @@ icon_state = "plate" }, /area/almayer/medical/morgue) -"asV" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/north2) "asW" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -6646,14 +6631,6 @@ icon_state = "cargo" }, /area/almayer/engineering/engineering_workshop/hangar) -"auJ" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/north1) "auK" = ( /obj/structure/stairs/perspective{ icon_state = "p_stair_sn_full_cap" @@ -7827,28 +7804,6 @@ icon_state = "redcorner" }, /area/almayer/shipboard/navigation) -"ayy" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = 15 - }, -/obj/structure/machinery/light, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Bravo Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Bravo Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = -8 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "ayz" = ( /obj/structure/bed/chair/office/dark{ dir = 8; @@ -8497,47 +8452,6 @@ icon_state = "plate" }, /area/almayer/command/cic) -"aAD" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door_control{ - id = "CIC Lockdown"; - name = "CIC Lockdown"; - pixel_x = -7; - pixel_y = 9; - req_access_txt = "1" - }, -/obj/structure/machinery/door_control{ - id = "Hangar Lockdown"; - name = "Hangar Lockdown"; - pixel_x = -7; - pixel_y = 2; - req_access_txt = "1" - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4; - icon_state = "exposed01-supply" - }, -/obj/structure/machinery/door_control{ - id = "bot_armory"; - name = "Armory Lockdown"; - pixel_x = -7; - pixel_y = -5; - req_one_access_txt = "1;4" - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Combat Information Center Telephone"; - phone_category = "Command"; - phone_id = "Combat Information Center"; - pixel_x = 5; - pixel_y = 4 - }, -/obj/structure/machinery/door/window/westright{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "aAE" = ( /obj/structure/pipes/vents/scrubber{ dir = 8 @@ -8927,18 +8841,6 @@ }, /turf/open/floor/almayer, /area/almayer/command/cic) -"aBN" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - name = "\improper Port Railguns and Viewing Room" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/upper_hull/u_f_p) "aBP" = ( /obj/structure/machinery/door/airlock/almayer/maint/reinforced{ access_modified = 1; @@ -8965,30 +8867,6 @@ icon_state = "silver" }, /area/almayer/command/cic) -"aBV" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = -17 - }, -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Charlie Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Charlie Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = 7 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "aBW" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -9124,12 +9002,6 @@ icon_state = "sterile_green" }, /area/almayer/medical/medical_science) -"aCu" = ( -/obj/structure/sink{ - pixel_y = 24 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "aCv" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 2; @@ -9226,13 +9098,6 @@ icon_state = "orangecorner" }, /area/almayer/engineering/upper_engineering) -"aDf" = ( -/obj/structure/machinery/shower{ - pixel_y = 16 - }, -/obj/item/tool/soap, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "aDg" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -11458,13 +11323,6 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) "aMM" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, /turf/open/floor/almayer{ dir = 4; icon_state = "red" @@ -12161,18 +12019,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) -"aQA" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/hull/upper_hull/u_a_s) "aQF" = ( /turf/closed/wall/almayer, /area/almayer/living/offices) @@ -12294,21 +12140,6 @@ icon_state = "test_floor4" }, /area/almayer/engineering/upper_engineering) -"aRk" = ( -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/hull/upper_hull/u_a_s) "aRo" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -12530,6 +12361,15 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) +"aSh" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/item/prop/helmetgarb/helmet_nvg/cosmetic, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "aSl" = ( /obj/structure/machinery/light, /obj/structure/machinery/cm_vending/sorted/medical, @@ -13541,12 +13381,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) -"aWN" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "aWR" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, @@ -13848,10 +13682,6 @@ icon_state = "plate" }, /area/almayer/hallways/starboard_hallway) -"aYU" = ( -/obj/structure/largecrate/supply/supplies/flares, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "aYV" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -14443,26 +14273,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) -"bbI" = ( -/obj/structure/machinery/door/airlock/almayer/maint, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - layer = 1.9 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) -"bbJ" = ( -/obj/structure/pipes/standard/manifold/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "greencorner" - }, -/area/almayer/hallways/starboard_hallway) "bbL" = ( /turf/open/floor/almayer{ dir = 8; @@ -14488,18 +14298,6 @@ "bbS" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/starboard_point_defense) -"bbU" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = -25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "bbV" = ( /obj/structure/machinery/light{ dir = 8 @@ -14802,31 +14600,6 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_s) -"bdp" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) -"bdq" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) "bdr" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) @@ -15104,12 +14877,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) -"beO" = ( -/turf/open/floor/almayer{ - dir = 5; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) "beP" = ( /obj/item/stack/catwalk, /obj/structure/disposalpipe/segment{ @@ -15170,12 +14937,6 @@ }, /turf/open/floor/almayer, /area/almayer/living/chapel) -"bfa" = ( -/obj/structure/machinery/cm_vending/sorted/tech/tool_storage, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bfb" = ( /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, @@ -15540,12 +15301,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_one) -"bgF" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) "bgG" = ( /obj/structure/window/framed/almayer/white, /turf/open/floor/plating, @@ -15843,10 +15598,10 @@ }, /area/almayer/living/starboard_garden) "biV" = ( -/obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 + dir = 8 }, +/obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/living/starboard_garden) "bja" = ( @@ -17024,12 +16779,6 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) -"bpf" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "bph" = ( /obj/structure/bed/chair/comfy/orange, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -17489,10 +17238,6 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) -"brT" = ( -/obj/structure/machinery/light, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "brW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -17542,16 +17287,6 @@ /obj/structure/machinery/computer/arcade, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) -"bsf" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 8; - name = "ship-grade camera" - }, -/obj/structure/largecrate/random, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_s) "bsj" = ( /obj/structure/machinery/line_nexter/med{ dir = 4 @@ -18554,6 +18289,22 @@ /obj/effect/landmark/late_join/alpha, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) +"bxC" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "bxD" = ( /obj/structure/machinery/status_display{ pixel_y = 30 @@ -18941,19 +18692,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) -"bzG" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/obj/effect/landmark/yautja_teleport, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "bzH" = ( /obj/structure/surface/rack, /obj/effect/spawner/random/toolbox, @@ -19480,21 +19218,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_lobby) -"bCf" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "bCg" = ( /obj/structure/machinery/light{ dir = 8 @@ -20538,6 +20261,9 @@ /area/almayer/squads/req) "bGz" = ( /obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, /turf/open/floor/almayer{ dir = 9; icon_state = "green" @@ -20843,15 +20569,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) -"bHM" = ( -/obj/structure/machinery/cm_vending/sorted/tech/comp_storage, -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bHP" = ( /turf/open/floor/plating/almayer, /area/almayer/shipboard/weapon_room) @@ -20993,17 +20710,6 @@ icon_state = "cargo" }, /area/almayer/squads/req) -"bIu" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - name = "Storage"; - req_one_access_txt = "19;21" - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/squads/req) "bIw" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/light{ @@ -21461,21 +21167,6 @@ icon_state = "red" }, /area/almayer/shipboard/weapon_room) -"bKo" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/machinery/disposal/broken, -/obj/item/reagent_container/food/drinks/cans/beer{ - layer = 3.1; - pixel_x = -7; - pixel_y = 16 - }, -/obj/structure/machinery/light, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "bKp" = ( /obj/structure/surface/table/almayer, /obj/item/paper_bin/uscm, @@ -22124,6 +21815,21 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_s) +"bMY" = ( +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/hull/upper_hull/u_a_s) "bNa" = ( /obj/structure/surface/table/almayer, /obj/item/folder/black, @@ -22270,15 +21976,6 @@ icon_state = "kitchen" }, /area/almayer/living/grunt_rnr) -"bNz" = ( -/obj/structure/surface/rack, -/obj/item/frame/table, -/obj/item/frame/table, -/obj/item/frame/table, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bNA" = ( /obj/structure/machinery/computer/ordercomp, /obj/structure/sign/safety/galley{ @@ -23053,9 +22750,7 @@ /turf/closed/wall/almayer, /area/almayer/squads/req) "bQS" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo{ - icon_state = "req_ammo_wall" - }, +/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend, /turf/open/floor/almayer{ icon_state = "green" }, @@ -23780,8 +23475,14 @@ }, /area/almayer/living/briefing) "bUc" = ( -/obj/structure/foamed_metal, -/turf/open/floor/plating, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "Secretroom"; + indestructible = 1; + unacidable = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/hull/lower_hull/l_m_s) "bUd" = ( /turf/open/floor/almayer{ @@ -23995,19 +23696,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_m_s) -"bUR" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "blue" - }, -/area/almayer/hallways/port_hallway) "bUT" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 26 @@ -24111,25 +23799,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"bVr" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_f_p) -"bVt" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "bVw" = ( /turf/open/floor/almayer{ dir = 4; @@ -24345,12 +24014,6 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engineering_workshop/hangar) -"bWy" = ( -/obj/structure/closet/toolcloset, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bWC" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out"; @@ -24448,6 +24111,24 @@ icon_state = "test_floor4" }, /area/almayer/engineering/engineering_workshop) +"bXc" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/mre_pack/xmas2{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/effect/landmark/map_item{ + layer = 3.03; + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/reagent_container/food/snacks/mre_pack/xmas3{ + pixel_x = 5 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "bXe" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) @@ -24684,9 +24365,7 @@ /turf/open/floor/almayer, /area/almayer/hallways/vehiclehangar) "bYa" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo{ - icon_state = "req_guns_wall" - }, +/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend, /turf/open/floor/almayer{ dir = 10; icon_state = "green" @@ -25784,6 +25463,17 @@ icon_state = "plate" }, /area/almayer/engineering/lower_engineering) +"ccF" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "ccG" = ( /obj/structure/largecrate/random/secure, /obj/effect/decal/warning_stripes{ @@ -26383,6 +26073,18 @@ }, /turf/open/floor/almayer, /area/almayer/squads/charlie) +"cgz" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/sign/poster{ + desc = "Eat an EAT bar! ...Aren't they called MEAT bars?"; + icon_state = "poster7"; + name = "EAT - poster"; + pixel_x = 27 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "cgA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27025,13 +26727,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_a_s) -"ckD" = ( -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/turf/closed/wall/almayer, -/area/almayer/hull/lower_hull/l_m_p) "ckI" = ( /obj/structure/disposalpipe/segment, /obj/item/device/radio/intercom{ @@ -27380,15 +27075,9 @@ }, /area/almayer/hull/lower_hull/l_m_p) "clR" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, /turf/open/floor/almayer{ - icon_state = "test_floor4" + dir = 4; + icon_state = "blue" }, /area/almayer/hallways/port_hallway) "clS" = ( @@ -27449,29 +27138,6 @@ icon_state = "plate" }, /area/almayer/squads/delta) -"cmb" = ( -/obj/structure/machinery/door/airlock/almayer/maint, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) -"cmc" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "cmd" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -28081,6 +27747,15 @@ icon_state = "greencorner" }, /area/almayer/squads/req) +"crK" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/vents/pump, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "crP" = ( /obj/item/tool/kitchen/utensil/pfork, /turf/open/floor/almayer{ @@ -28100,24 +27775,18 @@ icon_state = "greencorner" }, /area/almayer/hallways/starboard_hallway) -"csw" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 6; - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "csz" = ( /turf/open/floor/almayer{ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_p) +"csG" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/item/trash/popcorn, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "csI" = ( /turf/open/floor/almayer{ dir = 8; @@ -28291,6 +27960,20 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"cwQ" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "cwS" = ( /obj/structure/blocker/invisible_wall, /turf/open/floor/almayer/no_build{ @@ -28705,6 +28388,14 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/charlie) +"cEG" = ( +/obj/structure/sign/poster{ + icon_state = "poster14"; + pixel_x = -27 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "cEO" = ( /obj/structure/largecrate/supply/floodlights, /turf/open/floor/almayer{ @@ -28993,6 +28684,13 @@ icon_state = "orangecorner" }, /area/almayer/engineering/upper_engineering/port) +"cKX" = ( +/obj/structure/platform, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "cKY" = ( /obj/structure/machinery/light, /turf/open/floor/almayer{ @@ -29054,6 +28752,12 @@ icon_state = "cargo" }, /area/almayer/living/bridgebunks) +"cLV" = ( +/obj/structure/largecrate/random/barrel/green, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "cMl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29297,6 +29001,16 @@ icon_state = "red" }, /area/almayer/shipboard/starboard_missiles) +"cSK" = ( +/obj/structure/sign/safety/hvac_old{ + pixel_x = 8; + pixel_y = 32 + }, +/obj/structure/largecrate/supply/supplies/flares, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "cSN" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/light{ @@ -29662,26 +29376,26 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"dac" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddernortheast"; + name = "\improper North East Ladders Shutters" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "daj" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/almayer{ icon_state = "sterile_green_side" }, /area/almayer/shipboard/brig/surgery) -"dav" = ( -/obj/structure/machinery/door/poddoor/almayer/open{ - id = "Brig Lockdown Shutters"; - name = "\improper Brig Lockdown Shutter" - }, -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 2; - req_one_access = list(2,34,30) - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_s) "daz" = ( /turf/closed/wall/almayer/white/hull, /area/almayer/command/airoom) @@ -29819,13 +29533,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/weapon_room) -"ddG" = ( -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "ddK" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -29871,6 +29578,18 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/port_hallway) +"deT" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "emerald" + }, +/area/almayer/living/port_emb) "dfa" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, @@ -30017,6 +29736,15 @@ icon_state = "test_floor4" }, /area/almayer/hallways/starboard_umbilical) +"diw" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "diz" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ id_tag = "Boat1-D4"; @@ -30163,6 +29891,15 @@ icon_state = "red" }, /area/almayer/living/briefing) +"dkH" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "dkO" = ( /obj/effect/step_trigger/teleporter_vector{ name = "Almayer_Down2"; @@ -30401,6 +30138,21 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"dpo" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/sign/safety/waterhazard{ + pixel_y = 32 + }, +/obj/structure/sign/safety/rewire{ + pixel_x = 14; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/north1) "dpy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30439,6 +30191,13 @@ /obj/structure/largecrate/random/secure, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_s) +"dqg" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "dqj" = ( /turf/open/floor/almayer{ dir = 4; @@ -30915,6 +30674,17 @@ icon_state = "orange" }, /area/almayer/engineering/ce_room) +"dzF" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddernortheast"; + name = "\improper North East Ladders Shutters" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "dAb" = ( /obj/structure/largecrate/random/barrel/blue, /turf/open/floor/almayer{ @@ -30933,6 +30703,13 @@ icon_state = "test_floor4" }, /area/almayer/squads/bravo) +"dAO" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "dAX" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -31307,21 +31084,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) -"dGW" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "dHd" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -31642,6 +31404,15 @@ icon_state = "silver" }, /area/almayer/command/airoom) +"dQs" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "dQv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -31880,6 +31651,28 @@ icon_state = "blue" }, /area/almayer/living/briefing) +"dVm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + name = "\improper Port Railguns and Viewing Room" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hull/upper_hull/u_f_p) +"dVs" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "dVu" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -32055,6 +31848,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/grunt_rnr) +"dYX" = ( +/obj/structure/machinery/door/airlock/almayer/marine/bravo{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "dZd" = ( /turf/open/floor/almayer{ dir = 10; @@ -32089,10 +31894,6 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/general_equipment) -"eai" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "ean" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -32355,16 +32156,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) -"efa" = ( -/obj/item/frame/camera{ - desc = "The Staff Officer insisted he needed to monitor everyone at all times."; - layer = 2.9; - name = "broken camera"; - pixel_x = -7; - pixel_y = -6 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "efh" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/door_control{ @@ -32549,15 +32340,6 @@ icon_state = "plate" }, /area/almayer/living/port_emb) -"ehZ" = ( -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_f_p) "eim" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -32720,6 +32502,9 @@ /obj/structure/machinery/door/airlock/almayer/generic/glass{ name = "\improper Memorial Room" }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 8 + }, /turf/open/floor/almayer{ icon_state = "test_floor4" }, @@ -32734,17 +32519,6 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering) -"elh" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 - }, -/obj/structure/machinery/light{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer, -/area/almayer/shipboard/brig/cic_hallway) "elq" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -32856,6 +32630,9 @@ /area/almayer/shipboard/brig/evidence_storage) "enx" = ( /obj/structure/pipes/vents/pump, +/obj/structure/machinery/status_display{ + pixel_y = 30 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "green" @@ -32880,6 +32657,18 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/almayer, /area/almayer/engineering/upper_engineering/port) +"eoM" = ( +/obj/structure/surface/table/almayer, +/obj/item/storage/beer_pack, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = -27; + serial_number = 11 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "eoP" = ( /obj/structure/bed, /obj/structure/machinery/flasher{ @@ -32903,6 +32692,20 @@ icon_state = "red" }, /area/almayer/hallways/aft_hallway) +"epq" = ( +/obj/structure/stairs/perspective{ + dir = 1; + icon_state = "p_stair_full" + }, +/obj/structure/sign/poster{ + desc = "One of those hot, tanned babes back the beaches of good ol' Earth."; + icon_state = "poster12"; + name = "Beach Babe Pinup"; + pixel_x = 27; + serial_number = 12 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "epu" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/poddoor/almayer/open{ @@ -33153,15 +32956,6 @@ icon_state = "plating" }, /area/almayer/engineering/upper_engineering) -"etB" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/safety/storage{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "etE" = ( /obj/structure/prop/almayer/name_stencil, /turf/open/floor/almayer_hull{ @@ -33278,6 +33072,16 @@ icon_state = "greencorner" }, /area/almayer/hallways/starboard_hallway) +"ewr" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/shipboard/brig/cic_hallway) "ewO" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -33571,6 +33375,16 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south2) +"eCS" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/item/trash/popcorn, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "eDo" = ( /obj/effect/decal/warning_stripes{ icon_state = "W"; @@ -33587,6 +33401,16 @@ }, /turf/open/floor/almayer, /area/almayer/living/bridgebunks) +"eDz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/sign/safety/distribution_pipes{ + pixel_x = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "eDG" = ( /obj/structure/barricade/handrail{ dir = 1; @@ -33818,21 +33642,6 @@ icon_state = "plate" }, /area/almayer/command/corporateliason) -"eHq" = ( -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = 16; - pixel_y = -15 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/prop/invuln/pipe_water{ - pixel_x = 17 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "eHx" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/faxmachine/uscm/command, @@ -33991,19 +33800,6 @@ icon_state = "test_floor4" }, /area/almayer/engineering/laundry) -"eMn" = ( -/obj/structure/machinery/light, -/obj/structure/sign/safety/waterhazard{ - pixel_y = -32 - }, -/obj/structure/sign/safety/rewire{ - pixel_x = 14; - pixel_y = -32 - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/south1) "eMP" = ( /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -34231,27 +34027,6 @@ icon_state = "outerhull_dir" }, /area/space) -"eSV" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = -17 - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Delta Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Delta Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = 7 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "eTd" = ( /obj/structure/surface/table/almayer, /obj/item/trash/boonie{ @@ -34384,11 +34159,6 @@ icon_state = "test_floor4" }, /area/almayer/living/briefing) -"eVy" = ( -/obj/structure/surface/table/almayer, -/obj/item/storage/beer_pack, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "eVQ" = ( /obj/structure/machinery/light{ dir = 4 @@ -34452,12 +34222,6 @@ /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, /area/almayer/living/offices) -"eXE" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "eYr" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -34485,12 +34249,6 @@ icon_state = "plate" }, /area/almayer/living/briefing) -"eYv" = ( -/obj/structure/machinery/power/apc/almayer{ - dir = 8 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/living/port_emb) "eYz" = ( /obj/structure/machinery/camera/autoname/almayer/containment/ares{ dir = 1 @@ -34827,19 +34585,6 @@ icon_state = "green" }, /area/almayer/living/grunt_rnr) -"feC" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "feD" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -34879,6 +34624,17 @@ icon_state = "plating" }, /area/almayer/command/airoom) +"ffV" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/crew/alt, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Brig Cells Telephone"; + phone_category = "Almayer"; + phone_id = "Brig Cells"; + pixel_x = 15 + }, +/turf/open/floor/almayer, +/area/almayer/shipboard/brig/processing) "fgh" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -35019,6 +34775,13 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) +"fkO" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "fkW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35064,24 +34827,6 @@ icon_state = "silver" }, /area/almayer/living/briefing) -"fmf" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/almayer/glass{ - access_modified = 1; - dir = 2; - name = "\improper Requisitions Break Room"; - req_one_access_txt = "19;21" - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/squads/req) "fmv" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -35123,6 +34868,21 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/execution) +"fnx" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door/window/eastright{ + access_modified = 1; + dir = 8; + req_access_txt = "19" + }, +/obj/effect/landmark/map_item, +/obj/structure/machinery/door/window/eastleft{ + req_access_txt = "19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "fnA" = ( /obj/structure/surface/rack, /obj/item/tool/crowbar, @@ -35434,8 +35194,8 @@ }, /area/almayer/shipboard/brig/armory) "fsH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/machinery/firealarm{ + pixel_y = 28 }, /turf/open/floor/almayer{ dir = 1; @@ -35457,6 +35217,14 @@ icon_state = "plating" }, /area/almayer/shipboard/brig/armory) +"fsU" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/north1) "fsV" = ( /obj/structure/target, /turf/open/floor/almayer{ @@ -35532,6 +35300,20 @@ }, /turf/open/floor/plating, /area/almayer/shipboard/brig/perma) +"fuY" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice2"; + pixel_x = 16; + pixel_y = 16 + }, +/obj/structure/largecrate/supply/supplies/flares, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "fvd" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -35597,14 +35379,6 @@ icon_state = "plate" }, /area/almayer/living/starboard_garden) -"fwF" = ( -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_s) "fwY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35691,6 +35465,9 @@ }, /turf/open/floor/plating/almayer, /area/almayer/living/briefing) +"fza" = ( +/turf/open/floor/almayer, +/area/almayer/hull/lower_hull/l_m_s) "fzq" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -35767,19 +35544,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_a_s) -"fBx" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/port_hallway) -"fBA" = ( -/obj/item/device/assembly/mousetrap/armed, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "fBD" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -35916,17 +35680,6 @@ icon_state = "test_floor4" }, /area/almayer/command/cichallway) -"fEo" = ( -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - name = "Kitchen"; - req_one_access_txt = "30;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "fEC" = ( /obj/structure/machinery/power/apc/almayer, /turf/open/floor/almayer{ @@ -35969,17 +35722,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/morgue) -"fFz" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "Secretroom"; - indestructible = 1; - unacidable = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/lower_hull/l_m_p) "fFD" = ( /obj/structure/window/reinforced{ dir = 4; @@ -36194,18 +35936,6 @@ }, /turf/open/floor/almayer, /area/almayer/living/pilotbunks) -"fJA" = ( -/obj/structure/coatrack, -/obj/structure/sign/poster/clf{ - pixel_x = -28 - }, -/obj/structure/sign/nosmoking_1{ - pixel_y = 30 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "fJO" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -36555,15 +36285,6 @@ /obj/effect/step_trigger/clone_cleaner, /turf/closed/wall/almayer, /area/almayer/hull/upper_hull/u_m_p) -"fQS" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_p) "fRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -36603,32 +36324,13 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/north1) -"fSF" = ( -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/obj/structure/bedsheetbin{ - pixel_x = 26; - pixel_y = 5 - }, -/obj/item/tool/soap/syndie, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) -"fSG" = ( -/obj/structure/bed/chair{ - dir = 8; - pixel_y = 3 +"fSK" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/almayer, -/area/almayer/living/grunt_rnr) +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "fTi" = ( /obj/structure/largecrate/supply/floodlights, /turf/open/floor/almayer{ @@ -36849,6 +36551,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/req) +"fZq" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer, +/area/almayer/shipboard/brig/cic_hallway) "fZx" = ( /obj/structure/sign/safety/security{ pixel_x = 15; @@ -36872,6 +36582,17 @@ /obj/effect/landmark/late_join/bravo, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/bravo) +"gac" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "gai" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -37396,17 +37117,6 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/lower_medical_medbay) -"gjL" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/computer/crew/alt, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Brig Cells Telephone"; - phone_category = "Almayer"; - phone_id = "Brig Cells"; - pixel_x = 15; - }, -/turf/open/floor/almayer, -/area/almayer/shipboard/brig/processing) "gjN" = ( /obj/effect/landmark/yautja_teleport, /turf/open/floor/almayer{ @@ -37427,6 +37137,12 @@ /obj/structure/largecrate/random/secure, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"gkJ" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "gkK" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/surface/table/reinforced/almayer_B, @@ -37489,6 +37205,20 @@ /obj/structure/bed/chair/office/dark, /turf/open/floor/carpet, /area/almayer/living/commandbunks) +"gmb" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; + dir = 1; + name = "Storage"; + req_one_access_txt = "19;21" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/squads/req) "gmj" = ( /obj/structure/machinery/portable_atmospherics/canister/air, /turf/open/floor/almayer{ @@ -37547,6 +37277,24 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/weapon_room) +"goy" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/airlock/almayer/generic{ + name = "\improper Dorms" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "goD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37583,15 +37331,6 @@ icon_state = "test_floor4" }, /area/almayer/hallways/hangar) -"gpE" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/safety/distribution_pipes{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "gpI" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -37603,6 +37342,16 @@ "gpY" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/lifeboat_pumps/north1) +"gqq" = ( +/obj/structure/machinery/camera/autoname/almayer{ + dir = 8; + name = "ship-grade camera" + }, +/obj/structure/largecrate/random, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_s) "gqK" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -37656,6 +37405,31 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_p) +"gsg" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/structure/machinery/door_control{ + id = "Alpha_1"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "gsm" = ( /obj/structure/machinery/status_display{ pixel_x = -32 @@ -37693,15 +37467,6 @@ }, /turf/open/floor/wood/ship, /area/almayer/living/basketball) -"gte" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "gtp" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /obj/structure/disposalpipe/junction{ @@ -37731,8 +37496,7 @@ dir = 1 }, /turf/open/floor/almayer{ - dir = 8; - icon_state = "greencorner" + icon_state = "green" }, /area/almayer/hallways/port_hallway) "guC" = ( @@ -37745,21 +37509,6 @@ }, /turf/open/floor/carpet, /area/almayer/command/corporateliason) -"guG" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/obj/item/tool/soap, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "guS" = ( /obj/structure/reagent_dispensers/fueltank/custom, /turf/open/floor/almayer{ @@ -37880,7 +37629,7 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_s) -"gwO" = ( +"gwM" = ( /obj/structure/pipes/vents/pump, /obj/structure/mirror{ pixel_y = 32 @@ -37900,7 +37649,12 @@ pixel_x = 23; specialfunctions = 4 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "gwR" = ( /obj/item/device/flashlight/lamp/green, @@ -38206,6 +37960,14 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"gBW" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/south1) "gCd" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -38403,27 +38165,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) -"gHl" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = 16 - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Alpha Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Alpha Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = -8 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "gHo" = ( /obj/structure/machinery/door/airlock/almayer/marine/delta/tl, /turf/open/floor/almayer{ @@ -38519,6 +38260,13 @@ icon_state = "redfull" }, /area/almayer/shipboard/port_missiles) +"gKH" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/item/trash/uscm_mre, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "gKJ" = ( /obj/structure/machinery/vending/cola{ density = 0; @@ -38567,12 +38315,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/medical/hydroponics) -"gLu" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "gLz" = ( /obj/structure/machinery/cryopod{ layer = 3.1; @@ -38701,6 +38443,15 @@ icon_state = "cargo" }, /area/almayer/engineering/engine_core) +"gNi" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "gNp" = ( /turf/open/floor/almayer{ dir = 9; @@ -39176,6 +38927,16 @@ /obj/structure/bed/sofa/vert/grey/bot, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) +"gZG" = ( +/obj/structure/largecrate/supply/supplies/mre, +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "gZK" = ( /turf/open/floor/almayer, /area/almayer/living/auxiliary_officer_office) @@ -39266,11 +39027,6 @@ icon_state = "silver" }, /area/almayer/living/auxiliary_officer_office) -"hbx" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "hbI" = ( /obj/item/ammo_magazine/shotgun/buckshot, /obj/item/ammo_magazine/shotgun/buckshot, @@ -39425,6 +39181,15 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"heb" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "hec" = ( /turf/open/floor/almayer{ dir = 8; @@ -39449,6 +39214,15 @@ icon_state = "test_floor4" }, /area/almayer/lifeboat_pumps/north1) +"heK" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 1; + name = "\improper Tool Closet" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "heQ" = ( /obj/structure/bed/chair, /obj/structure/extinguisher_cabinet{ @@ -39522,6 +39296,10 @@ icon_state = "red" }, /area/almayer/command/lifeboat) +"hfy" = ( +/obj/structure/machinery/light, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "hfO" = ( /obj/structure/surface/table/almayer, /obj/item/reagent_container/spray/cleaner, @@ -39715,6 +39493,17 @@ icon_state = "red" }, /area/almayer/shipboard/port_missiles) +"hjB" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; + name = "Kitchen"; + req_one_access_txt = "30;19" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "hki" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer{ @@ -39894,7 +39683,6 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/generic2{ access_modified = 1; name = "\improper Flight Crew Quarters"; - req_access_txt = null; req_one_access_txt = "19;22" }, /turf/open/floor/almayer{ @@ -40122,6 +39910,21 @@ icon_state = "silver" }, /area/almayer/command/computerlab) +"huU" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "huX" = ( /obj/structure/largecrate/random/barrel/yellow, /obj/structure/machinery/light{ @@ -40405,17 +40208,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"hzP" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/power/apc/almayer{ - dir = 1 - }, -/obj/structure/machinery/recharger, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "hzV" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -40560,6 +40352,13 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"hDL" = ( +/obj/structure/sign/safety/distribution_pipes{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "hDR" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/storage/syringe_case{ @@ -40860,6 +40659,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"hLS" = ( +/obj/structure/machinery/door/airlock/almayer/marine/delta{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "hMi" = ( /obj/structure/pipes/vents/scrubber, /turf/open/floor/almayer, @@ -40910,21 +40721,6 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/main_office) -"hNL" = ( -/obj/structure/machinery/firealarm{ - pixel_y = 28 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "hNM" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/stack/sheet/metal{ @@ -41079,22 +40875,6 @@ icon_state = "plate" }, /area/almayer/squads/alpha) -"hRg" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = -16; - pixel_y = -15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "hRi" = ( /obj/structure/pipes/vents/scrubber{ dir = 1 @@ -41438,6 +41218,24 @@ }, /turf/open/floor/almayer, /area/almayer/squads/alpha_bravo_shared) +"hXm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer, +/area/almayer/shipboard/brig/cic_hallway) +"hXS" = ( +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = -32 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_p) "hXV" = ( /obj/structure/machinery/light{ dir = 1 @@ -42074,6 +41872,15 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"inh" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/shipboard/brig/cic_hallway) "ins" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -42271,16 +42078,6 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south2) -"irI" = ( -/obj/structure/sign/safety/maint{ - pixel_y = 32 - }, -/obj/structure/sign/safety/storage{ - pixel_x = 15; - pixel_y = 32 - }, -/turf/open/floor/almayer, -/area/almayer/hallways/starboard_hallway) "irJ" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -42551,6 +42348,17 @@ icon_state = "dark_sterile" }, /area/almayer/engineering/laundry) +"iwI" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; + name = "Storage"; + req_one_access_txt = "19;21" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/squads/req) "iwJ" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out"; @@ -42685,6 +42493,17 @@ icon_state = "plate" }, /area/almayer/living/offices) +"izr" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/sign/poster/propaganda{ + pixel_x = -27 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "izx" = ( /obj/structure/reagent_dispensers/water_cooler/stacks{ density = 0; @@ -42817,6 +42636,14 @@ icon_state = "test_floor4" }, /area/almayer/command/cichallway) +"iCz" = ( +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_s) "iCF" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -42841,6 +42668,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_s) +"iDN" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "iDT" = ( /obj/structure/surface/table/almayer, /obj/item/reagent_container/spray/cleaner{ @@ -42957,13 +42794,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_four) -"iGE" = ( -/obj/structure/janitorialcart, -/obj/item/tool/mop, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "iGK" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -43008,17 +42838,6 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/cells) -"iHO" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/item/storage/fancy/crayons{ - layer = 3.1; - pixel_x = -11; - pixel_y = 16 - }, -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "iIl" = ( /obj/structure/sink{ dir = 8; @@ -43084,20 +42903,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"iKa" = ( -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "iKb" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer{ @@ -43225,15 +43030,6 @@ icon_state = "silver" }, /area/almayer/command/computerlab) -"iLQ" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "orangecorner" - }, -/area/almayer/hallways/starboard_hallway) "iMm" = ( /turf/open/floor/almayer, /area/almayer/living/grunt_rnr) @@ -43389,22 +43185,6 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) -"iQL" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 2; - req_one_access = list(2,34,30) - }, -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = 16; - pixel_y = -16 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "iRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -43444,6 +43224,52 @@ /obj/item/trash/chips, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"iSm" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + desc = "Do you remember who you are?"; + icon_state = "mirror_broke"; + name = "broken mirror"; + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/item/device/cassette_tape/nam{ + layer = 2.9; + pixel_x = -6; + pixel_y = 11 + }, +/obj/structure/machinery/door_control{ + id = "Delta_2"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/obj/item/prop{ + desc = "A handful of rounds to reload on the go."; + icon = 'icons/obj/items/weapons/guns/handful.dmi'; + icon_state = "bullet_2"; + name = "handful of pistol bullets (9mm)"; + pixel_x = -8; + pixel_y = 29 + }, +/obj/item/prop{ + desc = "A bunch of tiny bits of shattered metal."; + icon = 'icons/obj/items/shards.dmi'; + icon_state = "shrapnelsmall"; + name = "piece of shrapnel"; + pixel_x = -1; + pixel_y = 24 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "iSZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43518,6 +43344,18 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"iUk" = ( +/obj/structure/machinery/door/airlock/almayer/marine/charlie{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "iUo" = ( /obj/structure/sign/safety/terminal{ pixel_x = 7; @@ -43587,15 +43425,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) -"iVY" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/shipboard/brig/cic_hallway) "iVZ" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/folder/black, @@ -43639,6 +43468,15 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/hangar) +"iWE" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/pipes/vents/pump{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "iWL" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -43965,12 +43803,6 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/shipboard/brig/processing) -"jcl" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "jcK" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -44028,6 +43860,13 @@ icon_state = "dark_sterile" }, /area/almayer/medical/operating_room_three) +"jdQ" = ( +/obj/structure/machinery/shower{ + pixel_y = 16 + }, +/obj/item/tool/soap, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "jea" = ( /obj/structure/sign/safety/autoopenclose{ pixel_y = 32 @@ -44328,16 +44167,6 @@ icon_state = "silver" }, /area/almayer/hull/upper_hull/u_m_p) -"jip" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - access_modified = 1; - name = "\improper Main Kitchen"; - req_one_access_txt = "30;19" - }, -/turf/open/floor/prison{ - icon_state = "kitchen" - }, -/area/almayer/living/grunt_rnr) "jiw" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -44346,6 +44175,25 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) +"jiU" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "jiX" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -44376,14 +44224,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/vehiclehangar) -"jjK" = ( -/obj/structure/surface/table/almayer, -/obj/item/paper_bin/uscm, -/obj/item/tool/pen, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "jjM" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -44494,6 +44334,25 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/perma) +"jlj" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + pixel_x = -8 + }, +/obj/item/toy/farwadoll{ + desc = "A USCM approved plush doll. It's not soft and hardly comforting!"; + force = 15; + icon_state = "therapyred"; + layer = 4.1; + name = "Sergeant Huggs"; + pixel_x = 7; + pixel_y = -1; + throwforce = 15 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "jlA" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -44940,6 +44799,19 @@ "jvY" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/command/telecomms) +"jwD" = ( +/obj/structure/prop/almayer/computers/sensor_computer2, +/obj/structure/machinery/door_control{ + id = "Secretroom"; + indestructible = 1; + layer = 2.5; + name = "Shutters"; + use_power = 0 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "jwK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -45308,17 +45180,26 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) "jJe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_y = 25 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "green" }, /area/almayer/hallways/port_hallway) +"jJk" = ( +/obj/structure/machinery/power/apc/almayer{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "blue" + }, +/area/almayer/living/port_emb) "jJq" = ( /obj/structure/surface/rack, /obj/item/storage/firstaid/regular, @@ -45421,6 +45302,15 @@ icon_state = "kitchen" }, /area/almayer/living/captain_mess) +"jLv" = ( +/obj/structure/machinery/firealarm{ + dir = 1; + pixel_y = -28 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "jLK" = ( /obj/structure/machinery/light{ dir = 4 @@ -45668,22 +45558,6 @@ dir = 8 }, /area/almayer/medical/containment/cell) -"jQA" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) -"jRn" = ( -/obj/structure/machinery/light/small, -/obj/structure/largecrate/supply/supplies/mre, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "jRz" = ( /obj/effect/step_trigger/teleporter/random{ affect_ghosts = 1; @@ -45750,6 +45624,15 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) +"jSy" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/bed/chair{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/grunt_rnr) "jSU" = ( /obj/structure/bed/chair{ can_buckle = 0; @@ -45845,6 +45728,15 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engineering_workshop/hangar) +"jUo" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "jUs" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -46139,9 +46031,25 @@ icon_state = "test_floor4" }, /area/almayer/hallways/aft_hallway) +"kam" = ( +/obj/item/tool/screwdriver{ + layer = 2.9; + pixel_x = -21; + pixel_y = -14 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "kan" = ( /turf/closed/wall/almayer/white, /area/almayer/medical/lower_medical_medbay) +"kat" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/hull/lower_hull/l_m_s) "kaA" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -46327,16 +46235,6 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) -"keO" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "keR" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -46348,15 +46246,6 @@ icon_state = "red" }, /area/almayer/hallways/stern_hallway) -"kfp" = ( -/obj/structure/sign/safety/distribution_pipes{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "kfv" = ( /obj/structure/surface/table/almayer, /obj/item/stack/nanopaste{ @@ -46504,6 +46393,18 @@ icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"kio" = ( +/obj/structure/machinery/firealarm{ + pixel_y = 28 + }, +/obj/structure/closet, +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "kiF" = ( /obj/effect/decal/cleanable/blood/oil, /obj/effect/decal/warning_stripes{ @@ -46774,6 +46675,14 @@ icon_state = "plate" }, /area/almayer/hallways/aft_hallway) +"kpo" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/south2) "kpQ" = ( /obj/structure/machinery/door_control{ id = "engidorm"; @@ -47082,12 +46991,6 @@ icon_state = "tcomms" }, /area/almayer/engineering/engine_core) -"kvN" = ( -/turf/open/floor/almayer{ - dir = 10; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) "kvU" = ( /obj/structure/surface/table/almayer, /turf/open/floor/plating/plating_catwalk, @@ -47145,6 +47048,19 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) +"kxd" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "kxo" = ( /obj/structure/machinery/washing_machine, /obj/structure/machinery/washing_machine{ @@ -47632,18 +47548,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) -"kHA" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/safety/high_voltage{ - pixel_x = 32; - pixel_y = -8 - }, -/obj/structure/sign/safety/hazard{ - pixel_x = 32; - pixel_y = 7 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "kHK" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47789,6 +47693,13 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"kKL" = ( +/obj/structure/stairs/perspective{ + dir = 4; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "kKR" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -47823,6 +47734,20 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"kLp" = ( +/obj/structure/sign/safety/stairs{ + pixel_x = -17; + pixel_y = 7 + }, +/obj/structure/sign/safety/escapepod{ + pixel_x = -17; + pixel_y = -8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/hallways/starboard_hallway) "kLP" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47867,14 +47792,6 @@ icon_state = "outerhull_dir" }, /area/almayer/engineering/upper_engineering/port) -"kMU" = ( -/obj/structure/sign/safety/maint{ - pixel_x = -17 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/port_hallway) "kNi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47913,6 +47830,16 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) +"kNC" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 2; + icon_state = "pipe-j2" + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "kNO" = ( /obj/structure/desertdam/decals/road_edge{ icon_state = "road_edge_decal3"; @@ -47926,12 +47853,6 @@ }, /turf/open/floor/wood/ship, /area/almayer/living/basketball) -"kNQ" = ( -/turf/open/floor/almayer{ - dir = 1; - icon_state = "orangecorner" - }, -/area/almayer/hallways/starboard_hallway) "kNY" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -48001,12 +47922,6 @@ icon_state = "test_floor4" }, /area/almayer/hallways/aft_hallway) -"kOH" = ( -/turf/open/floor/almayer{ - dir = 5; - icon_state = "blue" - }, -/area/almayer/living/port_emb) "kPo" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -48099,6 +48014,17 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_f_p) +"kQU" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "kRd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48176,6 +48102,18 @@ icon_state = "red" }, /area/almayer/hallways/aft_hallway) +"kSU" = ( +/obj/structure/transmitter/no_dnd{ + name = "Requisition Telephone"; + phone_category = "Almayer"; + phone_id = "Requisition"; + pixel_y = 30 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/almayer/squads/req) "kTc" = ( /obj/structure/closet/secure_closet/guncabinet/red, /obj/item/ammo_magazine/shotgun, @@ -48213,6 +48151,16 @@ icon_state = "tcomms" }, /area/almayer/command/telecomms) +"kTx" = ( +/obj/structure/stairs/perspective{ + dir = 1; + icon_state = "p_stair_full" + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "kTM" = ( /obj/item/frame/rack{ layer = 3.1; @@ -48249,7 +48197,6 @@ access_modified = 1; dir = 1; name = "\improper Flight Crew Quarters"; - req_access_txt = null; req_one_access_txt = "19;22" }, /turf/open/floor/almayer{ @@ -48433,6 +48380,12 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_f_s) +"kYv" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "kYP" = ( /obj/structure/sign/safety/maint{ pixel_x = 32 @@ -48532,12 +48485,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cic_hallway) -"laP" = ( -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "laQ" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -48645,6 +48592,11 @@ }, /turf/open/floor/wood/ship, /area/almayer/shipboard/brig/chief_mp_office) +"ldj" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/platform, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "ldl" = ( /obj/structure/sign/safety/maint{ pixel_x = 32 @@ -48827,6 +48779,21 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/starboard) +"lhu" = ( +/obj/structure/coatrack, +/obj/structure/sign/poster/clf{ + pixel_x = -28 + }, +/obj/structure/sign/nosmoking_1{ + pixel_y = 30 + }, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "lhv" = ( /obj/structure/machinery/door_control{ id = "CMO Shutters"; @@ -49062,23 +49029,6 @@ "lmK" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/command/securestorage) -"lmW" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/machinery/door_control{ - id = "Alpha_2"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "lne" = ( /obj/structure/bed/chair, /turf/open/floor/almayer{ @@ -49301,14 +49251,6 @@ icon_state = "orange" }, /area/almayer/living/port_emb) -"lqZ" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/south1) "lra" = ( /obj/structure/machinery/door/airlock/almayer/engineering{ name = "\improper Disposals" @@ -49341,15 +49283,6 @@ icon_state = "plate" }, /area/almayer/engineering/engineering_workshop) -"lru" = ( -/obj/structure/machinery/firealarm{ - pixel_y = 28 - }, -/obj/structure/closet, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "lrF" = ( /obj/structure/machinery/light, /obj/structure/surface/table/almayer, @@ -49628,47 +49561,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/aft_hallway) -"lwA" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - desc = "Do you remember who you are?"; - icon_state = "mirror_broke"; - name = "broken mirror"; - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/item/device/cassette_tape/nam{ - layer = 2.9; - pixel_x = -6; - pixel_y = 11 - }, -/obj/structure/machinery/door_control{ - id = "Delta_2"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/obj/item/prop{ - desc = "A handful of rounds to reload on the go."; - icon = 'icons/obj/items/weapons/guns/handful.dmi'; - icon_state = "bullet_2"; - name = "handful of pistol bullets (9mm)"; - pixel_x = -8; - pixel_y = 29 - }, -/obj/item/prop{ - desc = "A bunch of tiny bits of shattered metal."; - icon = 'icons/obj/items/shards.dmi'; - icon_state = "shrapnelsmall"; - name = "piece of shrapnel"; - pixel_x = -1; - pixel_y = 24 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "lwC" = ( /obj/structure/desertdam/decals/road_edge{ icon_state = "road_edge_decal3"; @@ -49774,6 +49666,14 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"lzn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "lzq" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -49904,6 +49804,13 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) +"lBz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "lBF" = ( /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, @@ -50061,21 +49968,6 @@ }, /turf/open/floor/almayer, /area/almayer/living/chapel) -"lEL" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/prop/ice_colony/tiger_rug{ - desc = "A beat up beer stained, incredibly garish, polyester tiger rug. No one knows how it got here. Written on the wash tag are the words 'From Thedus, with love <3', in Sharpie."; - icon_state = "HotlineAlt"; - layer = 2.9; - name = "Richard the tiger" - }, -/turf/open/floor/almayer{ - dir = 9; - icon_state = "emerald" - }, -/area/almayer/living/port_emb) "lEO" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -50231,13 +50123,6 @@ /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_s) -"lGO" = ( -/obj/structure/largecrate/random/case/double, -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "lHc" = ( /obj/effect/landmark/start/doctor, /obj/structure/sign/safety/maint{ @@ -50251,6 +50136,20 @@ icon_state = "greencorner" }, /area/almayer/living/grunt_rnr) +"lHG" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; + dir = 1; + req_one_access = null; + req_one_access_txt = "30;19" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "lIa" = ( /obj/item/robot_parts/arm/l_arm, /obj/item/robot_parts/leg/l_leg, @@ -50730,21 +50629,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_p) -"lSO" = ( -/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ - pixel_y = 25 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "lTt" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -50786,6 +50670,27 @@ icon_state = "redfull" }, /area/almayer/living/briefing) +"lVX" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = 16 + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Alpha Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Alpha Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = -8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "lWh" = ( /obj/structure/machinery/pipedispenser/orderable, /turf/open/floor/almayer{ @@ -51553,29 +51458,10 @@ icon_state = "silver" }, /area/almayer/living/briefing) -"moU" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "plating_striped" - }, -/area/almayer/squads/req) "moY" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/almayer, /area/almayer/squads/req) -"mqc" = ( -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "mqg" = ( /obj/structure/bed/chair{ dir = 4 @@ -51638,6 +51524,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"mrB" = ( +/obj/structure/machinery/camera/autoname/almayer{ + dir = 8; + name = "ship-grade camera" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_p) "mrD" = ( /obj/structure/machinery/light{ dir = 1 @@ -51662,6 +51557,19 @@ icon_state = "green" }, /area/almayer/squads/req) +"msg" = ( +/obj/structure/machinery/light, +/obj/structure/sign/safety/waterhazard{ + pixel_y = -32 + }, +/obj/structure/sign/safety/rewire{ + pixel_x = 14; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/south1) "msi" = ( /obj/structure/filingcabinet/filingcabinet{ density = 0; @@ -51768,12 +51676,6 @@ icon_state = "silver" }, /area/almayer/command/cichallway) -"mtS" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "mtX" = ( /obj/structure/closet/secure_closet/guncabinet/red, /obj/item/ammo_magazine/rifle/m41aMK1/ap, @@ -52172,6 +52074,22 @@ icon_state = "emerald" }, /area/almayer/living/briefing) +"mEb" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door_control{ + id = "laddersoutheast"; + name = "South East Ladders Shutters"; + pixel_y = 25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "mEE" = ( /obj/structure/platform{ dir = 4; @@ -52196,32 +52114,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) -"mFD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 5 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) -"mFM" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = -25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/obj/item/device/radio/intercom{ - freerange = 1; - name = "General Listening Channel"; - pixel_y = 28 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/port_hallway) "mFN" = ( /obj/effect/step_trigger/ares_alert/mainframe, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -52409,6 +52301,12 @@ icon_state = "silver" }, /area/almayer/command/cichallway) +"mJi" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/grunt_rnr) "mJj" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -52419,6 +52317,13 @@ "mJu" = ( /turf/open/floor/almayer/uscm/directional, /area/almayer/command/cic) +"mJx" = ( +/obj/structure/prop/server_equipment/broken, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "mJL" = ( /turf/open/floor/almayer{ dir = 5; @@ -52548,6 +52453,20 @@ /obj/structure/pipes/standard/manifold/fourway/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"mLb" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/item/toy/deck/uno{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/item/toy/deck{ + pixel_x = -6; + pixel_y = -2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "mLu" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -52611,14 +52530,6 @@ icon_state = "orange" }, /area/almayer/hallways/stern_hallway) -"mMu" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/south2) "mMP" = ( /obj/effect/landmark/start/intel, /turf/open/floor/plating/plating_catwalk, @@ -52804,17 +52715,6 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) -"mRc" = ( -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = -16; - pixel_y = -16 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "mRl" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 8; @@ -52853,6 +52753,16 @@ icon_state = "test_floor4" }, /area/almayer/command/airoom) +"mRS" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "mRW" = ( /turf/open/floor/almayer/research/containment/corner1, /area/almayer/medical/containment/cell/cl) @@ -52931,15 +52841,6 @@ icon_state = "cargo" }, /area/almayer/living/offices) -"mTk" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "mTm" = ( /turf/open/floor/almayer{ dir = 4; @@ -53061,6 +52962,15 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"mVZ" = ( +/obj/structure/sign/poster{ + desc = "It says DRUG."; + icon_state = "poster2"; + pixel_x = -27 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "mWe" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 8; @@ -53186,18 +53096,6 @@ icon_state = "plating" }, /area/almayer/hallways/vehiclehangar) -"mYZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "mZb" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -53600,6 +53498,22 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) +"nik" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "nim" = ( /obj/structure/machinery/door/airlock/almayer/engineering{ access_modified = 1; @@ -53820,6 +53734,11 @@ icon_state = "silver" }, /area/almayer/command/securestorage) +"nna" = ( +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "nnc" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -53885,16 +53804,6 @@ /obj/structure/largecrate/random/barrel/white, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) -"nob" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "noj" = ( /obj/structure/largecrate, /obj/structure/prop/server_equipment/laptop{ @@ -53957,6 +53866,22 @@ icon_state = "dark_sterile" }, /area/almayer/medical/containment) +"npB" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "nqx" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -54401,6 +54326,16 @@ "nyQ" = ( /turf/open/floor/almayer, /area/almayer/squads/charlie_delta_shared) +"nza" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/obj/item/trash/uscm_mre, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "nzv" = ( /obj/structure/filingcabinet/filingcabinet, /obj/item/clipboard, @@ -54466,12 +54401,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) -"nBl" = ( -/obj/structure/machinery/power/apc/almayer{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "nBo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54693,18 +54622,6 @@ icon_state = "plate" }, /area/almayer/shipboard/starboard_point_defense) -"nFy" = ( -/obj/structure/machinery/firealarm{ - dir = 1; - pixel_y = -28 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "nFI" = ( /obj/structure/surface/table/almayer, /obj/structure/disposalpipe/segment{ @@ -54734,6 +54651,16 @@ }, /turf/open/floor/almayer, /area/almayer/squads/alpha_bravo_shared) +"nFV" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "nFX" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 2; @@ -54865,6 +54792,17 @@ }, /turf/open/floor/almayer, /area/almayer/living/basketball) +"nIW" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "nJo" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -54974,6 +54912,21 @@ /obj/structure/machinery/cm_vending/sorted/marine_food, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"nLZ" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door_control{ + id = "laddernortheast"; + name = "North East Ladders Shutters"; + pixel_y = -25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "nMc" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 @@ -55066,23 +55019,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) -"nNT" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/machinery/door_control{ - id = "Alpha_1"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "nNV" = ( /obj/structure/bed/chair{ dir = 8; @@ -55207,6 +55143,12 @@ icon_state = "plate" }, /area/almayer/squads/req) +"nQg" = ( +/obj/structure/sink{ + pixel_y = 24 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "nQv" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -55264,6 +55206,12 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/main_office) +"nSN" = ( +/obj/structure/largecrate/supply/supplies/mre, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "nSS" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -55405,17 +55353,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"nVU" = ( -/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ - pixel_y = -30 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "nVX" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ id_tag = "Boat2-D1"; @@ -55745,16 +55682,6 @@ icon_state = "dark_sterile" }, /area/almayer/engineering/laundry) -"odM" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/shipboard/brig/cic_hallway) "odN" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -56003,6 +55930,22 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) +"ojR" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/machinery/door_control{ + id = "laddersoutheast"; + name = "South East Ladders Shutters"; + pixel_y = 25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "ojZ" = ( /obj/structure/window/framed/almayer/white, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -56053,6 +55996,17 @@ icon_state = "plating" }, /area/almayer/engineering/engine_core) +"okB" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "okD" = ( /obj/structure/prop/almayer/name_stencil{ icon_state = "almayer6" @@ -56192,6 +56146,13 @@ icon_state = "orange" }, /area/almayer/hallways/hangar) +"omW" = ( +/obj/structure/pipes/standard/manifold/fourway/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "onN" = ( /obj/structure/surface/table/almayer, /obj/structure/disposalpipe/segment{ @@ -56382,6 +56343,9 @@ id = "req_belt" }, /obj/structure/plasticflaps, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, /turf/open/floor/almayer, /area/almayer/squads/req) "oqZ" = ( @@ -56683,12 +56647,6 @@ icon_state = "test_floor4" }, /area/almayer/hallways/starboard_hallway) -"owN" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "owW" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -56943,20 +56901,24 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) -"oDu" = ( -/obj/structure/sign/safety/distribution_pipes{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "oDv" = ( /turf/open/floor/almayer{ dir = 9; icon_state = "red" }, /area/almayer/living/gym) +"oDx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; + dir = 1; + req_one_access = null; + req_one_access_txt = "30;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "oDE" = ( /obj/structure/surface/rack, /obj/item/reagent_container/spray/cleaner{ @@ -57051,6 +57013,15 @@ icon_state = "bluefull" }, /area/almayer/command/cichallway) +"oES" = ( +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_f_p) "oEX" = ( /obj/structure/pipes/vents/scrubber{ dir = 4 @@ -57162,13 +57133,6 @@ icon_state = "orange" }, /area/almayer/shipboard/brig/perma) -"oIm" = ( -/obj/structure/prop/server_equipment/broken, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "orange" - }, -/area/almayer/engineering/upper_engineering/starboard) "oIn" = ( /obj/structure/bed/chair{ dir = 8; @@ -57267,18 +57231,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_p) -"oLg" = ( -/obj/structure/machinery/conveyor{ - id = "req_belt" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/squads/req) "oLi" = ( /obj/effect/landmark/start/marine/medic/bravo, /obj/effect/landmark/late_join/bravo, @@ -57520,6 +57472,21 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"oQj" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/machinery/door_control{ + id = "laddernortheast"; + name = "North East Ladders Shutters"; + pixel_y = -25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "oQo" = ( /obj/item/stool, /obj/effect/landmark/yautja_teleport, @@ -57782,17 +57749,6 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/cryo) -"oWX" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - access_modified = 1; - dir = 1; - name = "\improper Kitchen Hydroponics"; - req_one_access_txt = "30;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "oXb" = ( /obj/effect/landmark/start/marine/charlie, /obj/effect/landmark/late_join/charlie, @@ -57978,6 +57934,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_p) +"pcj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "silvercorner" + }, +/area/almayer/shipboard/brig/cic_hallway) "pcl" = ( /turf/open/floor/almayer{ icon_state = "cargo" @@ -58115,6 +58081,18 @@ icon_state = "test_floor4" }, /area/almayer/engineering/upper_engineering/starboard) +"pfe" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + pixel_x = 5 + }, +/obj/item/facepaint/black{ + pixel_x = -10 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "pfh" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -58163,6 +58141,13 @@ icon_state = "test_floor4" }, /area/almayer/command/airoom) +"pgt" = ( +/obj/structure/machinery/cm_vending/sorted/tech/comp_storage, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "pgD" = ( /turf/closed/wall/almayer, /area/almayer/lifeboat_pumps/south1) @@ -58354,6 +58339,18 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/delta) +"pmv" = ( +/obj/structure/machinery/door/airlock/almayer/marine/alpha{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "pmH" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 @@ -58818,14 +58815,6 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) -"pyB" = ( -/obj/structure/sign/safety/maint{ - pixel_x = -17 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "pyC" = ( /obj/structure/largecrate/random/barrel/red, /obj/structure/machinery/light{ @@ -58864,16 +58853,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) -"pzi" = ( -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "pzG" = ( /obj/docking_port/stationary/emergency_response/port1, /turf/open/floor/almayer{ @@ -59268,21 +59247,6 @@ }, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) -"pIX" = ( -/obj/structure/pipes/standard/manifold/hidden/supply, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) -"pJb" = ( -/obj/structure/bed/chair{ - dir = 8 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "pJi" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -59290,6 +59254,25 @@ icon_state = "red" }, /area/almayer/shipboard/brig/general_equipment) +"pJD" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/item/tool/soap, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "pJE" = ( /obj/structure/closet/secure_closet{ name = "\improper Execution Firearms" @@ -59355,13 +59338,6 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_medbay) -"pLv" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "orange" - }, -/area/almayer/engineering/upper_engineering/starboard) "pLO" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -59567,6 +59543,25 @@ icon_state = "red" }, /area/almayer/shipboard/port_missiles) +"pPV" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/structure/machinery/door_control{ + id = "Alpha_2"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "pQq" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -59670,6 +59665,23 @@ icon_state = "silvercorner" }, /area/almayer/shipboard/brig/cic_hallway) +"pRT" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8; + name = "\improper Tool Closet" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "pRX" = ( /obj/structure/machinery/portable_atmospherics/hydroponics, /turf/open/floor/almayer{ @@ -60215,21 +60227,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) -"qcq" = ( -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/sign/safety/waterhazard{ - pixel_y = 32 - }, -/obj/structure/sign/safety/rewire{ - pixel_x = 14; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/north1) "qcy" = ( /obj/structure/sign/safety/bathunisex{ pixel_x = 8; @@ -60257,6 +60254,38 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"qdv" = ( +/obj/item/bedsheet/purple{ + layer = 3.2 + }, +/obj/item/bedsheet/purple{ + pixel_y = 13 + }, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = -2; + pixel_y = 4 + }, +/obj/structure/window/reinforced{ + dir = 8; + layer = 3.3; + pixel_y = 4 + }, +/obj/structure/bed{ + can_buckle = 0 + }, +/obj/structure/bed{ + buckling_y = 13; + layer = 3.5; + pixel_y = 13 + }, +/obj/item/clothing/head/beret/royal_marine, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "emerald" + }, +/area/almayer/living/port_emb) "qdz" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -60294,6 +60323,21 @@ icon_state = "test_floor4" }, /area/almayer/engineering/laundry) +"qep" = ( +/obj/structure/machinery/door/airlock/almayer/medical/glass{ + access_modified = 1; + dir = 2; + name = "\improper Field Surgery Equipment"; + req_access_txt = "20"; + req_one_access = null + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/medical/lower_medical_medbay) "qer" = ( /obj/structure/machinery/cryopod/right{ pixel_y = 6 @@ -60397,6 +60441,12 @@ icon_state = "test_floor4" }, /area/almayer/living/starboard_garden) +"qgw" = ( +/obj/structure/stairs/perspective{ + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "qgG" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -60500,10 +60550,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull) -"qif" = ( -/obj/structure/sign/dartboard, -/turf/closed/wall/almayer, -/area/almayer/hallways/hangar) "qih" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1; @@ -60523,6 +60569,13 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) +"qin" = ( +/obj/structure/sign/poster/safety{ + pixel_x = 27 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "qit" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/light{ @@ -60575,6 +60628,15 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"qkb" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_p) "qki" = ( /obj/effect/landmark/start/marine/smartgunner/charlie, /obj/effect/landmark/late_join/charlie, @@ -60587,6 +60649,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_s) +"qkP" = ( +/obj/item/frame/light_fixture{ + anchored = 1; + desc = "A broken fluorescent tube light."; + dir = 8; + icon_state = "tube-broken"; + name = "broken light fixture" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "qld" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -60708,6 +60790,12 @@ icon_state = "red" }, /area/almayer/shipboard/brig/perma) +"qmL" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "qmP" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/faxmachine/uscm, @@ -60823,13 +60911,6 @@ icon_state = "orange" }, /area/almayer/squads/bravo) -"qoX" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "qoY" = ( /obj/structure/machinery/vending/hydroseeds, /turf/open/floor/almayer{ @@ -60983,6 +61064,15 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/engineering/ce_room) +"qtn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/port_hallway) "qtv" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -61265,13 +61355,6 @@ icon_state = "plating" }, /area/almayer/hallways/vehiclehangar) -"qyK" = ( -/obj/structure/surface/table/almayer, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "qyW" = ( /obj/structure/bed/chair{ dir = 4 @@ -61336,6 +61419,17 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"qBM" = ( +/obj/item/storage/fancy/crayons{ + layer = 3.1; + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "green" + }, +/area/almayer/living/grunt_rnr) "qCc" = ( /obj/structure/sign/safety/security{ pixel_x = 15; @@ -62721,6 +62815,26 @@ icon_state = "plate" }, /area/almayer/shipboard/port_point_defense) +"rfT" = ( +/obj/item/frame/camera{ + desc = "The Staff Officer insisted he needed to monitor everyone at all times."; + layer = 2.9; + name = "broken camera"; + pixel_x = -7; + pixel_y = -6 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "rgy" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -62789,6 +62903,17 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) +"ril" = ( +/obj/structure/prop/invuln/lattice_prop{ + dir = 1; + icon_state = "lattice-simple"; + pixel_x = -16; + pixel_y = 17 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "riA" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -62870,6 +62995,44 @@ icon_state = "plate" }, /area/almayer/command/corporateliason) +"rjV" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/cameras/wooden_tv/prop{ + dir = 8; + layer = 3.2; + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = 27; + serial_number = 11 + }, +/obj/item/trash/pistachios{ + layer = 2; + pixel_x = 6; + pixel_y = -6 + }, +/obj/structure/machinery/recharger{ + layer = 3.1; + pixel_y = 22 + }, +/obj/item/ammo_magazine/rifle/incendiary{ + current_rounds = 0; + desc = "A 10mm assault rifle magazine with ':D' drawn on the side"; + pixel_x = 10; + pixel_y = 2 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "blue" + }, +/area/almayer/living/port_emb) "rka" = ( /obj/structure/surface/table/almayer, /obj/item/paper_bin/uscm, @@ -62971,15 +63134,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) -"rlG" = ( -/obj/structure/machinery/status_display{ - pixel_y = 30 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "rlQ" = ( /turf/open/floor/almayer{ dir = 1; @@ -63275,14 +63429,6 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) -"rsj" = ( -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice2"; - pixel_x = 16; - pixel_y = 16 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "rsx" = ( /obj/structure/largecrate/random/barrel/red, /obj/structure/sign/safety/high_voltage{ @@ -63509,9 +63655,7 @@ }, /area/almayer/lifeboat_pumps/north1) "ryR" = ( -/obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep{ - req_access = list(1) - }, +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -63541,19 +63685,24 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/main_office) -"rzM" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer, -/area/almayer/shipboard/brig/cic_hallway) "rzN" = ( /turf/open/floor/almayer{ icon_state = "dark_sterile" }, /area/almayer/medical/containment) +"rzP" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/obj/structure/machinery/door/airlock/almayer/maint, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hull/upper_hull/u_a_s) "rAb" = ( /turf/open/floor/almayer{ icon_state = "bluecorner" @@ -63944,6 +64093,15 @@ icon_state = "orange" }, /area/almayer/hallways/stern_hallway) +"rGg" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "rGj" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -64223,14 +64381,6 @@ icon_state = "containment_window_h" }, /area/almayer/medical/containment/cell/cl) -"rLF" = ( -/obj/structure/machinery/status_display{ - pixel_y = -30 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "rLU" = ( /turf/open/floor/almayer/research/containment/floor2{ dir = 8 @@ -64245,23 +64395,6 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) -"rNW" = ( -/obj/structure/machinery/door_control{ - id = "Secretroom"; - indestructible = 1; - layer = 2.5; - name = "Shutters"; - use_power = 0 - }, -/obj/structure/prop/almayer/computers/sensor_computer1, -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "rOc" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -64492,12 +64625,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) -"rSW" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "rTk" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -64525,18 +64652,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) -"rTY" = ( -/obj/structure/transmitter/no_dnd{ - name = "Requisition Telephone"; - phone_category = "Almayer"; - phone_id = "Requisition"; - pixel_y = 30; - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/squads/req) "rTZ" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 @@ -64718,6 +64833,17 @@ icon_state = "plate" }, /area/almayer/living/offices/flight) +"rZz" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_y = -30 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "rZB" = ( /obj/structure/pipes/standard/simple/visible{ dir = 9 @@ -65297,6 +65423,27 @@ icon_state = "cargo" }, /area/almayer/engineering/upper_engineering/port) +"snI" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = -17 + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Delta Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Delta Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "snM" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -65420,12 +65567,6 @@ icon_state = "plate" }, /area/almayer/command/cic) -"soZ" = ( -/obj/structure/largecrate/random/case/double, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "spF" = ( /obj/structure/surface/table/almayer, /obj/structure/flora/pottedplant{ @@ -65851,6 +65992,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/numbertwobunks) +"szX" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/hull/upper_hull/u_a_s) "sAc" = ( /obj/structure/bed/chair{ dir = 8; @@ -65877,20 +66030,6 @@ icon_state = "orange" }, /area/almayer/engineering/ce_room) -"sBp" = ( -/obj/structure/sign/safety/escapepod{ - pixel_x = -17; - pixel_y = -8 - }, -/obj/structure/sign/safety/stairs{ - pixel_x = -17; - pixel_y = 7 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "red" - }, -/area/almayer/hallways/starboard_hallway) "sBF" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -66008,15 +66147,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"sDQ" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "emeraldcorner" - }, -/area/almayer/hallways/port_hallway) "sEa" = ( /turf/open/floor/almayer{ icon_state = "redcorner" @@ -66116,6 +66246,13 @@ icon_state = "cargo" }, /area/almayer/shipboard/starboard_missiles) +"sFh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "sFC" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ @@ -66410,6 +66547,12 @@ dir = 1 }, /area/almayer/medical/containment/cell) +"sNI" = ( +/obj/structure/bed/chair/comfy/delta, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "sNO" = ( /obj/structure/desertdam/decals/road_edge{ icon_state = "road_edge_decal3" @@ -66629,6 +66772,30 @@ icon_state = "blue" }, /area/almayer/squads/delta) +"sSG" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = -17 + }, +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Charlie Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Charlie Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "sSR" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out"; @@ -66760,7 +66927,7 @@ pixel_y = -32 }, /turf/open/floor/almayer{ - icon_state = "greencorner" + icon_state = "green" }, /area/almayer/hallways/port_hallway) "sVi" = ( @@ -66975,6 +67142,13 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"sZF" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12; + pixel_y = 12 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_p) "sZH" = ( /obj/structure/surface/table/almayer, /obj/item/ashtray/bronze{ @@ -67035,6 +67209,11 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"tat" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "taA" = ( /obj/structure/machinery/light{ dir = 4 @@ -67108,6 +67287,21 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/perma) +"tda" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "tdc" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -67212,6 +67406,18 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"teH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/sign/safety/maint{ + pixel_y = 32 + }, +/obj/structure/sign/safety/storage{ + pixel_x = 15; + pixel_y = 32 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "teY" = ( /obj/structure/machinery/light{ dir = 1 @@ -67242,9 +67448,6 @@ name = "General Listening Channel"; pixel_y = 28 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, @@ -67396,6 +67599,13 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"tit" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "tiw" = ( /obj/structure/machinery/constructable_frame{ icon_state = "box_2" @@ -67487,6 +67697,13 @@ /obj/item/toy/farwadoll, /turf/open/floor/wood/ship, /area/almayer/shipboard/brig/cells) +"tki" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "tkq" = ( /obj/structure/pipes/vents/scrubber{ dir = 4 @@ -68014,42 +68231,6 @@ icon_state = "green" }, /area/almayer/living/grunt_rnr) -"tuv" = ( -/obj/item/bedsheet/purple{ - layer = 3.2 - }, -/obj/item/bedsheet/purple{ - pixel_y = 13 - }, -/obj/item/clothing/head/beret/centcom/captain{ - color = "#4b5320"; - desc = "Dusty beret bearing the logo of the royal marines. How did this get here?"; - name = "dusty beret"; - pixel_y = -6 - }, -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = -2; - pixel_y = 4 - }, -/obj/structure/window/reinforced{ - dir = 8; - layer = 3.3; - pixel_y = 4 - }, -/obj/structure/bed{ - can_buckle = 0 - }, -/obj/structure/bed{ - buckling_y = 13; - layer = 3.5; - pixel_y = 13 - }, -/turf/open/floor/almayer{ - dir = 10; - icon_state = "emerald" - }, -/area/almayer/living/port_emb) "tuA" = ( /turf/closed/wall/almayer/outer, /area/almayer/shipboard/port_missiles) @@ -68383,6 +68564,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) +"tBP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "tCb" = ( /obj/structure/surface/rack, /obj/item/device/radio{ @@ -68556,6 +68744,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"tGG" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "tGO" = ( /obj/effect/projector{ name = "Almayer_Up3"; @@ -68564,41 +68760,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) -"tHc" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/computer/cameras/wooden_tv/prop{ - dir = 8; - layer = 3.2; - pixel_x = -3; - pixel_y = 6 - }, -/obj/structure/sign/poster{ - desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; - icon_state = "poster11"; - name = "YOU ALWAYS KNOW A WORKING JOE."; - pixel_x = 27; - serial_number = 11 - }, -/obj/item/trash/pistachios{ - layer = 2; - pixel_x = 6; - pixel_y = -6 - }, -/obj/structure/machinery/recharger{ - layer = 3.1; - pixel_y = 22 - }, -/obj/item/ammo_magazine/rifle/incendiary{ - current_rounds = 0; - desc = "A 10mm assault rifle magazine with ':D' drawn on the side"; - pixel_x = 10; - pixel_y = 2 - }, -/turf/open/floor/almayer{ - dir = 6; - icon_state = "blue" - }, -/area/almayer/living/port_emb) "tHh" = ( /obj/structure/sign/safety/ladder{ pixel_x = 8; @@ -68651,15 +68812,6 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/shipboard/brig/cells) -"tIb" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "emerald" - }, -/area/almayer/living/port_emb) "tIp" = ( /obj/structure/machinery/door/airlock/almayer/generic{ name = "\improper Dorms" @@ -68717,20 +68869,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_s) -"tJa" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - dir = 1; - name = "Storage"; - req_one_access_txt = "19;21" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/squads/req) "tJi" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/paper_bin/uscm, @@ -68994,6 +69132,20 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"tQo" = ( +/obj/structure/machinery/status_display{ + pixel_y = -30 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "tQE" = ( /obj/item/clothing/head/welding, /turf/open/floor/almayer{ @@ -69135,17 +69287,6 @@ /obj/item/tool/pen, /turf/open/floor/almayer, /area/almayer/command/cic) -"tUv" = ( -/obj/structure/machinery/iv_drip, -/obj/structure/machinery/computer/working_joe{ - dir = 8; - pixel_x = 17 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "sterile_green_corner" - }, -/area/almayer/medical/lower_medical_medbay) "tUx" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) @@ -69270,21 +69411,6 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/cryo) -"tXG" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door/window/eastright{ - access_modified = 1; - dir = 8; - req_access_txt = "19" - }, -/obj/effect/landmark/map_item, -/obj/structure/machinery/door/window/eastleft{ - req_access_txt = "19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "tXM" = ( /obj/structure/pipes/vents/pump{ dir = 8 @@ -69486,6 +69612,13 @@ dir = 4 }, /area/almayer/medical/containment/cell) +"uay" = ( +/obj/structure/machinery/iv_drip, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "sterile_green_corner" + }, +/area/almayer/medical/lower_medical_medbay) "uaI" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/processor{ @@ -69545,6 +69678,28 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) +"ucz" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = 15 + }, +/obj/structure/machinery/light, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Bravo Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Bravo Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = -8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "udi" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -69598,6 +69753,14 @@ icon_state = "silver" }, /area/almayer/shipboard/brig/cic_hallway) +"udV" = ( +/obj/structure/machinery/firealarm{ + pixel_y = -28 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "udZ" = ( /obj/structure/pipes/vents/scrubber, /turf/open/floor/almayer, @@ -69787,6 +69950,15 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_s) +"uig" = ( +/obj/structure/sign/safety/storage{ + pixel_x = 8; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "uim" = ( /obj/structure/largecrate/random/secure, /turf/open/floor/almayer{ @@ -69875,6 +70047,13 @@ /obj/structure/window/framed/almayer/hull/hijack_bustable, /turf/open/floor/plating, /area/almayer/engineering/engineering_workshop/hangar) +"ukA" = ( +/obj/structure/platform, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "ukS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69894,17 +70073,6 @@ }, /turf/open/floor/almayer, /area/almayer/squads/charlie_delta_shared) -"ukW" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "ula" = ( /obj/structure/machinery/door/airlock/almayer/security/glass{ name = "Evidence Room" @@ -69948,6 +70116,16 @@ icon_state = "rasputin15" }, /area/almayer/powered/agent) +"umv" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; + dir = 8; + req_one_access = list(2,34,30) + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hull/lower_hull/l_m_s) "umy" = ( /obj/structure/machinery/light{ dir = 1 @@ -69989,6 +70167,14 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_f_p) +"umY" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "unh" = ( /obj/structure/surface/table/almayer, /obj/item/storage/firstaid/o2, @@ -70086,6 +70272,14 @@ icon_state = "cargo" }, /area/almayer/engineering/engine_core) +"upt" = ( +/obj/structure/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "upM" = ( /obj/structure/machinery/light{ dir = 4 @@ -70153,19 +70347,6 @@ "uqo" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/armory) -"uqr" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "uqA" = ( /obj/structure/machinery/firealarm{ dir = 8; @@ -71170,6 +71351,13 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/main_office) +"uJB" = ( +/obj/structure/janitorialcart, +/obj/item/tool/mop, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "uJU" = ( /obj/structure/machinery/cryopod/right{ pixel_y = 6 @@ -71453,6 +71641,18 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) +"uQo" = ( +/obj/structure/machinery/disposal, +/obj/item/reagent_container/food/drinks/cans/beer{ + layer = 3.3; + pixel_x = -4; + pixel_y = 15 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/living/port_emb) "uQU" = ( /obj/structure/stairs{ dir = 1 @@ -71497,20 +71697,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) -"uRI" = ( -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice1"; - pixel_x = 16; - pixel_y = -8 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/largecrate/supply/supplies/mre, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "uRM" = ( /obj/structure/bed{ can_buckle = 0 @@ -71705,6 +71891,13 @@ icon_state = "kitchen" }, /area/almayer/engineering/upper_engineering/port) +"uVb" = ( +/obj/structure/closet/toolcloset, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "uVd" = ( /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ pixel_y = -25 @@ -71842,6 +72035,15 @@ dir = 8 }, /area/almayer/medical/containment/cell) +"uXu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/port_hallway) "uXL" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -71864,12 +72066,6 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/command/lifeboat) -"uYO" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "uZo" = ( /obj/structure/bed/stool, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -71955,6 +72151,9 @@ /area/almayer/squads/bravo) "vbR" = ( /obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, /turf/open/floor/almayer{ dir = 5; icon_state = "green" @@ -72072,9 +72271,6 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) -"vdU" = ( -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "vdW" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -72108,16 +72304,6 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/main_office) -"veI" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "vfa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72483,6 +72669,18 @@ icon_state = "green" }, /area/almayer/living/grunt_rnr) +"vjD" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12; + pixel_y = 12 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "vjK" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer, @@ -72586,6 +72784,13 @@ icon_state = "redfull" }, /area/almayer/shipboard/port_missiles) +"vlR" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "vlX" = ( /obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep, /turf/open/floor/almayer{ @@ -72650,6 +72855,13 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) +"vnY" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_f_p) "vot" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72691,6 +72903,22 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) +"vpt" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = 27; + serial_number = 11 + }, +/obj/item/stack/folding_barricade, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "vpI" = ( /obj/effect/landmark/start/police, /turf/open/floor/plating/plating_catwalk, @@ -72791,6 +73019,27 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) +"vrB" = ( +/obj/structure/closet/crate{ + desc = "One of those old special operations crates from back in the day. After a leaked report from a meeting of SOF leadership lambasted the crates as 'waste of operational funds' the crates were removed from service."; + name = "special operations crate" + }, +/obj/item/clothing/mask/gas/swat, +/obj/item/clothing/mask/gas/swat, +/obj/item/clothing/mask/gas/swat, +/obj/item/clothing/mask/gas/swat, +/obj/item/attachable/suppressor, +/obj/item/attachable/suppressor, +/obj/item/attachable/suppressor, +/obj/item/attachable/suppressor, +/obj/item/explosive/grenade/smokebomb, +/obj/item/explosive/grenade/smokebomb, +/obj/item/explosive/grenade/smokebomb, +/obj/item/explosive/grenade/smokebomb, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "vrI" = ( /obj/structure/machinery/cryopod{ layer = 3.1; @@ -72940,6 +73189,20 @@ icon_state = "test_floor4" }, /area/almayer/medical/upper_medical) +"vtB" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "vtT" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /obj/structure/disposalpipe/junction{ @@ -72963,6 +73226,17 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/living/briefing) +"vuF" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + access_modified = 1; + dir = 1; + name = "\improper Kitchen Hydroponics"; + req_one_access_txt = "30;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "vuG" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 @@ -73027,6 +73301,30 @@ icon_state = "plate" }, /area/almayer/engineering/upper_engineering/starboard) +"vvY" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/obj/structure/bedsheetbin{ + pixel_x = 26; + pixel_y = 5 + }, +/obj/item/tool/soap/syndie, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "vwF" = ( /obj/structure/machinery/light{ dir = 1 @@ -73176,6 +73474,15 @@ "vyI" = ( /turf/open/floor/almayer, /area/almayer/engineering/upper_engineering/port) +"vyU" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "vzl" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -73373,10 +73680,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/hydroponics) -"vDh" = ( -/obj/item/weapon/dart/green, -/turf/open/floor/plating, -/area/almayer/hull/lower_hull/l_f_p) "vEf" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -73392,6 +73695,17 @@ /obj/effect/landmark/start/synthetic, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/synthcloset) +"vEn" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/item/stack/sheet/mineral/uranium{ + layer = 2.99 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "vEr" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -73419,21 +73733,6 @@ /obj/structure/machinery/vending/coffee, /turf/open/floor/almayer, /area/almayer/living/briefing) -"vEI" = ( -/obj/structure/machinery/door/airlock/almayer/medical/glass{ - access_modified = 1; - dir = 2; - name = "\improper Field Surgery Equipment"; - req_access_txt = "20"; - req_one_access = null - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/medical/lower_medical_medbay) "vFb" = ( /obj/structure/surface/table/almayer, /obj/item/attachable/lasersight, @@ -73445,17 +73744,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) -"vFh" = ( -/obj/structure/surface/table/reinforced/prison, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 1; - pixel_y = 7 - }, -/obj/item/tool/wrench, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "vFv" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer{ @@ -73530,6 +73818,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, /area/almayer/living/port_emb) +"vHq" = ( +/obj/item/device/assembly/mousetrap/armed, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "vHs" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -73537,6 +73842,47 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) +"vHt" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door_control{ + id = "CIC Lockdown"; + name = "CIC Lockdown"; + pixel_x = -7; + pixel_y = 9; + req_access_txt = "1" + }, +/obj/structure/machinery/door_control{ + id = "Hangar Lockdown"; + name = "Hangar Lockdown"; + pixel_x = -7; + pixel_y = 2; + req_access_txt = "1" + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4; + icon_state = "exposed01-supply" + }, +/obj/structure/machinery/door_control{ + id = "bot_armory"; + name = "Armory Lockdown"; + pixel_x = -7; + pixel_y = -5; + req_one_access_txt = "1;4" + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Combat Information Center Telephone"; + phone_category = "Command"; + phone_id = "Combat Information Center"; + pixel_x = 5; + pixel_y = 4 + }, +/obj/structure/machinery/door/window/westright{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "vHO" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -74120,6 +74466,14 @@ icon_state = "cargo" }, /area/almayer/squads/delta) +"vTt" = ( +/obj/structure/machinery/firealarm{ + pixel_y = 28 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "vTu" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -74232,6 +74586,13 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/briefing) +"vVh" = ( +/obj/item/weapon/dart/green, +/obj/structure/dartboard{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/almayer/hull/lower_hull/l_f_p) "vVs" = ( /turf/open/floor/almayer{ icon_state = "sterile_green" @@ -74529,6 +74890,25 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"wbe" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + layer = 3.03; + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/prop/helmetgarb/spacejam_tickets{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/prop/helmetgarb/spacejam_tickets{ + pixel_x = -8; + pixel_y = -3 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "wbh" = ( /obj/structure/machinery/light{ dir = 4 @@ -74741,20 +75121,6 @@ icon_state = "mono" }, /area/almayer/living/pilotbunks) -"weB" = ( -/obj/item/tool/screwdriver{ - layer = 2.9; - pixel_x = -21; - pixel_y = -14 - }, -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/closet, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "weC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -74882,16 +75248,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_s) -"whd" = ( -/obj/item/frame/light_fixture{ - anchored = 1; - desc = "A broken fluorescent tube light."; - dir = 8; - icon_state = "tube-broken"; - name = "broken light fixture" - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "whA" = ( /turf/open/floor/almayer/uscm/directional, /area/almayer/living/briefing) @@ -75191,6 +75547,14 @@ icon_state = "red" }, /area/almayer/shipboard/starboard_missiles) +"wmz" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "wmE" = ( /obj/structure/machinery/door/window/brigdoor/southright{ id = "Cell 4"; @@ -75258,16 +75622,6 @@ dir = 4 }, /area/almayer/medical/containment/cell) -"wom" = ( -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "wos" = ( /obj/structure/machinery/cm_vending/sorted/marine_food{ density = 0; @@ -75458,6 +75812,31 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cic_hallway) +"wsP" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/item/prop/helmetgarb/gunoil{ + layer = 4.2; + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/prop/helmetgarb/gunoil{ + layer = 4.2; + pixel_x = -10; + pixel_y = 1 + }, +/obj/item/prop/helmetgarb/gunoil{ + layer = 4.2; + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/weapon/broken_bottle{ + pixel_x = 11; + pixel_y = -2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "wsR" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -75565,18 +75944,6 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) -"wvl" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "wvI" = ( /obj/item/paper_bin/uscm{ pixel_y = 7 @@ -75608,6 +75975,18 @@ icon_state = "cargo" }, /area/almayer/living/synthcloset) +"wwk" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/item/stack/folding_barricade, +/obj/item/stack/sheet/mineral/uranium{ + layer = 2.99 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "wwr" = ( /obj/structure/machinery/cryopod{ layer = 3.1; @@ -75617,6 +75996,15 @@ icon_state = "cargo" }, /area/almayer/squads/charlie) +"wwu" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "wwD" = ( /obj/structure/bed/chair/comfy/orange, /turf/open/floor/almayer{ @@ -75730,16 +76118,6 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) -"wyK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "silvercorner" - }, -/area/almayer/shipboard/brig/cic_hallway) "wyO" = ( /obj/structure/largecrate/random/barrel/red, /obj/structure/prop/invuln/overhead_pipe{ @@ -75802,6 +76180,15 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"wAU" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/sign/poster/music{ + pixel_x = -27 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "wBY" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, @@ -76062,11 +76449,12 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) "wGI" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/machinery/light{ - dir = 4 + dir = 8 }, -/turf/closed/wall/almayer/reinforced, -/area/almayer/shipboard/port_missiles) +/turf/open/floor/almayer, +/area/almayer/hull/upper_hull/u_f_p) "wGX" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -76074,6 +76462,25 @@ /obj/structure/surface/table/almayer, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/auxiliary_officer_office) +"wHj" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/prop/ice_colony/tiger_rug{ + desc = "A beat up beer stained, incredibly garish, polyester tiger rug. No one knows how it got here. Written on the wash tag are the words 'From Thedus, with love <3', in Sharpie."; + icon_state = "HotlineAlt"; + layer = 2.9; + name = "Richard the tiger" + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "emerald" + }, +/area/almayer/living/port_emb) "wHo" = ( /turf/open/floor/almayer{ icon_state = "emerald" @@ -76303,6 +76710,12 @@ icon_state = "sterile_green" }, /area/almayer/medical/containment) +"wLV" = ( +/obj/structure/bed/chair/comfy/charlie, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "wMm" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -76647,28 +77060,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/aft_hallway) -"wUD" = ( -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice2"; - pixel_x = 16; - pixel_y = 16 - }, -/obj/structure/prop/almayer/computers/sensor_computer3, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/obj/structure/sign/safety/terminal{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "wUN" = ( /obj/structure/machinery/optable, /turf/open/floor/almayer{ @@ -76792,9 +77183,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"wVK" = ( -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "wVP" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -76858,6 +77246,14 @@ icon_state = "blue" }, /area/almayer/living/pilotbunks) +"wWJ" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "wWL" = ( /obj/item/tool/screwdriver, /obj/structure/platform_decoration{ @@ -76901,12 +77297,14 @@ /obj/effect/landmark/late_join/delta, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) -"wXv" = ( -/obj/structure/prop/invuln/joey, +"wXh" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, /turf/open/floor/almayer{ - icon_state = "plate" + icon_state = "mono" }, -/area/almayer/hull/lower_hull/l_m_s) +/area/almayer/lifeboat_pumps/north2) "wXH" = ( /obj/structure/bed/chair{ dir = 1 @@ -77200,23 +77598,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_m_p) -"xeP" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/surface/table/almayer, -/obj/item/spacecash/c10{ - pixel_x = 6 - }, -/obj/item/spacecash/c10{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/toy/deck{ - pixel_x = -9 - }, -/turf/open/floor/almayer, -/area/almayer/living/grunt_rnr) "xfc" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/sign/safety/cryo{ @@ -77343,24 +77724,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) -"xgM" = ( -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice2"; - pixel_x = 16; - pixel_y = 16 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "xgS" = ( /obj/structure/largecrate/supply/supplies/mre{ desc = "A supply crate containing everything you need to stop a CLF uprising."; @@ -77431,6 +77794,13 @@ }, /turf/open/floor/carpet, /area/almayer/command/cichallway) +"xiz" = ( +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice12"; + pixel_y = -16 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "xiC" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -77441,6 +77811,16 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engine_core) +"xjb" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + access_modified = 1; + name = "\improper Main Kitchen"; + req_one_access_txt = "30;19" + }, +/turf/open/floor/prison{ + icon_state = "kitchen" + }, +/area/almayer/living/grunt_rnr) "xjw" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -77516,16 +77896,13 @@ "xkd" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/shipboard/brig/cells) -"xkw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 +"xkC" = ( +/obj/structure/machinery/light{ + dir = 8 }, /turf/open/floor/almayer{ - dir = 4; - icon_state = "greencorner" + dir = 8; + icon_state = "emerald" }, /area/almayer/hallways/port_hallway) "xlk" = ( @@ -77773,12 +78150,6 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) -"xqg" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "xqp" = ( /obj/structure/machinery/body_scanconsole{ dir = 8; @@ -77822,6 +78193,11 @@ }, /turf/closed/wall/almayer, /area/almayer/command/securestorage) +"xqM" = ( +/obj/structure/platform, +/obj/structure/pipes/vents/pump, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xqS" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -77887,20 +78263,6 @@ icon_state = "cargo" }, /area/almayer/hallways/vehiclehangar) -"xtC" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 1; - req_one_access = null; - req_one_access_txt = "30;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "xtD" = ( /obj/structure/surface/table/almayer, /obj/item/tool/weldpack, @@ -78091,19 +78453,6 @@ /obj/structure/largecrate/supply/supplies/mre, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) -"xwv" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/structure/sign/poster{ - desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; - icon_state = "poster11"; - name = "YOU ALWAYS KNOW A WORKING JOE."; - pixel_x = -27; - serial_number = 11 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "xwG" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -78268,6 +78617,12 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"xyE" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "xyY" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/effect/decal/warning_stripes{ @@ -78296,6 +78651,17 @@ }, /turf/open/floor/plating, /area/almayer/hull/upper_hull/u_a_p) +"xzp" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "xzu" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -78464,6 +78830,22 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) +"xDQ" = ( +/obj/structure/platform, +/obj/item/trash/USCMtray{ + pixel_y = 4 + }, +/obj/item/trash/USCMtray{ + pixel_y = 6 + }, +/obj/item/trash/USCMtray{ + pixel_y = 8 + }, +/obj/item/trash/USCMtray{ + pixel_y = 10 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xEc" = ( /turf/open/floor/almayer{ dir = 9; @@ -78794,22 +79176,13 @@ /turf/open/floor/almayer, /area/almayer/shipboard/port_point_defense) "xMh" = ( -/obj/structure/closet/crate{ - desc = "One of those old special operations crates from back in the day. After a leaked report from a meeting of SOF leadership lambasted the crates as 'waste of operational funds' the crates were removed from service."; - name = "special operations crate" +/obj/structure/prop/invuln/lattice_prop{ + dir = 1; + icon_state = "lattice-simple"; + pixel_x = -16; + pixel_y = 17 }, -/obj/item/clothing/mask/gas/swat, -/obj/item/clothing/mask/gas/swat, -/obj/item/clothing/mask/gas/swat, -/obj/item/clothing/mask/gas/swat, -/obj/item/attachable/suppressor, -/obj/item/attachable/suppressor, -/obj/item/attachable/suppressor, -/obj/item/attachable/suppressor, -/obj/item/explosive/grenade/smokebomb, -/obj/item/explosive/grenade/smokebomb, -/obj/item/explosive/grenade/smokebomb, -/obj/item/explosive/grenade/smokebomb, +/obj/structure/largecrate/random/barrel/red, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -78844,15 +79217,6 @@ "xMs" = ( /turf/closed/wall/almayer/white, /area/almayer/medical/operating_room_two) -"xMt" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "plating_striped" - }, -/area/almayer/squads/req) "xMA" = ( /obj/structure/machinery/computer/med_data, /obj/structure/sign/safety/terminal{ @@ -78868,12 +79232,6 @@ dir = 6 }, /area/almayer/command/cic) -"xMK" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "emeraldcorner" - }, -/area/almayer/hallways/port_hallway) "xML" = ( /obj/structure/machinery/computer/cameras/wooden_tv/prop{ pixel_x = -4; @@ -78986,19 +79344,19 @@ dir = 4 }, /area/almayer/medical/containment/cell) -"xPg" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 9 - }, -/obj/structure/machinery/light, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "xPE" = ( /obj/structure/largecrate/random/barrel/white, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"xPR" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xPZ" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -79659,13 +80017,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_s) -"ybV" = ( -/obj/structure/disposalpipe/segment{ - dir = 1; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "ybZ" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/transmitter{ @@ -79873,6 +80224,15 @@ icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"yfw" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/almayer/hallways/starboard_hallway) "yfy" = ( /obj/structure/surface/table/almayer, /obj/item/trash/crushed_cup, @@ -79925,6 +80285,12 @@ /obj/effect/spawner/random/tool, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_p) +"ygK" = ( +/obj/structure/prop/almayer/computers/sensor_computer3, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "yhI" = ( /turf/open/floor/almayer{ dir = 4; @@ -80046,6 +80412,13 @@ icon_state = "cargo" }, /area/almayer/hull/lower_hull/l_m_s) +"ykF" = ( +/obj/structure/machinery/cm_vending/sorted/tech/tool_storage, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "ykP" = ( /obj/structure/filingcabinet{ density = 0; @@ -80095,21 +80468,6 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) -"ylm" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door/airlock/almayer/generic{ - name = "\improper Dorms" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/port_emb) "ylJ" = ( /obj/structure/sign/safety/maint{ pixel_x = 8; @@ -91160,7 +91518,7 @@ gaJ gaJ tRA lMc -gjL +ffV cMl oeB rkL @@ -94323,7 +94681,7 @@ bSv aIX aIX bSv -ehZ +oES eXo vRz aag @@ -94998,9 +95356,9 @@ adG adG adG adG -bsf -fwF -dav +gqq +iCz +aFN rPC rPC kDb @@ -95036,7 +95394,7 @@ mnm kIV wNU kIV -alv +mrB tuA tuA tuA @@ -96651,13 +97009,13 @@ vGA uwN pYX xuZ -wyK -elh -rzM -aBN -fQS -bVr -bVr +pcj +hXm +fZq +dVm +qkb +vnY +vnY bpd bqT vZv @@ -96853,8 +97211,8 @@ awz vSN mPj rWs -iVY -odM +inh +ewr lPC mgy wWT @@ -97269,7 +97627,7 @@ vcK mBA kCi kCi -wGI +kCi kCi vmW nIE @@ -97365,8 +97723,8 @@ baH fVz bHB bBN -qif -vDh +bcm +vVh kCT kCT kCT @@ -97472,7 +97830,7 @@ ukU bfP fvv vcK -vcK +wGI tuA tuA tuA @@ -98670,9 +99028,9 @@ wVW wVW wVW swH -ayy +ucz wVW -aBV +sSG sEM wVW wVW @@ -98871,13 +99229,13 @@ apo fHh wVW lZs -gHl +lVX sni ayz dAX aQg vpV -eSV +snI aGp wVW aDv @@ -100498,7 +100856,7 @@ wVW rOC soX azX -aAD +vHt aCb aDv aEC @@ -103717,7 +104075,7 @@ bdH aaC abs adq -qcq +dpo ajI add add @@ -103775,7 +104133,7 @@ gjq aJU aJU tiW -eMn +msg pgD tQV aaC @@ -103923,13 +104281,13 @@ adq jWH ajI add -auJ +fsU aHU aTm awW aTm jgF -auJ +fsU add ajI add @@ -103969,13 +104327,13 @@ aJU aJU tiW aJU -lqZ +gBW ouQ iun baw vPm qys -lqZ +gBW aJU tiW pUe @@ -104532,13 +104890,13 @@ adq add ajI add -auJ +fsU aHU aTm awW aTm jgF -auJ +fsU add ajI add @@ -104578,13 +104936,13 @@ aJU aJU tiW aJU -lqZ +gBW ouQ vbB baw tBq qys -lqZ +gBW aJU tiW aJU @@ -110338,7 +110696,7 @@ iMI rlZ rlZ rlZ -vEI +qep cnr qqK qqK @@ -110540,7 +110898,7 @@ kan avW bZn dXr -tUv +uay vhX gDW rlZ @@ -110981,7 +111339,7 @@ uaa uaa fiq oed -uqH +oDf yhQ ajZ bdH @@ -111086,11 +111444,11 @@ eGz csz czu aaa -aaa -aaa -aaa -aaa -aaa +aac +aaf +aaf +aaf +ajY aaa aaa aaa @@ -111111,15 +111469,15 @@ aaa aab aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -111187,13 +111545,13 @@ oed oed yhQ ajZ -bdH -aaa -aaa -aaa -aaa -aaa aaa +avo +avo +avo +avo +avo +avo aaa aaa aaa @@ -111216,14 +111574,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -111289,13 +111647,13 @@ vGk csz czu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aad +aag +aag +aag +aag +aaf +ajY aaa aaa aaa @@ -111314,15 +111672,15 @@ aaa aab aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -111387,10 +111745,17 @@ bJt bJt bJt oed -oDf +eHf yhQ ajZ -bdH +avo +avo +avs +avs +avs +avs +avo +avo aaa aaa aaa @@ -111399,34 +111764,27 @@ aaa aaa aaa aaa +aab +aaa aaa +"} +(155,1,1) = {" aaa aaa +aab aaa aaa aaa +bdH +bdH aaa -aab aaa aaa -"} -(155,1,1) = {" aaa aaa -aab aaa aaa aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH aaa aaa aaa @@ -111491,14 +111849,14 @@ qVM vGk ofs czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaf +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -111517,8 +111875,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -111582,7 +111940,7 @@ gSk bDs bDs bDs -jip +xjb fbo duo iIl @@ -111590,10 +111948,18 @@ bDs ujV bJt oed -bxX +oed yhQ ajZ -bdH +avo +avs +avs +hAG +vtr +avs +avs +avo +aaa aaa aaa aaa @@ -111601,35 +111967,27 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(156,1,1) = {" aaa aaa +aab aaa aaa aaa +bdH +bdH aaa -aab aaa aaa -"} -(156,1,1) = {" aaa aaa -aab aaa aaa aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH aaa aaa aaa @@ -111694,14 +112052,14 @@ qVM vGk csz czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -111720,8 +112078,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -111793,10 +112151,17 @@ hAz fhQ bJt vhI -oDf -yhQ -ajZ -bdH +oed +avo +avo +avo +avs +rKn +awa +awa +umm +avs +avo aaa aaa aaa @@ -111805,34 +112170,27 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(157,1,1) = {" aaa aaa +aab aaa aaa aaa -aab +bdH +bdH +aaa aaa aaa -"} -(157,1,1) = {" aaa aaa -aab aaa aaa aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH aaa aaa aaa @@ -111897,14 +112255,14 @@ qVM csz qVM czu -aaa -aac -aaf -aaf -aaf -ajY -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ bdH bdH aaa @@ -111923,8 +112281,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -111987,7 +112345,7 @@ nFI qdk vzP bJt -fEo +hjB bJt dpn bDs @@ -111997,16 +112355,16 @@ pdt bJt kTq oed -yhQ -ajZ -aaa -avo -avo -avo -avo -avo +lpy +avC +avC +wEg +axa +axa +dSZ +oMs +avs avo -aaa bdH aaa aaa @@ -112028,14 +112386,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -112100,14 +112458,14 @@ qVM hoX qVM czu -aaa -aad aag aag aag aag -aaf -ajY +aag +aag +aag +ajZ bdH bdH aaa @@ -112126,8 +112484,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112199,16 +112557,16 @@ reL wiI bJt nnr -eHf -yhQ -ajZ +eep +avo avo avo avs +awa +awa +awa +qUp avs -avs -avs -avo avo bdH aaa @@ -112231,14 +112589,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -112303,7 +112661,7 @@ qVM csz qVM czu -aaf +aah aag aag aag @@ -112329,8 +112687,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112402,14 +112760,14 @@ bDs vwI bJt koz -oed +oDf yhQ ajZ avo avs avs -hAG -vtr +loK +wpg avs avs avo @@ -112434,14 +112792,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -112506,14 +112864,14 @@ qVM vGk csz czu +aaa +aad aag aag aag aag -aag -aag -aag -ajZ +aah +afm bdH bdH aaa @@ -112532,8 +112890,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112605,16 +112963,16 @@ bDs oMd bJt oDf -oed -avo +uqH +yhQ +ajZ avo avo avs -rKn -awa -awa -umm avs +avs +avs +avo avo bdH aaa @@ -112637,14 +112995,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH bdH aaa @@ -112709,14 +113067,14 @@ qVM vGk csz czu -aag -aag -aag -aag -aag -aag -aag -ajZ +aaa +aae +aah +aah +aah +afm +aaa +aaa bdH bdH aaa @@ -112735,8 +113093,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112808,17 +113166,17 @@ bDs pdt bJt sIx -oed -lpy -avC -avC -wEg -axa -axa -dSZ -oMs -avs +bxX +yhQ +ajZ +aaa +avo +avo +avo avo +avo +avo +aaa bdH aaa aaa @@ -112840,14 +113198,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -112912,14 +113270,14 @@ qVM vGk ofs czu -aag -aag -aag -aag -aag -aag -aag -ajZ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -112938,8 +113296,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -113011,17 +113369,17 @@ bDs knK bJt oed -eep -avo -avo -avo -avs -awa -awa -awa -qUp -avs -avo +vgQ +yhQ +ajZ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113043,14 +113401,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -113115,14 +113473,14 @@ csz vGk csz czu -aah -aag -aag -aag -aag -aag -aag -ajZ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -113141,8 +113499,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -113175,27 +113533,27 @@ aQF aLG aYO aLG -bCf +tda ngI dkq lRZ -wvl +acc beH beH dwl bdd bdd -ukW +gac bdd bdd aMt beH beH -wvl +acc qby btY bAJ -dGW +huU buH bHL buH @@ -113214,17 +113572,17 @@ ljG tSp bJt oed -oDf +sHg yhQ ajZ -avo -avs -avs -loK -wpg -avs -avs -avo +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113246,14 +113604,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -113318,14 +113676,14 @@ qVM csz qVM czu -aaa -aad -aag -aag -aag -aag -aah -afm +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -113406,7 +113764,7 @@ bJt wbC lHu oiL -loY +qBM wXI nUd lkd @@ -113417,17 +113775,17 @@ oDE bJt bJt oed -uqH +oDf yhQ ajZ -avo -avo -avs -avs -avs -avs -avo -avo +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113457,7 +113815,7 @@ aaa aaa aaa aaa -bdH +aaa aaa aaa ahx @@ -113521,14 +113879,14 @@ qVM hoX qVM czu -aaa -aae -aah -aah -aah -afm -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -113608,8 +113966,8 @@ bCj rde vjC iMm -xeP -fSG +mJi +iMm iMm mkc bJt @@ -113620,17 +113978,17 @@ luS bJt iGg oed -bxX +oDf yhQ ajZ -aaa -avo -avo -avo -avo -avo -avo -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113660,7 +114018,7 @@ aaa aaa aaa aaa -bdH +aaa aaa aaa lYA @@ -113768,18 +114126,18 @@ aKW aSm aSm hhw -baY -bfb -bNz +beG dIR yky +bfb +baY hhw -xnY -xnY +aLF +bPV +yaG +bPU aSm -aLf -aLf -soZ +bPS hhw bwd auv @@ -113808,31 +114166,31 @@ bCh bCi bCo bCi +ejw +xML +iMm +jSy +wGb +iMm +rjn bJt -hzP -vdU -owN -vdU -vdU -jjK -lkd wUX bDs gSk vSp -xtC +lHG qgH oDf oDf yhQ ajZ bdH -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -113856,16 +114214,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aac +aaf +aaf +aaf +aaf +aaf +aaf +aaf lYA aiS aao @@ -113927,14 +114285,14 @@ qVM vGk csz czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaf +aaf +aaf +aaf +aaf +aaf +aaf +ajY aaa aaa aaa @@ -113959,66 +114317,66 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad +aac +aKW +aKW +aKW +aKW +aKW +aKW +aKW aKW aSm aLf hhw -beG -bgF -jQA -bgF -kvN -hhw -aSm -aLf -aSm -aSm -aLf -aSm -hhw +beI +bTQ +tBP +jfm +lYu +maw +fAS +jfm +lzn +eDz +jfm +jfm +bUP aLG aYO aLG -bCf +tda mng wTm wCI -wvl +acc beH beH beH -wvl +acc mng wTm wCI -wvl +acc beH beH beH -wvl +acc mng wTm wCI -bCf +tda buH bHL buH -ejw -qyK -vdU -owN -vdU -vdU -pJb -lkd +bJt +swE +wpI +ocm +wpI +wnL +kHd +bJt hSw qxE rui @@ -114026,16 +114384,16 @@ vSp bJt wuH oed -vgQ +uqH yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa +yhQ +yhQ +yhQ +yhQ +yhQ +yhQ +yhQ +ajY aaa aaa aaa @@ -114059,16 +114417,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aiT aap @@ -114130,14 +114488,14 @@ qVM oLw csz czu -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114162,32 +114520,32 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad aKW -uDB +aKW +bPU +lLV +aLf +aLf +aLf +jiX +aSm +aSm aLf ahU -beI -bTQ -qoX -jfm -lYu -maw -fAS -jfm -jfm -fAS -jfm -jfm -bUP -aem +aLf +fza +kat +uJB +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +teH mUa xNB bdd @@ -114200,7 +114558,7 @@ fUA qYZ bdd vuA -tXG +fnx vuA bdd qCc @@ -114213,32 +114571,32 @@ vuA bdd bSj bHL -buH -ejw -xML -vdU -jcl -iHO -vdU -rjn -bJt -bJt +bIR +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd bJt cDC -oWX +vuF bJt bJt +oed +oDf +oDf +oDf +qNy +cLV +oDf +oDf oDf -sHg yhQ -ajZ -bdH -bdH -aaa -aaa -aaa -aaa -aaa +yhQ aaa aaa aaa @@ -114262,16 +114620,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aiU aap @@ -114333,14 +114691,14 @@ qVM vGk ofs czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114365,32 +114723,32 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad aKW +bPV +aLf +xlD aSm +aSm +aSm +aLf +aLf +aLf aMs hhw -beO -bgH -bgH +pgt +ykF bgH -bPV -hhw -aLF -bPV -lGO -oDu -bPU -bPS -hhw -irI +uVb +bdd +pfe +wsP +izr +aSh +ccF +tGG +tGG +bdg +aLG awb aLG bdg @@ -114417,31 +114775,31 @@ bdg buH hOR buH -bJt -swE -wpI -ocm -wpI -wnL -kHd -bJt -bJt +bdg +sNI +wAU +diw +csG +sNI +wNT +wbe +bdd qXo feq loY aDU bJt +oed +oDf +oed +oDf +mOU +oDf +oDf +oed +oed oDf -vFh yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -114465,16 +114823,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aiZ aap @@ -114536,14 +114894,14 @@ qVM noV csz czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114568,31 +114926,31 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad aKW -bhC aSm -hhw -bfa -bHM -bWy -iGE -nsY +aLf nsY nsY +pRT nsY nsY nsY nsY nsY nsY +hhw +hhw +umv +hhw +bdd +bqZ +kbV +tGG +tGG +tGG +tGG +tGG +bdg aLG aYO aLG @@ -114620,31 +114978,31 @@ bdg buH bHL buH +bdg +sNI +sNI +sNI +sNI +dkH +cKX +bqZ +bdd +tLc +rsM +iMm +hTT nsY nsY +nik nsY nsY nsY nsY nsY nsY -nsY -tLc -rsM -iMm -hTT -bJt +upt oDf -jRn yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -114668,16 +115026,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA adf aao @@ -114739,14 +115097,14 @@ iid csz qVM czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114771,31 +115129,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad aKW aLf aSm -hhw -hhw -hhw -hhw -hhw nsY xWT -rSW +kxd jgk nsY rSG -rSW +wWJ oqS nsY +lhu +btk +aSm +eoM +bdd +vTt +kbV +tGG +tGG +tGG +tGG +tGG +bdg aLG aYO aLG @@ -114823,31 +115181,31 @@ bdg buH bHL buH +bdg +sNI +csG +sNI +sNI +gNi +wNT +cab +bdd +hxZ +rsM +iMm +gzV nsY xWT -rSW +kxd viu nsY rSG -whd +qkP oqS nsY -hxZ -rsM -iMm -gzV -bJt oDf -oed +oDf yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -114871,16 +115229,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA fZF aWs @@ -114942,14 +115300,14 @@ qVM hoX qVM czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114974,31 +115332,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad aKW aLf aSm -hhw -fJA -btk -xwv -eVy nsY xWT -wVK +kxd viu nsY iIP -wVK +nna dDt nsY +xiz +aSm +aSm +kOf +bdd +bDQ +kbV +tGG +okB +tGG +crK +tGG +bdg beB aYT beB @@ -115026,31 +115384,31 @@ bCx buH bHL buH +bdg +sNI +sNI +sNI +sNI +eCS +xqM +udV +bdd +hTf +rsM +oos +sBL nsY xWT -efa +rfT viu nsY dmR -wVK +kxd dDt nsY -hTf -rsM -oos -sBL -bJt -pzi -uNW +oDf +oed yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -115074,16 +115432,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aar aar @@ -115145,14 +115503,14 @@ qVM csz qVM czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -115177,33 +115535,33 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad aKW -rsj -sxe -iQL -glr -mhl +aLa aSm -ylY nsY -nNT -fBA -fSF +gsg +vHq +vvY nsY -lmW -mtS -iKa +pPV +umY +npB nsY -aLG -aZi +glr +mhl +aSm +ylY +bdd +bqZ +qgw +beH +qMR +vlR +dRT +qin +pmv +tBF +fSK aLG nyw bqZ @@ -115227,33 +115585,33 @@ eBg vKe eVv bFu -pIX -buH -nsY -gwO -mtS -guG -nsY -lwA -mtS -iKa -nsY -tuo +omW +bFu +hLS +eBg +eBg +eBg +eBg +fOk +epq +bqZ +bdd +hTf rKO wGb gUf -bJt -ddG +nsY +gwM +bxC +pJD +nsY +iSm +bxC +jiU +nsY +oDf oed yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -115380,22 +115738,9 @@ aaa aac aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aag aKW -mRc aLf -hhw -jFe -sxe -xZI -mNZ +aSm nsY nsY qxC @@ -115405,6 +115750,19 @@ nsY ntx nsY nsY +jFe +sxe +xZI +mNZ +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd aLG awb aLG @@ -115432,6 +115790,19 @@ bdg buH hOR buH +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +tuo +rsM +oos +gUf nsY nsY iFM @@ -115441,22 +115812,9 @@ nsY gLZ nsY nsY -hTf -rsM -oos -gUf -bJt oDf -oed +uqH yhQ -aag -aaf -aaf -aaf -aaf -aaf -aaf -aaf aaf aaf ajY @@ -115584,20 +115942,7 @@ aad aKW aKW aKW -aKW -aKW -aKW -aKW -aKW -aKW -aKW -aKW aSm -vUi -hhw -xCN -pOB -hfk aLf nsY tUS @@ -115608,8 +115953,21 @@ fPp lqN kjV nsY -aLG -awb +xCN +pOB +hfk +aLf +bdd +bqZ +kKL +aLJ +eBg +dAO +cEG +eBg +dYX +tBF +lBz aLG iuy bqZ @@ -115633,32 +115991,32 @@ beH bqZ bdg buH -hOR -buH +uXu +bFu +iUk +eBg +gkJ +eBg +eBg +mVZ +kTx +bqZ +bdd +hTf +wRO +iMm +gUf nsY aaq -lEL -tuv -eYv +wHj +qdv +uQo iQt uZo xmJ nsY -hTf -wRO -iMm -gUf -bJt -nBl -ndQ -yhQ -yhQ -yhQ -yhQ -yhQ -yhQ -yhQ -yhQ +oed +oDf yhQ yhQ yhQ @@ -115785,25 +116143,12 @@ aaa aaa aKW aKW -bPV -aSm -aSm -jiX -bPU bPT -uJo -aSm jiX aSm -aSm -aSm -hhw -nEA -lQu -lQu -aSm +aLf nsY -lru +kio sJY qJY qLH @@ -115811,6 +116156,19 @@ xTW oGP cnM nsY +nEA +lQu +lQu +aSm +bdd +bDQ +iWE +jUo +wmz +wmz +wwk +wmz +bdg aLG awb aLG @@ -115838,29 +116196,29 @@ bdg buH hOR buH +bdg +wLV +nza +wLV +wLV +wLV +ukA +bqZ +bdd +gKB +rsM +oos +gUf nsY mKJ -tIb +deT uAC rhQ pyc uMn ivz nsY -gKB -rsM -oos -gUf -bJt -oDf oed -oed -sow -oed -oDf -oDf -oDf -laP oDf oed oed @@ -115987,26 +116345,13 @@ aaa aaa aaa aKW -aLF +ygK aLf aLf aLf -aSm -aLf aLf -aLf -aLf -aLf -aSm -aLf -bPW -hhw -hhw -yfy -ugV -vUi -nsY -weB +heK +kam axc juD twW @@ -116014,6 +116359,19 @@ vHh pvh rgJ nsY +hhw +yfy +ugV +vUi +bdd +vTt +kbV +xzp +vEn +wmz +wmz +wmz +bdg aLG aYO bad @@ -116041,30 +116399,30 @@ bdd bGe bHL buH -nsY -eiN -gLu -eai -veI -xuQ -uPW -bKo -nsY +bdg +wLV +wLV +wLV +wLV +gKH +ldj +cab +bdd sOt cNX cdI sBL -bJt -oed -oDf -alm -hGZ +nsY +eiN +dVs +tat +kNC +xuQ +uPW +kYv +oDx +tbK tbK -hGZ -etB -hGZ -gpE -kHA tbK lNy oed @@ -116190,24 +116548,11 @@ aaa aaa aaa aKW -aSm +jwD aLf +uig hhw hhw -hhw -hhw -hhw -hhw -bPV -aLF -aSm -bzG -hhw -hhw -sSe -aLf -qce -aSm nsY wpz oEX @@ -116217,7 +116562,20 @@ xxm qSK ieu nsY -kfp +sSe +aLf +qce +aSm +bdd +bqZ +xPR +nIW +wmz +wmz +wmz +wmz +bdg +beB aYT beB beB @@ -116244,6 +116602,19 @@ bJz bJz bHT bJz +bdg +wLV +wLV +wLV +wLV +wLV +wNT +udV +bdd +pEl +roU +oos +uVh nsY kzK lFh @@ -116253,22 +116624,9 @@ mzV pML ivz nsY -pEl -roU -oos -uVh -bJt -aYU -bVt -wlp -aYU -bVt -fiq -fiq -fFz -fiq -fiq jZO +oDf +oed wlp ndQ yhQ @@ -116393,24 +116751,11 @@ aaa aaa aaa aKW -uDB +cSK +aSm aSm -hhw -bUc -bUc -bUc bUc -aLB -aLB -aLB -bbI -aLB -aLB -wXv -aLf -aLf -tRc -qEW +nSN nsY xgS dbn @@ -116420,6 +116765,19 @@ uRM ipe ehR nsY +aLf +aLf +tRc +qEW +bdd +jlj +mLb +wmz +vpt +kQU +wmz +wmz +bdg aLG aYO aLG @@ -116447,31 +116805,31 @@ buH buH bHL buH +bdg +gKH +cgz +vyU +wLV +wLV +xDQ +bXc +bdd +pcO +tJV +qoY +uCh nsY tXT -kOH +jJk wLG tyb sZH -tHc +rjV ivz nsY -pcO -tJV -qoY -uCh -bJt -bGb -bGb -cmb -bGb -bGb -fiq -xgM -eHq -uRI -ckD -wUD +fuY +sZF +vjD lFF ndM yhQ @@ -116598,22 +116956,9 @@ aaa aKW aLf aLf -hhw -bUc -bUc -bUc +xlD bUc -aLB -aWN -pyB -beB -bbU -aLB -aLB -aLB -aLB -aLB -aLB +vrB nsY nsY nsY @@ -116623,7 +116968,20 @@ nsY nsY nsY nsY -aLG +hhw +hhw +hhw +hhw +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +hDL aYO aNO aLG @@ -116649,34 +117007,34 @@ bdg buH bHa bHL -buH +bIR +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bJt +bJt +bJt +bJt nsY nsY nsY nsY -ylm +goy nsY nsY nsY nsY -bJt -bJt -bJt -bJt -bJt -bGb -mFM -bHW -kMU -fBx -fiq -hRg -oDf +gZG xMh -fiq -rNW +ril kRu -oDf +hXS yhQ aaa aaa @@ -116808,22 +117166,22 @@ hhw hhw aLB acF -akX -akX +heb cqa -bdp +bBh +aMV dRG -yiq -sBp aMV +yiq +kLp aMV bBh tCN -tCN -kNQ -awb -iLQ lDJ +tCN +tCN +yfw +tCN bBh aLG aLG @@ -116856,9 +117214,9 @@ buH buH cbD iZH -sDQ -hOR -xMK +xkC +njL +njL njL njL cbD @@ -116867,10 +117225,10 @@ bUM mYw iAT rdY -clR -eXE -gte -eXE +bUM +cbD +rGg +qtn kJV fiq fiq @@ -117011,20 +117369,20 @@ nHF cmE aLB nyG -aNO -uYO -xqg -bdq -aQt -aQt -aQt -aQt -aQt -sOm -aQt -aQt -aQt -wom +iDN +tit +nFV +tBL +tBL +tBL +tBL +tBL +tBL +mRS +tBL +tBL +tBL +tBL tBL tBL luz @@ -117054,13 +117412,13 @@ bqZ bdg buH bHa -mTk -hbx -hvp -keO -hbx -hbx -nob +wwu +buI +bFu +cbE +buI +buI +buI buI buI buI @@ -117070,10 +117428,10 @@ buI buI buI buI -feC -bFu -mFD -bHa +buI +rpd +fkO +bHY kro bGb uaa @@ -117214,10 +117572,10 @@ nHF nHF aLB csl -aQt -bbJ -csw -bdp +gjn +jJs +bBh +aMM aMM aNG bga @@ -117272,11 +117630,11 @@ ciU rOj bUd bUF -bUR clR -uqr -xkw -buI +clR +cbD +dQs +sFh guc bGb uaa @@ -117417,8 +117775,8 @@ nHF nHF jUx aLG -aNO -cmc +qmL +rZz jeb jeb jeb @@ -117479,7 +117837,7 @@ vra vra vra jJe -bHa +bHY buH vfo uaa @@ -117682,7 +118040,7 @@ mgF asX vra tfw -bHa +bHY sVf bGb uaa @@ -117824,7 +118182,7 @@ nHF aLB udF aNO -nVU +nLZ jeb obE tdE @@ -117884,8 +118242,8 @@ lpt qYQ ptj vra -lSO -bHa +mEb +bHY haT bGb uaa @@ -118025,9 +118383,9 @@ hhw hhw hhw aLB -rlG -aNO -nFy +dzF +dzF +dac jeb vlX thA @@ -118087,9 +118445,9 @@ cgo hQc asX vra -hNL -bHa -rLF +cwQ +vtB +tQo bGb fiq fiq @@ -118230,7 +118588,7 @@ cmE aLB enx aQt -xPg +oQj jeb vlX tdE @@ -118290,8 +118648,8 @@ lpt qYQ asX vra -mYZ -buI +ojR +tki lQQ bGb uaa @@ -118433,7 +118791,7 @@ nHF aLB ewo aNO -jJs +jLv jeb obE thA @@ -118494,7 +118852,7 @@ eBV ptj vra fsH -bHa +bHY pBn bGb uaa @@ -118636,7 +118994,7 @@ nHF cmC aLG aNO -jJs +uBw jeb vlX tdE @@ -118696,8 +119054,8 @@ lpt qYQ asX vra -mqc -ybV +pJJ +bHY buH cnd uaa @@ -120895,7 +121253,7 @@ bDY bCA bCA nLt -tJa +gmb bNQ bNQ bNQ @@ -121099,7 +121457,7 @@ bdj bri bLX bdl -rTY +kSU bNP bmD bNP @@ -121177,13 +121535,13 @@ acx aeC ajs aeC -asV +wXh ayn atr aeA aex ciw -asV +wXh aeC ydz ayb @@ -121225,13 +121583,13 @@ agJ sSl kkx vcE -mMu +kpo iMx tGi lJY bXe eyG -mMu +kpo vcE kUV vcE @@ -121299,7 +121657,7 @@ bkY bdl lOr lOr -bIu +iwI lOr bdl bEt @@ -121786,13 +122144,13 @@ acx umR ajs aeC -asV +wXh ayn atr aeA bXz ciw -asV +wXh aeC ajs qon @@ -121834,13 +122192,13 @@ vuv dHe kUV vcE -mMu +kpo iMx bXe lJY mzF eyG -mMu +kpo vcE kUV pPF @@ -122327,7 +122685,7 @@ bxg bZr bNQ bNQ -xMt +bNQ bGz hMs cbw @@ -122530,7 +122888,7 @@ bxh bZr krN krN -oLg +krN oqY can buH @@ -122733,7 +123091,7 @@ bxg bZr ibc uly -moU +bNN vbR pky cbv @@ -123538,7 +123896,7 @@ ycp bdl bdl rtj -fmf +agv bdl bdl bdl @@ -126051,7 +126409,7 @@ pVZ xlX psm psm -ahX +rzP psm psm fnZ @@ -126253,9 +126611,9 @@ aag pVZ xlX psm -aCu -aQA -bpf +nQg +szX +xyE psm eKD pBW @@ -126456,9 +126814,9 @@ aag pVZ yeP psm -aDf -aRk -brT +jdQ +bMY +hfy psm eKD nZF @@ -133568,7 +133926,7 @@ bdH bdH aad cuC -oIm +mJx rtd odb cuC @@ -133771,7 +134129,7 @@ bdH bdH cuC cuC -pLv +dqg rtd fcP cuC diff --git a/sound/effects/Heart Beat Short.ogg b/sound/effects/heart_beat_short.ogg similarity index 100% rename from sound/effects/Heart Beat Short.ogg rename to sound/effects/heart_beat_short.ogg diff --git a/strings/marinetips.txt b/strings/marinetips.txt index cf808884f1e5..416c9ef0a4dd 100644 --- a/strings/marinetips.txt +++ b/strings/marinetips.txt @@ -53,35 +53,51 @@ A misloaded OB can deviate severely from the intended target area - ensure you l The XO and CO are trained in Power Loader use and engineering, and can load the OB. You can change what your SL tracker beacon is tracking by right clicking on your headset and clicking "Switch Tracker Target". Boilers emit light - not every glow from around the corner is friendly! +The amount of items in Requisitions and Squad Preparations depend on how many players readied up at the start of the round. You can carry a variety of items inside your helmet - from gauze and cigarettes to flares and screwdrivers. CIC staff can track every USCM-aligned person via the suit sensors console and overwatch console - useful for finding escaped prisoners or dead marines. When the M7 RPG is fired, it creates a substantial shockwave behind it that can stun and harm marines standing too close. Watch your backblast! Remember that you need to put a defibrillator's paddles away in order to store it. -W-Y PMCs do not have marine IFF. Don't fire Smartguns through them! -To talk on multiple radio channels at once, put a COMMA [,] before your message and add up to four prefixes. E.g, ,abcd talks on all squad channels at once. +W-Y PMCs do not have marine IFF. Don't fire Smartguns at them! +To talk on multiple radio channels at once, put a COMMA [,] before your message and add up to four prefixes. E.g, ,abcd talks on the main four squad channels at once. Put .w or :w before your message to whisper. Another way to whisper is to use the verb "whisper" in the IC tab or command bar. For Vehicle Crewmen : it is often safer to repair the parts of your APC or tank inside the vehicle than outside it. It is almost always faster to do surgery manually than in the autodoc. To check your skills, go to the IC tab and click "view skills". +Minirockets pack the most punch per cost as far as CAS weaponry is concerned. The U7 underbarrel shotgun can instantly break down both resin doors and mechanical airlocks, and it's not bad at breaking walls down either. You can find breaching charges in Requisitions or the Squad Engineer vendor. They function like C4, but can be deployed and explode much quicker, and release powerful shrapnel on the opposite side. They require minor engineering knowledge, which can be obtained from pamphlets. Armor piercing ammunition does less damage to unarmored targets. +Requisitions may not grant you service if you are a 'pajamarine' : a marine in cryosleep attire. Be sure to dress up! You can insert empty pill bottles into ChemMasters before creating pills to have them automatically inserted. Nurses can practice a full range of surgeries on Professor DUMMY. Ask the gods to give you one if you see (or are) a nurse practicing. Drinks from the hot drinks machine warm you up. Be careful! Barricades block grenades, and indeed all thrown items, from the front if they're barbed up. +CAS Fire Missions doubles the accuracy of fired weapons, which can be substantial. Painkillers do not stack. Only the strongest has any effect. +Don't underestimate the mortar: with ammo and proper communication it can hit surprisingly hard. +You can shoot through tents, but they won't protect you much in return. +Reqs doesn't have an infinite budget. +Good Reqs can land supplies anywhere outside - given coords - and sometimes in a minimal amount of time. +A ‘point blank’ or ‘PB’ is a type of attack with a firearm where you click directly on a mob next to you. These attacks are not effected by accuracy allowing you to quickly fire with weapons like a shotgun to great effect. Intel Officers can be put in a squad by going to CIC and requesting it. Any marine can perform CPR. On dead marines, this will increase the time they have until they become unrevivable. If you've been pounced on and your squad is unloading into the target, you can hit the 'rest' button to stay down so you don't get filled with lead after getting up. You can check the landing zone as a marine in the status panel. +The Colonial Marshals may come to crack down on too heavy of a Black Market usage. Functioning night vision goggles can be recharged with batteries. Broken night vision goggles can be repaired by an Engineer with a screwdriver. Not the loadout ones though, those cannot be fixed. You can put a pistol belt on your suit slot. (Just grab a rifle instead.) Alt-clicking the Squad Leader tracker lets you track your fireteam leader instead. Armor has a randomized reduction in effectiveness, and does not protect the digits. Take the wiki damage values as a best-case scenario. You can click on your Security Access Tuner (multitool) in your hand to locate the area's APC if there is one. +Need help learning the game and these tips aren't enough? Use MentorHelp or try to get ahold of your ship's Senior Enlisted Advisor. Clicking on your sprite with help intent will let you check your body, seeing where your fractures and other wounds are. Armor has insulative properties - taking it off will help you cool off and take less damage faster if you've been set on fire. Both foldable cades & plasteel cades if loosened and folded down can be transported in crates! In this way, you can use the crate as a portable breach-repair kit, or dragged (or carried via Power Loader) to an unsecure area for quick defensive set up. The fuel tank pouch doesn't just carry fuel for an incinerator- they can also carry full-size extinguishers. Toolbelts & tool pouches also may hold miniature extinguishers. The M2C heavy machine gunner belt rig can also carry C4, breaching charges, and most tools. +You can always multitask as Medic, such as by using pills or healing kits at the same time as defibrillator. +The nuclear ordnance requires BOTH communication towers to be actively held to decrypt the nuclear codes. +ARES will periodically report the amount of available tech points on Command Channel. +The quick wield keys generally prioritize wieldable gear going from left to right on your inventory bar. +Orbital Bombardment warheads respect roofing and hive core protection. They won't hit inside of protected areas. diff --git a/strings/memetips.txt b/strings/memetips.txt index e05ac2f66bdb..abfe0872180c 100644 --- a/strings/memetips.txt +++ b/strings/memetips.txt @@ -12,17 +12,39 @@ Contrary to popular belief, turning off IFF as a Smartgunner does not actually i When playing as a Xenomorph, remember to aim for the groin to inflict additional psychological damage to marines. Never tell an officer that you're smarter than them - especially if it's true. There is no USS Sulaco. -There is no such thing as an Intel Officer. +There is no such thing as a Radio-Telephone Operator. There is no such thing as a techweb. +There is no such thing as a tip. +There is no such thing as a Fatty. +Dropship update is dropping tomorrow. +Don't forget your ceramic plates. Echo Squad does not exist. +Reqs should always spend all its resources on the Black Market. Foxtrot Squad DEFINITELY does not exist. +Intel Squad is a unicorn. Spec rolls are not actually random. +Watch out for Queen's charge ability. Never, ever attempt to correct a Provost about anything. If you die, make sure to ahelp so staff can restart the round! +You can obtain spec tokens by climbing outside the map and into space. There is no alcohol on Whiskey Outpost, other than in the Ground Commander's locker. Hitting enemies with weapons damages them. +Don't swap East and West. AGAIN. +Don't swap Minus and Positive coordinates... AGAIN. +OB'ing the FOB is always an option. +OB'ing the FOB is the best way to get some recognition from the aCO. +The sky erupts into flames right above you! This tip is a lie. +Stay hydrated. +Have a good day. +There is no tip. +These tips suck. Please write more. +This tip is not ready, please wait until next round. +Someone stole this tip, ask staff for a new one. If it's stupid but it works, it isn't stupid. If it's stupid but it works, it's still stupid and you got lucky. Corroders aren't real. They can't hurt you. ARES is not sentient. It has no feelings and its only thoughts are pre-programmed subroutines. +Remember that as Yautja HPCs are your primary weapons. +You can always bully staff into giving you more awesome tips. +Embrace the suck. diff --git a/strings/metatips.txt b/strings/metatips.txt index f694da02b5bf..24be6896bc05 100644 --- a/strings/metatips.txt +++ b/strings/metatips.txt @@ -1,13 +1,22 @@ Remember hotkeys and macros can be customized to your liking. Hotkeys can be accessed in your preferences, and macros can be edited in the Byond macro editor, available in the top left drop down menu (click the Byond logo in the corner of the game window). -If you're unsure about a gameplay mechanic, use the 'mentorhelp' verb in the Admin tab to ask veteran players on the subject. +If you're unsure about a gameplay mechanic, use the 'mentorhelp' verb in the Admin tab to ask veteran players on the subject. It is also available from the pause menu, pressing ESCAPE. Try not to get too mad about dying. We’re all here to have fun. +You can get information on current TestMerges by pressing 'Show Server Revision' in 'OOC' tab. After dying, ask yourself what you did wrong and make a mental note to not make the same mistake again. Communication, be it from a marine to a marine, a drone to the queen, or command to everyone, is vital and information on flanks can change how the entire round plays out. As an alien or marine, be careful of the flank, regardless of if the push is going well or stalling out. Half of getting good is knowing to be aggressive. The other half is knowing when not to be aggressive. Alt-click a storage item to draw the last item in it (last non-weapon if it's a weapon belt). Middle-click a storage item to immediately open it, and middle-click structures to attempt to vault them. Use "North, South, West, East" when referring to locations in-game rather than "up, down, left, right". +As a mentor, you can become the imaginary friend of a new player to teach them! You shouldn't ignore what your allies are up to. Sometimes they can be organizing a flank in hivemind/radio, sometimes they can be walking up behind you with a slug-loaded shotgun. Either way, it pays to be alert to what they're doing, as much to as what the enemies are. The Wiki (https://cm-ss13.com/wiki) is a very useful repository of information about the game, such as weapons, equipment, xenomorph castes and their strains. It may not be fully up to date much of the time, but the basics are usually accurate. As an observer, you may see how much remaining hijack time is left in the status panel. -Embrace the suck. +You can always AdminHelp with the F1 key to question a mmeber of staff regarding rules or game bugs. +As ghost you are given extra tools for spectating the round: you can jump and follow specific players, get notifications about CAS and OB strikes, can see all health bars, and such. +You can press ESC key to bring up the game pause menu. It allows you change settings, AdminHelp and MentorHelp, and even access the Web Maps of game by clicking at top right. +Dead? You can take that moment to 'Edit Characters' from Preferences or Escape menus, to flesh out your characters or change your settings. +Control of intelligence is important: be it for retrieving it as marine, or denying it as Xeno. +If the lobby music is too loud or bothering you, you can disable it in Preferences tab at top right. +Maps can and will be unpredictably modified by the Nightmare system - stay frosty while roaming around! +You can go to GitHub to view code of the game and propose modifications of your own. diff --git a/strings/xenotips.txt b/strings/xenotips.txt index 2ca2964ae2d5..8674146de655 100644 --- a/strings/xenotips.txt +++ b/strings/xenotips.txt @@ -32,5 +32,7 @@ You can join the hive as a living Facehugger by clicking on the hive's Eggmorphe Playable Facehuggers can leap onto targets with a one-second windup, but this will only infect them if they are adjacent to it. Otherwise, it will simply knock them down for a small duration. As a Facehugger, you cannot talk in hivemind, but you can still open Hive Status and overwatch your sisters. This can be useful if you're locating other Facehuggers, flanker castes, or trying to learn from experienced Facehugger players. Shift-clicking the Queen indicator will tell you what area you are in, on the map. +As a Ravager your abilities become greatly enhanced when you empower with three or more people around you. Resisting on a water tile will immediately put out fires. Make sure you're alone though - It's usually better to let a friendly Xenomorph pat you out than it is to expose yourself to open water. You can filter out the Xenomorphs displayed in hive status by health, allowing you to look only for wounded sisters. +Each xeno has their own ‘tackle counter’ on a marine. The range to successfully tackle can be anywhere from two to six tackles based on caste. If a marine gets stunned or knocked over by other means it will reset everyone's tackle counters and they may get up! diff --git a/tgui/packages/tgui/interfaces/Autodispenser.js b/tgui/packages/tgui/interfaces/Autodispenser.js index 0c8ce91512e5..5d029b72b894 100644 --- a/tgui/packages/tgui/interfaces/Autodispenser.js +++ b/tgui/packages/tgui/interfaces/Autodispenser.js @@ -11,7 +11,6 @@ export const Autodispenser = (_props, context) => { multiplier, cycle_limit, automode, - linked_storage, networked_storage, smartlink, outputmode, diff --git a/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx b/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx index 289bb53d777a..65a67524f5b4 100644 --- a/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx +++ b/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx @@ -18,7 +18,6 @@ interface DropshipNavigationProps extends NavigationProps { door_status: Array; has_flight_optimisation?: 0 | 1; is_flight_optimised?: 0 | 1; - flight_configuration: 'flyby' | 'ferry'; can_fly_by?: 0 | 1; can_set_automated?: 0 | 1; primary_lz?: string; @@ -116,7 +115,7 @@ export const DropshipDestinationSelection = (_, context) => { ); return (
@@ -182,41 +181,6 @@ const DestinationSelector = (props: DestinationProps, context) => { ); }; -const FlybyControl = (props, context) => { - const { act, data } = useBackend(context); - return ( -
- {data.flight_configuration === 'flyby' && ( - - )} - {data.has_flyby_skill === 1 && data.flight_configuration === 'ferry' && ( - - )} - {data.has_flyby_skill === 1 && data.shuttle_mode === 'called' && ( - - )} - {data.has_flyby_skill === 1 && data.shuttle_mode === 'idle' && ( - - )} - - } - /> - ); -}; - export const TouchdownCooldown = (_, context) => { const { data } = useBackend(context); return ( diff --git a/tgui/packages/tgui/interfaces/NavigationShuttle.tsx b/tgui/packages/tgui/interfaces/NavigationShuttle.tsx index 19ff7a0c7149..d262fa81dc3c 100644 --- a/tgui/packages/tgui/interfaces/NavigationShuttle.tsx +++ b/tgui/packages/tgui/interfaces/NavigationShuttle.tsx @@ -41,7 +41,7 @@ export const CancelLaunchButton = (_, context) => { export const LaunchButton = (_, context) => { const { act } = useBackend(context); - const [siteselection] = useSharedState( + const [siteselection, setSiteSelection] = useSharedState( context, 'target_site', undefined @@ -50,7 +50,10 @@ export const LaunchButton = (_, context) => { ); @@ -156,9 +159,15 @@ export const LaunchCountdown = (_, context) => { }; export const InFlightCountdown = (_, context) => { - const { data } = useBackend(context); + const { data, act } = useBackend(context); return ( -
+
act('cancel-flyby')}>Cancel + ) + }>
diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.js b/tgui/packages/tgui/interfaces/WorkingJoe.js index 6881d731db1b..6e6372326d9a 100644 --- a/tgui/packages/tgui/interfaces/WorkingJoe.js +++ b/tgui/packages/tgui/interfaces/WorkingJoe.js @@ -870,24 +870,20 @@ const AccessTickets = (props, context) => { can_claim = 'No'; } let can_update = 'Yes'; - if (ticket.assignee !== logged_in) { - can_update = 'No'; - } else if (ticket.lock_status === 'CLOSED') { + if (ticket.lock_status === 'CLOSED') { can_update = 'No'; } let view_status = 'Ticket is pending assignment.'; let view_icon = 'circle-question'; - let update_tooltip = 'Update Access'; - if (ticket.status === 'assigned') { - view_status = 'Ticket is assigned.'; - view_icon = 'circle-plus'; - update_tooltip = 'Grant Access'; - } else if (ticket.status === 'rejected') { + let update_tooltip = 'Grant Access'; + if (ticket.status === 'rejected') { view_status = 'Ticket has been rejected.'; view_icon = 'circle-xmark'; + update_tooltip = 'Ticket rejected. No further changes possible.'; } else if (ticket.status === 'cancelled') { view_status = 'Ticket was cancelled by reporter.'; view_icon = 'circle-stop'; + update_tooltip = 'Ticket cancelled. No further changes possible.'; } else if (ticket.status === 'granted') { view_status = 'Access ticket has been granted.'; view_icon = 'circle-check'; @@ -902,19 +898,19 @@ const AccessTickets = (props, context) => { update_tooltip = 'Access self-returned. No further changes possible.'; } + let can_reject = 'Yes'; + if (can_update === 'No') { + can_reject = 'No'; + } + if (ticket.status !== 'pending') { + can_reject = 'No'; + } return ( - {!!ticket.priority_status && ( - - {ticket.id} - - )} - {!ticket.priority_status && ( - - {ticket.id} - - )} + + {ticket.id} + {ticket.time} @@ -929,18 +925,20 @@ const AccessTickets = (props, context) => {
Extras
Emergency Response TeamEmergency Response TeamSurvivorSurvivorAgentAgent