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 += "
[R.fields["name"]] | "
+ dat += "[R.fields["id"]] | "
+ dat += "[R.fields["rank"]] | "
dat += "
"
- 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 += "")
+ |
"
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("Search Results for '[]': | ", tempname)
+ dat += "Search Results for '[tempname]': | "
dat += {"
@@ -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 += "Extras |
---|
"
-
- //ERT
- if(jobban_isbanned(M, "Emergency Response Team", P) || isbanned_dept)
- jobs += "Emergency Response Team | "
- else
- jobs += "Emergency Response Team | "
-
- //Survivor
- if(jobban_isbanned(M, "Survivor", P) || isbanned_dept)
- jobs += "Survivor | "
- else
- jobs += "Survivor | "
-
- if(jobban_isbanned(M, "Agent", P) || isbanned_dept)
- jobs += "Agent | "
- else
- jobs += "Agent | "
-
- 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) => {
- act('claim_ticket', { ticket: ticket.ref })}
- />
act('auth_access', { ticket: ticket.ref })}
/>
+ {can_reject === 'Yes' && (
+ act('reject_access', { ticket: ticket.ref })}
+ />
+ )}
);
diff --git a/tools/ci/download_od.sh b/tools/ci/download_od.sh
new file mode 100644
index 000000000000..024f93f9289c
--- /dev/null
+++ b/tools/ci/download_od.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -eo pipefail
+
+if [ -z "${OPENDREAM_VERSION+x}" ]; then
+ source dependencies.sh
+fi
+
+git clone https://github.com/OpenDreamProject/OpenDream.git ~/OpenDream
+cd ~/OpenDream
+git checkout tags/v${OPENDREAM_VERSION}
+git submodule update --init --recursive
diff --git a/tools/ci/run_od.sh b/tools/ci/run_od.sh
new file mode 100644
index 000000000000..3eeac5907353
--- /dev/null
+++ b/tools/ci/run_od.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -eo pipefail
+
+dotnet ~/OpenDream/DMCompiler/bin/Release/net7.0/DMCompiler.dll --suppress-unimplemented colonialmarines.dme
diff --git a/tools/ci/setup_od.sh b/tools/ci/setup_od.sh
new file mode 100644
index 000000000000..6d2ec170687c
--- /dev/null
+++ b/tools/ci/setup_od.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+set -eo pipefail
+
+cd ~/OpenDream
+
+dotnet restore
+dotnet build -c Release
diff --git a/tools/ci/validate_dme.py b/tools/ci/validate_dme.py
index 33066f72e75e..55666480425d 100644
--- a/tools/ci/validate_dme.py
+++ b/tools/ci/validate_dme.py
@@ -17,6 +17,9 @@
# Included by BSQL/includes.dm
r'code/__HELPERS/BSQL/**/*.dm',
+
+ # Included as part of OD lints
+ r'code/__pragmas.dm'
]
lines = []