diff --git a/.github/workflows/autowiki.yml b/.github/workflows/autowiki.yml index 82d0ac76f32f..fec68f2ca332 100644 --- a/.github/workflows/autowiki.yml +++ b/.github/workflows/autowiki.yml @@ -8,7 +8,7 @@ permissions: jobs: autowiki: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - name: "Check for AUTOWIKI_USERNAME" id: secrets_set @@ -32,7 +32,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt update || true - sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386 + sudo apt install -o APT::Immediate-Configure=false zlib1g-dev:i386 libssl-dev:i386 bash tools/ci/install_rust_g.sh - name: Compile and generate Autowiki files if: steps.secrets_set.outputs.SECRETS_ENABLED diff --git a/README.md b/README.md index 94ccaf07031f..abac21f624f0 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ ## CM-SS13 codebase -[![resentment](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://www.monkeyuser.com/assets/images/2019/131-bug-free.png) [![resentment](https://forthebadge.com/images/badges/contains-technical-debt.svg)](https://user-images.githubusercontent.com/8171642/50290880-ffef5500-043a-11e9-8270-a2e5b697c86c.png) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) + [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) [![Build Status](https://github.com/cmss13-devs/cmss13/workflows/CI%20Suite/badge.svg)](https://github.com/cmss13-devs/cmss13/actions?query=workflow%3A%22CI+Suite%22) - * **Website:** https://forum.cm-ss13.com/ * **Code:** https://github.com/cmss13-devs/cmss13 * **Wiki:** https://cm-ss13.com/wiki/Main_Page @@ -36,5 +35,3 @@ The code for CM-SS13 is licensed under the [GNU Affero General Public License v3 Assets including icons and sound are under the [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. Authorship for assets including art and sound under the CC BY-SA license is defined as the active development team of CM-SS13 unless stated otherwise (by author of the commit). All code is assumed to be licensed under AGPL v3 unless stated otherwise by file header. Commits before 9a001bf520f889b434acd295253a1052420860af are assumed to be licensed under GPLv3 and can be used in closed source repo. - - diff --git a/code/__DEFINES/ARES.dm b/code/__DEFINES/ARES.dm index ec84a6ab5992..a1b82af25821 100644 --- a/code/__DEFINES/ARES.dm +++ b/code/__DEFINES/ARES.dm @@ -26,6 +26,7 @@ #define ARES_RECORD_SECURITY "Security Update" #define ARES_RECORD_MAINTENANCE "Maintenance Ticket" #define ARES_RECORD_ACCESS "Access Ticket" +#define ARES_RECORD_FLIGHT "Flight Record" /// Not by ARES logged through marine_announcement() #define ARES_LOG_NONE 0 @@ -34,13 +35,14 @@ /// Logged in the security updates #define ARES_LOG_SECURITY 2 -/// Access levels specifically for Working Joe management console -#define APOLLO_ACCESS_REQUEST 0 -#define APOLLO_ACCESS_REPORTER 1 -#define APOLLO_ACCESS_TEMP 2 -#define APOLLO_ACCESS_AUTHED 3 -#define APOLLO_ACCESS_JOE 4 -#define APOLLO_ACCESS_DEBUG 5 +// Access levels specifically for Working Joe management console +#define APOLLO_ACCESS_LOGOUT 0 +#define APOLLO_ACCESS_REQUEST 1 +#define APOLLO_ACCESS_REPORTER 2 +#define APOLLO_ACCESS_TEMP 3 +#define APOLLO_ACCESS_AUTHED 4 +#define APOLLO_ACCESS_JOE 5 +#define APOLLO_ACCESS_DEBUG 6 /// Ticket statuses, both for Access and Maintenance /// Pending assignment/rejection @@ -54,6 +56,13 @@ /// Completed by WJs #define TICKET_COMPLETED "completed" +/// Granted Access Ticket +#define TICKET_GRANTED "granted" +/// Revoked Access Ticket +#define TICKET_REVOKED "revoked" +/// Self-Returned Access Ticket +#define TICKET_RETURNED "returned" + /// Checks for if buttons can be used, these may yet be removed and internalised to the UI programming #define TICKET_OPEN "OPEN" #define TICKET_CLOSED "CLOSED" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index fcc3e7784cb5..3abd79708f7a 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -41,3 +41,4 @@ var/MAX_EXPLOSION_RANGE = 14 /// Used in /obj/structure/pipes/vents/proc/create_gas #define VENT_GAS_SMOKE "Smoke" #define VENT_GAS_CN20 "CN20 Nerve Gas" +#define VENT_GAS_CN20_XENO "CN20-X Nerve Gas" diff --git a/code/__DEFINES/colours.dm b/code/__DEFINES/colours.dm index b7457f9ae478..5fa106715f39 100644 --- a/code/__DEFINES/colours.dm +++ b/code/__DEFINES/colours.dm @@ -142,6 +142,9 @@ * * Important note: colours can end up significantly different from the basic html picture, especially when saturated */ + +/// Full white. rgb(255, 255, 255) +#define LIGHT_COLOR_WHITE "#FFFFFF" /// Bright but quickly dissipating neon green. rgb(100, 200, 100) #define LIGHT_COLOUR_GREEN "#64C864" /// Electric green. rgb(0, 255, 0) diff --git a/code/__DEFINES/conflict.dm b/code/__DEFINES/conflict.dm index 30b2627bb1b0..0820c709cdae 100644 --- a/code/__DEFINES/conflict.dm +++ b/code/__DEFINES/conflict.dm @@ -26,7 +26,7 @@ #define AMMO_IGNORE_RESIST (1<<10) #define AMMO_BALLISTIC (1<<11) #define AMMO_IGNORE_COVER (1<<12) -// (1<<13) unused, previously was AMMO_SCANS_NEARBY +#define AMMO_ANTIVEHICLE (1<<13) #define AMMO_STOPPED_BY_COVER (1<<14) #define AMMO_SPECIAL_EMBED (1<<15) /// If the projectile hits a dense turf it'll do on_hit_turf on the turf just in front of the turf instead of on the turf itself @@ -90,6 +90,8 @@ #define ATTACH_IGNORE_EMPTY (1<<5) /// This attachment should activate if you attack() with it attached. #define ATTACH_MELEE (1<<6) +/// Override for attachies so you can fire them with a single hand . ONLY FOR PROJECTILES!! +#define ATTACH_WIELD_OVERRIDE (1<<7) //Ammo magazine defines, for flags_magazine @@ -218,6 +220,7 @@ #define UNIFORM_HAS_SENSORS 1 #define UNIFORM_FORCED_SENSORS 2 +#define EYE_PROTECTION_NEGATIVE -1 #define EYE_PROTECTION_NONE 0 #define EYE_PROTECTION_FLAVOR 1 #define EYE_PROTECTION_FLASH 2 diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index e1f221dccbde..9368caf3c6e3 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -3,6 +3,7 @@ #define COOLDOWN_HIJACK_BARRAGE "gamemode_explosive_barrage" #define COOLDOWN_HIJACK_GROUND_CHECK "gamemode_ground_check" #define COOLDOWN_ITEM_HOOD_SOUND "item_hood_sound" +#define COOLDOWN_LIGHT "cooldown_light" //Define for ship alt #define COOLDOWN_ALTITUDE_CHANGE "altitude_change" 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 b38339d1af17..0a9e00b59e04 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm @@ -12,7 +12,7 @@ #define COMSIG_HUMAN_REVIVED "human_revived" /// From /mob/living/carbon/human/bullet_act #define COMSIG_HUMAN_PRE_BULLET_ACT "human_pre_bullet_act" -/// From /mob/living/carbon/human/bullet_act(): (damage_result, ammo_flags, obj/item/projectile/P) +/// From /mob/living/carbon/human/bullet_act(): (damage_result, ammo_flags, obj/projectile/P) #define COMSIG_HUMAN_BULLET_ACT "human_bullet_act" #define COMPONENT_CANCEL_BULLET_ACT (1<<0) diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm index 323e0ee6966c..9eff6fa3ddc8 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm @@ -116,3 +116,9 @@ #define COMSIG_MOB_MOUSEDRAG "mob_mousedrag" //from /client/MouseDrag(): (atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) #define COMSIG_MOB_CLICK_CANCELED (1<<0) #define COMSIG_MOB_CLICK_HANDLED (1<<1) + +#define COMSIG_MOB_DEPLOYED_BIPOD "mob_deployed_bipod" +#define COMSIG_MOB_UNDEPLOYED_BIPOD "mob_undeployed_bipod" + +/// From /obj/item/proc/pickup() : (obj/item/picked_up) +#define COMSIG_MOB_PICKUP_ITEM "mob_pickup_item" diff --git a/code/__DEFINES/dcs/signals/atom/signals_atom.dm b/code/__DEFINES/dcs/signals/atom/signals_atom.dm index 0cbe28d0438c..7431c5593b17 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_atom.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_atom.dm @@ -26,5 +26,22 @@ ///from /turf/ChangeTurf #define COMSIG_ATOM_TURF_CHANGE "movable_turf_change" +//from atom/set_light(): (l_range, l_power, l_color) +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" + +///Called right before the atom changes the value of light_range to a different one, from base atom/set_light_range(): (new_range) +#define COMSIG_ATOM_SET_LIGHT_RANGE "atom_set_light_range" +///Called right before the atom changes the value of light_power to a different one, from base atom/set_light_power(): (new_power) +#define COMSIG_ATOM_SET_LIGHT_POWER "atom_set_light_power" +///Called right before the atom changes the value of light_color to a different one, from base atom/set_light_color(): (new_color) +#define COMSIG_ATOM_SET_LIGHT_COLOR "atom_set_light_color" +///Called right before the atom changes the value of light_on to a different one, from base atom/set_light_on(): (new_value) +#define COMSIG_ATOM_SET_LIGHT_ON "atom_set_light_on" +///Called right before the atom changes the value of light_flags to a different one, from base atom/set_light_flags(): (new_value) +#define COMSIG_ATOM_SET_LIGHT_FLAGS "atom_set_light_flags" + +///from base of atom/set_opacity(): (new_opacity) +#define COMSIG_ATOM_SET_OPACITY "atom_set_opacity" + ///When the transform or an atom is varedited through vv topic. #define COMSIG_ATOM_VV_MODIFY_TRANSFORM "atom_vv_modify_transform" diff --git a/code/__DEFINES/dcs/signals/atom/signals_item.dm b/code/__DEFINES/dcs/signals/atom/signals_item.dm index b7bbca9f64a3..6c31b77f76a4 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_item.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_item.dm @@ -55,6 +55,11 @@ #define COMSIG_GUN_BURST_SHOTS_TO_FIRE_MODIFIED "gun_burst_shots_to_fire_modified" #define COMSIG_GUN_BURST_SHOT_DELAY_MODIFIED "gun_burst_shot_delay_modified" +#define COMSIG_GUN_VULTURE_FIRED_ONEHAND "gun_vulture_fired_onehand" +#define COMSIG_VULTURE_SCOPE_MOVED "vulture_scope_moved" +#define COMSIG_VULTURE_SCOPE_SCOPED "vulture_scope_scoped" +#define COMSIG_VULTURE_SCOPE_UNSCOPED "vulture_scope_unscoped" + /// from /obj/item/weapon/gun/proc/recalculate_attachment_bonuses() : () #define COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES "gun_recalculate_attachment_bonuses" diff --git a/code/__DEFINES/dcs/signals/atom/signals_projectile.dm b/code/__DEFINES/dcs/signals/atom/signals_projectile.dm index 861f351a1f58..46014d5351d5 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_projectile.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_projectile.dm @@ -15,17 +15,17 @@ #define COMSIG_AMMO_POINT_BLANK "ammo_point_blank" #define COMPONENT_CANCEL_AMMO_POINT_BLANK (1<<0) -/// From /obj/item/projectile/handle_mob(): (mob/living/target) +/// From /obj/projectile/handle_mob(): (mob/living/target) #define COMSIG_BULLET_PRE_HANDLE_MOB "bullet_pre_handle_mob" -/// From /obj/item/projectile/handle_mob(): (mob/living/target) +/// From /obj/projectile/handle_mob(): (mob/living/target) #define COMSIG_BULLET_POST_HANDLE_MOB "bullet_post_handle_mob" -/// From /obj/item/projectile/handle_obj(): (obj/target, did_hit) +/// From /obj/projectile/handle_obj(): (obj/target, did_hit) #define COMSIG_BULLET_POST_HANDLE_OBJ "bullet_post_handle_obj" -/// From /obj/item/projectile/handle_obj(): (obj/target) +/// From /obj/projectile/handle_obj(): (obj/target) #define COMSIG_BULLET_PRE_HANDLE_OBJ "bullet_pre_handle_obj" -/// From /obj/item/projectile/scan_a_turf(): (turf/target) +/// From /obj/projectile/scan_a_turf(): (turf/target) #define COMSIG_BULLET_POST_HANDLE_TURF "bullet_post_handle_turf" -/// From /obj/item/projectile/scan_a_turf(): (turf/target) +/// From /obj/projectile/scan_a_turf(): (turf/target) #define COMSIG_BULLET_PRE_HANDLE_TURF "bullet_pre_handle_turf" #define COMPONENT_BULLET_PASS_THROUGH (1<<0) #define COMSIG_BULLET_TERMINAL "bullet_terminal" diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index 461eae27a2a3..210aee450406 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -42,6 +42,8 @@ #define ATOM_DECORATED (1<<16) /// Whether or not the object uses hearing #define USES_HEARING (1<<17) +/// Should we use the initial icon for display? Mostly used by overlay only objects +#define HTML_USE_INITAL_ICON (1<<18) //========================================================================================== @@ -233,6 +235,8 @@ #define SLOT_LEGS (1<<13) #define SLOT_ACCESSORY (1<<14) #define SLOT_SUIT_STORE (1<<15) //this allows items to be stored in the suit slot regardless of suit +/// Anything with this flag cannot be worn in suit storage, period. +#define SLOT_BLOCK_SUIT_STORE (1<<16) //================================================= //slots diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 78d90c65ecb1..38e5693dcbe5 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -17,3 +17,9 @@ #define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE) /// Used for HUD objects #define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE) + +// Notification action types +#define NOTIFY_JUMP "jump" +#define NOTIFY_ATTACK "attack" +#define NOTIFY_ORBIT "orbit" +#define NOTIFY_JOIN_XENO "join_xeno" diff --git a/code/__DEFINES/human.dm b/code/__DEFINES/human.dm index 846119d6b55d..ebf08f495752 100644 --- a/code/__DEFINES/human.dm +++ b/code/__DEFINES/human.dm @@ -116,14 +116,15 @@ #define ORDER_FOCUS_MAX_LEVEL 50 //Human Overlays Indexes used in update_icons///////// -#define UNDERWEAR_LAYER 41 -#define UNDERSHIRT_LAYER 40 -#define MUTANTRACE_LAYER 39 +#define BODYPARTS_LAYER 42 +#define DAMAGE_LAYER 41 -/// For use by Hunter Flay -#define FLAY_LAYER 38 +#define UNDERWEAR_LAYER 40 +#define UNDERSHIRT_LAYER 39 +#define MUTANTRACE_LAYER 38 -#define DAMAGE_LAYER 37 +/// For use by Hunter Flay +#define FLAY_LAYER 37 #define UNIFORM_LAYER 36 /// bs12 specific. this hack is probably gonna come back to haunt me @@ -176,7 +177,7 @@ /// If you're hit by an acid DoT #define EFFECTS_LAYER 1 -#define TOTAL_LAYERS 41 +#define TOTAL_LAYERS 42 ////////////////////////////////// //Synthetic Defines diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index eac5121f173e..600f7d14b0aa 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -288,12 +288,16 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST //-------- TWE --------// #define JOB_TWE_REPRESENTATIVE "TWE Representative" -#define JOB_TWE_YONTO "RMC Yonto" -#define JOB_TWE_SANTO "RMC Santo" -#define JOB_TWE_NITO "RMC Nito" -#define JOB_TWE_ITTO "RMC Itto" +//RMC +#define JOB_TWE_RMC_RIFLEMAN "RMC Rifleman" +#define JOB_TWE_RMC_MARKSMAN "RMC Marksman" +#define JOB_TWE_RMC_SMARTGUNNER "RMC Smartgunner" +#define JOB_TWE_RMC_BREACHER "RMC Breacher" +#define JOB_TWE_RMC_TEAMLEADER "RMC Team Leader" +#define JOB_TWE_RMC_LIEUTENANT "RMC Lieutenant" +#define JOB_TWE_RMC_COMMANDER "RMC Commander" -#define TWE_COMMANDO_JOB_LIST list(JOB_TWE_YONTO, JOB_TWE_SANTO, JOB_TWE_NITO, JOB_TWE_ITTO) +#define TWE_COMMANDO_JOB_LIST list(JOB_TWE_RMC_RIFLEMAN, JOB_TWE_RMC_BREACHER, JOB_TWE_RMC_SMARTGUNNER,JOB_TWE_RMC_MARKSMAN ,JOB_TWE_RMC_TEAMLEADER, JOB_TWE_RMC_LIEUTENANT, JOB_TWE_RMC_COMMANDER) #define JOB_TWE_SEAMAN "TWE Seaman" #define JOB_TWE_LSEAMAN "TWE Leading Seaman" @@ -326,7 +330,6 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_TIS_SA "UAAC-TIS Special Agent" #define TIS_JOB_LIST list(JOB_TIS_SA, JOB_TIS_IO) - //-------- DUTCH'S DOZEN --------// #define JOB_DUTCH_ARNOLD "Dutch's Dozen - Dutch" #define JOB_DUTCH_RIFLEMAN "Dutch's Dozen - Rifleman" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 74a390e2db47..c0ccd5164b0b 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -141,8 +141,6 @@ #define ABOVE_FLY_LAYER 6 -#define ABOVE_LIGHTING_PLANE 16 - /// blip from motion detector #define BELOW_FULLSCREEN_LAYER 16.9 #define FULLSCREEN_LAYER 17 @@ -160,6 +158,8 @@ #define FULLSCREEN_BLIND_LAYER 17.15 /// pain flashes #define FULLSCREEN_PAIN_LAYER 17.2 +/// Vulture sniper/spotter scope +#define FULLSCREEN_VULTURE_SCOPE_LAYER 17.21 /// in critical #define FULLSCREEN_CRIT_LAYER 17.25 @@ -168,11 +168,44 @@ #define CINEMATIC_LAYER 21 -#define TYPING_LAYER 500 - /// for areas, so they appear above everything else on map file. #define AREAS_LAYER 999 +//---------- EMISSIVES ------------- +//Layering order of these is not particularly meaningful. +//Important part is the seperation of the planes for control via plane_master + +/// This plane masks out lighting to create an "emissive" effect, ie for glowing lights in otherwise dark areas. +#define EMISSIVE_PLANE 90 +/// The render target used by the emissive layer. +#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" +/// The layer you should use if you _really_ don't want an emissive overlay to be blocked. +#define EMISSIVE_LAYER_UNBLOCKABLE 9999 + +#define LIGHTING_BACKPLANE_LAYER 14.5 + +#define LIGHTING_RENDER_TARGET "LIGHT_PLANE" + +#define SHADOW_RENDER_TARGET "SHADOW_RENDER_TARGET" + +/// Plane for balloon text (text that fades up) +#define BALLOON_CHAT_PLANE 110 +/// Bubble for typing indicators +#define TYPING_LAYER 500 + +#define O_LIGHTING_VISUAL_PLANE 120 +#define O_LIGHTING_VISUAL_LAYER 16 +#define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" + +#define LIGHTING_PRIMARY_LAYER 15 //The layer for the main lights of the station +#define LIGHTING_PRIMARY_DIMMER_LAYER 15.1 //The layer that dims the main lights of the station +#define LIGHTING_SECONDARY_LAYER 16 //The colourful, usually small lights that go on top + +#define LIGHTING_SHADOW_LAYER 17 //Where the shadows happen + +#define ABOVE_LIGHTING_PLANE 150 +#define ABOVE_LIGHTING_LAYER 18 + /*=============================*\ | | | PLANE DEFINES | @@ -194,6 +227,7 @@ #define GHOST_PLANE 80 +///--------------- FULLSCREEN RUNECHAT BUBBLES ------------ #define LIGHTING_PLANE 100 #define EXTERIOR_LIGHTING_PLANE 101 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 5a4ba7676233..097a0f5d5e71 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,5 +1,109 @@ +///Object doesn't use any of the light systems. Should be changed to add a light source to the object. +#define NO_LIGHT_SUPPORT 0 +///Light made with the lighting datums, applying a matrix. +#define STATIC_LIGHT 1 +///Light made by masking the lighting darkness plane. +#define MOVABLE_LIGHT 2 +///A mix of the above, cheaper on moving items than dynamic, but heavier on rendering than movable +#define HYBRID_LIGHT 3 +///Pointy light +#define DIRECTIONAL_LIGHT 4 + +#define LIGHT_ATTACHED (1<<0) + +#define MINIMUM_USEFUL_LIGHT_RANGE 1.4 + +#define LIGHTING_ICON 'icons/effects/lighting_object.dmi' // icon used for lighting shading effects +#define LIGHTING_ICON_BIG 'icons/effects/lighting_object_big.dmi' //! icon used for lighting shading effects + +#define ALPHA_TO_INTENSITY(alpha) (-(((clamp(alpha, 0, 22) - 22) / 6) ** 4) + 255) + + +#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow. + #define LIGHTING_PLANE_ALPHA_VISIBLE 255 ///The dim natural vision of Yautja #define LIGHTING_PLANE_ALPHA_YAUTJA 235 +#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192 #define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 127 #define LIGHTING_PLANE_ALPHA_INVISIBLE 0 + + +#define FLASH_LIGHT_DURATION 2 +#define FLASH_LIGHT_POWER 3 +#define FLASH_LIGHT_RANGE 3.8 + +// Emissive blocking. +/// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. +#define EMISSIVE_BLOCK_GENERIC 1 +/// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. +#define EMISSIVE_BLOCK_UNIQUE 2 + +/// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. +#define EMISSIVE_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 1,1,1,0) +/// A globaly cached version of [EMISSIVE_COLOR] for quick access. +GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) +/// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. +#define EM_BLOCK_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) +/// A globaly cached version of [EM_BLOCK_COLOR] for quick access. +GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) +/// A set of appearance flags applied to all emissive and emissive blocker overlays. +#define EMISSIVE_APPEARANCE_FLAGS (KEEP_APART|KEEP_TOGETHER|RESET_COLOR|RESET_TRANSFORM) +/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. +#define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) +/// A globaly cached version of [EM_MASK_MATRIX] for quick access. +GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) + +/// Returns the red part of a #RRGGBB hex sequence as number +#define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4)) + +/// Returns the green part of a #RRGGBB hex sequence as number +#define GETGREENPART(hexa) hex2num(copytext(hexa, 4, 6)) + +/// Returns the blue part of a #RRGGBB hex sequence as number +#define GETBLUEPART(hexa) hex2num(copytext(hexa, 6, 8)) + +/// Parse the hexadecimal color into lumcounts of each perspective. +#define PARSE_LIGHT_COLOR(source) \ +do { \ + if (source.light_color != COLOR_WHITE) { \ + var/__light_color = source.light_color; \ + source.lum_r = GETREDPART(__light_color) / 255; \ + source.lum_g = GETGREENPART(__light_color) / 255; \ + source.lum_b = GETBLUEPART(__light_color) / 255; \ + } else { \ + source.lum_r = 1; \ + source.lum_g = 1; \ + source.lum_b = 1; \ + }; \ +} while (FALSE) + + +//Bay lighting engine shit, not in /code/modules/lighting because BYOND is being shit about it //thats how defines work, hello? +#define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process + +#define MOVABLE_MAX_RANGE 7 + +#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square +#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources +#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone +#define LIGHTING_ROUND_VALUE (1 / 64) //Value used to round lumcounts, values smaller than 1/129 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY. + +/// If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting objects. Set to zero to disable soft lighting. Luminosity changes then work if it's lit at all. +#define LIGHTING_SOFT_THRESHOLD 0 + +// If I were you I'd leave this alone. +#define LIGHTING_BASE_MATRIX \ + list \ + ( \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 0, 0, 0, 1 \ + ) \ + +#define LIGHTING_NO_UPDATE 0 +#define LIGHTING_VIS_UPDATE 1 +#define LIGHTING_CHECK_UPDATE 2 +#define LIGHTING_FORCE_UPDATE 3 diff --git a/code/__DEFINES/mob_hud.dm b/code/__DEFINES/mob_hud.dm index 2704e52d2f85..02f992694832 100644 --- a/code/__DEFINES/mob_hud.dm +++ b/code/__DEFINES/mob_hud.dm @@ -65,3 +65,6 @@ #define TRACKER_HIVE "Hive Core" #define TRACKER_LEADER "Leader" #define TRACKER_TUNNEL "Tunnel" + +//These are used to manage the same HUD having multiple sources +#define HUD_SOURCE_ADMIN "admin" diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index bb31f4d84b1e..d13fd8169fca 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -6,7 +6,7 @@ #define SHUTTLE_LOCK_COOLDOWN 10 MINUTES #define MONORAIL_LOCK_COOLDOWN 3 MINUTES #define SHUTTLE_LOCK_TIME_LOCK 1 MINUTES -#define EVACUATION_AUTOMATIC_DEPARTURE 10 MINUTES //All pods automatically depart in 10 minutes, unless they are full or unable to launch for some reason. +#define EVACUATION_AUTOMATIC_DEPARTURE (10 MINUTES) //All pods automatically depart in 10 minutes, unless they are full or unable to launch for some reason. #define EVACUATION_ESTIMATE_DEPARTURE ((evac_time + EVACUATION_AUTOMATIC_DEPARTURE - world.time) * 0.1) #define EVACUATION_STATUS_STANDING_BY 0 @@ -71,6 +71,7 @@ #define MODE_SHIPSIDE_SD (1<<8) /// Toggles whether Predators can big SD when not on the groundmap #define MODE_HARDCORE_PERMA (1<<9) /// Toggles Hardcore for all marines, meaning they instantly perma upon death #define MODE_DISPOSABLE_MOBS (1<<10) // Toggles if mobs fit in disposals or not. Off by default. +#define MODE_BYPASS_JOE (1<<11) // Toggles if ghosts can bypass Working Joe spawn limitations, does NOT bypass WL requirement. Off by default. #define ROUNDSTATUS_FOG_DOWN 1 #define ROUNDSTATUS_PODDOORS_OPEN 2 @@ -240,7 +241,7 @@ var/global/list/whitelist_hierarchy = list(WHITELIST_NORMAL, WHITELIST_COUNCIL, #define FACTION_LIST_MARINE list(FACTION_MARINE) #define FACTION_LIST_HUMANOID list(FACTION_MARINE, FACTION_PMC, FACTION_WY, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_SURVIVOR, FACTION_NEUTRAL, FACTION_COLONIST, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_YAUTJA, FACTION_ZOMBIE) -#define FACTION_LIST_ERT list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_MARSHAL) +#define FACTION_LIST_ERT list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_MARSHAL, FACTION_TWE) #define FACTION_LIST_WY list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) #define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) #define FACTION_LIST_MARINE_UPP list(FACTION_MARINE, FACTION_UPP) diff --git a/code/__DEFINES/objects.dm b/code/__DEFINES/objects.dm index 0a34ac9d6fe9..a6b95c879ae4 100644 --- a/code/__DEFINES/objects.dm +++ b/code/__DEFINES/objects.dm @@ -168,3 +168,8 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse // For reinforced table status #define RTABLE_WEAKENED 1 #define RTABLE_NORMAL 2 + +//Lights define +#define CHECKS_PASSED 1 +#define STILL_ON_COOLDOWN 2 +#define NO_LIGHT_STATE_CHANGE 3 diff --git a/code/__DEFINES/pred.dm b/code/__DEFINES/pred.dm index 5826a2ca56f6..a8bc1007d51e 100644 --- a/code/__DEFINES/pred.dm +++ b/code/__DEFINES/pred.dm @@ -1,5 +1,6 @@ #define PRED_MATERIALS list("ebony", "silver", "bronze", "crimson", "bone") #define PRED_TRANSLATORS list("Modern", "Retro", "Combo") +#define PRED_LEGACIES list("None", "Dragon", "Swamp", "Enforcer", "Collector") #define PRED_SKIN_COLOR list("tan", "green", "purple", "blue", "red", "black") #define PRED_YAUTJA_CAPE "yautja cape" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 44f47d7adfdb..e2bd155fcb0d 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -26,6 +26,7 @@ #define RADIO_CHANNEL_HEADSET "headset" #define RADIO_CHANNEL_ENGI "Engi" #define RADIO_CHANNEL_HIGHCOM "HighCom" +#define RADIO_CHANNEL_PROVOST "Provost" #define RADIO_CHANNEL_INTERCOM "intercom" #define RADIO_CHANNEL_INTEL "Intel" #define RADIO_CHANNEL_JTAC "JTAC" @@ -64,5 +65,7 @@ #define RADIO_CHANNEL_DUTCH_DOZEN "DD" #define RADIO_CHANNEL_VAI "VAI" #define RADIO_CHANNEL_CMB "CMB" +#define RADIO_CHANNEL_ROYAL_MARINE "Royal Marine" #define RADIO_CHANNEL_YAUTJA "Yautja" + diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 126a8f82ece8..d283656ccae6 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -95,6 +95,7 @@ #define MOBILE_SHUTTLE_ID_ERT1 "ert_response_shuttle" #define MOBILE_SHUTTLE_ID_ERT2 "ert_pmc_shuttle" #define MOBILE_SHUTTLE_ID_ERT3 "ert_upp_shuttle" +#define MOBILE_SHUTTLE_ID_ERT4 "ert_twe_shuttle" #define MOBILE_SHUTTLE_ID_ERT_SMALL "ert_rescue_shuttle" #define MOBILE_SHUTTLE_ID_ERT_BIG "ert_boarding_shuttle" diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index fdd1a8f083ad..5dabb4545a32 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -8,6 +8,7 @@ #define SKILL_ENGINEER "engineer" #define SKILL_CONSTRUCTION "construction" #define SKILL_LEADERSHIP "leadership" +#define SKILL_OVERWATCH "overwatch" #define SKILL_MEDICAL "medical" #define SKILL_SURGERY "surgery" #define SKILL_RESEARCH "research" @@ -134,7 +135,6 @@ #define SKILL_POWERLOADER_MASTER 2 //Pilot, CT, Req, OT, CE #define SKILL_POWERLOADER_MAX 2 - //leadership skill #define SKILL_LEAD_NOVICE 0 //Anyone but the above. Using SL items is possible but painfully slow #define SKILL_LEAD_TRAINED 1 //SL @@ -142,6 +142,11 @@ #define SKILL_LEAD_MASTER 3 //XO, CO #define SKILL_LEAD_MAX 3 +//overwatch skill +#define SKILL_OVERWATCH_DEFAULT 0 +#define SKILL_OVERWATCH_TRAINED 1 //Allows use of overwatch consoles +#define SKILL_OVERWATCH_MAX 1 + //JTAC skill #define SKILL_JTAC_NOVICE 0 //Anyone but those following. diff --git a/code/__DEFINES/sounds.dm b/code/__DEFINES/sounds.dm index f01ddfc86792..a6bb381100e7 100644 --- a/code/__DEFINES/sounds.dm +++ b/code/__DEFINES/sounds.dm @@ -21,6 +21,7 @@ #define ITEM_EQUIP_VOLUME 50 //Reserved channels +#define SOUND_CHANNEL_NOTIFY 1016 #define SOUND_CHANNEL_VOX 1017 #define SOUND_CHANNEL_MUSIC 1018 #define SOUND_CHANNEL_AMBIENCE 1019 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 1aaf3714182e..793e7b6b2f35 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -177,6 +177,8 @@ #define TRAIT_USING_WHEELCHAIR "t_using_wheelchair" /// If the mob will instantly go permadead upon death #define TRAIT_HARDCORE "t_hardcore" +/// If the mob is able to use the vulture rifle or spotting scope +#define TRAIT_VULTURE_USER "t_vulture_user" // -- ability traits -- /// Xenos with this trait cannot have plasma transfered to them @@ -204,6 +206,10 @@ // GUN TRAITS #define TRAIT_GUN_SILENCED "t_gun_silenced" +#define TRAIT_GUN_BIPODDED "t_gun_bipodded" + +#define TRAIT_GUN_LIGHT_DEACTIVATED "t_gun_light_deactivated" + // Miscellaneous item traits. // Do NOT bloat this category, if needed make a new category (like shoe traits, xeno item traits...) @@ -238,7 +244,8 @@ GLOBAL_LIST_INIT(mob_traits, list( TRAIT_LEADERSHIP, TRAIT_DEXTROUS, TRAIT_REAGENT_SCANNER, - TRAIT_ABILITY_BURROWED + TRAIT_ABILITY_BURROWED, + TRAIT_VULTURE_USER, )) /* @@ -270,6 +277,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EMOTE_CD_EXEMPT" = TRAIT_EMOTE_CD_EXEMPT, "TRAIT_LISPING" = TRAIT_LISPING, "TRAIT_CANNOT_EAT" = TRAIT_CANNOT_EAT, + "TRAIT_VULTURE_USER" = TRAIT_VULTURE_USER, ), /mob/living/carbon/xenomorph = list( "TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER, @@ -298,6 +306,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( ), /obj/item/weapon/gun = list( "TRAIT_GUN_SILENCED" = TRAIT_GUN_SILENCED, + "TRAIT_GUN_BIPODDED" = TRAIT_GUN_BIPODDED, ), /obj/structure/surface/table = list( "TRAIT_STRUCTURE_FLIPPING" = TRAIT_TABLE_FLIPPING, diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index ecdd9f64ec38..eb248e8a30a7 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -134,3 +134,6 @@ #define VV_HK_TOGGLEPOWER "togglepower" #define VV_HK_ADD_ITEMS_TO_VENDOR "add_items_to_vendor" + +// /obj/structure/pipes/vents +#define VV_HK_GAS "release_gas" diff --git a/code/__DEFINES/weapon_stats.dm b/code/__DEFINES/weapon_stats.dm index 590223426a66..beac54d98892 100644 --- a/code/__DEFINES/weapon_stats.dm +++ b/code/__DEFINES/weapon_stats.dm @@ -136,6 +136,7 @@ As such, don't expect any values assigned to common firearms to even consider ho //How many ticks you have to wait between firing. Burst delay uses the same variable! */ +#define FIRE_DELAY_TIER_VULTURE 20 #define FIRE_DELAY_TIER_1 12 #define FIRE_DELAY_TIER_2 10 #define FIRE_DELAY_TIER_3 9 diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 0f822385ad13..b178f0692dd6 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -169,7 +169,7 @@ #define XENO_BURIED_LARVA_TIME_LIMIT (30 MINUTES) /// The time when xenos can start taking over comm towers -#define XENO_COMM_ACQUISITION_TIME (90 MINUTES) +#define XENO_COMM_ACQUISITION_TIME (55 MINUTES) /// The time it takes for a pylon to give one larva while activated #define XENO_PYLON_ACTIVATION_COOLDOWN (5 MINUTES) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 6c913b016083..fe15e6d84c79 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -38,6 +38,32 @@ };\ } while(FALSE) +// binary search sorted insert +// IN: Object to be inserted +// LIST: List to insert object into +#define BINARY_INSERT_NUM(IN, LIST) \ + var/__BIN_CTTL = length(LIST);\ + if(!__BIN_CTTL) {\ + LIST += IN;\ + } else {\ + var/__BIN_LEFT = 1;\ + var/__BIN_RIGHT = __BIN_CTTL;\ + var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + var/__BIN_ITEM;\ + while(__BIN_LEFT < __BIN_RIGHT) {\ + __BIN_ITEM = LIST[__BIN_MID];\ + if(__BIN_ITEM <= IN) {\ + __BIN_LEFT = __BIN_MID + 1;\ + } else {\ + __BIN_RIGHT = __BIN_MID;\ + };\ + __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + };\ + __BIN_ITEM = LIST[__BIN_MID];\ + __BIN_MID = __BIN_ITEM > IN ? __BIN_MID : __BIN_MID + 1;\ + LIST.Insert(__BIN_MID, IN);\ + } + //Like typesof() or subtypesof(), but returns a typecache instead of a list /proc/typecacheof(path, ignore_root_path, only_root_path = FALSE) if(ispath(path)) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index c05795c32b10..66ecf9ea034f 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -268,7 +268,7 @@ // copied from join as xeno var/deathtime = world.time - cur_obs.timeofdeath - if(deathtime < XENO_JOIN_DEAD_TIME && ( !cur_obs.client.admin_holder || !(cur_obs.client.admin_holder.rights & R_ADMIN) || !cur_obs.bypass_time_of_death_checks)) + if(deathtime < XENO_JOIN_DEAD_TIME && ( !cur_obs.client.admin_holder || !(cur_obs.client.admin_holder.rights & R_ADMIN)) && !cur_obs.bypass_time_of_death_checks) continue // AFK players cannot be drafted diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 4c8e1fe31354..99f621919771 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -323,176 +323,138 @@ world . = list(r, g, b) if(usealpha) . += alpha - - /// Create a single [/icon] from a given [/atom] or [/image]. /// /// Very low-performance. Should usually only be used for HTML, where BYOND's /// appearance system (overlays/underlays, etc.) is not available. /// /// Only the first argument is required. -/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) - //Define... defines. +/proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) + // Loop through the underlays, then overlays, sorting them into the layers list + #define PROCESS_OVERLAYS_OR_UNDERLAYS(flat, process, base_layer) \ + for (var/i in 1 to process.len) { \ + var/image/current = process[i]; \ + if (!current) { \ + continue; \ + } \ + if (current.plane != FLOAT_PLANE && current.plane != appearance.plane) { \ + continue; \ + } \ + var/current_layer = current.layer; \ + if (current_layer < 0) { \ + if (current_layer <= -1000) { \ + return flat; \ + } \ + current_layer = base_layer + appearance.layer + current_layer / 1000; \ + } \ + for (var/index_to_compare_to in 1 to layers.len) { \ + var/compare_to = layers[index_to_compare_to]; \ + if (current_layer < layers[compare_to]) { \ + layers.Insert(index_to_compare_to, current); \ + break; \ + } \ + } \ + layers[current] = current_layer; \ + } + var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing") - #define BLANK icon(flat_template) - #define GENERATE_FLAT_IMAGE_ICON(ICON_VAR, IMG_SOURCE, icon_to_use, icon_state_to_use, dir_to_use)\ - var/icon/SELF_ICON=icon(icon(icon_to_use, icon_state_to_use, dir_to_use), "", SOUTH, no_anim ? 1 : null);\ - if(##IMG_SOURCE.alpha < 255)\ - SELF_ICON.Blend(rgb(255, 255, 255, ##IMG_SOURCE.alpha), ICON_MULTIPLY);\ - if(##IMG_SOURCE.color) {\ - if(islist(##IMG_SOURCE.color))\ - SELF_ICON.MapColors(arglist(##IMG_SOURCE.color));\ - else\ - SELF_ICON.Blend(##IMG_SOURCE.color, ICON_MULTIPLY);\ - }\ - ##ICON_VAR = SELF_ICON; - #define INDEX_X_LOW 1 - #define INDEX_X_HIGH 2 - #define INDEX_Y_LOW 3 - #define INDEX_Y_HIGH 4 - - #define flatX1 flat_size[INDEX_X_LOW] - #define flatX2 flat_size[INDEX_X_HIGH] - #define flatY1 flat_size[INDEX_Y_LOW] - #define flatY2 flat_size[INDEX_Y_HIGH] - #define addX1 add_size[INDEX_X_LOW] - #define addX2 add_size[INDEX_X_HIGH] - #define addY1 add_size[INDEX_Y_LOW] - #define addY2 add_size[INDEX_Y_HIGH] - - #define PROCESS_SET_UNDERLAYS 0 - #define PROCESS_SET_VIS_CONTENTS 1 - #define PROCESS_SET_OVERLAYS 2 - - if(!A || A.alpha <= 0) - return BLANK - - var/noIcon = FALSE + if(!appearance || appearance.alpha <= 0) + return icon(flat_template) + if(start) if(!defdir) - defdir = A.dir + defdir = appearance.dir if(!deficon) - deficon = A.icon + deficon = appearance.icon if(!defstate) - defstate = A.icon_state + defstate = appearance.icon_state if(!defblend) - defblend = A.blend_mode + defblend = appearance.blend_mode + + var/curicon = appearance.icon || deficon + var/curstate = appearance.icon_state || defstate + var/curdir = (!appearance.dir || appearance.dir == SOUTH) ? defdir : appearance.dir - var/curicon = A.icon || deficon - var/curstate = A.icon_state || defstate + var/render_icon = curicon - if(!(noIcon = (!curicon))) + if (render_icon) var/curstates = icon_states(curicon) if(!(curstate in curstates)) - if("" in curstates) + if ("" in curstates) curstate = "" else - noIcon = TRUE // Do not render this object. + render_icon = FALSE - var/curdir var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have - //These should use the parent's direction (most likely) - if(!A.dir || A.dir == SOUTH) - curdir = defdir - else - curdir = A.dir - //Try to remove/optimize this section ASAP, CPU hog. //Determines if there's directionals. - if(!noIcon && curdir != SOUTH) - var/exist = FALSE - var/static/list/checkdirs = list(NORTH, EAST, WEST) - for(var/i in checkdirs) //Not using GLOB for a reason. - if(length(icon_states(icon(curicon, curstate, i)))) - exist = TRUE - break - if(!exist) + if(render_icon && curdir != SOUTH) + if ( + !length(icon_states(icon(curicon, curstate, NORTH))) \ + && !length(icon_states(icon(curicon, curstate, EAST))) \ + && !length(icon_states(icon(curicon, curstate, WEST))) \ + ) base_icon_dir = SOUTH if(!base_icon_dir) base_icon_dir = curdir - ASSERT(!BLEND_DEFAULT) //I might just be stupid but lets make sure this define is 0. - - var/curblend = A.blend_mode || defblend + var/curblend = appearance.blend_mode || defblend - var/atom/movable/AM = A - if(length(A.overlays) || length(A.underlays) || (istype(AM) && AM.vis_contents)) - var/icon/flat = BLANK + if(appearance.overlays.len || appearance.underlays.len) + var/icon/flat = icon(flat_template) // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() var/image/copy // Add the atom's icon itself, without pixel_x/y offsets. - if(!noIcon) - copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=base_icon_dir) - copy.color = A.color - copy.alpha = A.alpha + if(render_icon) + copy = image(icon=curicon, icon_state=curstate, layer=appearance.layer, dir=base_icon_dir) + copy.color = appearance.color + copy.alpha = appearance.alpha copy.blend_mode = curblend - layers[copy] = A.layer - - // Loop through the underlays, then vis_contents, then overlays, sorting them into the layers list - for(var/process_set in PROCESS_SET_UNDERLAYS to PROCESS_SET_OVERLAYS) - var/list/process - switch(process_set) - if(PROCESS_SET_UNDERLAYS) - process = A.underlays - if(PROCESS_SET_VIS_CONTENTS) - if(!istype(AM)) - continue - process = A.vis_contents - else // PROCESS_SET_OVERLAYS - process = A.overlays - for(var/i in 1 to process.len) - var/image/current = process[i] - if(!current) - continue - if(process_set == PROCESS_SET_VIS_CONTENTS && !istype(current)) - current = image(icon = current.icon, icon_state = current.icon_state, layer = current.layer, dir = current.dir) - var/current_layer = current.layer - if(current_layer < 0) - if(current_layer <= -1000) - return flat - current_layer = A.layer + ((process_set ? 1000 : 0)+current_layer) / 1000 - - for(var/p in 1 to layers.len) - var/image/cmp = layers[p] - if(current_layer < layers[cmp]) - layers.Insert(p, current) - break - layers[current] = current_layer + layers[copy] = appearance.layer + + PROCESS_OVERLAYS_OR_UNDERLAYS(flat, appearance.underlays, 0) + PROCESS_OVERLAYS_OR_UNDERLAYS(flat, appearance.overlays, 1) var/icon/add // Icon of overlay being added - // Current dimensions of flattened icon - var/list/flat_size = list(1, flat.Width(), 1, flat.Height()) - // Dimensions of overlay being added - var/list/add_size[4] + var/flatX1 = 1 + var/flatX2 = flat.Width() + var/flatY1 = 1 + var/flatY2 = flat.Height() - for(var/V in layers) - var/image/I = V - if(I.alpha == 0) + var/addX1 = 0 + var/addX2 = 0 + var/addY1 = 0 + var/addY2 = 0 + + for(var/image/layer_image as anything in layers) + if(layer_image.alpha == 0) continue - if(I == copy) // 'I' is an /image based on the object being flattened. + if(layer_image == copy) // 'layer_image' is an /image based on the object being flattened. curblend = BLEND_OVERLAY - add = icon(I.icon, I.icon_state, base_icon_dir) - else // 'I' is an /image - var/image_has_icon = I.icon - if(image_has_icon) - GENERATE_FLAT_IMAGE_ICON(add, I, I.icon, I.icon_state, base_icon_dir) + add = icon(layer_image.icon, layer_image.icon_state, base_icon_dir) + else // 'I' is an appearance object. + add = getFlatIcon(image(layer_image), curdir, curicon, curstate, curblend, FALSE, no_anim) if(!add) continue + // Find the new dimensions of the flat icon to fit the added overlay - add_size = list( - min(flatX1, I.pixel_x+1), - max(flatX2, I.pixel_x+add.Width()), - min(flatY1, I.pixel_y+1), - max(flatY2, I.pixel_y+add.Height()) + addX1 = min(flatX1, layer_image.pixel_x + 1) + addX2 = max(flatX2, layer_image.pixel_x + add.Width()) + addY1 = min(flatY1, layer_image.pixel_y + 1) + addY2 = max(flatY2, layer_image.pixel_y + add.Height()) + + if ( + addX1 != flatX1 \ + && addX2 != flatX2 \ + && addY1 != flatY1 \ + && addY2 != flatY2 \ ) - - if(flat_size ~! add_size) // Resize the flattened icon so the new icon fits flat.Crop( addX1 - flatX1 + 1, @@ -500,48 +462,46 @@ world addX2 - flatX1 + 1, addY2 - flatY1 + 1 ) - flat_size = add_size.Copy() + + flatX1 = addX1 + flatX2 = addY1 + flatY1 = addX2 + flatY2 = addY2 // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1) + flat.Blend(add, blendMode2iconMode(curblend), layer_image.pixel_x + 2 - flatX1, layer_image.pixel_y + 2 - flatY1) - if(A.color) - if(islist(A.color)) - flat.MapColors(arglist(A.color)) + if(appearance.color) + if(islist(appearance.color)) + flat.MapColors(arglist(appearance.color)) else - flat.Blend(A.color, ICON_MULTIPLY) + flat.Blend(appearance.color, ICON_MULTIPLY) - if(A.alpha < 255) - flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + if(appearance.alpha < 255) + flat.Blend(rgb(255, 255, 255, appearance.alpha), ICON_MULTIPLY) if(no_anim) //Clean up repeated frames var/icon/cleaned = new /icon() cleaned.Insert(flat, "", SOUTH, 1, 0) - . = cleaned + return cleaned else - . = icon(flat, "", SOUTH) - else //There's no overlays. - if(!noIcon) - GENERATE_FLAT_IMAGE_ICON(., A, curicon, curstate, base_icon_dir) - - //Clear defines - #undef flatX1 - #undef flatX2 - #undef flatY1 - #undef flatY2 - #undef addX1 - #undef addX2 - #undef addY1 - #undef addY2 - - #undef INDEX_X_LOW - #undef INDEX_X_HIGH - #undef INDEX_Y_LOW - #undef INDEX_Y_HIGH - - #undef GENERATE_FLAT_IMAGE_ICON - #undef BLANK + return icon(flat, "", SOUTH) + else if (render_icon) // There's no overlays. + var/icon/final_icon = icon(icon(curicon, curstate, base_icon_dir), "", SOUTH, no_anim ? TRUE : null) + + if (appearance.alpha < 255) + final_icon.Blend(rgb(255,255,255, appearance.alpha), ICON_MULTIPLY) + + if (appearance.color) + if (islist(appearance.color)) + final_icon.MapColors(arglist(appearance.color)) + else + final_icon.Blend(appearance.color, ICON_MULTIPLY) + + return final_icon + + #undef PROCESS_OVERLAYS_OR_UNDERLAYS /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. @@ -611,12 +571,100 @@ world I.color = color I.flick_overlay(src, time) -/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE) +/// generates a filename for a given asset. +/// like generate_asset_name(), except returns the rsc reference and the rsc file hash as well as the asset name (sans extension) +/// used so that certain asset files dont have to be hashed twice +/proc/generate_and_hash_rsc_file(file, dmi_file_path) + var/rsc_ref = fcopy_rsc(file) + var/hash + //if we have a valid dmi file path we can trust md5'ing the rsc file because we know it doesnt have the bug described in http://www.byond.com/forum/post/2611357 + if(dmi_file_path) + hash = md5(rsc_ref) + else //otherwise, we need to do the expensive fcopy() workaround + hash = md5asfile(rsc_ref) + + return list(rsc_ref, hash, "asset.[hash]") + +///given a text string, returns whether it is a valid dmi icons folder path +/proc/is_valid_dmi_file(icon_path) + if(!istext(icon_path) || !length(icon_path)) + return FALSE + + var/is_in_icon_folder = findtextEx(icon_path, "icons/") + var/is_dmi_file = findtextEx(icon_path, ".dmi") + + if(is_in_icon_folder && is_dmi_file) + return TRUE + return FALSE + +/// given an icon object, dmi file path, or atom/image/mutable_appearance, attempts to find and return an associated dmi file path. +/// a weird quirk about dm is that /icon objects represent both compile-time or dynamic icons in the rsc, +/// but stringifying rsc references returns a dmi file path +/// ONLY if that icon represents a completely unchanged dmi file from when the game was compiled. +/// so if the given object is associated with an icon that was in the rsc when the game was compiled, this returns a path. otherwise it returns "" +/proc/get_icon_dmi_path(icon/icon) + /// the dmi file path we attempt to return if the given object argument is associated with a stringifiable icon + /// if successful, this looks like "icons/path/to/dmi_file.dmi" + var/icon_path = "" + + if(isatom(icon) || istype(icon, /image) || istype(icon, /mutable_appearance)) + var/atom/atom_icon = icon + icon = atom_icon.icon + //atom icons compiled in from 'icons/path/to/dmi_file.dmi' are weird and not really icon objects that you generate with icon(). + //if theyre unchanged dmi's then they're stringifiable to "icons/path/to/dmi_file.dmi" + + if(isicon(icon) && isfile(icon)) + //icons compiled in from 'icons/path/to/dmi_file.dmi' at compile time are weird and arent really /icon objects, + ///but they pass both isicon() and isfile() checks. theyre the easiest case since stringifying them gives us the path we want + var/icon_ref = text_ref(icon) + var/locate_icon_string = "[locate(icon_ref)]" + + icon_path = locate_icon_string + + else if(isicon(icon) && "[icon]" == "/icon") + // icon objects generated from icon() at runtime are icons, but they ARENT files themselves, they represent icon files. + // if the files they represent are compile time dmi files in the rsc, then + // the rsc reference returned by fcopy_rsc() will be stringifiable to "icons/path/to/dmi_file.dmi" + var/rsc_ref = fcopy_rsc(icon) + + var/icon_ref = text_ref(rsc_ref) + + var/icon_path_string = "[locate(icon_ref)]" + + icon_path = icon_path_string + + else if(istext(icon)) + var/rsc_ref = fcopy_rsc(icon) + //if its the text path of an existing dmi file, the rsc reference returned by fcopy_rsc() will be stringifiable to a dmi path + + var/rsc_ref_ref = text_ref(rsc_ref) + var/rsc_ref_string = "[locate(rsc_ref_ref)]" + + icon_path = rsc_ref_string + + if(is_valid_dmi_file(icon_path)) + return icon_path + + return FALSE + +/** + * generate an asset for the given icon or the icon of the given appearance for [thing], and send it to any clients in target. + * Arguments: + * * thing - either a /icon object, or an object that has an appearance (atom, image, mutable_appearance). + * * target - either a reference to or a list of references to /client's or mobs with clients + * * icon_state - string to force a particular icon_state for the icon to be used + * * dir - dir number to force a particular direction for the icon to be used + * * frame - what frame of the icon_state's animation for the icon being used + * * moving - whether or not to use a moving state for the given icon + * * sourceonly - if TRUE, only generate the asset and send back the asset url, instead of tags that display the icon to players + * * extra_clases - string of extra css classes to use when returning the icon string + */ +/proc/icon2html(atom/thing, client/target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null) if (!thing) return var/key - var/icon/I = thing + var/icon/icon2collapse = thing if (!target) return @@ -628,46 +676,64 @@ world targets = list(target) else targets = target - if (!targets.len) - return - if (!isicon(I)) + if(!length(targets)) + return + + //check if the given object is associated with a dmi file in the icons folder. if it is then we dont need to do a lot of work + //for asset generation to get around byond limitations + var/icon_path = get_icon_dmi_path(thing) + + if (!isicon(icon2collapse)) if (isfile(thing)) //special snowflake - var/name = sanitize_filename("[generate_asset_name(thing)].png") + var/name = SANITIZE_FILENAME("[generate_asset_name(thing)].png") if (!SSassets.cache[name]) SSassets.transport.register_asset(name, thing) for (var/thing2 in targets) SSassets.transport.send_assets(thing2, name) if(sourceonly) return SSassets.transport.get_asset_url(name) - return "" - var/atom/A = thing + return "" + + //its either an atom, image, or mutable_appearance, we want its icon var + icon2collapse = thing.icon - I = A.icon if (isnull(icon_state)) - icon_state = A.icon_state - if (!icon_state) - icon_state = initial(A.icon_state) + icon_state = thing.icon_state + //Despite casting to atom, this code path supports mutable appearances, so let's be nice to them + if(isnull(icon_state) || (isatom(thing) && thing.flags_atom & HTML_USE_INITAL_ICON)) + icon_state = initial(thing.icon_state) if (isnull(dir)) - dir = initial(A.dir) + dir = initial(thing.dir) if (isnull(dir)) - dir = A.dir + dir = thing.dir + + if (ishuman(thing)) // Shitty workaround for a BYOND issue. + var/icon/temp = icon2collapse + icon2collapse = icon() + icon2collapse.Insert(temp, dir = SOUTH) + dir = SOUTH else if (isnull(dir)) dir = SOUTH if (isnull(icon_state)) icon_state = "" - I = icon(I, icon_state, dir, frame, moving) + icon2collapse = icon(icon2collapse, icon_state, dir, frame, moving) + + var/list/name_and_ref = generate_and_hash_rsc_file(icon2collapse, icon_path)//pretend that tuples exist + + var/rsc_ref = name_and_ref[1] //weird object thats not even readable to the debugger, represents a reference to the icons rsc entry + var/file_hash = name_and_ref[2] + key = "[name_and_ref[3]].png" - key = "[generate_asset_name(I)].png" if(!SSassets.cache[key]) - SSassets.transport.register_asset(key, I) - for (var/thing2 in targets) - SSassets.transport.send_assets(thing2, key) + SSassets.transport.register_asset(key, rsc_ref, file_hash, icon_path) + for (var/client_target in targets) + SSassets.transport.send_assets(client_target, key) if(sourceonly) return SSassets.transport.get_asset_url(key) - return "" + return "" //Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. /proc/costly_icon2html(thing, target, sourceonly = FALSE) diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm new file mode 100644 index 000000000000..08c360849b58 --- /dev/null +++ b/code/__HELPERS/lighting.dm @@ -0,0 +1,11 @@ +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. +/proc/emissive_appearance(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) + var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags | EMISSIVE_APPEARANCE_FLAGS) + appearance.color = GLOB.emissive_color + return appearance + +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EM_BLOCK_COLOR]. +/proc/emissive_blocker(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) + var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags | EMISSIVE_APPEARANCE_FLAGS) + appearance.color = GLOB.em_block_color + return appearance diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2e48c9f80cd3..9a6ee4362088 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -894,7 +894,7 @@ if(ismob(source)) var/mob/M = source has_nightvision = M.see_in_dark >= 12 - if(!has_nightvision && target_turf.lighting_lumcount == 0) + if(!has_nightvision && target_turf.get_lumcount() == 0) return FALSE while(current != target_turf) @@ -1227,12 +1227,11 @@ var/global/image/action_purple_power_up if(A.vars.Find(lowertext(varname))) return 1 else return 0 -//Returns: all the non-lighting areas in the world, sorted. +//Returns: all the areas in the world, sorted. /proc/return_sorted_areas() var/list/area/AL = list() for(var/area/A in GLOB.sorted_areas) - if(!A.lighting_subarea) - AL += A + AL += A return AL //Takes: Area type as text string or as typepath OR an instance of the area. @@ -1252,13 +1251,8 @@ var/global/image/action_purple_power_up var/area/A = GLOB.areas_by_type[areatype] // Fix it up with /area/var/related due to lighting shenanigans - var/list/area/LA - if(!length(A.related)) - LA = list(A) - else LA = A.related - for(var/area/Ai in LA) - for(var/turf/T in Ai) - turfs += T + for(var/turf/T in A) + turfs += T return turfs @@ -1382,7 +1376,7 @@ var/global/image/action_purple_power_up // if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn // X.opacity = !X.opacity -// X.SetOpacity(!X.opacity) +// X.set_opacity(!X.opacity) toupdate += X @@ -1766,6 +1760,85 @@ var/list/WALLITEMS = list( if(location == src) return TRUE +GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) + +/// Version of view() which ignores darkness, because BYOND doesn't have it (I actually suggested it but it was tagged redundant, BUT HEARERS IS A T- /rant). +/proc/dview(range = world.view, center, invis_flags = 0) + if(!center) + return + + GLOB.dview_mob.loc = center + + GLOB.dview_mob.see_invisible = invis_flags + + . = view(range, GLOB.dview_mob) + GLOB.dview_mob.loc = null + +/mob/dview + name = "INTERNAL DVIEW MOB" + invisibility = 101 + density = FALSE + see_in_dark = 1e6 + var/ready_to_die = FALSE + +/mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists + SHOULD_CALL_PARENT(FALSE) + if(flags_atom & INITIALIZED) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_atom |= INITIALIZED + return INITIALIZE_HINT_NORMAL + +/mob/dview/Destroy(force = FALSE) + if(!ready_to_die) + stack_trace("ALRIGHT WHICH FUCKER TRIED TO DELETE *MY* DVIEW?") + + if (!force) + return QDEL_HINT_LETMELIVE + + log_world("EVACUATE THE SHITCODE IS TRYING TO STEAL MUH JOBS") + GLOB.dview_mob = new + return ..() + + +#define FOR_DVIEW(type, range, center, invis_flags) \ + GLOB.dview_mob.loc = center; \ + GLOB.dview_mob.see_invisible = invis_flags; \ + for(type in view(range, GLOB.dview_mob)) + +#define FOR_DVIEW_END GLOB.dview_mob.loc = null + +/proc/get_turf_pixel(atom/AM) + if(!istype(AM)) + return + + //Find AM's matrix so we can use it's X/Y pixel shifts + var/matrix/M = matrix(AM.transform) + + var/pixel_x_offset = AM.pixel_x + M.get_x_shift() + var/pixel_y_offset = AM.pixel_y + M.get_y_shift() + + //Irregular objects + var/icon/AMicon = icon(AM.icon, AM.icon_state) + var/AMiconheight = AMicon.Height() + var/AMiconwidth = AMicon.Width() + if(AMiconheight != world.icon_size || AMiconwidth != world.icon_size) + pixel_x_offset += ((AMiconwidth/world.icon_size)-1)*(world.icon_size*0.5) + pixel_y_offset += ((AMiconheight/world.icon_size)-1)*(world.icon_size*0.5) + + //DY and DX + var/rough_x = round(round(pixel_x_offset,world.icon_size)/world.icon_size) + var/rough_y = round(round(pixel_y_offset,world.icon_size)/world.icon_size) + + //Find coordinates + var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom + if(!T) + return null + var/final_x = T.x + rough_x + var/final_y = T.y + rough_y + + if(final_x || final_y) + return locate(final_x, final_y, T.z) + //used to check if a mob can examine an object /atom/proc/can_examine(mob/user) if(!user.client) @@ -1993,3 +2066,30 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(stop_type && istype(turf_to_check, stop_type)) break return turf_to_check + +/// Given a direction, return the direction and the +-45 degree directions next to it +/proc/get_related_directions(direction = NORTH) + switch(direction) + if(NORTH) + return list(NORTH, NORTHEAST, NORTHWEST) + + if(EAST) + return list(EAST, NORTHEAST, SOUTHEAST) + + if(SOUTH) + return list(SOUTH, SOUTHEAST, SOUTHWEST) + + if(WEST) + return list(WEST, NORTHWEST, SOUTHWEST) + + if(NORTHEAST) + return list(NORTHEAST, NORTH, EAST) + + if(SOUTHEAST) + return list(SOUTHEAST, EAST, SOUTH) + + if(SOUTHWEST) + return list(SOUTHWEST, SOUTH, WEST) + + if(NORTHWEST) + return list(NORTHWEST, NORTH, WEST) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index d71125c318f6..53dd40ff6035 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -249,6 +249,7 @@ DEFINE_BITFIELD(valid_equip_slots, list( "SLOT_LEGS" = SLOT_LEGS, "SLOT_ACCESSORY" = SLOT_ACCESSORY, "SLOT_SUIT_STORE" = SLOT_SUIT_STORE, + "SLOT_BLOCK_SUIT_STORE" = SLOT_BLOCK_SUIT_STORE, )) DEFINE_BITFIELD(flags_alarm_state, list( @@ -417,6 +418,7 @@ DEFINE_BITFIELD(toggleable_flags, list( "MODE_LZ_PROTECTION" = MODE_LZ_PROTECTION, "MODE_SHIPSIDE_SD" = MODE_SHIPSIDE_SD, "MODE_DISPOSABLE_MOBS" = MODE_DISPOSABLE_MOBS, + "MODE_BYPASS_JOE" = MODE_BYPASS_JOE, )) DEFINE_BITFIELD(state, list( diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index df7dd48a1dd1..86390718b6ca 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -210,7 +210,7 @@ return TRUE if (mods["ctrl"]) - if (Adjacent(user)) + if (Adjacent(user) && user.next_move < world.time) user.start_pulling(src) return TRUE return FALSE diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 139de9e59a35..c6b642974881 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -27,3 +27,10 @@ #define ui_ghost_slot3 "SOUTH:6,CENTER:0" #define ui_ghost_slot4 "SOUTH:6,CENTER+1:0" #define ui_ghost_slot5 "SOUTH:6,CENTER+2:0" + +//Upper-middle right (alerts) +#define ui_alert1 "EAST-1:28,CENTER+5:27" +#define ui_alert2 "EAST-1:28,CENTER+4:25" +#define ui_alert3 "EAST-1:28,CENTER+3:23" +#define ui_alert4 "EAST-1:28,CENTER+2:21" +#define ui_alert5 "EAST-1:28,CENTER+1:19" diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 293cdbd6374e..fec62c35317f 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -72,9 +72,11 @@ var/severity = 0 var/fs_view = 7 var/show_when_dead = FALSE + /// If this should try and resize if the user's view is bigger than the default + var/should_resize = TRUE /atom/movable/screen/fullscreen/proc/update_for_view(client_view) - if (screen_loc == "CENTER-7,CENTER-7" && fs_view != client_view) + if (screen_loc == "CENTER-7,CENTER-7" && fs_view != client_view && should_resize) var/list/actualview = getviewsize(client_view) fs_view = client_view transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) @@ -169,6 +171,14 @@ /atom/movable/screen/fullscreen/laser_blind icon_state = "impairedoverlay1" +/atom/movable/screen/fullscreen/vulture + icon_state = "vulture_scope_overlay_sniper" + layer = FULLSCREEN_VULTURE_SCOPE_LAYER + +/atom/movable/screen/fullscreen/vulture/spotter + icon_state = "vulture_scope_overlay_spotter" + should_resize = FALSE + //Weather overlays// /atom/movable/screen/fullscreen/weather @@ -186,3 +196,34 @@ /atom/movable/screen/fullscreen/weather/high icon_state = "impairedoverlay3" + +/atom/movable/screen/fullscreen/lighting_backdrop + icon = 'icons/mob/hud/screen1.dmi' + icon_state = "flash" + transform = matrix(200, 0, 0, 0, 200, 0) + plane = LIGHTING_PLANE + blend_mode = BLEND_OVERLAY + show_when_dead = TRUE + +/atom/movable/screen/fullscreen/lighting_backdrop/update_for_view(client_view) + return + +//Provides darkness to the back of the lighting plane +/atom/movable/screen/fullscreen/lighting_backdrop/lit_secondary + invisibility = INVISIBILITY_LIGHTING + layer = BACKGROUND_LAYER + LIGHTING_PRIMARY_DIMMER_LAYER + color = "#000" + alpha = 60 + +/atom/movable/screen/fullscreen/lighting_backdrop/backplane + invisibility = INVISIBILITY_LIGHTING + layer = LIGHTING_BACKPLANE_LAYER + color = "#000" + blend_mode = BLEND_ADD + +/atom/movable/screen/fullscreen/see_through_darkness + icon_state = "nightvision" + plane = LIGHTING_PLANE + layer = LIGHTING_PRIMARY_LAYER + blend_mode = BLEND_ADD + show_when_dead = TRUE diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7f9ad85e154e..392f3ae9a060 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -400,3 +400,40 @@ zone_sel.color = ui_color zone_sel.update_icon(mymob) static_inventory += zone_sel + +// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there +/datum/hud/proc/reorganize_alerts(mob/viewmob) + var/mob/screenmob = viewmob || mymob + if(!screenmob.client) + return + var/list/alerts = mymob.alerts + if(!length(alerts)) + return FALSE + if(!hud_shown) + for(var/category in alerts) + var/atom/movable/screen/alert/alert = alerts[category] + screenmob.client.screen -= alert + return TRUE + var/c = 0 + for(var/category in alerts) + var/atom/movable/screen/alert/alert = alerts[category] + c++ + switch(c) + if(1) + . = ui_alert1 + if(2) + . = ui_alert2 + if(3) + . = ui_alert3 + if(4) + . = ui_alert4 + if(5) + . = ui_alert5 // Right now there's 5 slots + else + . = "" + alert.screen_loc = . + screenmob.client.screen |= alert + if(!viewmob) + for(var/obs in mymob.observers) + reorganize_alerts(obs) + return TRUE diff --git a/code/_onclick/hud/rendering/plane_master.dm b/code/_onclick/hud/rendering/plane_master.dm index d29228f4c16e..91c0e24fae1f 100644 --- a/code/_onclick/hud/rendering/plane_master.dm +++ b/code/_onclick/hud/rendering/plane_master.dm @@ -76,6 +76,17 @@ appearance_flags = PLANE_MASTER | NO_CLIENT_COLOR | PIXEL_SCALE //byond internal end +/*! + * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. + * + * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. + * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. + * Emissive overlays and emissive blockers are put onto the same plane. + * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. + * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. + * This is then used to alpha mask the lighting plane. + */ + ///Contains all lighting objects /atom/movable/screen/plane_master/lighting name = "lighting plane master" @@ -83,10 +94,41 @@ blend_mode_override = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT +/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob) + . = ..() + mymob.overlay_fullscreen("lighting_backdrop", /atom/movable/screen/fullscreen/lighting_backdrop/backplane) + mymob.overlay_fullscreen("lighting_backdrop_lit_secondary", /atom/movable/screen/fullscreen/lighting_backdrop/lit_secondary) + +/atom/movable/screen/plane_master/lighting/Initialize() + . = ..() + add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE)) + add_filter("object_lighting", 2, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE)) + /atom/movable/screen/plane_master/lighting/exterior name = "exterior lighting plane master" plane = EXTERIOR_LIGHTING_PLANE +/** + * Handles emissive overlays and emissive blockers. + */ +/atom/movable/screen/plane_master/emissive + name = "emissive plane master" + plane = EMISSIVE_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = EMISSIVE_RENDER_TARGET + render_relay_plane = null + +/atom/movable/screen/plane_master/emissive/Initialize() + . = ..() + add_filter("em_block_masking", 1, color_matrix_filter(GLOB.em_mask_matrix)) + +/atom/movable/screen/plane_master/above_lighting + name = "above lighting plane master" + plane = ABOVE_LIGHTING_PLANE + appearance_flags = PLANE_MASTER //should use client color + blend_mode = BLEND_OVERLAY + render_relay_plane = RENDER_PLANE_GAME + /atom/movable/screen/plane_master/runechat name = "runechat plane master" plane = RUNECHAT_PLANE @@ -94,6 +136,14 @@ blend_mode = BLEND_OVERLAY render_relay_plane = RENDER_PLANE_NON_GAME +/atom/movable/screen/plane_master/o_light_visual + name = "overlight light visual plane master" + plane = O_LIGHTING_VISUAL_PLANE + render_target = O_LIGHTING_VISUAL_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blend_mode = BLEND_MULTIPLY + blend_mode_override = BLEND_MULTIPLY + /atom/movable/screen/plane_master/runechat/backdrop(mob/mymob) . = ..() remove_filter("AO") diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 9643d0f652ae..206b1dbf9979 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -639,3 +639,7 @@ /atom/movable/screen/rotate/alt dir = WEST rotate_amount = -90 + +/atom/movable/screen/vulture_scope // The part of the vulture's scope that drifts over time + icon_state = "vulture_unsteady" + screen_loc = "CENTER,CENTER" diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm deleted file mode 100644 index 9b6088b9bc1e..000000000000 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ /dev/null @@ -1,406 +0,0 @@ -/* - Modified DynamicAreaLighting for TGstation - Coded by Carnwennan - - This is TG's 'new' lighting system. It's basically a heavily modified combination of Forum_Account's and - ShadowDarke's respective lighting libraries. Credits, where due, to them. - - Like sd_DAL (what we used to use), it changes the shading overlays of areas by splitting each type of area into sub-areas - by using the var/tag variable and moving turfs into the contents list of the correct sub-area. This method is - much less costly than using overlays or objects. - - Unlike sd_DAL however it uses a queueing system. Everytime we call a change to opacity or luminosity - (through SetOpacity() or SetLuminosity()) we are simply updating variables and scheduling certain lights/turfs for an - update. Actual updates are handled periodically by the lighting_controller. This carries additional overheads, however it - means that each thing is changed only once per lighting_controller.processing_interval ticks. Allowing for greater control - over how much priority we'd like lighting updates to have. It also makes it possible for us to simply delay updates by - setting lighting_controller.processing = 0 at say, the start of a large explosion, waiting for it to finish, and then - turning it back on with lighting_controller.processing = 1. - - Unlike our old system there are hardcoded maximum luminositys (different for certain atoms). - This is to cap the cost of creating lighting effects. - (without this, an atom with luminosity of 20 would have to update 41^2 turfs!) :s - - Also, in order for the queueing system to work, each light remembers the effect it casts on each turf. This is going to - have larger memory requirements than our previous system but it's easily worth the hassle for the greater control we - gain. It also reduces cost of removing lighting effects by a lot! - - Known Issues/TODO: - Shuttles still do not have support for dynamic lighting (I hope to fix this at some point) - No directional lighting support. (prototype looked ugly) -*/ - -#define LIGHTING_CIRCULAR 1 //comment this out to use old square lighting effects. -#define LIGHTING_LAYER 10 //Drawing layer for lighting overlays -#define LIGHTING_ICON 'icons/effects/ss13_dark_alpha6.dmi' //Icon used for lighting shading effects -#define LIGHTING_STATES 6 - -// Update these lists if the luminosity cap -// of 8 is removed -GLOBAL_LIST_INIT(comp1table, list( - 0, - 0.934, - 1.868, - 2.802, - 3.736, - 4.67, - 5.604, - 6.538, - 7.472, -)) -GLOBAL_LIST_INIT(comp2table, list( - 0, - 0.427, - 0.854, - 1.281, - 1.708, - 2.135, - 2.562, - 2.989, - 3.416, -)) -/datum/light_source - var/atom/owner - var/changed = 1 - var/list/effect = list() - var/__x = 0 //x coordinate at last update - var/__y = 0 //y coordinate at last update - var/__z = 0 //z coordinate at last update - -#define turf_update_lumcount(T, amount)\ - T.lighting_lumcount += amount;\ - if(!T.lighting_changed){\ - SSlighting.changed_turfs += T;\ - T.lighting_changed = TRUE;\ - } - -#define ls_remove_effect(ls)\ - for(var/t in ls.effect){\ - var/turf/T = t;\ - turf_update_lumcount(T, -ls.effect[T]);\ - }\ - ls.effect.Cut(); - -/datum/light_source/New(atom/A) - if(!istype(A)) - CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.") - ..() - owner = A - __x = owner.x - __y = owner.y - __z = owner.z - // the lighting object maintains a list of all light sources - SSlighting.lights.Add(src) - -//Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one -/datum/light_source/proc/check() - if(!owner) - ls_remove_effect(src) - return TRUE //causes it to be removed from our list of lights. The garbage collector will then destroy it. - - if(owner.luminosity > 8) - owner.luminosity = 8 - - changed = FALSE - - ls_remove_effect(src) - if(owner.loc && owner.luminosity > 0) - for(var/turf/T in view(owner.luminosity, owner)) - var/dist - var/dx = abs(T.x - __x) - var/dy = abs(T.y - __y) - // Use dx+1 and dy+1 because lists use 1-based indexing - if(dx >= dy) - dist = (GLOB.comp1table[dx+1]) + (GLOB.comp2table[dy+1]) - else - dist = (GLOB.comp2table[dx+1]) + (GLOB.comp1table[dy+1]) - var/delta_lumen = owner.luminosity - dist - if(delta_lumen > 0) - effect[T] = delta_lumen - turf_update_lumcount(T, delta_lumen) - return FALSE - else - owner.light = null - return TRUE - -/datum/light_source/proc/changed() - if(owner) - __x = owner.x - __y = owner.y - - if(!changed) - changed = 1 - SSlighting.lights.Add(src) - - -/datum/light_source/proc/remove_effect() - // before we apply the effect we remove the light's current effect. - for(var/turf/T in effect) // negate the effect of this light source - turf_update_lumcount(T, -effect[T]) - effect.Cut() // clear the effect list - -/atom - var/datum/light_source/light - var/trueLuminosity = 0 // Typically 'luminosity' squared. The builtin luminosity must remain linear. - // We may read it, but NEVER set it directly. - -//Movable atoms with opacity when they are constructed will trigger nearby lights to update -//Movable atoms with luminosity when they are constructed will create a light_source automatically -/atom/movable/Initialize(mapload, ...) - . = ..() - if(opacity) - if(isturf(loc)) - var/turf/T = loc - if(T.lighting_lumcount > 1) - UpdateAffectingLights() - if(luminosity) - if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.") - trueLuminosity = luminosity * luminosity - light = new(src) - -//Objects with opacity will trigger nearby lights to update at next lighting process. -/atom/movable/Destroy() - if(opacity) - if(isturf(loc)) - var/turf/T = loc - if(T.lighting_lumcount > 1) - UpdateAffectingLights() - . = ..() - -/atom/vv_edit_var(var_name, var_value) - switch(var_name) - if(NAMEOF(src, luminosity)) - SetLuminosity(var_value) - return ..() - -//Sets our luminosity. -//If we have no light it will create one. -//If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its -//queues are complete. -//if we have a light already it is merely updated, rather than making a new one. -/atom/proc/SetLuminosity(new_luminosity, trueLum = FALSE, atom/source) - if(new_luminosity < 0) - new_luminosity = 0 - if(!trueLum) - new_luminosity *= new_luminosity - if(light) - if(trueLuminosity != new_luminosity) //non-luminous lights are removed from the lights list in add_effect() - light.changed() - else - if(new_luminosity) - light = new(src) - trueLuminosity = new_luminosity - if (trueLuminosity < 1) - luminosity = 0 - else if (trueLuminosity <= 100) - luminosity = sqrtTable[trueLuminosity] - else - luminosity = sqrt(trueLuminosity) - -//This slightly modifies human luminosity. Source of light do NOT stack. -//When you drop a light source it should keep a running total of your actual luminosity and set it accordingly. -/mob/SetLuminosity(new_luminosity, trueLum, atom/source) - LAZYREMOVE(luminosity_sources, source) - if(source) - UnregisterSignal(source, COMSIG_PARENT_QDELETING) - var/highest_luminosity = 0 - for(var/luminosity_source as anything in luminosity_sources) - var/lumonisity_rating = luminosity_sources[luminosity_source] - if(highest_luminosity < lumonisity_rating) - highest_luminosity = lumonisity_rating - if(source && new_luminosity > 0) - LAZYSET(luminosity_sources, source, new_luminosity) - RegisterSignal(source, COMSIG_PARENT_QDELETING, PROC_REF(remove_luminosity_source)) - if(new_luminosity < highest_luminosity) - new_luminosity = highest_luminosity - return ..() - -/mob/proc/remove_luminosity_source(atom/source) - SetLuminosity(0, FALSE, source) - -/area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas - luminosity = !!new_luminosity - trueLuminosity = luminosity - - -//change our opacity (defaults to toggle), and then update all lights that affect us. -/atom/proc/SetOpacity(new_opacity) - if(new_opacity == null) - new_opacity = !opacity //default = toggle opacity - else if(opacity == new_opacity) - return FALSE //opacity hasn't changed! don't bother doing anything - opacity = new_opacity //update opacity, the below procs now call light updates. - return TRUE - -/turf/SetOpacity(new_opacity) - . = ..() - //only bother if opacity changed - if(!.) - return - if(lighting_lumcount) //only bother with an update if our turf is currently affected by a light - UpdateAffectingLights() - -/atom/movable/SetOpacity(new_opacity) - . = ..() - // only bother if opacity changed - if(!.) - return - // only bother with an update if we're on a turf - if(isturf(loc)) - var/turf/T = loc - // only bother with an update if our turf is currently affected by a light - if(T.lighting_lumcount) - UpdateAffectingLights() - - -/turf - var/lighting_lumcount = 0 - var/lighting_changed = 0 - var/cached_lumcount = 0 - -/turf/open/space - lighting_lumcount = 4 //starlight - -/turf/proc/update_lumcount(amount, removing = 0) - lighting_lumcount += amount - - if(!lighting_changed) - SSlighting.changed_turfs += src - lighting_changed = 1 - -/turf/proc/lighting_tag(const/level) - var/area/A = loc - return A.tagbase + "sd_L[level]" - -/turf/proc/build_lighting_area(const/tag, const/level) - var/area/Area = loc - var/area/A = new Area.type() // create area if it wasn't found - // replicate vars - for(var/V in Area.vars) - switch(V) - if ("contents","lighting_overlay", "overlays") - continue - else - if(issaved(Area.vars[V])) A.vars[V] = Area.vars[V] - - A.tag = tag - A.lighting_subarea = 1 - A.lighting_space = 0 // in case it was copied from a space subarea - - A.SetLightLevel(level) - Area.related += A - - if(SSweather.is_weather_event && SSweather.map_holder.should_affect_area(A)) - A.overlays += SSweather.curr_master_turf_overlay - - return A - -/turf/proc/shift_to_subarea() - lighting_changed = 0 - var/area/Area = loc - - if(!istype(Area) || !Area.lighting_use_dynamic) return - - var/level = min(max(round(lighting_lumcount,1),0),LIGHTING_STATES) - var/new_tag = lighting_tag(level) - - if(Area.tag!=new_tag) //skip if already in this area - var/area/A = locate(new_tag) // find an appropriate area - - if (!A) - A = build_lighting_area(new_tag, level) - - A.contents += src // move the turf into the area - -// Dedicated lighting sublevel for space turfs -// helps us depower things in space, remove space fire alarms, -// and evens out space lighting -/turf/open/space/lighting_tag(level) - var/area/A = loc - return A.tagbase + "sd_L_space" -/turf/open/space/build_lighting_area(tag, level) - var/area/A = ..(tag,4) - A.lighting_space = 1 - A.SetLightLevel(4) - A.icon_state = null - return A - - -/area - var/lighting_use_dynamic = 1 //Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area - var/image/lighting_overlay //tracks the darkness image of the area for easy removal - var/lighting_subarea = 0 //tracks whether we're a lighting sub-area - var/lighting_space = 0 // true for space-only lighting subareas - var/tagbase - var/exterior_light = 2 - -/area/proc/SetLightLevel(light) - if(!src) return - if(light <= 0) - light = 0 - luminosity = 1 - if(light > LIGHTING_STATES) - light = LIGHTING_STATES - - if(lighting_overlay) - overlays -= lighting_overlay - lighting_overlay.icon_state = "[light]" - else - lighting_overlay = image(LIGHTING_ICON,,num2text(light),LIGHTING_LAYER) - lighting_overlay.plane = ceiling <= CEILING_GLASS ? EXTERIOR_LIGHTING_PLANE : LIGHTING_PLANE - if (light < 6) - overlays.Add(lighting_overlay) - -/area/proc/SetDynamicLighting() - src.lighting_use_dynamic = 1 - for(var/turf/T in src.contents) - turf_update_lumcount(T, 0) - -/area/proc/InitializeLighting() //TODO: could probably improve this bit ~Carn - tagbase = "[type]" - if(!tag) tag = tagbase - if(!lighting_use_dynamic) - if(!lighting_subarea) // see if this is a lighting subarea already - //show the dark overlay so areas, not yet in a lighting subarea, won't be bright as day and look silly. - SetLightLevel(4) - -//#undef LIGHTING_LAYER -#undef LIGHTING_CIRCULAR -//#undef LIGHTING_ICON - -#define LIGHTING_MAX_LUMINOSITY_STATIC 8 //Maximum luminosity to reduce lag. -#define LIGHTING_MAX_LUMINOSITY_MOBILE 6 //Moving objects have a lower max luminosity since these update more often. (lag reduction) -#define LIGHTING_MAX_LUMINOSITY_TURF 1 //turfs have a severely shortened range to protect from inevitable floor-lighttile spam. - -//set the changed status of all lights which could have possibly lit this atom. -//We don't need to worry about lights which lit us but moved away, since they will have change status set already -//This proc can cause lots of lights to be updated. :( -/atom/proc/UpdateAffectingLights() -// for(var/atom/A in oview(LIGHTING_MAX_LUMINOSITY_STATIC-1,src)) -// if(A.light) -// A.light.changed() //force it to update at next process() - -/atom/movable/UpdateAffectingLights() - if(isturf(loc)) - loc.UpdateAffectingLights() - -/turf/UpdateAffectingLights() - for(var/atom/A in oview(LIGHTING_MAX_LUMINOSITY_STATIC-1,src)) - if(A.light) - A.light.changed() - -//caps luminosity effects max-range based on what type the light's owner is. -/atom/proc/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC) - -/atom/movable/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_MOBILE) - -/obj/structure/machinery/light/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC) - -/turf/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_TURF) - -#undef LIGHTING_MAX_LUMINOSITY_STATIC -#undef LIGHTING_MAX_LUMINOSITY_MOBILE -#undef LIGHTING_MAX_LUMINOSITY_TURF diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index a98eaa0f7876..a5c5271c8d7d 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -73,6 +73,7 @@ var/const/YAUT_FREQ = 1205 var/const/DUT_FREQ = 1210 var/const/CMB_FREQ = 1220 var/const/VAI_FREQ = 1215 +var/const/RMC_FREQ = 1216 //WY Channels (1230-1249) var/const/WY_FREQ = 1231 @@ -105,6 +106,7 @@ var/const/MAX_FREQ = 1468 // --------------------------------------------------- //USCM High Command (USCM 1470-1499) var/const/HC_FREQ = 1471 var/const/SOF_FREQ = 1472 +var/const/PVST_FREQ = 1473 //Ship department channels var/const/SENTRY_FREQ = 1480 @@ -139,8 +141,10 @@ var/list/radiochannels = list( RADIO_CHANNEL_VAI = VAI_FREQ, RADIO_CHANNEL_CMB = CMB_FREQ, RADIO_CHANNEL_DUTCH_DOZEN = DUT_FREQ, + RADIO_CHANNEL_ROYAL_MARINE = RMC_FREQ, RADIO_CHANNEL_HIGHCOM = HC_FREQ, + RADIO_CHANNEL_PROVOST = PVST_FREQ, RADIO_CHANNEL_ALMAYER = PUB_FREQ, RADIO_CHANNEL_COMMAND = COMM_FREQ, RADIO_CHANNEL_MEDSCI = MED_FREQ, @@ -188,7 +192,7 @@ var/list/radiochannels = list( ) // Response Teams -#define ERT_FREQS list(VAI_FREQ, DUT_FREQ, YAUT_FREQ, CMB_FREQ) +#define ERT_FREQS list(VAI_FREQ, DUT_FREQ, YAUT_FREQ, CMB_FREQ, RMC_FREQ) // UPP Frequencies #define UPP_FREQS list(UPP_FREQ, UPP_CMD_FREQ, UPP_ENGI_FREQ, UPP_MED_FREQ, UPP_CCT_FREQ, UPP_KDO_FREQ) @@ -249,6 +253,7 @@ SUBSYSTEM_DEF(radio) "[INTEL_FREQ]" = "intelradio", "[WY_FREQ]" = "wyradio", "[VAI_FREQ]" = "vairadio", + "[RMC_FREQ]" = "rmcradio", "[CMB_FREQ]" = "cmbradio", "[CLF_FREQ]" = "clfradio", "[ALPHA_FREQ]" = "alpharadio", @@ -259,6 +264,7 @@ SUBSYSTEM_DEF(radio) "[CRYO_FREQ]" = "cryoradio", "[SOF_FREQ]" = "hcradio", "[HC_FREQ]" = "hcradio", + "[PVST_FREQ]" = "pvstradio", "[COLONY_FREQ]" = "deptradio", ) diff --git a/code/controllers/subsystem/interior.dm b/code/controllers/subsystem/interior.dm index f81cc6c8d88c..389e95fe6022 100644 --- a/code/controllers/subsystem/interior.dm +++ b/code/controllers/subsystem/interior.dm @@ -19,7 +19,17 @@ SUBSYSTEM_DEF(interior) var/list/bottom_left = reserved_area.bottom_left_coords - template.load(locate(bottom_left[1] + (INTERIOR_BORDER_SIZE / 2), bottom_left[2] + (INTERIOR_BORDER_SIZE / 2), bottom_left[3]), centered = FALSE) + var/list/bounds = template.load(locate(bottom_left[1] + (INTERIOR_BORDER_SIZE / 2), bottom_left[2] + (INTERIOR_BORDER_SIZE / 2), bottom_left[3]), centered = FALSE) + + var/list/turfs = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), + locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])) + + var/list/areas = list() + for(var/turf/current_turf as anything in turfs) + areas |= current_turf.loc + + for(var/area/current_area as anything in areas) + current_area.add_base_lighting() interiors += interior return reserved_area diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 26ee4c9a648e..3c3d14468bc2 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -1,68 +1,124 @@ SUBSYSTEM_DEF(lighting) - name = "Lighting" + name = "Lighting" + wait = 2 init_order = SS_INIT_LIGHTING - priority = SS_PRIORITY_LIGHTING - wait = 0.4 SECONDS - runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY - var/list/datum/light_source/lights_current = list() - var/list/datum/light_source/lights = list() + //debug var for tracking updates before init is complete + var/duplicate_shadow_updates_in_init = 0 + ///Total times shadows were updated, debug + var/total_shadow_calculations = 0 - var/list/turf/changed_turfs_current = list() - var/list/turf/changed_turfs = list() + ///Whether the SS has begun setting up yet + var/started = FALSE + var/static/list/static_sources_queue = list() //! List of static lighting sources queued for update. + var/static/list/corners_queue = list() //! List of lighting corners queued for update. + var/static/list/objects_queue = list() //! List of lighting objects queued for update. -/datum/controller/subsystem/lighting/stat_entry(msg) - msg = "L:[lights.len]; T:[changed_turfs.len]" - return ..() + var/static/list/mask_queue = list() //! List of hybrid lighting sources queued for update. /datum/controller/subsystem/lighting/Initialize(timeofday) - for(var/thing in lights) - var/datum/light_source/L = thing - if(L) - L.check() - lights.Cut() + started = TRUE + if(!initialized) + //Handle static lightnig + create_all_lighting_objects() + fire(FALSE, TRUE) + return SS_INIT_SUCCESS - var/z_start = 1 - var/z_finish = world.maxz +/datum/controller/subsystem/lighting/stat_entry() + . = ..("ShCalcs:[total_shadow_calculations]|SourcQ:[static_sources_queue.len]|CcornQ:[corners_queue.len]|ObjQ:[objects_queue.len]|HybrQ:[mask_queue.len]") - var/list/init_turfs = block(locate(1,1,z_start),locate(world.maxx,world.maxy,z_finish)) +/datum/controller/subsystem/lighting/fire(resumed, init_tick_checks) + MC_SPLIT_TICK_INIT(3) + if(!init_tick_checks) + MC_SPLIT_TICK + var/updators_num = 0 + while(updators_num < length(static_sources_queue)) + updators_num += 1 - for(var/turf/thing in init_turfs) - if(istype(thing)) - thing.shift_to_subarea() + var/datum/static_light_source/L = static_sources_queue[updators_num] + L.update_corners() - return SS_INIT_SUCCESS + if(!QDELETED(L)) + L.needs_update = LIGHTING_NO_UPDATE + else + updators_num -= 1 + if(init_tick_checks) + if(!TICK_CHECK) + continue + static_sources_queue.Cut(1, updators_num + 1) + updators_num = 0 + stoplag() + else if (MC_TICK_CHECK) + break + if(updators_num) + static_sources_queue.Cut(1, updators_num + 1) + updators_num = 0 + if(!init_tick_checks) + MC_SPLIT_TICK -/datum/controller/subsystem/lighting/fire(resumed = FALSE) - if(!resumed) - lights_current = lights - lights = list() - changed_turfs_current = changed_turfs - changed_turfs = list() + while(updators_num < length(corners_queue)) + updators_num += 1 + var/datum/static_lighting_corner/C = corners_queue[updators_num] + C.needs_update = FALSE //update_objects() can call qdel if the corner is storing no data + C.update_objects() - while(lights_current.len) - var/datum/light_source/L = lights_current[lights_current.len] - lights_current.len-- - if(!L) - continue - if(!L.owner || L.changed) - L.check() - if(MC_TICK_CHECK) - return - - while(changed_turfs_current.len) - var/turf/T = changed_turfs_current[changed_turfs_current.len] - changed_turfs_current.len-- - if(!T) + if(init_tick_checks) + if(!TICK_CHECK) + continue + corners_queue.Cut(1, updators_num + 1) + updators_num = 0 + stoplag() + else if (MC_TICK_CHECK) + break + if(updators_num) + corners_queue.Cut(1, updators_num + 1) + updators_num = 0 + if(!init_tick_checks) + MC_SPLIT_TICK + + while(updators_num < length(objects_queue)) + updators_num += 1 + + var/datum/static_lighting_object/O = objects_queue[updators_num] + if (QDELETED(O)) continue - if(T.lighting_changed) - if(T.lighting_lumcount != T.cached_lumcount) - T.cached_lumcount = T.lighting_lumcount - T.shift_to_subarea() - T.lighting_changed = FALSE - if (MC_TICK_CHECK) - return + O.update() + O.needs_update = FALSE + + if(init_tick_checks) + if(!TICK_CHECK) + continue + objects_queue.Cut(1, updators_num + 1) + updators_num = 0 + else if (MC_TICK_CHECK) + break + if(updators_num) + objects_queue.Cut(1, updators_num + 1) + updators_num = 0 + if(!init_tick_checks) + MC_SPLIT_TICK + + while(updators_num > length(mask_queue)) + updators_num += 1 + + var/atom/movable/lighting_mask/mask_to_update = mask_queue[updators_num] + mask_to_update.calculate_lighting_shadows() + + if(init_tick_checks) + if(!TICK_CHECK) + continue + mask_queue.Cut(1, updators_num + 1) + updators_num = 0 + stoplag() + else if (MC_TICK_CHECK) + break + if(updators_num) + mask_queue.Cut(1, updators_num + 1) + +/datum/controller/subsystem/lighting/Recover() + initialized = SSlighting.initialized + return ..() diff --git a/code/controllers/subsystem/projectiles.dm b/code/controllers/subsystem/projectiles.dm index 075a4f7facc5..a23303ea282d 100644 --- a/code/controllers/subsystem/projectiles.dm +++ b/code/controllers/subsystem/projectiles.dm @@ -6,11 +6,11 @@ SUBSYSTEM_DEF(projectiles) priority = SS_PRIORITY_PROJECTILES /// List of projectiles handled by the subsystem - VAR_PRIVATE/list/obj/item/projectile/projectiles + VAR_PRIVATE/list/obj/projectile/projectiles /// List of projectiles on hold due to sleeping - VAR_PRIVATE/list/obj/item/projectile/sleepers + VAR_PRIVATE/list/obj/projectile/sleepers /// List of projectiles handled this controller firing - VAR_PRIVATE/list/obj/item/projectile/flying + VAR_PRIVATE/list/obj/projectile/flying /* * Scheduling notes: @@ -42,14 +42,14 @@ SUBSYSTEM_DEF(projectiles) flying = projectiles.Copy() flying -= sleepers while(flying.len) - var/obj/item/projectile/projectile = flying[flying.len] + var/obj/projectile/projectile = flying[flying.len] flying.len-- var/delta_time = wait * world.tick_lag * (1 SECONDS) handle_projectile_flight(projectile, delta_time) if(MC_TICK_CHECK) return -/datum/controller/subsystem/projectiles/proc/handle_projectile_flight(obj/item/projectile/projectile, delta_time) +/datum/controller/subsystem/projectiles/proc/handle_projectile_flight(obj/projectile/projectile, delta_time) PRIVATE_PROC(TRUE) set waitfor = FALSE // We're in double-check land here because there ARE rulebreakers. @@ -66,15 +66,15 @@ SUBSYSTEM_DEF(projectiles) stop_projectile(projectile) // Ideally this was already done thru process() qdel(projectile) -/datum/controller/subsystem/projectiles/proc/process_wrapper(obj/item/projectile/projectile, delta_time) +/datum/controller/subsystem/projectiles/proc/process_wrapper(obj/projectile/projectile, delta_time) // set waitfor=TRUE . = PROC_RETURN_SLEEP . = projectile.process(delta_time) sleepers -= projectile // Recover from sleep -/datum/controller/subsystem/projectiles/proc/queue_projectile(obj/item/projectile/projectile) +/datum/controller/subsystem/projectiles/proc/queue_projectile(obj/projectile/projectile) projectiles |= projectile -/datum/controller/subsystem/projectiles/proc/stop_projectile(obj/item/projectile/projectile) +/datum/controller/subsystem/projectiles/proc/stop_projectile(obj/projectile/projectile) projectiles -= projectile flying -= projectile // avoids problems with deleted projs projectile.speed = 0 diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0e23b99a9cc2..db6c3c71a7fa 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -199,6 +199,8 @@ SUBSYSTEM_DEF(ticker) if(CONFIG_GET(flag/autooocmute)) ooc_allowed = FALSE + round_start_time = world.time + CHECK_TICK for(var/I in round_start_events) var/datum/callback/cb = I @@ -222,9 +224,7 @@ SUBSYSTEM_DEF(ticker) equip_characters() GLOB.data_core.manifest() - log_world("Game start took [(world.timeofday - init_start) / 10]s") - round_start_time = world.time //SSdbcore.SetRoundStart() current_state = GAME_STATE_PLAYING diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 7610c007df90..325c45fe2300 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(weather) /datum/controller/subsystem/weather/proc/setup_weather_areas() weather_areas = list() for(var/area/A in all_areas) - if(A == A.master && A.weather_enabled && map_holder.should_affect_area(A)) + if(A.weather_enabled && map_holder.should_affect_area(A)) weather_areas += A curr_master_turf_overlay = new /obj/effect/weather_vfx_holder @@ -146,8 +146,7 @@ SUBSYSTEM_DEF(weather) curr_master_turf_overlay.icon_state = weather_event_instance.turf_overlay_icon_state curr_master_turf_overlay.alpha = weather_event_instance.turf_overlay_alpha for(var/area/area as anything in weather_areas) - for(var/area/subarea as anything in area.related) - subarea.overlays += curr_master_turf_overlay + area.overlays += curr_master_turf_overlay update_mobs_weather() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_WEATHER_CHANGE) @@ -169,8 +168,7 @@ SUBSYSTEM_DEF(weather) message_admins(SPAN_BLUE("Weather Event of unknown type [weather_event_type] ending after [DisplayTimeText(world.time - current_event_start_time)].")) for(var/area/area as anything in weather_areas) - for(var/area/subarea as anything in area.related) - subarea.overlays -= curr_master_turf_overlay + area.overlays -= curr_master_turf_overlay if (map_holder.no_weather_turf_icon_state) curr_master_turf_overlay.icon_state = map_holder.no_weather_turf_icon_state diff --git a/code/datums/agents/tools/tranq_gun.dm b/code/datums/agents/tools/tranq_gun.dm index e95f853cef82..91f6f8c294b7 100644 --- a/code/datums/agents/tools/tranq_gun.dm +++ b/code/datums/agents/tools/tranq_gun.dm @@ -1,7 +1,7 @@ /obj/item/weapon/gun/pistol/tranquilizer name = "Tranquilizer gun" desc = "Contains horse tranquilizer darts. Useful at knocking people out." - icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/guns_by_faction/event.dmi' icon_state = "pk9r" item_state = "pk9r" current_mag = /obj/item/ammo_magazine/pistol/tranq @@ -28,7 +28,7 @@ name = "\improper Tranquilizer magazine (Horse Tranquilizer)" default_ammo = /datum/ammo/bullet/pistol/tranq caliber = ".22" - icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/event.dmi' icon_state = "pk-9_tranq" max_rounds = 5 gun_type = /obj/item/weapon/gun/pistol/tranquilizer diff --git a/code/datums/components/cluster_stack.dm b/code/datums/components/cluster_stack.dm index c79ce855e5b1..01d266d01a15 100644 --- a/code/datums/components/cluster_stack.dm +++ b/code/datums/components/cluster_stack.dm @@ -75,7 +75,7 @@ SIGNAL_HANDLER L += "Cluster Stack: [cluster_stacks]/[MAX_CLUSTER_STACKS]" -/datum/component/cluster_stack/proc/apply_cluster_stacks(mob/living/L, damage_result, ammo_flags, obj/item/projectile/P) +/datum/component/cluster_stack/proc/apply_cluster_stacks(mob/living/L, damage_result, ammo_flags, obj/projectile/P) SIGNAL_HANDLER if(cluster_stacks >= MAX_CLUSTER_STACKS) var/old_dmg_cont = damage_counter diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm new file mode 100644 index 000000000000..00a5e86b5d60 --- /dev/null +++ b/code/datums/components/overlay_lighting.dm @@ -0,0 +1,513 @@ +///For switchable lights, is it on and currently emitting light? +#define LIGHTING_ON (1<<0) +///Is the parent attached to something else, its loc? Then we need to keep an eye of this. +#define LIGHTING_ATTACHED (1<<1) + +#define GET_PARENT (parent_attached_to || parent) + +#define SHORT_CAST 2 + + +/** + * Movable atom overlay-based lighting component. + * + * * Component works by applying a visual object to the parent target. + * + * * The component tracks the parent's loc to determine the current_holder. + * * The current_holder is either the parent or its loc, whichever is on a turf. If none, then the current_holder is null and the light is not visible. + * + * * Lighting works at its base by applying a dark overlay and "cutting" said darkness with light, adding (possibly colored) transparency. + * * This component uses the visible_mask visual object to apply said light mask on the darkness. + * + * * The main limitation of this system is that it uses a limited number of pre-baked geometrical shapes, but for most uses it does the job. + * + * * Another limitation is for big lights: you only see the light if you see the object emiting it. + * * For small objects this is good (you can't see them behind a wall), but for big ones this quickly becomes prety clumsy. +*/ +/datum/component/overlay_lighting + ///How far the light reaches, float. + var/range = 1 + ///Ceiling of range, integer without decimal entries. + var/lumcount_range = 0 + ///How much this light affects the dynamic_lumcount of turfs. + var/lum_power = 0.5 + ///Transparency value. + var/set_alpha = 0 + ///For light sources that can be turned on and off. + var/overlay_lighting_flags = NONE + + ///Cache of the possible light overlays, according to size. + var/static/list/light_overlays = list( + "32" = 'icons/effects/light_overlays/light_32.dmi', + "64" = 'icons/effects/light_overlays/light_64.dmi', + "96" = 'icons/effects/light_overlays/light_96.dmi', + "128" = 'icons/effects/light_overlays/light_128.dmi', + "160" = 'icons/effects/light_overlays/light_160.dmi', + "192" = 'icons/effects/light_overlays/light_192.dmi', + "224" = 'icons/effects/light_overlays/light_224.dmi', + "256" = 'icons/effects/light_overlays/light_256.dmi', + "288" = 'icons/effects/light_overlays/light_288.dmi', + "320" = 'icons/effects/light_overlays/light_320.dmi', + "352" = 'icons/effects/light_overlays/light_352.dmi', + "384" = 'icons/effects/light_overlays/light_384.dmi', + "416" = 'icons/effects/light_overlays/light_416.dmi', + ) + + ///Overlay effect to cut into the darkness and provide light. + var/image/visible_mask + ///Lazy list to track the turfs being affected by our light, to determine their visibility. + var/list/turf/affected_turfs + ///Movable atom currently holding the light. Parent might be a flashlight, for example, but that might be held by a mob or something else. + var/atom/movable/current_holder + ///Movable atom the parent is attached to. For example, a flashlight into a helmet or gun. We'll need to track the thing the parent is attached to as if it were the parent itself. + var/atom/movable/parent_attached_to + ///Whether we're a directional light + var/directional = FALSE + ///A cone overlay for directional light, it's alpha and color are dependant on the light + var/image/cone + ///Current tracked direction for the directional cast behaviour + var/current_direction + ///Tracks current directional x offset so we dont update unecessarily + var/directional_offset_x + ///Tracks current directional y offset so we dont update unecessarily + var/directional_offset_y + ///Cast range for the directional cast (how far away the atom is moved) + var/cast_range = 2 + + +/datum/component/overlay_lighting/Initialize(_range, _power, _color, starts_on, is_directional) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + var/atom/movable/movable_parent = parent + if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != DIRECTIONAL_LIGHT) + stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT]/[DIRECTIONAL_LIGHT] instead.") + return COMPONENT_INCOMPATIBLE + + . = ..() + + visible_mask = image('icons/effects/light_overlays/light_32.dmi', icon_state = "light") + visible_mask.plane = O_LIGHTING_VISUAL_PLANE + visible_mask.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + visible_mask.alpha = 0 + if(is_directional) + directional = TRUE + cone = image('icons/effects/light_overlays/light_cone.dmi', icon_state = "light") + cone.plane = O_LIGHTING_VISUAL_PLANE + cone.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + cone.alpha = 110 + cone.transform = cone.transform.Translate(-32, -32) + set_direction(movable_parent.dir) + if(!isnull(_range)) + movable_parent.set_light_range(_range) + set_range(parent, movable_parent.light_range) + if(!isnull(_power)) + movable_parent.set_light_power(_power) + set_power(parent, movable_parent.light_power) + if(!isnull(_color)) + movable_parent.set_light_color(_color) + set_color(parent, movable_parent.light_color) + if(!isnull(starts_on)) + movable_parent.set_light_on(starts_on) + +/datum/component/overlay_lighting/RegisterWithParent() + . = ..() + if(directional) + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_parent_dir_change)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_moved)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(check_holder)) + RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_RANGE, PROC_REF(set_range)) + RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_POWER, PROC_REF(set_power)) + RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_COLOR, PROC_REF(set_color)) + RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_ON, PROC_REF(on_toggle)) + RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_FLAGS, PROC_REF(on_light_flags_change)) + var/atom/movable/movable_parent = parent + if(movable_parent.light_flags & LIGHT_ATTACHED) + overlay_lighting_flags |= LIGHTING_ATTACHED + set_parent_attached_to(ismovable(movable_parent.loc) ? movable_parent.loc : null) + check_holder() + if(movable_parent.light_on) + turn_on() + + + +/datum/component/overlay_lighting/UnregisterFromParent() + overlay_lighting_flags &= ~LIGHTING_ATTACHED + set_parent_attached_to(null) + set_holder(null) + clean_old_turfs() + UnregisterSignal(parent, list( + COMSIG_MOVABLE_MOVED, + COMSIG_ATOM_SET_LIGHT_RANGE, + COMSIG_ATOM_SET_LIGHT_POWER, + COMSIG_ATOM_SET_LIGHT_COLOR, + COMSIG_ATOM_SET_LIGHT_ON, + COMSIG_ATOM_SET_LIGHT_FLAGS, + )) + if(directional) + UnregisterSignal(parent, COMSIG_ATOM_DIR_CHANGE) + if(overlay_lighting_flags & LIGHTING_ON) + turn_off() + return ..() + + +/datum/component/overlay_lighting/Destroy() + set_parent_attached_to(null) + set_holder(null) + clean_old_turfs() + visible_mask = null + cone = null + parent_attached_to = null + return ..() + + +///Clears the affected_turfs lazylist, removing from its contents the effects of being near the light. +/datum/component/overlay_lighting/proc/clean_old_turfs() + for(var/turf/lit_turf as anything in affected_turfs) + lit_turf.dynamic_lumcount -= lum_power + affected_turfs = null + + +///Populates the affected_turfs lazylist, adding to its contents the effects of being near the light. +/datum/component/overlay_lighting/proc/get_new_turfs() + if(!current_holder) + return + LAZYINITLIST(affected_turfs) + if(range <= 2) + //Range here is 1 because actual range of lighting mask is 1 tile even if it says that range is 2 + for(var/turf/lit_turf in RANGE_TURFS(1, current_holder.loc)) + lit_turf.dynamic_lumcount += lum_power + affected_turfs += lit_turf + else + for(var/turf/lit_turf in view(lumcount_range, get_turf(current_holder))) + lit_turf.dynamic_lumcount += lum_power + affected_turfs += lit_turf + + +///Clears the old affected turfs and populates the new ones. +/datum/component/overlay_lighting/proc/make_luminosity_update() + clean_old_turfs() + if(!isturf(current_holder?.loc)) + return + if(directional) + cast_directional_light() + get_new_turfs() + + +///Adds the luminosity and source for the afected movable atoms to keep track of their visibility. +/datum/component/overlay_lighting/proc/add_dynamic_lumi() + LAZYSET(current_holder.affected_movable_lights, src, lumcount_range + 1) + current_holder.underlays += visible_mask + current_holder.update_dynamic_luminosity() + if(directional) + current_holder.underlays += cone + +///Removes the luminosity and source for the afected movable atoms to keep track of their visibility. +/datum/component/overlay_lighting/proc/remove_dynamic_lumi() + LAZYREMOVE(current_holder.affected_movable_lights, src) + current_holder.underlays -= visible_mask + current_holder.update_dynamic_luminosity() + if(directional) + current_holder.underlays -= cone + +///Called to change the value of parent_attached_to. +/datum/component/overlay_lighting/proc/set_parent_attached_to(atom/movable/new_parent_attached_to) + if(new_parent_attached_to == parent_attached_to) + return + + . = parent_attached_to + parent_attached_to = new_parent_attached_to + if(.) + var/atom/movable/old_parent_attached_to = . + UnregisterSignal(old_parent_attached_to, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(old_parent_attached_to == current_holder) + RegisterSignal(old_parent_attached_to, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel)) + RegisterSignal(old_parent_attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) + if(parent_attached_to) + if(parent_attached_to == current_holder) + UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + RegisterSignal(parent_attached_to, COMSIG_PARENT_QDELETING, PROC_REF(on_parent_attached_to_qdel)) + RegisterSignal(parent_attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_attached_to_moved)) + check_holder() + + +///Called to change the value of current_holder. +/datum/component/overlay_lighting/proc/set_holder(atom/movable/new_holder) + if(new_holder == current_holder) + return + if(current_holder) + if(current_holder != parent && current_holder != parent_attached_to) + UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(directional) + UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE) + if(overlay_lighting_flags & LIGHTING_ON) + remove_dynamic_lumi() + current_holder = new_holder + if(new_holder == null) + clean_old_turfs() + return + if(new_holder != parent && new_holder != parent_attached_to) + RegisterSignal(new_holder, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel)) + if(overlay_lighting_flags & LIGHTING_ON) + RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) + if(directional) + RegisterSignal(new_holder, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_holder_dir_change)) + if(directional && current_direction != new_holder.dir) + current_direction = new_holder.dir + if(overlay_lighting_flags & LIGHTING_ON) + add_dynamic_lumi() + make_luminosity_update() + + +///Used to determine the new valid current_holder from the parent's loc. +/datum/component/overlay_lighting/proc/check_holder() + var/atom/movable/movable_parent = GET_PARENT + if(isturf(movable_parent.loc)) + set_holder(movable_parent) + return + var/atom/inside = movable_parent.loc //Parent's loc + if(isnull(inside)) + set_holder(null) + return + if(isturf(inside.loc)) + set_holder(inside) + return + set_holder(null) + + +///Called when the current_holder is qdeleted, to remove the light effect. +/datum/component/overlay_lighting/proc/on_holder_qdel(atom/movable/source, force) + UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(directional) + UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE) + set_holder(null) + + +///Called when current_holder changes loc. +/datum/component/overlay_lighting/proc/on_holder_moved(atom/movable/source, OldLoc, Dir, Forced) + if(!(overlay_lighting_flags & LIGHTING_ON)) + return + make_luminosity_update() + +///Called when the current_holder is qdeleted, to remove the light effect. +/datum/component/overlay_lighting/proc/on_parent_attached_to_qdel(atom/movable/source, force) + SIGNAL_HANDLER + UnregisterSignal(parent_attached_to, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(directional) + UnregisterSignal(parent_attached_to, COMSIG_ATOM_DIR_CHANGE) + if(parent_attached_to == current_holder) + set_holder(null) + set_parent_attached_to(null) + +///Called when parent_attached_to changes loc. +/datum/component/overlay_lighting/proc/on_parent_attached_to_moved(atom/movable/source, OldLoc, Dir, Forced) + SIGNAL_HANDLER + check_holder() + if(!(overlay_lighting_flags & LIGHTING_ON) || !current_holder) + return + make_luminosity_update() + +///Called when parent changes loc. +/datum/component/overlay_lighting/proc/on_parent_moved(atom/movable/source, OldLoc, Dir, Forced) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + if(overlay_lighting_flags & LIGHTING_ATTACHED) + set_parent_attached_to(ismovable(movable_parent.loc) ? movable_parent.loc : null) + check_holder() + if(!(overlay_lighting_flags & LIGHTING_ON) || !current_holder) + return + make_luminosity_update() + + +///Changes the range which the light reaches. 0 means no light, 7 is the maximum value. +/datum/component/overlay_lighting/proc/set_range(atom/source, new_range) + SIGNAL_HANDLER + if(range == new_range) + return + if(range == 0) + turn_off() + range = clamp(CEILING(new_range, 0.5), 1, 7) + var/pixel_bounds = ((range - 1) * 64) + 32 + lumcount_range = CEILING(range, 1) + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= visible_mask + visible_mask.icon = light_overlays["[pixel_bounds]"] + if(pixel_bounds == 32) + visible_mask.transform = null + return + var/offset = (pixel_bounds - 32) * 0.5 + var/matrix/transform = new + transform.Translate(-offset, -offset) + visible_mask.transform = transform + directional_offset_x = 0 + directional_offset_y = 0 + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask + if(directional) + cast_range = clamp(round(new_range * 0.5), 1, 3) + if(overlay_lighting_flags & LIGHTING_ON) + make_luminosity_update() + + +///Changes the intensity/brightness of the light by altering the visual object's alpha. +/datum/component/overlay_lighting/proc/set_power(atom/source, new_power) + SIGNAL_HANDLER + set_lum_power(new_power >= 0 ? 0.5 : -0.5) + set_alpha = min(230, (abs(new_power) * 120) + 30) + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= visible_mask + visible_mask.alpha = set_alpha + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask + + if(!directional) + return + + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= cone + cone.alpha = min(200, (abs(new_power) * 90)+20) + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += cone + + +///Changes the light's color, pretty straightforward. +/datum/component/overlay_lighting/proc/set_color(atom/source, new_color) + SIGNAL_HANDLER + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= visible_mask + visible_mask.color = new_color + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask + + if(!directional) + return + + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= cone + cone.color = new_color + if(current_holder && overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += cone + + +///Toggles the light on and off. +/datum/component/overlay_lighting/proc/on_toggle(atom/source, new_value) + SIGNAL_HANDLER + if(new_value) //Truthy value input, turn on. + turn_on() + return + turn_off() //Falsey value, turn off. + +///Triggered right after the parent light flags change. +/datum/component/overlay_lighting/proc/on_light_flags_change(atom/source, new_flags) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + + if(new_flags & LIGHT_ATTACHED) // Gained the [LIGHT_ATTACHED] property + overlay_lighting_flags |= LIGHTING_ATTACHED + if(ismovable(movable_parent.loc)) + set_parent_attached_to(movable_parent.loc) + else // Lost the [LIGHT_ATTACHED] property + overlay_lighting_flags &= ~LIGHTING_ATTACHED + set_parent_attached_to(null) + +///Toggles the light on. +/datum/component/overlay_lighting/proc/turn_on() + if(overlay_lighting_flags & LIGHTING_ON) + return + overlay_lighting_flags |= LIGHTING_ON + if(current_holder) + add_dynamic_lumi(current_holder) + if(directional) + cast_directional_light() + if(current_holder && current_holder != parent && current_holder != parent_attached_to) + RegisterSignal(current_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) + get_new_turfs() + + +///Toggles the light off. +/datum/component/overlay_lighting/proc/turn_off() + if(!(overlay_lighting_flags & LIGHTING_ON)) + return + if(current_holder) + remove_dynamic_lumi() + overlay_lighting_flags &= ~LIGHTING_ON + if(current_holder && current_holder != parent && current_holder != parent_attached_to) + UnregisterSignal(current_holder, COMSIG_MOVABLE_MOVED) + clean_old_turfs() + + +///Here we append the behavior associated to changing lum_power. +/datum/component/overlay_lighting/proc/set_lum_power(new_lum_power) + if(lum_power == new_lum_power) + return + . = lum_power + lum_power = new_lum_power + var/difference = . - lum_power + for(var/t in affected_turfs) + var/turf/lit_turf = t + lit_turf.dynamic_lumcount -= difference + +///Here we append the behavior associated to changing lum_power. +/datum/component/overlay_lighting/proc/cast_directional_light() + var/final_distance = cast_range + //Lower the distance by 1 if we're not looking at a cardinal direction, and we're not a short cast + if(final_distance > SHORT_CAST && !(ALL_CARDINALS & current_direction)) + final_distance -= 1 + var/turf/scanning = get_turf(current_holder) + for(var/i in 1 to final_distance) + var/turf/next_turf = get_step(scanning, current_direction) + if(isnull(next_turf) || IS_OPAQUE_TURF(next_turf)) + final_distance = i + break + scanning = next_turf + + current_holder.underlays -= visible_mask + + var/translate_x = -((range - 1) * 32) + var/translate_y = translate_x + switch(current_direction) + if(NORTH) + translate_y += 32 * final_distance + if(SOUTH) + translate_y += -32 * final_distance + if(EAST) + translate_x += 32 * final_distance + if(WEST) + translate_x += -32 * final_distance + if((directional_offset_x != translate_x) || (directional_offset_y != translate_y)) + directional_offset_x = translate_x + directional_offset_y = translate_y + var/matrix/transform = matrix() + transform.Translate(translate_x, translate_y) + visible_mask.transform = transform + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask + +///Called when current_holder changes loc. +/datum/component/overlay_lighting/proc/on_holder_dir_change(atom/movable/source, olddir, newdir) + SIGNAL_HANDLER + set_direction(newdir) + +///Called when parent changes loc. +/datum/component/overlay_lighting/proc/on_parent_dir_change(atom/movable/source, olddir, newdir) + SIGNAL_HANDLER + + if(current_holder?.dir != newdir) + return + + set_direction(newdir) + +///Sets a new direction for the directional cast, then updates luminosity +/datum/component/overlay_lighting/proc/set_direction(newdir) + if(!newdir) + return + if(current_direction == newdir) + return + current_direction = newdir + if(overlay_lighting_flags & LIGHTING_ON) + make_luminosity_update() + +#undef LIGHTING_ON +#undef LIGHTING_ATTACHED +#undef GET_PARENT +#undef SHORT_CAST diff --git a/code/datums/effects/acid.dm b/code/datums/effects/acid.dm index 721fe27a0d0d..d89f7261a223 100644 --- a/code/datums/effects/acid.dm +++ b/code/datums/effects/acid.dm @@ -104,7 +104,7 @@ if(!acids_area) return - if(SSweather.is_weather_event && locate(acids_area.master) in SSweather.weather_areas) + if(SSweather.is_weather_event && locate(acids_area) in SSweather.weather_areas) //smothering_strength is 1-10, we use this to take a proportional amount off the stats duration = duration - (duration * (SSweather.weather_event_instance.fire_smothering_strength * 0.1)) damage_in_total_human = damage_in_total_human - (damage_in_total_human * (SSweather.weather_event_instance.fire_smothering_strength * 0.1)) diff --git a/code/datums/effects/neurotoxin.dm b/code/datums/effects/neurotoxin.dm index 836fccf49ca3..1657d41d8a36 100644 --- a/code/datums/effects/neurotoxin.dm +++ b/code/datums/effects/neurotoxin.dm @@ -123,13 +123,8 @@ return TRUE /datum/effects/neurotoxin/proc/process_hallucination(mob/living/carbon/human/victim) - /// area of the victim for areachecks - var/hallu_area = get_area(victim) switch(rand(0, 100)) if(0 to 5) - if(hallu_area) - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("[victim] has experienced a rare neuro-induced 'Schizo Lurker Pounce' hallucination (5% chance) at \the [hallu_area]" + " [OBSERVER_JMP(observer, victim)]")) playsound_client(victim?.client,pick('sound/voice/alien_pounce.ogg','sound/voice/alien_pounce.ogg')) victim.KnockDown(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound_client), victim.client,"alien_claw_flesh"), 1 SECONDS) @@ -140,18 +135,12 @@ victim.apply_effect(AGONY,10) victim.emote("pain") if(6 to 10) - if(hallu_area) - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("[victim] has experienced a rare neuro-induced 'OB' hallucination (4% chance) at \the [hallu_area]" + " [OBSERVER_JMP(observer, victim)]")) playsound_client(victim.client,'sound/effects/ob_alert.ogg') addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound_client), victim.client,'sound/weapons/gun_orbital_travel.ogg'), 2 SECONDS) if(11 to 16) playsound_client(victim.client,'sound/voice/alien_queen_screech.ogg') victim.KnockDown(1) if(17 to 24) - if(hallu_area) - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("[victim] has experienced a rare neuro-induced 'Fake CAS firemission' hallucination (7% chance) at \the [hallu_area]" + " [OBSERVER_JMP(observer, victim)]")) hallucination_fakecas_sequence(victim) //Not gonna spam a billion timers for this one so outsourcing to a proc with sleeps is a better async solution if(25 to 42) to_chat(victim,SPAN_HIGHDANGER("A SHELL IS ABOUT TO IMPACT [pick(SPAN_UNDERLINE("TOWARDS THE [pick("WEST","EAST","SOUTH","NORTH")]"),SPAN_UNDERLINE("RIGHT ONTOP OF YOU!"))]!")) diff --git a/code/datums/elements/bullet_trait/bullet_trait.md b/code/datums/elements/bullet_trait/bullet_trait.md index 9253b3a6311a..8081843bd000 100644 --- a/code/datums/elements/bullet_trait/bullet_trait.md +++ b/code/datums/elements/bullet_trait/bullet_trait.md @@ -1,7 +1,7 @@ # A PROTOTYPE FOR MAKING ANY BULLET TRAITS Element representing traits that can be applied to bullets upon being fired -* Must be attached to a projectile (`/obj/item/projectile` in `projectile.dm`) +* Must be attached to a projectile (`/obj/projectile` in `projectile.dm`) * Allows for the customization of bullet behavior based on ammo types or guns (or other things) By convention, bullet_traits should be named bullet_trait_[insert rest of name here] @@ -16,7 +16,7 @@ By convention, bullet_traits should be named bullet_trait_[insert rest of name h /datum/element/bullet_trait/databaseAttach(datum/target) . = ..() // All bullet traits can only be applied to projectiles - if(!istype(target, /obj/item/projectile)) + if(!istype(target, /obj/projectile)) return ELEMENT_INCOMPATIBLE [handling here] diff --git a/code/datums/elements/bullet_trait/damage_boost.dm b/code/datums/elements/bullet_trait/damage_boost.dm index 1d93851dd73d..a0370f2d36b6 100644 --- a/code/datums/elements/bullet_trait/damage_boost.dm +++ b/code/datums/elements/bullet_trait/damage_boost.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(damage_boost_vehicles, typecacheof(/obj/vehicle/multitile)) */ /datum/element/bullet_trait_damage_boost/Attach(datum/target, damage_mult, list/damage_boosted_atoms) . = ..() - if(!istype(target, /obj/item/projectile)) + if(!istype(target, /obj/projectile)) return ELEMENT_INCOMPATIBLE src.damage_mult = damage_mult @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(damage_boost_vehicles, typecacheof(/obj/vehicle/multitile)) //add more cases for other interactions (switch doesn't seem to work with istype) else return 0 -/datum/element/bullet_trait_damage_boost/proc/handle_bullet(obj/item/projectile/P, atom/A) +/datum/element/bullet_trait_damage_boost/proc/handle_bullet(obj/projectile/P, atom/A) SIGNAL_HANDLER atom_type = check_type(A) diff --git a/code/datums/elements/bullet_trait/iff.dm b/code/datums/elements/bullet_trait/iff.dm index bd08c100d0f4..ab48b29f4812 100644 --- a/code/datums/elements/bullet_trait/iff.dm +++ b/code/datums/elements/bullet_trait/iff.dm @@ -1,5 +1,5 @@ /// This is the iff_group -/obj/item/projectile/var/runtime_iff_group +/obj/projectile/var/runtime_iff_group /datum/element/bullet_trait_iff // General bullet trait vars @@ -13,7 +13,7 @@ /datum/element/bullet_trait_iff/Attach(datum/target, iff_group) . = ..() - if(!istype(target, /obj/item/projectile)) + if(!istype(target, /obj/projectile)) return ELEMENT_INCOMPATIBLE if(!iff_group) @@ -39,7 +39,7 @@ /datum/element/bullet_trait_iff/proc/set_iff(datum/target, mob/living/carbon/human/firer) SIGNAL_HANDLER - var/obj/item/projectile/P = target + var/obj/projectile/P = target P.runtime_iff_group = get_user_iff_group(firer) // We have a "cache" to avoid getting ID card iff every shot, diff --git a/code/datums/elements/bullet_trait/ignored_range.dm b/code/datums/elements/bullet_trait/ignored_range.dm index 668e5dab2dd7..3910fb400bdb 100644 --- a/code/datums/elements/bullet_trait/ignored_range.dm +++ b/code/datums/elements/bullet_trait/ignored_range.dm @@ -12,7 +12,7 @@ /datum/element/bullet_trait_ignored_range/Attach(datum/target, range_to_ignore) . = ..() ignored_range = range_to_ignore - if(!istype(target, /obj/item/projectile)) + if(!istype(target, /obj/projectile)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_BULLET_CHECK_MOB_SKIPPING, PROC_REF(check_distance)) @@ -22,7 +22,7 @@ return ..() -/datum/element/bullet_trait_ignored_range/proc/check_distance(obj/item/projectile/P, mob/living/carbon/human/projectile_target) +/datum/element/bullet_trait_ignored_range/proc/check_distance(obj/projectile/P, mob/living/carbon/human/projectile_target) SIGNAL_HANDLER if(P.distance_travelled <= ignored_range) diff --git a/code/datums/elements/bullet_trait/incendiary.dm b/code/datums/elements/bullet_trait/incendiary.dm index c7f6e75e8e3b..2d5d0a15f368 100644 --- a/code/datums/elements/bullet_trait/incendiary.dm +++ b/code/datums/elements/bullet_trait/incendiary.dm @@ -8,7 +8,7 @@ /datum/element/bullet_trait_incendiary/Attach(datum/target, reagent = /datum/reagent/napalm/ut, stacks = 20) . = ..() - if(!istype(target, /obj/item/projectile)) + if(!istype(target, /obj/projectile)) return ELEMENT_INCOMPATIBLE if(ispath(reagent)) diff --git a/code/datums/elements/bullet_trait/penetrating/heavy.dm b/code/datums/elements/bullet_trait/penetrating/heavy.dm new file mode 100644 index 000000000000..fa41b8dcfc4e --- /dev/null +++ b/code/datums/elements/bullet_trait/penetrating/heavy.dm @@ -0,0 +1,47 @@ +/datum/element/bullet_trait_penetrating/heavy + // Generic bullet trait vars + element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + id_arg_index = 3 + + /// For every turf this pierces, how much damage should this lose? + var/damage_lost_per_pen = 100 + /// Typecache of things to annihilate if the bullet is on a tile with it + var/static/list/bullet_destroy_structures = typecacheof(list( + /obj/structure/surface, + /obj/structure/barricade, + )) + +/datum/element/bullet_trait_penetrating/heavy/Attach(datum/target, distance_loss_per_hit = 3, damage_lost_per_pen = 75) + . = ..() + if(. == ELEMENT_INCOMPATIBLE) + return + + src.damage_lost_per_pen = damage_lost_per_pen + +/datum/element/bullet_trait_penetrating/heavy/handle_passthrough_movables(obj/projectile/bullet, atom/movable/hit_movable, did_hit) + if(did_hit) + var/slow_mult = 1 + if(ismob(hit_movable)) + var/mob/mob = hit_movable + if(mob.mob_size >= MOB_SIZE_BIG) + slow_mult = 2 + + bullet.distance_travelled += (distance_loss_per_hit * slow_mult) + + if(is_type_in_typecache(hit_movable, bullet_destroy_structures)) + var/obj/structure/cade = hit_movable + cade.deconstruct() // This bullet just tears through whatever cades you put it up against from either side + bullet.damage -= damage_lost_per_pen + + return COMPONENT_BULLET_PASS_THROUGH + +/datum/element/bullet_trait_penetrating/heavy/handle_passthrough_turf(obj/projectile/bullet, turf/closed/wall/hit_wall) + bullet.distance_travelled += distance_loss_per_hit + bullet.damage -= damage_lost_per_pen + + if(!istype(hit_wall)) + return COMPONENT_BULLET_PASS_THROUGH + + if(!hit_wall.hull) + return COMPONENT_BULLET_PASS_THROUGH + diff --git a/code/datums/elements/bullet_trait/penetrating.dm b/code/datums/elements/bullet_trait/penetrating/penetrating.dm similarity index 89% rename from code/datums/elements/bullet_trait/penetrating.dm rename to code/datums/elements/bullet_trait/penetrating/penetrating.dm index 00fb330a7330..d3ba8a78f7f4 100644 --- a/code/datums/elements/bullet_trait/penetrating.dm +++ b/code/datums/elements/bullet_trait/penetrating/penetrating.dm @@ -8,7 +8,7 @@ /datum/element/bullet_trait_penetrating/Attach(datum/target, distance_loss_per_hit = 3) . = ..() - if(!istype(target, /obj/item/projectile)) + if(!istype(target, /obj/projectile)) return ELEMENT_INCOMPATIBLE src.distance_loss_per_hit = distance_loss_per_hit @@ -27,13 +27,13 @@ )) return ..() -/datum/element/bullet_trait_penetrating/proc/handle_passthrough_movables(obj/item/projectile/P, atom/movable/A, did_hit) +/datum/element/bullet_trait_penetrating/proc/handle_passthrough_movables(obj/projectile/P, atom/movable/A, did_hit) SIGNAL_HANDLER if(did_hit) P.distance_travelled += distance_loss_per_hit return COMPONENT_BULLET_PASS_THROUGH -/datum/element/bullet_trait_penetrating/proc/handle_passthrough_turf(obj/item/projectile/P, turf/closed/wall/T) +/datum/element/bullet_trait_penetrating/proc/handle_passthrough_turf(obj/projectile/P, turf/closed/wall/T) SIGNAL_HANDLER P.distance_travelled += distance_loss_per_hit diff --git a/code/datums/elements/light_blocking.dm b/code/datums/elements/light_blocking.dm new file mode 100644 index 000000000000..9fef194f1cd4 --- /dev/null +++ b/code/datums/elements/light_blocking.dm @@ -0,0 +1,43 @@ +/** + * Attached to movable atoms with opacity. Listens to them move and updates their old and new turf loc's opacity accordingly. + */ +/datum/element/light_blocking + element_flags = ELEMENT_DETACH + + +/datum/element/light_blocking/Attach(datum/target) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_target_move)) + var/atom/movable/movable_target = target + if(!isturf(movable_target.loc)) + return + for(var/turf/turf_loc as anything in movable_target.locs) + turf_loc.add_opacity_source(target) + + +/datum/element/light_blocking/Detach(datum/target) + . = ..() + UnregisterSignal(target, list(COMSIG_MOVABLE_MOVED)) + var/atom/movable/movable_target = target + if(!isturf(movable_target.loc)) + return + for(var/turf/turf_loc as anything in movable_target.locs) + turf_loc.remove_opacity_source(target) + + +///Updates old and new turf loc opacities. +///Updates old and new turf loc opacities. +/datum/element/light_blocking/proc/on_target_move(atom/movable/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + if(isturf(old_loc)) + if(old_locs) + for(var/turf/old_turf as anything in old_locs) + old_turf.remove_opacity_source(source) + else + var/turf/old_turf = old_loc + old_turf.remove_opacity_source(source) + if(isturf(source.loc)) + for(var/turf/new_turf as anything in source.locs) + new_turf.add_opacity_source(source) diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index e7dcba08ed61..7ed61852e9bf 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -1,13 +1,12 @@ -//whiskey outpost extra marines /datum/emergency_call/cryo_squad name = "Marine Cryo Reinforcements (Squad)" mob_max = 10 mob_min = 1 probability = 0 objectives = "Assist the USCM forces" - max_engineers = 4 + max_engineers = 2 max_medics = 2 name_of_spawn = /obj/effect/landmark/ert_spawns/distress_cryo shuttle_id = "" @@ -95,3 +94,10 @@ /obj/effect/landmark/ert_spawns/distress_cryo name = "Distress_Cryo" + +/datum/emergency_call/cryo_squad/tech + name = "Marine Cryo Reinforcements (Tech)" + mob_max = 5 + max_engineers = 1 + max_medics = 1 + max_heavies = 0 diff --git a/code/datums/emergency_calls/cryo_spec.dm b/code/datums/emergency_calls/cryo_spec.dm new file mode 100644 index 000000000000..6cc7c905efbc --- /dev/null +++ b/code/datums/emergency_calls/cryo_spec.dm @@ -0,0 +1,43 @@ +/datum/emergency_call/cryo_spec + name = "Marine Cryo Reinforcement (Spec)" + mob_max = 1 + mob_min = 1 + probability = 0 + objectives = "Assist the USCM forces" + name_of_spawn = /obj/effect/landmark/ert_spawns/distress_cryo + shuttle_id = "" + spawn_max_amount = TRUE + +/datum/emergency_call/cryo_spec/create_member(datum/mind/mind, turf/override_spawn_loc) + set waitfor = FALSE + if(SSmapping.configs[GROUND_MAP].map_name == MAP_WHISKEY_OUTPOST) + name_of_spawn = /obj/effect/landmark/ert_spawns/distress_wo + var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() + + if(!istype(spawn_loc)) + return //Didn't find a useable spawn point. + + var/mob/living/carbon/human/human = new(spawn_loc) + + if(mind) + mind.transfer_to(human, TRUE) + else + human.create_hud() + + if(!mind) + for(var/obj/structure/machinery/cryopod/pod in view(7,human)) + if(pod && !pod.occupant) + pod.go_in_cryopod(human, silent = TRUE) + break + + sleep(5) + human.client?.prefs.copy_all_to(human, JOB_SQUAD_SPECIALIST, TRUE, TRUE) + arm_equipment(human, /datum/equipment_preset/uscm/spec/cryo, mind == null, TRUE) + to_chat(human, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM")) + to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) + + sleep(10) + if(!mind) + human.free_for_ghosts() + to_chat(human, SPAN_BOLD("Objectives: [objectives]")) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 3d43917b2bc7..390a8cfd5d61 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -8,12 +8,19 @@ /datum/game_mode var/list/datum/emergency_call/all_calls = list() //initialized at round start and stores the datums. var/datum/emergency_call/picked_calls[] = list() //Which distress calls are currently active + var/ert_dispatched = FALSE /datum/game_mode/proc/ares_online() var/name = "ARES Online" var/input = "ARES. Online. Good morning, marines." shipwide_ai_announcement(input, name, 'sound/AI/ares_online.ogg') +/datum/game_mode/proc/request_ert(user, ares = FALSE) + if(!user) + return FALSE + message_admins("[key_name(user)] has requested a Distress Beacon! [ares ? SPAN_ORANGE("(via ARES)") : ""] ([SSticker.mode.ert_dispatched ? SPAN_RED("A random ERT was dispatched previously.") : SPAN_GREEN("No previous random ERT dispatched.")]) [CC_MARK(user)] (SEND) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") + return TRUE + //The distress call parent. Cannot be called itself due to "name" being a filtered target. /datum/emergency_call var/name = "name" @@ -106,6 +113,7 @@ give_action(M, /datum/action/join_ert, src) /datum/game_mode/proc/activate_distress() + ert_dispatched = TRUE var/datum/emergency_call/random_call = get_random_call() if(!istype(random_call, /datum/emergency_call)) //Something went horribly wrong return @@ -147,7 +155,6 @@ var/choice = tgui_input_list(src, "Choose a distress beacon to join", "", beacons) if(!choice) - to_chat(src, "Something seems to have gone wrong!") return if(!beacons[choice] || !(beacons[choice] in SSticker.mode.picked_calls)) diff --git a/code/datums/emergency_calls/royal_marines.dm b/code/datums/emergency_calls/royal_marines.dm new file mode 100644 index 000000000000..b3feaccf87bb --- /dev/null +++ b/code/datums/emergency_calls/royal_marines.dm @@ -0,0 +1,75 @@ +/datum/emergency_call/royal_marines + name = "Royal Marines Commando (Squad) (Friendly)" + mob_max = 7 + probability = 0 + name_of_spawn = /obj/effect/landmark/ert_spawns/distress_twe + item_spawn = /obj/effect/landmark/ert_spawns/distress_twe/item + max_engineers = 0 + max_medics = 0 + max_heavies = 3 + +/datum/emergency_call/royal_marines/New() + ..() + arrival_message = "[MAIN_SHIP_NAME], this is [pick_weight(list("HMS Patna"= 50, "HMS Thunderchild" = 50))]; we are responding to your distress call and boarding in accordance with the Military Aid Act of 2177, Authentication code Lima-18153. " + objectives = "Ensure the survival of the [MAIN_SHIP_NAME], eliminate any hostiles, and assist the crew in any way possible." + + +/datum/emergency_call/royal_marines/create_member(datum/mind/spawning_mind, turf/override_spawn_loc) + var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() + + if(!istype(spawn_loc)) + return //Didn't find a useable spawn point. + + var/mob/living/carbon/human/mob = new(spawn_loc) + spawning_mind.transfer_to(mob, TRUE) + + if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) + leader = mob + to_chat(mob, SPAN_ROLE_HEADER("You are an Officer in the Royal Marines Commando. Born in the Three World Empire.")) + arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/team_leader, TRUE, TRUE) + else if(heavies < max_heavies && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(mob.client, JOB_SQUAD_SPECIALIST)) + var/specialist_kit = pick("Sniper", "Smartgun", "Breach") + switch(specialist_kit) + if("Sniper") + to_chat(mob, SPAN_ROLE_HEADER("You are a skilled marksman in the Royal Marines Commando. Born in the Three World Empire.")) + arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/spec/marksman, TRUE, TRUE) + if("Smartgun") + to_chat(mob, SPAN_ROLE_HEADER("You are a Smartgunner in the Royal Marines Commando. Born in the Three World Empire.")) + arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/spec/machinegun, TRUE, TRUE) + if("Breach") + to_chat(mob, SPAN_ROLE_HEADER("You are a CQB Specialist in the Royal Marines Commando. Born in the Three World Empire.")) + arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/spec/breacher, TRUE, TRUE) + heavies++ + else + to_chat(mob, SPAN_ROLE_HEADER("You are a member of the Royal Marines Commando. Born in the three world empire.")) + arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/standard, TRUE, TRUE) + + print_backstory(mob) + + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + + +/datum/emergency_call/royal_marines/print_backstory(mob/living/carbon/human/spawning_mob) + to_chat(spawning_mob, SPAN_BOLD("You were born in the Three World Empire to a [pick_weight(list("average" = 75, "poor" = 15, "well-established" = 10))] family.")) + to_chat(spawning_mob, SPAN_BOLD("Joining the Royal Marines gave you a lot of combat experience and useful skills.")) + to_chat(spawning_mob, SPAN_BOLD("You are [pick_weight(list("unaware" = 75, "faintly aware" = 15, "knoledgeable" = 10))] of the xenomorph threat.")) + to_chat(spawning_mob, SPAN_BOLD("You are a citizen of the three world empire and joined the Royal Marines Commando")) + to_chat(spawning_mob, SPAN_BOLD("You are apart of a jointed UA/TWE taskforce onboard the HMS Patna and Thunderchild.")) + to_chat(spawning_mob, SPAN_BOLD("Under the directive of the RMC high command, you have been assisting USCM forces with maintaining peace in the area.")) + to_chat(spawning_mob, SPAN_BOLD("Assist the USCMC Force of the [MAIN_SHIP_NAME] however you can.")) + +/datum/emergency_call/royal_marines/platoon + name = "Royal Marines Commando (Platoon) (Friendly)" + mob_min = 7 + mob_max = 28 + probability = 0 + max_medics = 0 + max_heavies = 6 + max_engineers = 0 + +/obj/effect/landmark/ert_spawns/distress_twe + name = "Distress_TWE" + +/obj/effect/landmark/ert_spawns/distress_twe/item + name = "Distress_TWEItem" + diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm index 94d4bf2a0ab6..04bcfecf9128 100644 --- a/code/datums/emergency_calls/upp.dm +++ b/code/datums/emergency_calls/upp.dm @@ -77,14 +77,14 @@ var/equipment_path = /datum/equipment_preset/upp/specialist if(heavy_pick) if(HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER)) - equipment_path = pick(/datum/equipment_preset/upp/specialist, /datum/equipment_preset/upp/minigunner) + equipment_path = pick(/datum/equipment_preset/upp/specialist, /datum/equipment_preset/upp/machinegunner) else if(HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && !HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY)) - equipment_path = /datum/equipment_preset/upp/minigunner + equipment_path = /datum/equipment_preset/upp/machinegunner arm_equipment(H, equipment_path, TRUE, TRUE) else if(smartgunners < max_smartgunners && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) smartgunners++ to_chat(H, SPAN_ROLE_HEADER("You are a sergeant of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) - arm_equipment(H, /datum/equipment_preset/upp/minigunner, TRUE, TRUE) + arm_equipment(H, /datum/equipment_preset/upp/machinegunner, TRUE, TRUE) else to_chat(H, SPAN_ROLE_HEADER("You are a soldier of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/soldier, TRUE, TRUE) diff --git a/code/datums/entities/player_note.dm b/code/datums/entities/player_note.dm index 420bb5f0a470..216e20b40701 100644 --- a/code/datums/entities/player_note.dm +++ b/code/datums/entities/player_note.dm @@ -94,4 +94,4 @@ BSQL_PROTECT_DATUM(/datum/entity/player_note) /// Returns all notes associated with a CKEY, structured as a list of strings. /proc/get_all_notes(player_ckey) for(var/datum/view_record/note_view/note in DB_VIEW(/datum/view_record/note_view, DB_COMP("player_ckey", DB_EQUALS, player_ckey))) - LAZYADDASSOC(., "[note.note_category]", "\"[note.text]\", by [note.admin_ckey] ([note.admin_rank]) on [note.date] ([note.round_id])") + LAZYADDASSOCLIST(., "[note.note_category]", "\"[note.text]\", by [note.admin_ckey] ([note.admin_rank]) on [note.date] ([note.round_id])") diff --git a/code/datums/factions/clf.dm b/code/datums/factions/clf.dm index 38e0d576f805..ce53b505b352 100644 --- a/code/datums/factions/clf.dm +++ b/code/datums/factions/clf.dm @@ -31,12 +31,12 @@ list("PRIMARY FIREARMS", 0, null, null, null), list("ABR-40 Hunting Rifle", 30, /obj/item/weapon/gun/rifle/l42a/abr40, null, VENDOR_ITEM_REGULAR), list("Basira-Armstrong Bolt-Action", 15, /obj/item/weapon/gun/boltaction, null, VENDOR_ITEM_REGULAR), - list("CZ-81 Machine Pistol", 20, /obj/item/ammo_magazine/pistol/skorpion, null, VENDOR_ITEM_REGULAR), list("Double Barrel Shotgun", 30, /obj/item/weapon/gun/shotgun/double, null, VENDOR_ITEM_REGULAR), list("HG 37-12 Pump Shotgun", 30, /obj/item/weapon/gun/shotgun/double/sawn, null, VENDOR_ITEM_REGULAR), list("M16 Rifle", 30, /obj/item/weapon/gun/rifle/m16, null, VENDOR_ITEM_REGULAR), list("MAR-30 Battle Carbine", 30, /obj/item/weapon/gun/rifle/mar40/carbine, null, VENDOR_ITEM_REGULAR), list("MAR-40 Battle Rifle", 30, /obj/item/weapon/gun/rifle/mar40, null, VENDOR_ITEM_REGULAR), + list("Type-64 Submachinegun", 20, /obj/item/weapon/gun/smg/bizon, null, VENDOR_ITEM_REGULAR), list("MAC-15 Submachinegun", 20, /obj/item/weapon/gun/smg/mac15, null, VENDOR_ITEM_REGULAR), list("MP27 Submachinegun", 20, /obj/item/weapon/gun/smg/mp27, null, VENDOR_ITEM_REGULAR), list("MP5 Submachinegun", 20, /obj/item/weapon/gun/smg/mp5, null, VENDOR_ITEM_REGULAR), @@ -48,12 +48,12 @@ list("Box Of Buckshot Shells", 10, /obj/item/ammo_magazine/shotgun/buckshot, null, VENDOR_ITEM_REGULAR), list("Box Of Flechette Shells", 10, /obj/item/ammo_magazine/shotgun/flechette, null, VENDOR_ITEM_REGULAR), list("Box Of Shotgun Slugs", 10, /obj/item/ammo_magazine/shotgun, null, VENDOR_ITEM_REGULAR), - list("CZ-81 Magazine (.32ACP)", 5, /obj/item/ammo_magazine/pistol/skorpion, null, VENDOR_ITEM_REGULAR), list("M16 AP Magazine (5.56x45mm)", 15, /obj/item/ammo_magazine/rifle/m16/ap, null, VENDOR_ITEM_REGULAR), list("M16 Magazine (5.56x45mm)", 5, /obj/item/ammo_magazine/rifle/m16, null, VENDOR_ITEM_REGULAR), list("MAC-15 Magazine (9mm)", 5, /obj/item/ammo_magazine/smg/mac15, null, VENDOR_ITEM_REGULAR), list("MAR Magazine (7.62x39mm)", 5, /obj/item/ammo_magazine/rifle/mar40, null, VENDOR_ITEM_REGULAR), list("MAR Extended Magazine (7.62x39mm)", 15, /obj/item/ammo_magazine/rifle/mar40/extended, null, VENDOR_ITEM_REGULAR), + list("Type-64 Helical Magazine (.7.62x19mm)", 5, /obj/item/ammo_magazine/smg/bizon, null, VENDOR_ITEM_REGULAR), list("MP27 Magazine (4.6x30mm)", 5, /obj/item/ammo_magazine/smg/mp27, null, VENDOR_ITEM_REGULAR), list("MP5 Magazine (9mm)", 5, /obj/item/ammo_magazine/smg/mp5, null, VENDOR_ITEM_REGULAR), @@ -99,13 +99,13 @@ list("PRIMARY FIREARMS", -1, null, null), list("ABR-40 Hunting Rifle", 30, /obj/item/weapon/gun/rifle/l42a/abr40, null, VENDOR_ITEM_REGULAR), list("Basira-Armstrong Bolt-Action", 15, /obj/item/weapon/gun/boltaction, null, VENDOR_ITEM_REGULAR), - list("CZ-81 Machine Pistol", 20, /obj/item/ammo_magazine/pistol/skorpion, VENDOR_ITEM_REGULAR), list("Double Barrel Shotgun", 20, /obj/item/weapon/gun/shotgun/double, VENDOR_ITEM_REGULAR), list("HG 37-12 Pump Shotgun", 20, /obj/item/weapon/gun/shotgun/double/sawn, VENDOR_ITEM_REGULAR), list("M16 Rifle", 20, /obj/item/weapon/gun/rifle/m16, VENDOR_ITEM_REGULAR), list("MAC-15 Submachinegun", 20, /obj/item/weapon/gun/smg/mac15, VENDOR_ITEM_REGULAR), list("MAR-30 Battle Carbine", 20, /obj/item/weapon/gun/rifle/mar40/carbine, VENDOR_ITEM_REGULAR), list("MAR-40 Battle Rifle", 20, /obj/item/weapon/gun/rifle/mar40, VENDOR_ITEM_REGULAR), + list("Type 64 Submachinegun", 20, /obj/item/weapon/gun/smg/bizon, VENDOR_ITEM_REGULAR), list("MP27 Submachinegun", 20, /obj/item/weapon/gun/smg/mp27, VENDOR_ITEM_REGULAR), list("MP5 Submachinegun", 20, /obj/item/weapon/gun/smg/mp5, VENDOR_ITEM_REGULAR), list("Sawn-Off Shotgun", 20, /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, VENDOR_ITEM_REGULAR), @@ -116,12 +116,12 @@ list("Box Of Buckshot Shells", 15, /obj/item/ammo_magazine/shotgun/buckshot, VENDOR_ITEM_REGULAR), list("Box Of Flechette Shells", 15, /obj/item/ammo_magazine/shotgun/flechette, VENDOR_ITEM_REGULAR), list("Box Of Shotgun Slugs", 15, /obj/item/ammo_magazine/shotgun, VENDOR_ITEM_REGULAR), - list("CZ-81 Magazine (.32ACP)", 60, /obj/item/ammo_magazine/pistol/skorpion, VENDOR_ITEM_REGULAR), list("M16 AP Magazine (5.56x45mm)", 10, /obj/item/ammo_magazine/rifle/m16/ap, VENDOR_ITEM_REGULAR), list("M16 Magazine (5.56x45mm)", 60, /obj/item/ammo_magazine/rifle/m16, VENDOR_ITEM_REGULAR), list("MAC-15 Magazine (9mm)", 60, /obj/item/ammo_magazine/smg/mac15, VENDOR_ITEM_REGULAR), list("MAR Magazine (7.62x39mm)", 60, /obj/item/ammo_magazine/rifle/mar40, VENDOR_ITEM_REGULAR), list("MAR Extended Magazine (7.62x39mm)", 10, /obj/item/ammo_magazine/rifle/mar40/extended, VENDOR_ITEM_REGULAR), + list("Type 64 Helical Magazine (7.62x19mm)", 60, /obj/item/ammo_magazine/smg/bizon, VENDOR_ITEM_REGULAR), list("MP27 Magazine (4.6x30mm)", 60, /obj/item/ammo_magazine/smg/mp27, VENDOR_ITEM_REGULAR), list("MP5 Magazine (9mm)", 60, /obj/item/ammo_magazine/smg/mp5, VENDOR_ITEM_REGULAR), diff --git a/code/datums/factions/royalmarinescommando.dm b/code/datums/factions/royalmarinescommando.dm new file mode 100644 index 000000000000..2fab0348bcfa --- /dev/null +++ b/code/datums/factions/royalmarinescommando.dm @@ -0,0 +1,94 @@ +/datum/faction/royal_marines_commando + name = "Royal Marines Commando" + faction_tag = FACTION_TWE + +/datum/faction/royal_marines_commando/modify_hud_holder(image/holder, mob/living/carbon/human/H) + var/hud_icon_state + var/obj/item/card/id/dogtag/ID = H.get_idcard() + var/_role + if(H.mind) + _role = H.job + else if(ID) + _role = ID.rank + switch(_role) + if(JOB_TWE_RMC_LIEUTENANT) + hud_icon_state = "lieutenant" + if(JOB_TWE_RMC_TEAMLEADER) + hud_icon_state = "teamleader" + if(JOB_TWE_RMC_MARKSMAN) + hud_icon_state = "marksman" + if(JOB_TWE_RMC_RIFLEMAN) + hud_icon_state = "rifleman" + if(JOB_TWE_RMC_SMARTGUNNER) + hud_icon_state = "smartgunner" + if(JOB_TWE_RMC_BREACHER) + hud_icon_state = "breacher" + if(hud_icon_state) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', H, "rmc_[hud_icon_state]") + +/datum/faction/royal_marines_commando/get_antag_guns_snowflake_equipment() + return list( + list("PRIMARY FIREARMS", 0, null, null, null), + list("F903A1 Rifle", 20, /obj/item/weapon/gun/rifle/rmc_f90, null, VENDOR_ITEM_REGULAR), + list("F903A2 Rifle", 30, /obj/item/weapon/gun/rifle/rmc_f90/a_grip, null, VENDOR_ITEM_REGULAR), + list("F903A1 Marksman Rifle", 30, /obj/item/weapon/gun/rifle/rmc_f90/scope, null, VENDOR_ITEM_REGULAR), + list("F903A1/B 'Breacher' Rifle", 30, /obj/item/weapon/gun/rifle/rmc_f90/shotgun, null, VENDOR_ITEM_REGULAR), + + list("PRIMARY AMMUNITION", 0, null, null, null), + list("F903 Magazine (10x24mm)", 5, /obj/item/ammo_magazine/rifle/rmc_f90, null, VENDOR_ITEM_REGULAR), + list("F903A1 Marksman Magazine (10x24mm)", 15, /obj/item/ammo_magazine/rifle/rmc_f90/marksman, null, VENDOR_ITEM_REGULAR), + + list("SIDEARMS", 0, null, null, null), + list("VP78 Pistol", 20, /obj/item/weapon/gun/pistol/vp78, null, VENDOR_ITEM_REGULAR), + list("88 Mod 4 Combat Pistol", 15, /obj/item/weapon/gun/pistol/mod88, null, VENDOR_ITEM_REGULAR), + + list("SIDEARM AMMUNITION", 0, null, null, null), + list("VP78 magazine (9mm)", 5, /obj/item/ammo_magazine/pistol/vp78, null, VENDOR_ITEM_REGULAR), + list("88M4 AP Magazine (9mm)", 5, /obj/item/ammo_magazine/pistol/mod88, null, VENDOR_ITEM_REGULAR), + + list("ATTACHMENTS", 0, null, null, null), + list("Angled Grip", 15, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), + list("Burst Fire Assembly", 15, /obj/item/attachable/burstfire_assembly, null, VENDOR_ITEM_REGULAR), + list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), + list("Laser Sight", 15, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), + list("Rail Flashlight", 5, /obj/item/attachable/flashlight, null, VENDOR_ITEM_REGULAR), + 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("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), + list("Vertical Grip", 15, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR), + + list("UTILITIES", 0, null, null, null), + list("M94 Marking Flare Pack", 3, /obj/item/storage/box/m94, null, VENDOR_ITEM_RECOMMENDED), + list("Smoke Grenade", 7, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR), + list("R2175/B HIDP grenade packet", 7, /obj/item/storage/box/packet/rmc/incin, null, VENDOR_ITEM_REGULAR), + list("R2175/A HEDP grenade packet", 7, /obj/item/storage/box/packet/rmc/he, null, VENDOR_ITEM_REGULAR), + list("L5 bayonet", 3, /obj/item/attachable/bayonet/rmc, null, VENDOR_ITEM_REGULAR), + ) + +/datum/faction/royal_marines_commando/get_antag_guns_sorted_equipment() + return list( + list("PRIMARY FIREARMS", -1, null, null), + list("F903A1 Rifle", 20, /obj/item/weapon/gun/rifle/rmc_f90, null, VENDOR_ITEM_REGULAR), + list("F903A2 Rifle", 30, /obj/item/weapon/gun/rifle/rmc_f90/a_grip, null, VENDOR_ITEM_REGULAR), + list("F903A1 Marksman Rifle", 30, /obj/item/weapon/gun/rifle/rmc_f90/scope, null, VENDOR_ITEM_REGULAR), + list("F903A1/B 'Breacher' Rifle", 30, /obj/item/weapon/gun/rifle/rmc_f90/shotgun, null, VENDOR_ITEM_REGULAR), + + list("PRIMARY AMMUNITION", -1, null, null), + list("F903 Magazine (10x24mm)", 5, /obj/item/ammo_magazine/rifle/rmc_f90, null, VENDOR_ITEM_REGULAR), + list("F903A1 Marksman Magazine (10x24mm)", 15, /obj/item/ammo_magazine/rifle/rmc_f90/marksman, null, VENDOR_ITEM_REGULAR), + + list("SIDEARMS", -1, null, null), + list("VP78 Pistol", 20, /obj/item/weapon/gun/pistol/vp78, null, VENDOR_ITEM_REGULAR), + list("88 Mod 4 Combat Pistol", 15, /obj/item/weapon/gun/pistol/mod88, null, VENDOR_ITEM_REGULAR), + + list("SIDEARM AMMUNITION", -1, null, null), + list("VP78 magazine (9mm)", 5, /obj/item/ammo_magazine/pistol/vp78, null, VENDOR_ITEM_REGULAR), + list("88M4 AP Magazine (9mm)", 5, /obj/item/ammo_magazine/pistol/mod88, null, VENDOR_ITEM_REGULAR), + + list("UTILITIES", -1, null, null), + list("M94 Marking Flare Pack", 3, /obj/item/storage/box/m94, null, VENDOR_ITEM_RECOMMENDED), + list("Smoke Grenade", 7, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR), + list("R2175/B HIDP grenade packet", 7, /obj/item/storage/box/packet/rmc/incin, null, VENDOR_ITEM_REGULAR), + list("R2175/A HEDP grenade packet", 7, /obj/item/storage/box/packet/rmc/he, null, VENDOR_ITEM_REGULAR), + list("L5 bayonet", 3, /obj/item/attachable/bayonet/rmc, null, VENDOR_ITEM_REGULAR), + ) diff --git a/code/datums/factions/upp.dm b/code/datums/factions/upp.dm index a5a89cfd0a80..9f28e5967831 100644 --- a/code/datums/factions/upp.dm +++ b/code/datums/factions/upp.dm @@ -47,24 +47,24 @@ /datum/faction/upp/get_antag_guns_snowflake_equipment() return list( list("PRIMARY FIREARMS", 0, null, null, null), - list("CZ-81 Machine Pistol", 20, /obj/item/weapon/gun/pistol/skorpion/upp, null, VENDOR_ITEM_REGULAR), + list("Type 64 Submachinegun", 20, /obj/item/weapon/gun/smg/bizon/upp, null, VENDOR_ITEM_REGULAR), list("Type 71 Pulse Rifle", 30, /obj/item/weapon/gun/rifle/type71, null, VENDOR_ITEM_REGULAR), list("Type 71 Pulse Rifle Carbine", 30, /obj/item/weapon/gun/rifle/type71/carbine, null, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", 0, null, null, null), - list("CZ-81 Magazine (.32ACP)", 5, /obj/item/ammo_magazine/pistol/skorpion, null, VENDOR_ITEM_REGULAR), + list("Type 64 Helical Magazine (7.62x19mm)", 5, /obj/item/ammo_magazine/smg/bizon, null, VENDOR_ITEM_REGULAR), list("Type 71 AP Magazine (5.45x39mm)", 15, /obj/item/ammo_magazine/rifle/type71/ap, null, VENDOR_ITEM_REGULAR), list("Type 71 Magazine (5.45x39mm)", 5, /obj/item/ammo_magazine/rifle/type71, null, VENDOR_ITEM_REGULAR), list("SIDEARMS", 0, null, null, null), - list("Highpower Automag", 15, /obj/item/weapon/gun/pistol/highpower, null, VENDOR_ITEM_REGULAR), - list("Korovin PK-9 Pistol", 15, /obj/item/weapon/gun/pistol/c99/upp, null, VENDOR_ITEM_REGULAR), - list("N-Y 7.62mm Revolver", 15, /obj/item/weapon/gun/revolver/nagant, null, VENDOR_ITEM_REGULAR), + list("Type 73 Pistol", 25, /obj/item/weapon/gun/pistol/t73, null, VENDOR_ITEM_REGULAR), + list("NP92 Pistol", 15, /obj/item/weapon/gun/pistol/np92, null, VENDOR_ITEM_REGULAR), + list("ZHNK-72 Revolver", 15, /obj/item/weapon/gun/revolver/upp, null, VENDOR_ITEM_REGULAR), list("SIDEARM AMMUNITION", 0, null, null, null), - list("Highpower Magazine (9mm)", 5, /obj/item/ammo_magazine/pistol/highpower, null, VENDOR_ITEM_REGULAR), - list("N-Y Speed Loader (7.62x38mmR)", 5, /obj/item/ammo_magazine/revolver/upp, null, VENDOR_ITEM_REGULAR), - list("PK-9 Magazine (.22 Hollowpoint)", 5, /obj/item/ammo_magazine/pistol/c99, null, VENDOR_ITEM_REGULAR), + list("Type 73 Magazine (7.62x25mm Tokarev)", 5, /obj/item/ammo_magazine/pistol/t73, null, VENDOR_ITEM_REGULAR), + list("ZHNK-72 Speed Loader (7.62x38mmR)", 5, /obj/item/ammo_magazine/revolver/upp, null, VENDOR_ITEM_REGULAR), + list("NP92 Magazine (9x18mm Makarov)", 40, /obj/item/ammo_magazine/pistol/np92, null, VENDOR_ITEM_REGULAR), list("ATTACHMENTS", 0, null, null, null), list("Angled Grip", 15, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), @@ -86,24 +86,24 @@ /datum/faction/upp/get_antag_guns_sorted_equipment() return list( list("PRIMARY FIREARMS", -1, null, null), - list("CZ-81 Machine Pistol", 20, /obj/item/weapon/gun/pistol/skorpion/upp, VENDOR_ITEM_REGULAR), + list("Type 64 Submachinegun", 20, /obj/item/weapon/gun/smg/bizon/upp, VENDOR_ITEM_REGULAR), list("Type 71 Pulse Rifle", 20, /obj/item/weapon/gun/rifle/type71, VENDOR_ITEM_REGULAR), list("Type 71 Pulse Rifle Carbine", 20, /obj/item/weapon/gun/rifle/type71/carbine, VENDOR_ITEM_REGULAR), list("PRIMARY AMMUNITION", -1, null, null), - list("CZ-81 Magazine (.32ACP)", 60, /obj/item/ammo_magazine/pistol/skorpion, VENDOR_ITEM_REGULAR), + list("Type 64 Helical Magazine (7.62x19mm)", 60, /obj/item/ammo_magazine/smg/bizon, VENDOR_ITEM_REGULAR), list("Type 71 AP Magazine (5.45x39mm)", 60, /obj/item/ammo_magazine/rifle/type71/ap, VENDOR_ITEM_REGULAR), list("Type 71 Magazine (5.45x39mm)", 60, /obj/item/ammo_magazine/rifle/type71, VENDOR_ITEM_REGULAR), list("SIDEARMS", -1, null, null), - list("Highpower Automag", 20, /obj/item/weapon/gun/pistol/highpower, VENDOR_ITEM_REGULAR), - list("Korovin PK-9 Pistol", 20, /obj/item/weapon/gun/pistol/c99/upp, VENDOR_ITEM_REGULAR), - list("N-Y 7.62mm Revolver", 20, /obj/item/weapon/gun/revolver/nagant, VENDOR_ITEM_REGULAR), + list("Type 73 Pistol", 20, /obj/item/weapon/gun/pistol/t73, VENDOR_ITEM_REGULAR), + list("NP02 Pistol", 20, /obj/item/weapon/gun/pistol/np92, VENDOR_ITEM_REGULAR), + list("ZHNK-72 Revolver", 20, /obj/item/weapon/gun/revolver/upp, VENDOR_ITEM_REGULAR), list("SIDEARM AMMUNITION", -1, null, null), - list("Highpower Magazine (9mm)", 40, /obj/item/ammo_magazine/pistol/highpower, VENDOR_ITEM_REGULAR), - list("N-Y Speed Loader (7.62x38mmR)", 40, /obj/item/ammo_magazine/revolver/upp, VENDOR_ITEM_REGULAR), - list("PK-9 Magazine (.22 Hollowpoint)", 40, /obj/item/ammo_magazine/pistol/c99, VENDOR_ITEM_REGULAR), + list("Type 73 Magazine (7.62x25mm Tokarev)", 40, /obj/item/ammo_magazine/pistol/t73, VENDOR_ITEM_REGULAR), + list("ZHNK-72 Speed Loader (7.62x38mmR)", 40, /obj/item/ammo_magazine/revolver/upp, VENDOR_ITEM_REGULAR), + list("NP92 Magazine (9x18mm Makarov)", 40, /obj/item/ammo_magazine/pistol/np92, VENDOR_ITEM_REGULAR), list("UTILITIES", -1, null, null), list("M94 Marking Flare Pack", 20, /obj/item/storage/box/m94, VENDOR_ITEM_RECOMMENDED), diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index aa1bc9b40783..65c5a47896fa 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -30,10 +30,18 @@ var/list/datum/mob_hud/huds = list( // Stop displaying a HUD to a specific person // (took off medical glasses) -/datum/mob_hud/proc/remove_hud_from(mob/user) +/datum/mob_hud/proc/remove_hud_from(mob/user, source) + if(length(hudusers[user]) && (source in hudusers[user])) + hudusers[user] -= source + + if(length(hudusers[user])) + return FALSE + for(var/mob/target in hudmobs) remove_from_single_hud(user, target) + hudusers -= user + return TRUE // Stop rendering a HUD on a target // "unenroll" them so to speak @@ -53,8 +61,24 @@ var/list/datum/mob_hud/huds = list( user.client.images -= target.clone.hud_list[i] // Allow user to view a HUD (putting on medical glasses) -/datum/mob_hud/proc/add_hud_to(mob/user) +/datum/mob_hud/proc/add_hud_to(mob/user, source) hudusers |= user + if(hudusers[user]) + hudusers[user] |= list(source) + else + hudusers[user] += list(source) + + for(var/mob/target in hudmobs) + add_to_single_hud(user, target) + +/// Refreshes the HUD, adding user and sources if missing and then calls to add the HUD +/datum/mob_hud/proc/refresh_hud(mob/user, list/source) + hudusers |= user + if(hudusers[user]) + hudusers[user] |= source + else + hudusers[user] += source + for(var/mob/target in hudmobs) add_to_single_hud(user, target) @@ -229,13 +253,13 @@ var/list/datum/mob_hud/huds = list( for(var/datum/mob_hud/hud in huds) if(istype(hud, /datum/mob_hud/xeno)) hud.remove_from_hud(src) - hud.remove_hud_from(src) + hud.remove_hud_from(src, src) else if (istype(hud, /datum/mob_hud/xeno_infection)) - hud.remove_hud_from(src) + hud.remove_hud_from(src, src) if (xeno_hostile_hud) xeno_hostile_hud = FALSE var/datum/mob_hud/hostile_hud = huds[MOB_HUD_XENO_HOSTILE] - hostile_hud.remove_hud_from(src) + hostile_hud.remove_hud_from(src, src) @@ -243,13 +267,7 @@ var/list/datum/mob_hud/huds = list( var/mob/M = source_mob ? source_mob : src for(var/datum/mob_hud/hud in huds) if(M in hud.hudusers) - readd_hud(hud) - -/mob/proc/readd_hud(datum/mob_hud/hud) - hud.add_hud_to(src) - - - + hud.refresh_hud(src, hud.hudusers[M]) //Medical HUDs diff --git a/code/datums/paygrades/factions/twe/twe.dm b/code/datums/paygrades/factions/twe/twe.dm index 214d70890c18..9707e89e6171 100644 --- a/code/datums/paygrades/factions/twe/twe.dm +++ b/code/datums/paygrades/factions/twe/twe.dm @@ -2,42 +2,56 @@ name = "TWE Paygrade" pay_multiplier = 2 // less people = more to pay them -//TWE RMC -/datum/paygrade/twe/rc1 - paygrade = "TC1" - name = "Yonto" - prefix = "Yt." +//RMC Emlisted +/datum/paygrade/twe/e1 + paygrade = "RMC E1" + name = "Heitai-Marine" + prefix = "Hti-Mne." -/datum/paygrade/twe/rc2 - paygrade = "TC2" - name = "Santo" - prefix = "St." +/datum/paygrade/twe/e2 + paygrade = "RMC E2" + name = "Santo-Lance Corporal" + prefix = "St-LCpl." pay_multiplier = 2.1 -/datum/paygrade/twe/rc3 - paygrade = "TC3" - name = "Nito" - prefix = "Nt." +/datum/paygrade/twe/e3 + paygrade = "RMC E3" + name = "Nito-Corporal" + prefix = "Nt-Cpl." pay_multiplier = 2.2 -/datum/paygrade/twe/rc4 - paygrade = "TC4" - name = "Itto" - prefix = "It." +/datum/paygrade/twe/e4 + paygrade = "RMC E4" + name = "Itto-Sergeant" + prefix = "Sgt." pay_multiplier = 2.3 +//RMC Officer + +/datum/paygrade/twe/o1/rmc + paygrade = "RMC O1" + name = "Second Lieutenant" + prefix = "2nd LT." + pay_multiplier = 3 + +//TWE Warrent Officer +/datum/paygrade/twe/wo1 + paygrade = "TWE WO." + name = "Warrant Officer" + prefix = "WO." + pay_multiplier = 3.5 //TWE Naval Officers /datum/paygrade/twe/o1 - paygrade = "TO1" - name = "Seaman" - prefix = "SN." + paygrade = "TWE O1" + name = "Second Lieutenant" + prefix = "2nd LT" pay_multiplier = 3 /datum/paygrade/twe/o2 - paygrade = "TO2" - name = "Leading Seaman" - prefix = "LR." + paygrade = "RMC O2" + name = "First Lieutenant" + prefix = "1st LT" pay_multiplier = 3.25 /datum/paygrade/twe/o3 @@ -46,12 +60,6 @@ prefix = "SO." pay_multiplier = 3.5 -/datum/paygrade/twe/o3e - paygrade = "TO3E" - name = "Warrant Officer" - prefix = "WO." - pay_multiplier = 3.5 - /datum/paygrade/twe/o4 paygrade = "TO4" name = "Captain" diff --git a/code/datums/skills.dm b/code/datums/skills.dm index 9bc53007173d..f80b391123f2 100644 --- a/code/datums/skills.dm +++ b/code/datums/skills.dm @@ -79,6 +79,11 @@ 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 @@ -281,6 +286,7 @@ CIVILIAN 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, @@ -292,6 +298,7 @@ CIVILIAN 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, @@ -312,6 +319,7 @@ CIVILIAN 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, ) @@ -576,6 +584,7 @@ COMMAND STAFF 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, @@ -593,6 +602,7 @@ COMMAND STAFF 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, @@ -614,6 +624,7 @@ COMMAND STAFF 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, @@ -633,6 +644,7 @@ COMMAND STAFF 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, @@ -650,6 +662,7 @@ COMMAND STAFF 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, @@ -676,6 +689,7 @@ COMMAND STAFF 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, @@ -692,6 +706,7 @@ COMMAND STAFF 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, @@ -707,6 +722,7 @@ COMMAND STAFF 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, @@ -725,6 +741,7 @@ COMMAND STAFF 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, @@ -738,6 +755,7 @@ COMMAND STAFF 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, @@ -783,6 +801,7 @@ MILITARY NONCOMBATANT 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, @@ -817,6 +836,7 @@ MILITARY NONCOMBATANT 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, @@ -881,6 +901,7 @@ SYNTHETIC 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, @@ -940,6 +961,7 @@ SYNTHETIC 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, @@ -1043,6 +1065,7 @@ United States Colonial Marines 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, @@ -1113,6 +1136,7 @@ COLONIAL LIBERATION FRONT 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, @@ -1130,6 +1154,7 @@ COLONIAL LIBERATION FRONT 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, @@ -1176,6 +1201,7 @@ FREELANCERS 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, ) @@ -1243,6 +1269,7 @@ UNITED PROGRESSIVE PEOPLES 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, ) @@ -1269,6 +1296,7 @@ UNITED PROGRESSIVE PEOPLES 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, @@ -1283,6 +1311,7 @@ UNITED PROGRESSIVE PEOPLES 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, @@ -1290,6 +1319,7 @@ UNITED PROGRESSIVE PEOPLES 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" @@ -1385,6 +1415,7 @@ Private Military Contractors 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, @@ -1400,6 +1431,7 @@ Private Military Contractors 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, @@ -1461,6 +1493,7 @@ Private Military Contractors 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, @@ -1494,6 +1527,7 @@ CONTRACTORS 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, @@ -1582,6 +1616,7 @@ COLONIAL MARSHALS 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, @@ -1601,6 +1636,7 @@ COLONIAL MARSHALS 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, @@ -1672,7 +1708,7 @@ COLONIAL MARSHALS SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, ) /datum/skills/military/survivor/upp_sl @@ -1681,12 +1717,14 @@ COLONIAL MARSHALS 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_DEFAULT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, SKILL_JTAC = SKILL_JTAC_EXPERT, ) @@ -1777,6 +1815,7 @@ SPEC-OPS 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, @@ -1890,6 +1929,7 @@ MISCELLANEOUS 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, @@ -1932,6 +1972,7 @@ MISCELLANEOUS 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, @@ -1967,6 +2008,7 @@ MISCELLANEOUS 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, ) @@ -1995,6 +2037,7 @@ MISCELLANEOUS 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, @@ -2012,6 +2055,7 @@ MISCELLANEOUS 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, ) @@ -2040,6 +2084,7 @@ MISCELLANEOUS 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, @@ -2053,3 +2098,75 @@ MISCELLANEOUS 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/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 3f4453d03f32..1737a66e85a9 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -332,15 +332,15 @@ Additionally, weapons that are way too good to put in the basically-flavor black dollar_cost = 5 containertype = /obj/structure/largecrate/black_market -/datum/supply_packs/contraband/seized/ppsh - name = "PPSh-17b submachinegun crate (x5 magazines included)" +/datum/supply_packs/contraband/seized/pps43 + name = "Type-19 submachinegun crate (x5 magazines included)" contains = list( - /obj/item/weapon/gun/smg/ppsh, - /obj/item/ammo_magazine/smg/ppsh/extended, - /obj/item/ammo_magazine/smg/ppsh/extended, - /obj/item/ammo_magazine/smg/ppsh, - /obj/item/ammo_magazine/smg/ppsh, - /obj/item/ammo_magazine/smg/ppsh, + /obj/item/weapon/gun/smg/pps43, + /obj/item/ammo_magazine/smg/pps43/extended, + /obj/item/ammo_magazine/smg/pps43/extended, + /obj/item/ammo_magazine/smg/pps43, + /obj/item/ammo_magazine/smg/pps43, + /obj/item/ammo_magazine/smg/pps43, ) dollar_cost = 15 containertype = /obj/structure/largecrate/black_market @@ -373,18 +373,18 @@ Additionally, weapons that are way too good to put in the basically-flavor black dollar_cost = 45 containertype = /obj/structure/largecrate/black_market -/datum/supply_packs/contraband/seized/c99 - name = "Korovin PK-9 pistol crate (x6 magazines included)" +/datum/supply_packs/contraband/seized/t73 + name = "Type 73 pistol crate (x6 magazines included)" contains = list( - /obj/item/weapon/gun/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, + /obj/item/weapon/gun/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, ) - dollar_cost = 5 + dollar_cost = 15 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/seized/kt42 @@ -415,14 +415,14 @@ Additionally, weapons that are way too good to put in the basically-flavor black dollar_cost = 5 containertype = /obj/structure/largecrate/black_market -/datum/supply_packs/contraband/seized/skorpion - name = "CZ-81 machine pistol (x4 magazines included)" +/datum/supply_packs/contraband/seized/bizon + name = "Type 64 Submachinegun (x4 magazines included)" contains = list( - /obj/item/weapon/gun/pistol/skorpion, - /obj/item/ammo_magazine/pistol/skorpion, - /obj/item/ammo_magazine/pistol/skorpion, - /obj/item/ammo_magazine/pistol/skorpion, - /obj/item/ammo_magazine/pistol/skorpion, + /obj/item/weapon/gun/smg/bizon, + /obj/item/ammo_magazine/smg/bizon, + /obj/item/ammo_magazine/smg/bizon, + /obj/item/ammo_magazine/smg/bizon, + /obj/item/ammo_magazine/smg/bizon, ) dollar_cost = 15 containertype = /obj/structure/largecrate/black_market @@ -456,10 +456,10 @@ Additionally, weapons that are way too good to put in the basically-flavor black dollar_cost = 15 containertype = /obj/structure/largecrate/black_market -/datum/supply_packs/contraband/seized/nagant - name = "N-Y 7.62mm revolver (x6 magazines included)" +/datum/supply_packs/contraband/seized/upprevolver + name = "ZHNK-72 revolver (x6 magazines included)" contains = list( - /obj/item/weapon/gun/revolver/nagant, + /obj/item/weapon/gun/revolver/upp, /obj/item/ammo_magazine/revolver/upp, /obj/item/ammo_magazine/revolver/upp, /obj/item/ammo_magazine/revolver/upp, @@ -467,7 +467,7 @@ Additionally, weapons that are way too good to put in the basically-flavor black /obj/item/ammo_magazine/revolver/upp, /obj/item/ammo_magazine/revolver/upp, ) - dollar_cost = 10 + dollar_cost = 15 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/seized/r4t @@ -1067,11 +1067,11 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro new picked_type(loc) loot_message = SPAN_NOTICE("It's some strange elite gear...?") if(11 to 15) - //Skorpion - new /obj/item/weapon/gun/pistol/skorpion(loc) - new /obj/item/ammo_magazine/pistol/skorpion(loc) - new /obj/item/ammo_magazine/pistol/skorpion(loc) - new /obj/item/ammo_magazine/pistol/skorpion(loc) + //Type 64 + new /obj/item/weapon/gun/smg/bizon(loc) + new /obj/item/ammo_magazine/smg/bizon(loc) + new /obj/item/ammo_magazine/smg/bizon(loc) + new /obj/item/ammo_magazine/smg/bizon(loc) // Somehow they found a Webley. new /obj/item/weapon/gun/revolver/m44/custom/webley(loc) new /obj/item/ammo_magazine/revolver/webley(loc) @@ -1079,11 +1079,11 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro new /obj/item/ammo_magazine/revolver/webley(loc) loot_message = SPAN_NOTICE("It's some CLF pistol armaments!") if(16 to 20) - // PPSH - new /obj/item/weapon/gun/smg/ppsh/with_drum_mag(loc) - new /obj/item/ammo_magazine/smg/ppsh/extended(loc) - new /obj/item/ammo_magazine/smg/ppsh/extended(loc) - new /obj/item/ammo_magazine/smg/ppsh/extended(loc) + // Type 19 + new /obj/item/weapon/gun/smg/pps43/extended_mag(loc) + new /obj/item/ammo_magazine/smg/pps43/extended(loc) + new /obj/item/ammo_magazine/smg/pps43/extended(loc) + new /obj/item/ammo_magazine/smg/pps43/extended(loc) // MAC-15 new /obj/item/weapon/gun/smg/mac15/extended(loc) new /obj/item/ammo_magazine/smg/mac15/extended(loc) diff --git a/code/datums/supply_packs/food.dm b/code/datums/supply_packs/food.dm index caef6e3f8664..9e0527aed6cf 100644 --- a/code/datums/supply_packs/food.dm +++ b/code/datums/supply_packs/food.dm @@ -141,7 +141,7 @@ //all the finish snacks. /datum/supply_packs/donuts - name = "boxe of donut (x5)" + name = "box of donuts (x5)" contains = list( /obj/item/storage/donut_box, /obj/item/storage/donut_box, @@ -151,7 +151,7 @@ ) cost = 10 containertype = /obj/structure/closet/crate/supply - containername = "\improper boxe of donut (x5)" + containername = "box of donuts (x5)" group = "Food" /datum/supply_packs/mre diff --git a/code/datums/supply_packs/weapons.dm b/code/datums/supply_packs/weapons.dm index a28e0c7191ce..927db853e9fd 100644 --- a/code/datums/supply_packs/weapons.dm +++ b/code/datums/supply_packs/weapons.dm @@ -42,7 +42,7 @@ group = "Weapons" /datum/supply_packs/grenade_launchers - name = "M79 Grenade Launcher Crate (x2 Guncasess)" + name = "M79 Grenade Launcher Crate (x2 Guncases)" contains = list( /obj/item/storage/box/guncase/m79, /obj/item/storage/box/guncase/m79, @@ -120,6 +120,16 @@ containername = "\improper XM88 Heavy Rifle crate" group = "Weapons" +/* Uncomment me if it's decided to let the m707 be purchasable through req +/datum/supply_packs/gun/m707 + name = "M707 Anti-Materiel Rifle crate (M707 x1)" + contains = list() + cost = 120 + containertype = /obj/structure/closet/crate/secure/vulture + containername = "M707 crate" + group = "Weapons" +*/ + /datum/supply_packs/gun/merc contains = list() name = "black market firearms (x1)" diff --git a/code/game/area/BigRed.dm b/code/game/area/BigRed.dm index 59d7c40cd56f..57e062195a3c 100644 --- a/code/game/area/BigRed.dm +++ b/code/game/area/BigRed.dm @@ -654,6 +654,7 @@ minimap_color = MINIMAP_AREA_LZ icon_state = "tcomsatcham" requires_power = FALSE + is_resin_allowed = FALSE /area/bigredv2/landing/console name = "\improper LZ1 'Telecomms'" diff --git a/code/game/area/DesertDam.dm b/code/game/area/DesertDam.dm index 73635eb6385d..96e5eb1f62e5 100644 --- a/code/game/area/DesertDam.dm +++ b/code/game/area/DesertDam.dm @@ -682,7 +682,6 @@ /area/desert_dam/exterior requires_power = 1 always_unpowered = 1 - lighting_use_dynamic = 1 power_light = FALSE power_equip = FALSE power_environ = FALSE diff --git a/code/game/area/IceColony.dm b/code/game/area/IceColony.dm index 2c7bbee2969c..40289b92b5ad 100644 --- a/code/game/area/IceColony.dm +++ b/code/game/area/IceColony.dm @@ -28,7 +28,6 @@ icon_state = "cliff_blocked" requires_power = 1 always_unpowered = 1 - lighting_use_dynamic = 1 power_light = FALSE power_equip = FALSE power_environ = FALSE @@ -65,6 +64,7 @@ name = "\improper Emergency Landing Pad" icon_state = "landing_pad" minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE //Everything around the physical landing pad @@ -79,6 +79,7 @@ name = "\improper Aerodrome Container Yard" icon_state = "container_yard" minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE // // Valleys diff --git a/code/game/area/LV522_Chances_Claim.dm b/code/game/area/LV522_Chances_Claim.dm index 3d15d49c3df7..ffd6a5897e4e 100644 --- a/code/game/area/LV522_Chances_Claim.dm +++ b/code/game/area/LV522_Chances_Claim.dm @@ -52,7 +52,6 @@ name = "Chance's Claim - Dropship Alamo Landing Zone" icon_state = "shuttle" icon = 'icons/turf/area_shiva.dmi' - lighting_use_dynamic = TRUE /area/lv522/landing_zone_1/lz1_console name = "Chance's Claim - Dropship Alamo Console" @@ -75,7 +74,6 @@ name = "Chance's Claim - Dropship Normandy Landing Zone" icon_state = "shuttle2" icon = 'icons/turf/area_shiva.dmi' - lighting_use_dynamic = TRUE /area/lv522/landing_zone_2/lz2_console name = "Chance's Claim - Dropship Normandy Console" @@ -180,6 +178,7 @@ name = "North LZ1 - Spaceport" icon_state = "red" minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/lv522/indoors/lone_buildings/outdoor_bot name = "East LZ1 - Outdoor T-Comms" diff --git a/code/game/area/Sulaco.dm b/code/game/area/Sulaco.dm index 851025e1b63a..ae197537143a 100644 --- a/code/game/area/Sulaco.dm +++ b/code/game/area/Sulaco.dm @@ -117,7 +117,7 @@ //DISTRESS SHUTTLES /area/shuttle/distress - lighting_use_dynamic = FALSE + base_lighting_alpha = 255 unique = TRUE /area/shuttle/distress/start diff --git a/code/game/area/WhiskeyOutpost.dm b/code/game/area/WhiskeyOutpost.dm index 583a5dafc299..02d94dc942da 100644 --- a/code/game/area/WhiskeyOutpost.dm +++ b/code/game/area/WhiskeyOutpost.dm @@ -79,7 +79,6 @@ //ambience = list('sound/ambience/jungle_amb1.ogg') requires_power = 1 always_unpowered = 1 - lighting_use_dynamic = 1 power_light = FALSE power_equip = FALSE power_environ = FALSE @@ -180,7 +179,6 @@ ceiling = CEILING_UNDERGROUND_ALLOW_CAS requires_power = 1 always_unpowered = 1 - lighting_use_dynamic = 1 power_light = FALSE power_equip = FALSE power_environ = FALSE diff --git a/code/game/area/admin_level.dm b/code/game/area/admin_level.dm index 501047c46d08..00b408c04adf 100644 --- a/code/game/area/admin_level.dm +++ b/code/game/area/admin_level.dm @@ -3,14 +3,13 @@ /area/adminlevel ceiling = CEILING_METAL + base_lighting_alpha = 255 /area/adminlevel/bunker01 icon_state = "thunder" requires_power = FALSE statistic_exempt = TRUE flags_area = AREA_NOTUNNEL - luminosity = TRUE - lighting_use_dynamic = FALSE /area/adminlevel/bunker01/mainroom name = "\improper Bunker Main Room" @@ -78,8 +77,7 @@ ceiling = CEILING_UNDERGROUND_ALLOW_CAS always_unpowered = TRUE requires_power = TRUE - lighting_use_dynamic = TRUE - luminosity = FALSE + base_lighting_alpha = 0 /area/adminlevel/bunker01/caves/outpost name = "\improper Bunker Outpost" @@ -87,8 +85,6 @@ ceiling = CEILING_UNDERGROUND_ALLOW_CAS requires_power = TRUE always_unpowered = FALSE - lighting_use_dynamic = TRUE - luminosity = FALSE /area/adminlevel/bunker01/caves/xeno name = "\improper Bunker Xeno Hive" @@ -129,6 +125,10 @@ name = "Freelancer Station" icon_state = "yellow" +/area/adminlevel/ert_station/royal_marines_station + name = "HMS Patna Hangerbay" + icon_state = "yellow" + /area/adminlevel/ert_station/shuttle_dispatch name = "Shuttle Dispatch Station" soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2c274665fa19..826b2dc0585f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -28,9 +28,6 @@ var/unique = TRUE var/has_gravity = 1 - var/area/master // master area used for power calcluations - // (original area before splitting due to sd_DAL) - var/list/related // the other areas of the same type as this // var/list/lights // list of all lights on this area var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area var/air_doors_activated = 0 @@ -89,10 +86,8 @@ if(unique) GLOB.areas_by_type[type] = src ..() - master = src //moved outside the spawn(1) to avoid runtimes in lighting.dm when it references loc.loc.master ~Carn - related = list(src) - initialize_power_and_lighting() + initialize_power() /area/Initialize(mapload, ...) icon_state = "" //Used to reset the icon overlay, I assume. @@ -105,24 +100,26 @@ if(is_mainship_level(z)) GLOB.ship_areas += src -/area/proc/initialize_power_and_lighting(override_power) + if(base_lighting_alpha) + return INITIALIZE_HINT_ROUNDSTART + +/area/LateInitialize() + . = ..() + + update_base_lighting() + +/area/proc/initialize_power(override_power) if(requires_power) - luminosity = 0 if(override_power) //Reset everything if you want to override. power_light = TRUE power_equip = TRUE power_environ = TRUE - if(lighting_use_dynamic) - SetDynamicLighting() else power_light = FALSE //rastaf0 power_equip = FALSE //rastaf0 power_environ = FALSE //rastaf0 - luminosity = 1 - lighting_use_dynamic = 0 power_change() // all machines set to current power level, also updates lighting icon - InitializeLighting() /// Returns the correct ambience sound track for a client in this area /area/proc/get_sound_ambience(client/target) @@ -135,13 +132,12 @@ poweralm = state if(istype(source)) //Only report power alarms on the z-level where the source is located. var/list/cameras = list() - for (var/area/RA in related) - for (var/obj/structure/machinery/camera/C in RA) - cameras += C - if(state == 1) - C.network.Remove(CAMERA_NET_POWER_ALARMS) - else - C.network.Add(CAMERA_NET_POWER_ALARMS) + for (var/obj/structure/machinery/camera/C in src) + cameras += C + if(state == 1) + C.network.Remove(CAMERA_NET_POWER_ALARMS) + else + C.network.Add(CAMERA_NET_POWER_ALARMS) for (var/mob/living/silicon/aiPlayer in ai_mob_list) if(aiPlayer.z == source.z) if (state == 1) @@ -161,10 +157,9 @@ // return 0 //redudant //Check all the alarms before lowering atmosalm. Raising is perfectly fine. - for (var/area/RA in related) - for (var/obj/structure/machinery/alarm/AA in RA) - if ( !(AA.inoperable()) && !AA.shorted) - danger_level = max(danger_level, AA.danger_level) + for (var/obj/structure/machinery/alarm/AA in src) + if ( !(AA.inoperable()) && !AA.shorted) + danger_level = max(danger_level, AA.danger_level) if(danger_level != atmosalm) if (danger_level < 1 && atmosalm >= 1) @@ -172,9 +167,8 @@ air_doors_open() if (danger_level < 2 && atmosalm >= 2) - for(var/area/RA in related) - for(var/obj/structure/machinery/camera/C in RA) - C.network.Remove(CAMERA_NET_ATMOSPHERE_ALARMS) + for(var/obj/structure/machinery/camera/C in src) + C.network.Remove(CAMERA_NET_ATMOSPHERE_ALARMS) for(var/mob/living/silicon/aiPlayer in ai_mob_list) aiPlayer.cancelAlarm("Atmosphere", src, src) for(var/obj/structure/machinery/computer/station_alert/a in machines) @@ -182,11 +176,10 @@ if (danger_level >= 2 && atmosalm < 2) var/list/cameras = list() - for(var/area/RA in related) - //updateicon() - for(var/obj/structure/machinery/camera/C in RA) - cameras += C - C.network.Add(CAMERA_NET_ATMOSPHERE_ALARMS) + //updateicon() + for(var/obj/structure/machinery/camera/C in src) + cameras += C + C.network.Add(CAMERA_NET_ATMOSPHERE_ALARMS) for(var/mob/living/silicon/aiPlayer in ai_mob_list) aiPlayer.triggerAlarm("Atmosphere", src, cameras, src) for(var/obj/structure/machinery/computer/station_alert/a in machines) @@ -194,40 +187,38 @@ air_doors_close() atmosalm = danger_level - for(var/area/RA in related) - for (var/obj/structure/machinery/alarm/AA in RA) - AA.update_icon() + for (var/obj/structure/machinery/alarm/AA in src) + AA.update_icon() return 1 return 0 /area/proc/air_doors_close() - if(!src.master.air_doors_activated) - src.master.air_doors_activated = 1 - for(var/obj/structure/machinery/door/firedoor/E in src.master.all_doors) - if(!E:blocked) - if(E.operating) - E:nextstate = OPEN - else if(!E.density) - INVOKE_ASYNC(E, TYPE_PROC_REF(/obj/structure/machinery/door, close)) + for(var/obj/structure/machinery/door/firedoor/E in all_doors) + if(E.blocked) + continue + + if(E.operating) + E.nextstate = OPEN + else if(!E.density) + E.close() + /area/proc/air_doors_open() - if(src.master.air_doors_activated) - src.master.air_doors_activated = 0 - for(var/obj/structure/machinery/door/firedoor/E in src.master.all_doors) - if(!E:blocked) - if(E.operating) - E:nextstate = OPEN - else if(E.density) - INVOKE_ASYNC(E, TYPE_PROC_REF(/obj/structure/machinery/door, open)) + for(var/obj/structure/machinery/door/firedoor/E in all_doors) + if(E.blocked) + continue + if(E.operating) + E.nextstate = OPEN + else if(E.density) + E.open() /area/proc/firealert() if(name == "Space") //no fire alarms in space return if(!(flags_alarm_state & ALARM_WARNING_FIRE)) - flags_alarm_state |= ALARM_WARNING_FIRE - master.flags_alarm_state |= ALARM_WARNING_FIRE //used for firedoor checks + flags_alarm_state |= ALARM_WARNING_FIRE //used for firedoor checks updateicon() mouse_opacity = MOUSE_OPACITY_TRANSPARENT for(var/obj/structure/machinery/door/firedoor/D in all_doors) @@ -237,10 +228,9 @@ else if(!D.density) INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/structure/machinery/door, close)) var/list/cameras = list() - for(var/area/RA in related) - for (var/obj/structure/machinery/camera/C in RA) - cameras.Add(C) - C.network.Add(CAMERA_NET_FIRE_ALARMS) + for (var/obj/structure/machinery/camera/C in src) + cameras.Add(C) + C.network.Add(CAMERA_NET_FIRE_ALARMS) for (var/mob/living/silicon/ai/aiPlayer in ai_mob_list) aiPlayer.triggerAlarm("Fire", src, cameras, src) for (var/obj/structure/machinery/computer/station_alert/a in machines) @@ -248,8 +238,7 @@ /area/proc/firereset() if(flags_alarm_state & ALARM_WARNING_FIRE) - flags_alarm_state &= ~ALARM_WARNING_FIRE - master.flags_alarm_state &= ~ALARM_WARNING_FIRE //used for firedoor checks + flags_alarm_state &= ~ALARM_WARNING_FIRE //used for firedoor checks mouse_opacity = MOUSE_OPACITY_TRANSPARENT updateicon() for(var/obj/structure/machinery/door/firedoor/D in all_doors) @@ -258,9 +247,8 @@ D.nextstate = OPEN else if(D.density) INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/structure/machinery/door, open)) - for(var/area/RA in related) - for (var/obj/structure/machinery/camera/C in RA) - C.network.Remove(CAMERA_NET_FIRE_ALARMS) + for (var/obj/structure/machinery/camera/C in src) + C.network.Remove(CAMERA_NET_FIRE_ALARMS) for (var/mob/living/silicon/ai/aiPlayer in ai_mob_list) aiPlayer.cancelAlarm("Fire", src, src) for (var/obj/structure/machinery/computer/station_alert/a in machines) @@ -278,16 +266,16 @@ /* /area/proc/toggle_evacuation() //toggles lights and creates an overlay. flags_alarm_state ^= ALARM_WARNING_EVAC - master.flags_alarm_state ^= ALARM_WARNING_EVAC + flags_alarm_state ^= ALARM_WARNING_EVAC //if(flags_alarm_state & ALARM_WARNING_EVAC) - // master.lightswitch = FALSE + // lightswitch = FALSE //lightswitch = FALSE //Lights going off. // else - // master.lightswitch = TRUE + // lightswitch = TRUE //lightswitch = TRUE //Coming on. - master.updateicon() + updateicon() - //master.power_change() + //power_change() /area/proc/toggle_shut_down() @@ -312,75 +300,72 @@ if(icon_state != I) icon_state = I //If the icon state changed, change it. Otherwise do nothing. /area/proc/powered(chan) // return true if the area has power to given channel - if(!master.requires_power) + if(!requires_power) return 1 - if(master.always_unpowered) + if(always_unpowered) return 0 switch(chan) if(POWER_CHANNEL_EQUIP) - return master.power_equip + return power_equip if(POWER_CHANNEL_LIGHT) - return master.power_light + return power_light if(POWER_CHANNEL_ENVIRON) - return master.power_environ + return power_environ return 0 /area/proc/update_power_channels(equip, light, environ) - if(!master) - CRASH("CALLED update_power_channels on non-master channel!") var/changed = FALSE - if(master.power_equip != equip) - master.power_equip = equip + if(power_equip != equip) + power_equip = equip changed = TRUE - if(master.power_light != light) - master.power_light = light + if(power_light != light) + power_light = light changed = TRUE - if(master.power_environ != environ) - master.power_environ = environ + if(power_environ != environ) + power_environ = environ changed = TRUE if(changed) //Something got changed power-wise, time for an update! power_change() // called when power status changes /area/proc/power_change() - for(var/area/RA in related) - for(var/obj/structure/machinery/M in RA) // for each machine in the area - if(!M.gc_destroyed) - M.power_change() // reverify power status (to update icons etc.) - if(flags_alarm_state) - RA.updateicon() + for(var/obj/structure/machinery/M in src) // for each machine in the area + if(!M.gc_destroyed) + M.power_change() // reverify power status (to update icons etc.) + if(flags_alarm_state) + updateicon() /area/proc/usage(chan, reset_oneoff = FALSE) var/used = 0 switch(chan) if(POWER_CHANNEL_LIGHT) - used += master.used_light + used += used_light if(POWER_CHANNEL_EQUIP) - used += master.used_equip + used += used_equip if(POWER_CHANNEL_ENVIRON) - used += master.used_environ + used += used_environ if(POWER_CHANNEL_ONEOFF) - used += master.used_oneoff + used += used_oneoff if(reset_oneoff) - master.used_oneoff = 0 + used_oneoff = 0 if(POWER_CHANNEL_TOTAL) - used += master.used_light + master.used_equip + master.used_environ + master.used_oneoff + used += used_light + used_equip + used_environ + used_oneoff if(reset_oneoff) - master.used_oneoff = 0 + used_oneoff = 0 return used /area/proc/use_power(amount, chan) switch(chan) if(POWER_CHANNEL_EQUIP) - master.used_equip += amount + used_equip += amount if(POWER_CHANNEL_LIGHT) - master.used_light += amount + used_light += amount if(POWER_CHANNEL_ENVIRON) - master.used_environ += amount + used_environ += amount if(POWER_CHANNEL_ONEOFF) - master.used_oneoff += amount + used_oneoff += amount /area/Entered(A,atom/OldLoc) if(ismob(A)) @@ -388,7 +373,7 @@ return var/mob/M = A var/area/old_area = get_area(OldLoc) - if(old_area.master == master) + if(old_area == src) return M?.client?.soundOutput?.update_ambience(src, null, TRUE) else if(istype(A, /obj/structure/machinery)) @@ -416,24 +401,21 @@ A.has_gravity = gravitystate - for(var/area/SubA in A.related) - SubA.has_gravity = gravitystate - - if(gravitystate) - for(var/mob/living/carbon/human/M in SubA) - thunk(M) - for(var/mob/M1 in SubA) - M1.make_floating(0) - else - for(var/mob/M in SubA) - if(M.Check_Dense_Object() && istype(src,/mob/living/carbon/human/)) - var/mob/living/carbon/human/H = src - if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags_inventory & NOSLIPPING)) //magboots + dense_object = no floaty effect - H.make_floating(0) - else - H.make_floating(1) + if(gravitystate) + for(var/mob/living/carbon/human/M in A) + thunk(M) + for(var/mob/M1 in A) + M1.make_floating(0) + else + for(var/mob/M in A) + if(M.Check_Dense_Object() && istype(src,/mob/living/carbon/human/)) + var/mob/living/carbon/human/H = src + if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags_inventory & NOSLIPPING)) //magboots + dense_object = no floaty effect + H.make_floating(0) else - M.make_floating(1) + H.make_floating(1) + else + M.make_floating(1) /area/proc/thunk(M) if(istype(get_turf(M), /turf/open/space)) // Can't fall onto nothing. diff --git a/code/game/area/areas_event.dm b/code/game/area/areas_event.dm index fe34d74363d5..c43dae3a65b2 100644 --- a/code/game/area/areas_event.dm +++ b/code/game/area/areas_event.dm @@ -47,20 +47,12 @@ structure: //events are not part of regular gameplay, therefore, no statistics statistic_exempt = TRUE - //no dynamic lighting - exterior_light = 0 - lighting_use_dynamic = FALSE + base_lighting_alpha = 255 //always powered requires_power = FALSE unlimited_power = TRUE -/area/event/Initialize() - . = ..() - if(exterior_light) - for(var/turf/T in contents) - T.update_lumcount(exterior_light) - //no dynamic lighting, unpowered. /area/event/unpowered name = "Open grounds (event)" @@ -75,7 +67,6 @@ structure: icon_state = "event_dyn" requires_power = TRUE unlimited_power = TRUE - lighting_use_dynamic = TRUE //no dynamic lighting, unpowered. /area/event/dynamic/unpowered @@ -83,13 +74,14 @@ structure: icon_state = "event_dyn_nopower" unlimited_power = FALSE + base_lighting_alpha = 255 //dynamic lighting, lit, powered. /area/event/dynamic/lit name = "Open grounds (event PDL)" icon_state = "event_dyn_lit" - exterior_light = 3 + base_lighting_alpha = 255 //dynamic lighting, lit, unpowered. /area/event/dynamic/lit/unpowered @@ -97,6 +89,7 @@ structure: icon_state = "event_dyn_lit_nopower" unlimited_power = FALSE + base_lighting_alpha = 255 //-----------------------CEILING_METAL-------------------------- @@ -122,7 +115,6 @@ structure: icon_state = "metal_dyn" requires_power = TRUE unlimited_power = TRUE - lighting_use_dynamic = TRUE //no dynamic lighting, unpowered. /area/event/metal/dynamic/unpowered @@ -137,7 +129,7 @@ structure: name = "Building interior (event PDL)" icon_state = "metal_dyn_lit" - exterior_light = 3 + base_lighting_alpha = 255 //dynamic lighting, lit, unpowered. /area/event/metal/dynamic/lit/unpowered @@ -176,7 +168,6 @@ structure: icon_state = "under_dyn" requires_power = TRUE unlimited_power = TRUE - lighting_use_dynamic = TRUE //no dynamic lighting, unpowered. /area/event/underground/dynamic/unpowered @@ -191,7 +182,7 @@ structure: name = "Small caves (event PDL)" icon_state = "under_dyn_lit" - exterior_light = 3 + base_lighting_alpha = 255 //dynamic lighting, lit, unpowered. /area/event/underground/dynamic/lit/unpowered @@ -232,7 +223,6 @@ structure: icon_state = "undercas_dyn" requires_power = TRUE unlimited_power = TRUE - lighting_use_dynamic = TRUE //no dynamic lighting, unpowered. /area/event/underground_no_CAS/dynamic/unpowered @@ -246,7 +236,7 @@ structure: name = "Caves (event PDL)" icon_state = "undercas_dyn_lit" - exterior_light = 3 + base_lighting_alpha = 255 //dynamic lighting, lit, unpowered. /area/event/underground_no_CAS/dynamic/lit/unpowered @@ -286,7 +276,6 @@ structure: icon_state = "deep_dyn" requires_power = TRUE unlimited_power = TRUE - lighting_use_dynamic = TRUE //no dynamic lighting, unpowered. /area/event/deep_underground/dynamic/unpowered @@ -301,7 +290,7 @@ structure: name = "Deep underground (event PDL)" icon_state = "deep_dyn_lit" - exterior_light = 3 + base_lighting_alpha = 255 //dynamic lighting, lit, unpowered. /area/event/deep_underground/dynamic/lit/unpowered diff --git a/code/game/area/chinook.dm b/code/game/area/chinook.dm index 62bbdee7bd17..b9cd440fd548 100644 --- a/code/game/area/chinook.dm +++ b/code/game/area/chinook.dm @@ -9,7 +9,6 @@ requires_power = TRUE statistic_exempt = TRUE flags_area = AREA_NOTUNNEL - lighting_use_dynamic = TRUE sound_environment = SOUND_ENVIRONMENT_ROOM unlimited_power = TRUE ceiling = CEILING_METAL diff --git a/code/game/area/kutjevo.dm b/code/game/area/kutjevo.dm index 48f18091df4a..422017c0a46b 100644 --- a/code/game/area/kutjevo.dm +++ b/code/game/area/kutjevo.dm @@ -8,20 +8,17 @@ icon_state = "kutjevo" can_build_special = TRUE //T-Comms structure temperature = 308.7 //kelvin, 35c, 95f - lighting_use_dynamic = 1 minimap_color = MINIMAP_AREA_ENGI /area/shuttle/drop1/kutjevo name = "Kutjevo - Dropship Alamo Landing Zone" icon_state = "shuttle" icon = 'icons/turf/area_kutjevo.dmi' - lighting_use_dynamic = 1 /area/shuttle/drop2/kutjevo name = "Kutjevo - Dropship Normandy Landing Zone" icon_state = "shuttle2" icon = 'icons/turf/area_kutjevo.dmi' - lighting_use_dynamic = 1 /area/kutjevo/exterior name = "Kutjevo - Exterior" diff --git a/code/game/area/prison_v3_fiorina.dm b/code/game/area/prison_v3_fiorina.dm index deb5d8758784..9c60f8173ab8 100644 --- a/code/game/area/prison_v3_fiorina.dm +++ b/code/game/area/prison_v3_fiorina.dm @@ -8,7 +8,6 @@ icon_state = "fiorina" can_build_special = TRUE //T-Comms structure temperature = T20C - lighting_use_dynamic = 1 ceiling = CEILING_GLASS minimap_color = MINIMAP_AREA_COLONY @@ -71,14 +70,13 @@ name = "Fiorina - LZ" is_landing_zone = TRUE minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/fiorina/lz/near_lzI name = "Fiorina - LZ1 Aux Port" - is_resin_allowed = FALSE /area/fiorina/lz/near_lzII name = "Fiorina - LZ2 Prison Port" - is_resin_allowed = FALSE /area/fiorina/lz/console_I name = "Fiorina - LZ1 Control Console" diff --git a/code/game/area/shiva.dm b/code/game/area/shiva.dm index 8ca47c03e5ca..e4939cd67e1e 100644 --- a/code/game/area/shiva.dm +++ b/code/game/area/shiva.dm @@ -7,14 +7,12 @@ icon_state = "shiva" can_build_special = TRUE //T-Comms structure temperature = ICE_COLONY_TEMPERATURE - lighting_use_dynamic = TRUE minimap_color = MINIMAP_AREA_COLONY /area/shuttle/drop1/shiva name = "Shiva's Snowball - Dropship Alamo Landing Zone" icon_state = "shuttle" icon = 'icons/turf/area_shiva.dmi' - lighting_use_dynamic = TRUE is_resin_allowed = FALSE minimap_color = MINIMAP_AREA_LZ @@ -22,7 +20,6 @@ name = "Shiva's Snowball - Dropship Normandy Landing Zone" icon_state = "shuttle2" icon = 'icons/turf/area_shiva.dmi' - lighting_use_dynamic = TRUE is_resin_allowed = FALSE minimap_color = MINIMAP_AREA_LZ diff --git a/code/game/area/shuttles.dm b/code/game/area/shuttles.dm index f61f13097d12..62c42406e795 100644 --- a/code/game/area/shuttles.dm +++ b/code/game/area/shuttles.dm @@ -1,13 +1,15 @@ /area/shuttle name = "Shuttle" requires_power = FALSE + unlimited_power = TRUE always_unpowered = FALSE icon_state = "shuttle" ceiling_muffle = TRUE // Loading the same shuttle map at a different time will produce distinct area instances. unique = FALSE - lighting_use_dynamic = FALSE + + base_lighting_alpha = 255 ///area/shuttle/Initialize() @@ -37,6 +39,7 @@ name = "Hyperspace" desc = "Weeeeee" ambience_exterior = 'sound/ambience/shuttle_fly_loop.ogg' + base_lighting_alpha = 255 /area/shuttle/vehicle_elevator name = "Vehicle ASRS" @@ -52,7 +55,7 @@ /area/shuttle/trijent_shuttle/elevator requires_power = TRUE - lighting_use_dynamic = FALSE + unlimited_power = FALSE powernet_name = "ground" /area/shuttle/trijent_shuttle/lz1 @@ -66,6 +69,7 @@ /area/shuttle/trijent_shuttle/omega name = "Trijent Omega" + /area/shuttle/escape_pod icon = 'icons/turf/area_almayer.dmi' icon_state = "lifeboat" diff --git a/code/game/area/space_station_13_areas.dm b/code/game/area/space_station_13_areas.dm index 226ca555cd57..df5e54a77013 100644 --- a/code/game/area/space_station_13_areas.dm +++ b/code/game/area/space_station_13_areas.dm @@ -18,7 +18,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "\improper Space" requires_power = 1 always_unpowered = 1 - lighting_use_dynamic = 0 + base_lighting_alpha = 255 power_light = FALSE power_equip = FALSE power_environ = FALSE @@ -39,7 +39,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station ceiling = CEILING_METAL /area/admin/droppod - lighting_use_dynamic = FALSE + base_lighting_alpha = 255 /area/admin/droppod/holding name = "\improper Admin Supply Drops Droppod" @@ -56,9 +56,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "start area" icon_state = "start" ceiling = CEILING_MAX - requires_power = 0 - luminosity = 1 - lighting_use_dynamic = 0 + requires_power = FALSE + static_lighting = FALSE + base_lighting_alpha = 255 has_gravity = 1 // === end remove @@ -72,6 +72,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station statistic_exempt = TRUE ceiling = CEILING_METAL + base_lighting_alpha = 255 + /area/centcom/control name = "\improper abandoned Centcom Control" @@ -86,6 +88,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station statistic_exempt = TRUE ceiling = CEILING_METAL + base_lighting_alpha = 255 + /area/tdome/tdome1 name = "\improper abandoned Thunderdome (Team 1)" icon_state = "green" diff --git a/code/game/area/strata.dm b/code/game/area/strata.dm index 1cf0eac58d1c..117cffa600d4 100644 --- a/code/game/area/strata.dm +++ b/code/game/area/strata.dm @@ -18,14 +18,16 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed /area/shuttle/drop1/strata //Not in Sulaco.DM because holy shit we need to sort things. name = "Dropship Alamo Landing Zone" icon_state = "shuttle" - lighting_use_dynamic = 0 //No bad + base_lighting_alpha = 255 minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/shuttle/drop2/strata name = "Dropship Normandy Landing Zone" icon_state = "shuttle2" - lighting_use_dynamic = 0 + base_lighting_alpha = 255 minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/strata/ag name = "Above Ground Area" @@ -92,6 +94,7 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed unlimited_power = 1 //So the DS computer always works for the Queen is_landing_zone = TRUE minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/strata/ag/exterior/landingzone_2 name = "Landing Zone 2 Pad - Ice Fields" @@ -100,6 +103,7 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed unlimited_power = 1 //So the DS computer always works for the Queen is_landing_zone = TRUE minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/strata/ag/interior/nearlz1 name = "Landing Zone 1 - Mining Aerodrome" @@ -113,6 +117,7 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed icon_state = "nearlz2" weather_enabled = TRUE //This LZ is outside, but consider disabling if it destroys the meta. minimap_color = MINIMAP_AREA_LZ + is_resin_allowed = FALSE /area/strata/ag/exterior/landingzone_valley name = "Landing Zone Valley" diff --git a/code/game/area/techtree.dm b/code/game/area/techtree.dm index 70b70e3852be..24510562ab57 100644 --- a/code/game/area/techtree.dm +++ b/code/game/area/techtree.dm @@ -1,5 +1,5 @@ /area/techtree - lighting_use_dynamic = FALSE + base_lighting_alpha = 255 ceiling = CEILING_MAX requires_power = 0 ambience_exterior = AMBIENCE_ALMAYER diff --git a/code/game/area/varadero.dm b/code/game/area/varadero.dm index 09b082f2acd6..682f3ded1c66 100644 --- a/code/game/area/varadero.dm +++ b/code/game/area/varadero.dm @@ -8,7 +8,6 @@ icon_state = "varadero" can_build_special = TRUE //T-Comms structure temperature = TROPICAL_TEMP - lighting_use_dynamic = TRUE minimap_color = MINIMAP_AREA_COLONY //shuttle stuff @@ -17,7 +16,6 @@ name = "New Varadero - Dropship Alamo Landing Zone" icon_state = "shuttle" icon = 'icons/turf/area_varadero.dmi' - lighting_use_dynamic = TRUE is_resin_allowed = FALSE minimap_color = MINIMAP_AREA_LZ @@ -26,7 +24,6 @@ name = "New Varadero - Dropship Normandy Landing Zone" icon_state = "shuttle2" icon = 'icons/turf/area_varadero.dmi' - lighting_use_dynamic = TRUE is_resin_allowed = FALSE minimap_color = MINIMAP_AREA_LZ @@ -35,7 +32,6 @@ /area/varadero/exterior name = "New Varadero - Exterior" ceiling = CEILING_NONE - lighting_use_dynamic = TRUE ambience_exterior = AMBIENCE_NV //soundscape_playlist @@ -119,7 +115,6 @@ name = "New Varadero - East Beach" is_resin_allowed = FALSE icon_state = "varadero1" - lighting_use_dynamic = TRUE minimap_color = MINIMAP_AREA_JUNGLE /area/varadero/exterior/monsoon @@ -130,7 +125,6 @@ /area/varadero/exterior/pool name = "New Varadero - Interior Pool" icon_state = "varadero1" - lighting_use_dynamic = TRUE minimap_color = MINIMAP_AREA_COMMAND_CAVE /area/varadero/exterior/eastocean @@ -292,8 +286,6 @@ power_light = FALSE power_equip = FALSE power_environ = FALSE - luminosity = 0 - lighting_use_dynamic = 1 sound_environment = SOUND_ENVIRONMENT_AUDITORIUM minimap_color = MINIMAP_AREA_CAVES @@ -311,8 +303,7 @@ power_light = FALSE power_equip = FALSE power_environ = FALSE - luminosity = 0 - lighting_use_dynamic = 1 + minimap_color = MINIMAP_AREA_RESEARCH_CAVE /area/varadero/interior_protected/caves/central diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d2cad09edc83..e1541f8368b8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -59,6 +59,36 @@ ///Default pixel y shifting for the atom's icon. var/base_pixel_y = 0 + //light stuff + + ///Light systems, only one of the three should be active at the same time. + var/light_system = STATIC_LIGHT + ///Range of the light in tiles. Zero means no light. + var/light_range = 0 + ///Intensity of the light. The stronger, the less shadows you will see on the lit area. + var/light_power = 1 + ///Hexadecimal RGB string representing the colour of the light. White by default. + var/light_color = COLOR_WHITE + ///Boolean variable for toggleable lights. Has no effect without the proper light_system, light_range and light_power values. + var/light_on = FALSE + ///Bitflags to determine lighting-related atom properties. + var/light_flags = NONE + ///Our light source. Don't fuck with this directly unless you have a good reason! + var/tmp/datum/dynamic_light_source/light + ///Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list. + var/tmp/list/hybrid_light_sources + + //Values should avoid being close to -16, 16, -48, 48 etc. + //Best keep them within 10 units of a multiple of 32, as when the light is closer to a wall, the probability + //that a shadow extends to opposite corners of the light mask square is increased, resulting in more shadow + //overlays. + ///x offset for dynamic lights on this atom + var/light_pixel_x + ///y offset for dynamic lights on this atom + var/light_pixel_y + ///typepath for the lighting maskfor dynamic light sources + var/light_mask_type = null + ///The color this atom will be if we choose to draw it on the minimap var/minimap_color = MINIMAP_SOLID @@ -77,7 +107,7 @@ Make sure the return value equals the return value of the parent so that the directive is properly returned. */ //=========================================================================== -/atom/Destroy() +/atom/Destroy(force) orbiters = null // The component is attached to us normally and will be deleted elsewhere QDEL_NULL(reagents) QDEL_NULL(light) @@ -327,6 +357,12 @@ Parameters are passed from New. CRASH("Warning: [src]([type]) initialized multiple times!") flags_atom |= INITIALIZED + if(light_system != MOVABLE_LIGHT && light_system != DIRECTIONAL_LIGHT && light_power && light_range) + update_light() + if(isturf(loc) && opacity) + var/turf/opaque_turf = loc + opaque_turf.directional_opacity = ALL_CARDINALS // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. + pass_flags = pass_flags_cache[type] if (isnull(pass_flags)) pass_flags = new() @@ -569,6 +605,37 @@ Parameters are passed from New. var/icon/I = icon(icon, icon_state, dir) return (I.Width() + I.Height()) * 0.5 +/** + * If this object has lights, turn it on/off. + * user: the mob actioning this + * toggle_on: if TRUE, will try to turn ON the light. Opposite if FALSE + * cooldown: how long until you can toggle the light on/off again + * sparks: if a spark effect will be generated + * forced: if TRUE and toggle_on = FALSE, will cause the light to turn on in cooldown second + * originated_turf: if not null, will check if the obj_turf is closer than distance_max to originated_turf, and the proc will return if not + * distance_max: used to check if originated_turf is close to obj.loc +*/ +/atom/proc/turn_light(mob/user, toggle_on , cooldown = 1 SECONDS, sparks = FALSE, forced = FALSE, light_again = FALSE) + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_LIGHT) && !forced) + return STILL_ON_COOLDOWN + if(cooldown <= 0) + cooldown = 1 SECONDS + TIMER_COOLDOWN_START(src, COOLDOWN_LIGHT, cooldown) + if(toggle_on == light_on) + return NO_LIGHT_STATE_CHANGE + if(light_again && !toggle_on) //Is true when turn light is called by nightfall and the light is already on + addtimer(CALLBACK(src, PROC_REF(reset_light)), cooldown + 1) + if(sparks && light_on) + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(5, 0, src) + spark_system.attach(src) + spark_system.start(src) + return CHECKS_PASSED + +///Turn on the light, should be called by a timer +/atom/proc/reset_light() + turn_light(null, TRUE, 1 SECONDS, FALSE, TRUE) + /** * Return the markup to for the dropdown list for the VV panel for this atom * diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 17b37ce76630..b8a901ccf321 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -21,13 +21,24 @@ var/datum/component/orbiter/orbiting + /// Either FALSE, [EMISSIVE_BLOCK_GENERIC], or [EMISSIVE_BLOCK_UNIQUE] + var/blocks_emissive = FALSE + ///Internal holder for emissive blocker object, do not use directly use blocks_emissive + var/atom/movable/emissive_blocker/em_block + + ///Lazylist to keep track on the sources of illumination. + var/list/affected_movable_lights + ///Highest-intensity light affecting us, which determines our visibility. + var/affecting_dynamic_lumi = 0 + //=========================================================================== -/atom/movable/Destroy() +/atom/movable/Destroy(force) for(var/atom/movable/I in contents) qdel(I) if(pulledby) pulledby.stop_pulling() QDEL_NULL(launch_metadata) + QDEL_NULL(em_block) if(loc) loc.on_stored_atom_del(src) //things that container need to do when a movable atom inside it is deleted @@ -38,6 +49,9 @@ . = ..() moveToNullspace() //so we move into null space. Must be after ..() b/c atom's Dispose handles deleting our lighting stuff + QDEL_NULL(light) + QDEL_NULL(static_light) + //=========================================================================== //Overlays @@ -60,6 +74,48 @@ return src.master.attack_hand(a, b, c) return +/atom/movable/Initialize(mapload, ...) + . = ..() + switch(blocks_emissive) + if(EMISSIVE_BLOCK_GENERIC) + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) + gen_emissive_blocker.color = GLOB.em_block_color + gen_emissive_blocker.dir = dir + gen_emissive_blocker.appearance_flags |= appearance_flags + overlays += gen_emissive_blocker + if(EMISSIVE_BLOCK_UNIQUE) + render_target = ref(src) + em_block = new(src, render_target) + overlays += list(em_block) + if(opacity) + AddElement(/datum/element/light_blocking) + if(light_system == MOVABLE_LIGHT) + AddComponent(/datum/component/overlay_lighting) + if(light_system == DIRECTIONAL_LIGHT) + AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) + +/* + +///Updates this movables emissive overlay +/atom/movable/proc/update_emissive_block() + if(!blocks_emissive) + return + else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC) + var/mutable_appearance/gen_emissive_blocker = emissive_blocker(icon, icon_state, alpha = src.alpha, appearance_flags = src.appearance_flags) + gen_emissive_blocker.dir = dir + if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE) + if(!em_block) + render_target = ref(src) + em_block = new(src, render_target) + return em_block + +/atom/movable/update_overlays() + . = ..() + + . += update_emissive_block() + +*/ + /atom/movable/vv_get_dropdown() . = ..() VV_DROPDOWN_OPTION(VV_HK_EDIT_PARTICLES, "Edit Particles") @@ -215,7 +271,7 @@ /atom/movable/clone/get_examine_text(mob/user) return src.mstr.get_examine_text(user) -/atom/movable/clone/bullet_act(obj/item/projectile/P) +/atom/movable/clone/bullet_act(obj/projectile/P) return src.mstr.bullet_act(P) ///////////////////// @@ -251,10 +307,10 @@ if(light) //Clone lighting if(!clone.light) - clone.SetLuminosity(luminosity) //Create clone light + clone.set_light(luminosity) //Create clone light else if(clone.light) - clone.SetLuminosity(0) //Kill clone light + clone.set_light(0) //Kill clone light /atom/movable/proc/destroy_clone() clones.Remove(src.clone) @@ -279,3 +335,23 @@ //if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) // return return throw_atom(target, range, speed, thrower, spin) + +///Keeps track of the sources of dynamic luminosity and updates our visibility with the highest. +/atom/movable/proc/update_dynamic_luminosity() + var/highest = 0 + for(var/i in affected_movable_lights) + if(affected_movable_lights[i] <= highest) + continue + highest = affected_movable_lights[i] + if(highest == affecting_dynamic_lumi) + return + luminosity -= affecting_dynamic_lumi + affecting_dynamic_lumi = highest + luminosity += affecting_dynamic_lumi + + +///Helper to change several lighting overlay settings. +/atom/movable/proc/set_light_range_power_color(range, power, color) + set_light_range(range) + set_light_power(power) + set_light_color(color) diff --git a/code/game/cas_manager/datums/cas_fire_envelope.dm b/code/game/cas_manager/datums/cas_fire_envelope.dm index 450fe8e6a82b..d7c939b76e16 100644 --- a/code/game/cas_manager/datums/cas_fire_envelope.dm +++ b/code/game/cas_manager/datums/cas_fire_envelope.dm @@ -125,10 +125,6 @@ mission_error = mission.error_message(check_result) return 0 - if(target_turf && target_turf.signal_loc) - var/turf/TT = get_turf(target_turf.signal_loc) - if(TT && TT.z) - msg_admin_niche("[key_name(usr)] launching Fire Mission '[mission.name]' onto [target_turf.name] at ([TT.x],[TT.y],[TT.z]) [ADMIN_JMP(TT)]") //actual firemission code execute_firemission_unsafe(target_turf, offset, dir, mission) return 1 diff --git a/code/game/cas_manager/datums/cas_fire_mission.dm b/code/game/cas_manager/datums/cas_fire_mission.dm index 42f5b4bd8655..0a04876414e7 100644 --- a/code/game/cas_manager/datums/cas_fire_mission.dm +++ b/code/game/cas_manager/datums/cas_fire_mission.dm @@ -98,6 +98,17 @@ if(initial_turf == null || check(linked_console) != FIRE_MISSION_ALL_GOOD) return FIRE_MISSION_NOT_EXECUTABLE + var/obj/effect/firemission_effect = new(initial_turf) + + firemission_effect.icon = 'icons/obj/items/weapons/projectiles.dmi' + firemission_effect.icon_state = "laser_target2" + firemission_effect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + firemission_effect.invisibility = INVISIBILITY_MAXIMUM + QDEL_IN(firemission_effect, 5 SECONDS) + + notify_ghosts(header = "CAS Fire Mission", message = "[usr ? usr : "Someone"] is launching Fire Mission '[name]' at [get_area(initial_turf)].", source = firemission_effect) + msg_admin_niche("[usr ? key_name(usr) : "Someone"] is launching Fire Mission '[name]' at ([initial_turf.x],[initial_turf.y],[initial_turf.z]) [ADMIN_JMP(initial_turf)]") + var/relative_dir for(var/mob/M in range(15, initial_turf)) if(get_turf(M) == initial_turf) diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index becee89adb6d..36271054bb21 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -567,21 +567,39 @@ Additional game mode variables. var/hive_picked = tgui_input_list(xeno_candidate, "Select which Hive to attempt joining.", "Hive Choice", active_hives, theme="hive_status") if(!hive_picked) to_chat(xeno_candidate, SPAN_ALERT("Hive choice error. Aborting.")) - return + return FALSE hive = GLOB.hive_datum[active_hives[hive_picked]] else hive = GLOB.hive_datum[last_active_hive] - if(!hive.hive_location) - to_chat(xeno_candidate, SPAN_WARNING("The selected hive does not have a hive core to spawn from!")) - return - for(var/mob_name in hive.banished_ckeys) if(hive.banished_ckeys[mob_name] == xeno_candidate.ckey) to_chat(xeno_candidate, SPAN_WARNING("You are banished from the [hive], you may not rejoin unless the Queen re-admits you or dies.")) - return + return FALSE + + var/list/selection_list = list() + var/list/selection_list_structure = list() + + if(hive.hive_location?.lesser_drone_spawns >= 1) + selection_list += "hive core" + selection_list_structure += hive.hive_location + + for(var/obj/effect/alien/resin/special/pylon/cycled_pylon as anything in hive.hive_structures[XENO_STRUCTURE_PYLON]) + if(cycled_pylon.lesser_drone_spawns >= 1) + selection_list += "[cycled_pylon.name] at [get_area(cycled_pylon)]" + selection_list_structure += cycled_pylon + + if(!length(selection_list)) + to_chat(xeno_candidate, SPAN_WARNING("The selected hive does not have enough power for a lesser drone at any hive core or pylon!")) + return FALSE + + var/prompt = tgui_input_list(xeno_candidate, "Select spawn?", "Spawnpoint Selection", selection_list) + if(!prompt) + return FALSE + + var/obj/effect/alien/resin/special/pylon/selected_structure = selection_list_structure[selection_list.Find(prompt)] - hive.hive_location.spawn_lesser_drone(xeno_candidate) + selected_structure.spawn_lesser_drone(xeno_candidate) return TRUE @@ -939,7 +957,7 @@ Additional game mode variables. to_chat(joe_candidate, SPAN_WARNING("You are not whitelisted! You may apply on the forums to be whitelisted as a synth.")) return - if(joe_candidate.ckey in joes) + if((joe_candidate.ckey in joes) && !MODE_HAS_TOGGLEABLE_FLAG(MODE_BYPASS_JOE)) if(show_warning) to_chat(joe_candidate, SPAN_WARNING("You already were a Working Joe this round!")) return @@ -947,12 +965,12 @@ Additional game mode variables. // council doesn't count towards this conditional. if(joe_job.get_whitelist_status(RoleAuthority.roles_whitelist, joe_candidate.client) == WHITELIST_NORMAL) var/joe_max = joe_job.total_positions - if(joe_job.current_positions >= joe_max) + if((joe_job.current_positions >= joe_max) && !MODE_HAS_TOGGLEABLE_FLAG(MODE_BYPASS_JOE)) if(show_warning) to_chat(joe_candidate, SPAN_WARNING("Only [joe_max] Working Joes may spawn per round.")) return - if(!enter_allowed) + if(!enter_allowed && !MODE_HAS_TOGGLEABLE_FLAG(MODE_BYPASS_JOE)) if(show_warning) to_chat(joe_candidate, SPAN_WARNING("There is an administrative lock from entering the game.")) return diff --git a/code/game/gamemodes/cm_self_destruct.dm b/code/game/gamemodes/cm_self_destruct.dm index 8c022fd0d916..d2f9c4eac784 100644 --- a/code/game/gamemodes/cm_self_destruct.dm +++ b/code/game/gamemodes/cm_self_destruct.dm @@ -103,7 +103,7 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi for(var/obj/structure/machinery/status_display/SD in machines) if(is_mainship_level(SD.z)) SD.set_picture("evac") - for(var/obj/docking_port/mobile/escape_shuttle/shuttle in SSshuttle.mobile) + for(var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle in SSshuttle.mobile) shuttle.prepare_evac() activate_lifeboats() process_evacuation() @@ -121,7 +121,7 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi if(is_mainship_level(SD.z)) SD.set_picture("redalert") - for(var/obj/docking_port/mobile/escape_shuttle/shuttle in SSshuttle.mobile) + for(var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle in SSshuttle.mobile) shuttle.cancel_evac() return TRUE @@ -132,17 +132,17 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi ai_announcement("WARNING: Evacuation order confirmed. Launching escape pods.", 'sound/AI/evacuation_confirmed.ogg') addtimer(CALLBACK(src, PROC_REF(launch_lifeboats)), 10 SECONDS) // giving some time to board lifeboats - for(var/obj/docking_port/mobile/escape_shuttle/shuttle in SSshuttle.mobile) + for(var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle in SSshuttle.mobile) shuttle.evac_launch() sleep(50) sleep(300) //Sleep 30 more seconds to make sure everyone had a chance to leave. var/lifesigns = 0 // lifesigns += P.passengers - var/obj/docking_port/mobile/lifeboat/lifeboat1 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_PORT) + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat1 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_PORT) lifeboat1.check_for_survivors() lifesigns += lifeboat1.survivors - var/obj/docking_port/mobile/lifeboat/lifeboat2 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_STARBOARD) + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat2 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_STARBOARD) lifeboat2.check_for_survivors() lifesigns += lifeboat2.survivors ai_announcement("ATTENTION: Evacuation complete. Outbound lifesigns detected: [lifesigns ? lifesigns : "none"].", 'sound/AI/evacuation_complete.ogg') @@ -166,7 +166,7 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi // LIFEBOATS CORNER /datum/authority/branch/evacuation/proc/activate_lifeboats() for(var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock in GLOB.lifeboat_almayer_docks) - var/obj/docking_port/mobile/lifeboat/lifeboat = lifeboat_dock.get_docked() + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = lifeboat_dock.get_docked() if(lifeboat && lifeboat.available) lifeboat.status = LIFEBOAT_ACTIVE lifeboat_dock.open_dock() @@ -174,15 +174,15 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi /datum/authority/branch/evacuation/proc/deactivate_lifeboats() for(var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock in GLOB.lifeboat_almayer_docks) - var/obj/docking_port/mobile/lifeboat/lifeboat = lifeboat_dock.get_docked() + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = lifeboat_dock.get_docked() if(lifeboat && lifeboat.available) lifeboat.status = LIFEBOAT_INACTIVE /datum/authority/branch/evacuation/proc/launch_lifeboats() for(var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock in GLOB.lifeboat_almayer_docks) - var/obj/docking_port/mobile/lifeboat/lifeboat = lifeboat_dock.get_docked() + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = lifeboat_dock.get_docked() if(lifeboat && lifeboat.available) - lifeboat.send_to_infinite_transit() + lifeboat.evac_launch() //========================================================================================= //========================================================================================= diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm index d6dfc695c5d0..a5126627adaf 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost/skills.dm @@ -17,6 +17,7 @@ SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_JTAC = SKILL_JTAC_EXPERT, ) @@ -37,6 +38,7 @@ 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_MEDIC, SKILL_POLICE = SKILL_POLICE_FLASH, SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, diff --git a/code/game/jobs/job/civilians/support/working_joe.dm b/code/game/jobs/job/civilians/support/working_joe.dm index d4b575f324f2..bdc7d3aa071b 100644 --- a/code/game/jobs/job/civilians/support/working_joe.dm +++ b/code/game/jobs/job/civilians/support/working_joe.dm @@ -12,6 +12,7 @@ flags_startup_parameters = ROLE_ADD_TO_DEFAULT|ROLE_WHITELISTED|ROLE_CUSTOM_SPAWN flags_whitelist = WHITELIST_JOE gear_preset = /datum/equipment_preset/synth/working_joe + gets_emergency_kit = FALSE job_options = list(STANDARD_VARIANT = "JOE", HAZMAT_VARIANT = "HAZ") var/standard = TRUE @@ -45,11 +46,6 @@ else . = {"You are a Working Joe for Hazardous Environments! You are held to a higher standard and are required to obey not only the Server Rules but Marine Law, Roleplay Expectations and Synthetic Rules. You are a variant of the Working Joe built for tougher environments and fulfill the specific duty of dangerous repairs or maintenance. Your primary task is to maintain the reactor, SMES and AI Core. Your secondary task is to respond to hazardous environments, such as an atmospheric breach or biohazard spill, and assist with repairs when ordered to by either an AI Mainframe, or a Commisioned Officer. You should not be seen outside of emergencies besides in Engineering and the AI Core! Stay in character at all times. Use the APOLLO link to communicate with your uplink!"} - -/datum/job/civilian/working_joe/announce_entry_message(mob/living/carbon/human/H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ai_announcement), "[H.real_name] has been activated."), 1.5 SECONDS) - return ..() - /obj/effect/landmark/start/working_joe name = JOB_WORKING_JOE icon_state = "wj_spawn" diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 234902e11d22..0785fc5c337f 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -37,6 +37,8 @@ /// When set you will be able to choose between the different job options when selecting your role. /// Associated list. Main list elements - actual options, associated values - shorthands for job preferences menu (keep those short). var/job_options + /// If TRUE, this job will spawn w/ a cryo emergency kit during evac/red alert + var/gets_emergency_kit = TRUE /datum/job/New() . = ..() diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index fb85be012d30..116de402104d 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -370,13 +370,14 @@ var/message_colour = chat_color if(only_leader) if(squad_leader) - var/mob/living/carbon/human/SL = squad_leader - if(!SL.stat && SL.client) - SL.play_screen_text("[title_text]
" + text, /atom/movable/screen/text/screen_text/command_order, message_colour) + if(!squad_leader.stat && squad_leader.client) + playsound_client(squad_leader.client, 'sound/effects/radiostatic.ogg', squad_leader.loc, 25, FALSE) + squad_leader.play_screen_text("[title_text]
" + text, /atom/movable/screen/text/screen_text/command_order, message_colour) else - for(var/mob/living/carbon/human/M in marines_list) - if(!M.stat && M.client) //Only living and connected people in our squad - M.play_screen_text("[title_text]
" + text, /atom/movable/screen/text/screen_text/command_order, message_colour) + for(var/mob/living/carbon/human/marine in marines_list) + if(!marine.stat && marine.client) //Only living and connected people in our squad + playsound_client(marine.client, 'sound/effects/radiostatic.ogg', marine.loc, 25, FALSE) + marine.play_screen_text("[title_text]
" + text, /atom/movable/screen/text/screen_text/command_order, message_colour) /// Displays a message to the squad members in chat /datum/squad/proc/send_message(text = "", plus_name = 0, only_leader = 0) diff --git a/code/game/machinery/ARES/ARES.dm b/code/game/machinery/ARES/ARES.dm index de4140ef1b81..ed4391c89c24 100644 --- a/code/game/machinery/ARES/ARES.dm +++ b/code/game/machinery/ARES/ARES.dm @@ -149,14 +149,17 @@ 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 and (/datum/ares_record/antiair)s + /// 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) @@ -205,12 +208,6 @@ var/list/login_list = list() - /// If this is used to create AI Core access tickets - var/ticket_console = FALSE - var/obj/item/card/id/authenticator_id - var/ticket_authenticated = FALSE - var/obj/item/card/id/target_id - /obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) if(link && !override) return FALSE diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index a335a36994e5..e03f218f0f34 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -32,6 +32,8 @@ GLOBAL_LIST_INIT(maintenance_categories, 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_link/Destroy() for(var/obj/structure/machinery/ares/link in linked_systems) @@ -57,20 +59,23 @@ GLOBAL_LIST_INIT(maintenance_categories, list( /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(mob/living/user, ob_name, coordinates) - interface.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user)) +/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_antiair(mob/living/user, details) - interface.records_security.Add(new /datum/ares_record/antiair(details, user)) - -/datum/ares_link/proc/log_ares_requisition(source, details, mob/living/user) - interface.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user)) +/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) @@ -208,6 +213,7 @@ GLOBAL_LIST_INIT(maintenance_categories, list( 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 @@ -224,8 +230,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( var/list/logged_alerts = list() for(var/datum/ares_record/security/security_alert as anything in records_security) - if(!istype(security_alert)) - continue var/list/current_alert = list() current_alert["time"] = security_alert.time current_alert["title"] = security_alert.title @@ -234,6 +238,17 @@ GLOBAL_LIST_INIT(maintenance_categories, list( 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() @@ -279,18 +294,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( logged_discussions += list(deleted_disc) data["deleted_discussions"] = logged_discussions - var/list/logged_adjustments = list() - for(var/datum/ares_record/antiair/aa_adjustment as anything in records_security) - if(!istype(aa_adjustment)) - continue - var/list/current_adjustment = list() - current_adjustment["time"] = aa_adjustment.time - current_adjustment["details"] = aa_adjustment.details - current_adjustment["user"] = aa_adjustment.user - current_adjustment["ref"] = "\ref[aa_adjustment]" - logged_adjustments += list(current_adjustment) - data["aa_adjustments"] = logged_adjustments - var/list/logged_orders = list() for(var/datum/ares_record/requisition_log/req_order as anything in records_asrs) if(!istype(req_order)) @@ -428,12 +431,12 @@ GLOBAL_LIST_INIT(maintenance_categories, list( 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_antiair") - last_menu = current_menu - current_menu = "antiair" if("page_emergency") last_menu = current_menu current_menu = "emergency" @@ -457,7 +460,7 @@ GLOBAL_LIST_INIT(maintenance_categories, list( new_title = "[record.title] at [record.time]" new_details = record.details records_announcement -= record - if(ARES_RECORD_SECURITY) + if(ARES_RECORD_SECURITY, ARES_RECORD_ANTIAIR) new_title = "[record.title] at [record.time]" new_details = record.details records_security -= record @@ -506,16 +509,18 @@ GLOBAL_LIST_INIT(maintenance_categories, list( // -- Emergency Buttons -- // if("general_quarters") - if(security_level == SEC_LEVEL_RED || security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("Alert level is already red or above, General Quarters cannot be called.")) + 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 - set_security_level(2, no_sound = TRUE, announce = 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") @@ -563,7 +568,7 @@ GLOBAL_LIST_INIT(maintenance_categories, list( 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 a Distress Beacon (via ARES)! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + 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 @@ -620,100 +625,22 @@ GLOBAL_LIST_INIT(maintenance_categories, list( /obj/structure/machinery/computer/working_joe/ares_auth_to_text(access_level) switch(access_level) - if(APOLLO_ACCESS_REQUEST)//0 + if(APOLLO_ACCESS_LOGOUT)//0 + return "Logged Out" + if(APOLLO_ACCESS_REQUEST)//1 return "Unauthorized Personnel" - if(APOLLO_ACCESS_REPORTER)//1 + if(APOLLO_ACCESS_REPORTER)//2 return "Validated Incident Reporter" - if(APOLLO_ACCESS_TEMP)//2 + if(APOLLO_ACCESS_TEMP)//3 return "Authorized Visitor" - if(APOLLO_ACCESS_AUTHED)//3 + if(APOLLO_ACCESS_AUTHED)//4 return "Certified Personnel" - if(APOLLO_ACCESS_JOE)//4 + if(APOLLO_ACCESS_JOE)//5 return "Working Joe" - if(APOLLO_ACCESS_DEBUG)//5 + if(APOLLO_ACCESS_DEBUG)//6 return "AI Service Technician" // ------ Maintenance Controller UI ------ // -/obj/structure/machinery/computer/working_joe/verb/eject_id() - set category = "Object" - set name = "Eject ID Card" - set src in oview(1) - - if(!usr || usr.stat || usr.lying) - return FALSE - - if(authenticator_id) - authenticator_id.loc = get_turf(src) - if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) - usr.put_in_hands(authenticator_id) - if(operable()) // Powered. Console can response. - visible_message("[SPAN_BOLD("[src]")] states, \"AUTH LOGOUT: Session end confirmed.\"") - else - to_chat(usr, "You remove [authenticator_id] from [src].") - ticket_authenticated = FALSE // No card - no access - authenticator_id = null - - else if(target_id) - target_id.loc = get_turf(src) - if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) - usr.put_in_hands(target_id) - else - to_chat(usr, "You remove [target_id] from [src].") - target_id = null - - else - to_chat(usr, "There is nothing to remove from the console.") - return - -/obj/structure/machinery/computer/working_joe/attackby(obj/object, mob/user) - if(istype(object, /obj/item/card/id)) - if(!ticket_console) - to_chat(user, SPAN_WARNING("This console doesn't have an ID port!")) - return FALSE - if(!operable()) - to_chat(user, SPAN_NOTICE("You try to insert [object] but [src] remains silent.")) - return FALSE - var/obj/item/card/id/idcard = object - if((idcard.assignment == JOB_WORKING_JOE) || (ACCESS_ARES_DEBUG in idcard.access)) - if(!authenticator_id) - if(user.drop_held_item()) - object.forceMove(src) - authenticator_id = object - authenticate(authenticator_id) - else if(!target_id) - if(user.drop_held_item()) - object.forceMove(src) - target_id = object - else - to_chat(user, "Both slots are full already. Remove a card first.") - return FALSE - else - if(!target_id) - if(user.drop_held_item()) - object.forceMove(src) - target_id = object - else - to_chat(user, "Both slots are full already. Remove a card first.") - return FALSE - else - ..() - -/obj/structure/machinery/computer/working_joe/proc/authenticate(obj/item/card/id/id_card) - if(!id_card) - visible_message("[SPAN_BOLD("[src]")] states, \"AUTH ERROR: Authenticator card is missing!\"") - return FALSE - - if((ACCESS_MARINE_AI in id_card.access) || (ACCESS_ARES_DEBUG in id_card.access)) - ticket_authenticated = TRUE - visible_message("[SPAN_BOLD("[src]")] states, \"AUTH LOGIN: Welcome, [id_card.registered_name]. Access granted.\"") - return TRUE - - visible_message("[SPAN_BOLD("[src]")] states, \"AUTH ERROR: Access denied.\"") - return FALSE - - - - /obj/structure/machinery/computer/working_joe/attack_hand(mob/user as mob) if(..() || !allowed(usr) || inoperable()) return FALSE @@ -730,7 +657,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( /obj/structure/machinery/computer/working_joe/ui_data(mob/user) var/list/data = list() - data["ticket_console"] = ticket_console data["current_menu"] = current_menu data["last_page"] = last_menu @@ -748,9 +674,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( data["apollo_log"] = list() data["apollo_log"] += link.apollo_log - data["authenticated"] = ticket_authenticated - - var/list/logged_maintenance = list() for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) if(!istype(maint_ticket)) @@ -775,10 +698,11 @@ GLOBAL_LIST_INIT(maintenance_categories, list( 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_COMPLETED) + if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED) lock_status = TICKET_CLOSED var/list/current_ticket = list() @@ -793,8 +717,10 @@ GLOBAL_LIST_INIT(maintenance_categories, list( current_ticket["lock_status"] = lock_status current_ticket["ref"] = "\ref[access_ticket]" logged_access += list(current_ticket) - data["access_tickets"] = logged_access + if(lock_status == TICKET_OPEN) + requesting_access += access_ticket.ticket_name + data["access_tickets"] = logged_access return data @@ -864,9 +790,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( if("page_request") last_menu = current_menu current_menu = "access_requests" - if("page_returns") - last_menu = current_menu - current_menu = "access_returns" if("page_report") last_menu = current_menu current_menu = "maint_reports" @@ -963,28 +886,122 @@ GLOBAL_LIST_INIT(maintenance_categories, list( return TRUE if("new_access") - var/priority_report = FALSE - var/ticket_holder = tgui_input_text(operator, "Who is the ticket for?", "Ticket Holder", encode = FALSE) + 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 - if(authentication >= APOLLO_ACCESS_AUTHED) - var/is_priority = tgui_alert(operator, "Is this a priority request?", "Priority designation", list("Yes", "No")) - if(is_priority == "Yes") - priority_report = TRUE - - var/confirm = alert(operator, "Please confirm the submission of your access ticket request. \n\n Priority: [priority_report ? "Yes" : "No"] \n Holder: '[ticket_holder]' \n Details: '[details]' \n\n Is this correct?", "Confirmation", "Yes", "No") + 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, priority_report) + 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 - if(priority_report) - ares_apollo_talk("Priority Access Request: [ticket_holder] - ID [access_ticket.ticket_id]. Seek and resolve.") 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 4e2b479e71a2..19751462bc37 100644 --- a/code/game/machinery/ARES/ARES_records.dm +++ b/code/game/machinery/ARES/ARES_records.dm @@ -32,13 +32,21 @@ /datum/ares_record/security record_name = ARES_RECORD_SECURITY -/datum/ares_record/antiair +/datum/ares_record/security/antiair record_name = ARES_RECORD_ANTIAIR -/datum/ares_record/antiair/New(details, user) +/datum/ares_record/security/antiair/New(details) time = worldtime2text() src.title = "AntiAir Adjustment" src.details = details + +/datum/ares_record/flight + record_name = ARES_RECORD_FLIGHT + +/datum/ares_record/flight/New(details, user) + time = worldtime2text() + src.title = "Flight Log" + src.details = details src.user = user /datum/ares_record/bombardment @@ -107,3 +115,17 @@ /datum/ares_ticket/access ticket_type = ARES_RECORD_ACCESS + var/user_id_num + +/datum/ares_ticket/access/New(user, name, details, priority, global_id_num) + var/ref_holder = "\ref[src]" + var/pos = length(ref_holder) + var/new_id = "#[copytext("\ref[src]", pos - 4, pos)]" + + 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 a50aa40abd90..335a877f9f25 100644 --- a/code/game/machinery/ARES/ARES_step_triggers.dm +++ b/code/game/machinery/ARES/ARES_step_triggers.dm @@ -163,7 +163,18 @@ to_chat(passer, SPAN_BOLDWARNING("You hear a harsh buzzing sound as you cross the threshold!")) ares_apollo_talk(broadcast_message) if(idcard) - idcard.access -= ACCESS_MARINE_AI_TEMP + /// Removes the access from the ID and updates the ID's modification log. + for(var/obj/item/card/id/identification in link.active_ids) + if(identification != idcard) + continue + idcard.access -= ACCESS_MARINE_AI_TEMP + link.active_ids -= idcard + idcard.modification_log += "Temporary AI access revoked by [MAIN_AI_SYSTEM]" + /// Updates the related access ticket. + for(var/datum/ares_ticket/access/access_ticket in link.tickets_access) + if(access_ticket.user_id_num != idcard.registered_gid) + continue + access_ticket.ticket_status = TICKET_REVOKED COOLDOWN_START(src, sensor_cooldown, COOLDOWN_ARES_ACCESS_CONTROL) if(alert_id && link) for(var/obj/effect/step_trigger/ares_alert/sensor in link.linked_alerts) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 28e045163f06..16512a944be1 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -136,8 +136,6 @@ /obj/structure/machinery/alarm/proc/first_run() alarm_area = get_area(src) - if (alarm_area.master) - alarm_area = alarm_area.master area_uid = alarm_area.uid if (name == "alarm") name = "[alarm_area.name] Air Alarm" @@ -203,11 +201,10 @@ /obj/structure/machinery/alarm/proc/elect_master() if(!alarm_area) return 0 - for (var/area/A in alarm_area.related) - for (var/obj/structure/machinery/alarm/AA in A) - if (!(AA.inoperable())) - alarm_area.master_air_alarm = AA - return 1 + for (var/obj/structure/machinery/alarm/AA in alarm_area) + if (!(AA.inoperable())) + alarm_area.master_air_alarm = AA + return 1 return 0 /obj/structure/machinery/alarm/proc/get_danger_level(current_value, list/danger_levels) @@ -314,9 +311,8 @@ /obj/structure/machinery/alarm/proc/apply_mode() //propagate mode to other air alarms in the area //TODO: make it so that players can choose between applying the new mode to the room they are in (related area) vs the entire alarm area - for (var/area/RA in alarm_area.related) - for (var/obj/structure/machinery/alarm/AA in RA) - AA.mode = mode + for (var/obj/structure/machinery/alarm/AA in alarm_area) + AA.mode = mode switch(mode) if(AALARM_MODE_SCRUBBING) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 7e548d02d919..3c2c81ff0ce7 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -90,7 +90,7 @@ update_flag density = FALSE update_icon() -/obj/structure/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/Proj) +/obj/structure/machinery/portable_atmospherics/canister/bullet_act(obj/projectile/Proj) if(Proj.ammo.damage) update_health(round(Proj.ammo.damage / 2)) ..() diff --git a/code/game/machinery/bio-dome_floodlights.dm b/code/game/machinery/bio-dome_floodlights.dm index 488cf1ed79cc..a1f028a79f30 100644 --- a/code/game/machinery/bio-dome_floodlights.dm +++ b/code/game/machinery/bio-dome_floodlights.dm @@ -60,9 +60,9 @@ spawn(rand(0,50)) if(F.is_lit) //Shut it down - F.SetLuminosity(0) + F.set_light(0) else - F.SetLuminosity(F.lum_value) + F.set_light(F.lum_value) F.is_lit = !(F.is_lit) F.update_icon() return 0 @@ -101,7 +101,6 @@ if(fswitch?.floodlist) fswitch.floodlist -= src fswitch = null - SetLuminosity(0) return ..() /obj/structure/machinery/hydro_floodlight/update_icon() @@ -130,7 +129,7 @@ user.visible_message(SPAN_NOTICE("[user] finishes welding [src]'s damage."), \ SPAN_NOTICE("You finish welding [src]'s damage.")) if(is_lit) - SetLuminosity(lum_value) + set_light(lum_value) update_icon() return 1 else @@ -161,7 +160,7 @@ if(do_after(user, 50, INTERRUPT_ALL, BUSY_ICON_HOSTILE) && !damaged) //Not when it's already damaged. if(!src) return 0 damaged = 1 - SetLuminosity(0) + set_light(0) user.visible_message(SPAN_DANGER("[user] slashes up [src]!"), SPAN_DANGER("You slash up [src]!")) playsound(src, 'sound/weapons/blade1.ogg', 25, 1) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index aff1efa3de66..116753093fe5 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -3,7 +3,8 @@ /obj/structure/machinery/bot icon = 'icons/obj/structures/machinery/aibots.dmi' layer = MOB_LAYER - luminosity = 3 + light_system = MOVABLE_LIGHT + light_range = 3 use_power = USE_POWER_NONE var/obj/item/card/id/botcard // the ID card that the bot "holds" var/on = 1 @@ -15,6 +16,12 @@ var/open = 0//Maint panel var/locked = 1 +/obj/structure/machinery/bot/Initialize(mapload, ...) + . = ..() + + if(light_range) + set_light_on(TRUE) + /obj/structure/machinery/bot/Destroy() QDEL_NULL(botcard) . = ..() @@ -24,12 +31,12 @@ if(stat) return 0 on = 1 - SetLuminosity(initial(luminosity)) + set_light(initial(luminosity)) return 1 /obj/structure/machinery/bot/proc/turn_off() on = 0 - SetLuminosity(0) + set_light(0) /obj/structure/machinery/bot/proc/explode() qdel(src) @@ -38,10 +45,6 @@ if(health <= 0) explode() -/obj/structure/machinery/bot/Destroy() - SetLuminosity(0) - . = ..() - /obj/structure/machinery/bot/get_examine_text(mob/user) . = ..() if(health < maxhealth) @@ -89,7 +92,7 @@ else ..() -/obj/structure/machinery/bot/bullet_act(obj/item/projectile/Proj) +/obj/structure/machinery/bot/bullet_act(obj/projectile/Proj) health -= Proj.ammo.damage ..() healthcheck() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 20208a573c61..4d17e4a08803 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -79,7 +79,7 @@ network = list() cameranet.removeCamera(src) stat |= EMPED - SetLuminosity(0) + set_light(0) triggerCameraAlarm() spawn(900) network = previous_network diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 03dbe299b1f7..08de86581518 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -166,7 +166,7 @@ /obj/structure/holohoop/BlockedPassDirs(atom/movable/mover, target_dir) if(istype(mover,/obj/item) && mover.throwing) var/obj/item/I = mover - if(istype(I, /obj/item/projectile)) + if(istype(I, /obj/projectile)) return BLOCKED_MOVEMENT if(prob(50)) I.forceMove(src.loc) diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index 7d63a2e8c3af..c3b17dbf8090 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -11,11 +11,11 @@ /// requesting a distress beacon COOLDOWN_DECLARE(cooldown_request) /// requesting evac - COOLDOWN_DECLARE(cooldown_destruct) + COOLDOWN_DECLARE(cooldown_destruct) /// messaging HC (admins) COOLDOWN_DECLARE(cooldown_central) /// making a ship announcement - COOLDOWN_DECLARE(cooldown_message) + COOLDOWN_DECLARE(cooldown_message) var/list/messagetitle = list() var/list/messagetext = list() @@ -164,11 +164,11 @@ if(!level_selected) return - set_security_level(seclevel2num(level_selected)) + 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("Security Level Update", "[usr] has changed the security level to [get_security_level()].") + link.log_ares_security("Manual Security Update", "[usr] has changed the security level to [get_security_level()].") . = TRUE if("messageUSCM") @@ -230,7 +230,7 @@ for(var/client/admin_client as anything in GLOB.admins) if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) admin_client << 'sound/effects/sos-morse-code.ogg' - message_admins("[key_name(usr)] has requested a Distress Beacon! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + SSticker.mode.request_ert(usr) to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) COOLDOWN_START(src, cooldown_request, COOLDOWN_COMM_REQUEST) diff --git a/code/game/machinery/computer/area_air_control.dm b/code/game/machinery/computer/area_air_control.dm index e3f16a988c86..22f4211aa8ee 100644 --- a/code/game/machinery/computer/area_air_control.dm +++ b/code/game/machinery/computer/area_air_control.dm @@ -139,14 +139,10 @@ var/turf/T_src = get_turf(src) if(!T_src.loc) return 0 var/area/A_src = T_src.loc - if (A_src.master) - A_src = A_src.master var/turf/T_scrub = get_turf(scrubber) if(!T_scrub.loc) return 0 var/area/A_scrub = T_scrub.loc - if (A_scrub.master) - A_scrub = A_scrub.master if(A_scrub != A_src) return 0 @@ -160,14 +156,11 @@ var/turf/T = get_turf(src) if(!T.loc) return - var/area/A = T.loc - if (A.master) - A = A.master for(var/obj/structure/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in machines ) var/turf/T2 = get_turf(scrubber) if(T2 && T2.loc) - var/area/A2 = T2.loc - if(istype(A2) && A2.master && A2.master == A ) + var/area/A = T2.loc + if(istype(A) && A) connectedscrubbers += scrubber found = 1 diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index d4feca457f4a..281c548227b0 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -17,12 +17,12 @@ var/atom/movable/screen/map_view/cam_screen var/atom/movable/screen/background/cam_background - /// All turfs within range of the currently active camera - var/list/range_turfs = list() - var/colony_camera_mapload = TRUE var/admin_console = FALSE + /// All the plane masters that need to be applied. + var/list/cam_plane_masters + /obj/structure/machinery/computer/cameras/Initialize(mapload) . = ..() // Map name has to start and end with an A-Z character, @@ -33,6 +33,16 @@ if(colony_camera_mapload && mapload && is_ground_level(z)) network = list(CAMERA_NET_COLONY) + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness) + var/atom/movable/screen/plane_master/instance = new plane() + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + if(instance.blend_mode_override) + instance.blend_mode = instance.blend_mode_override + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance + // Initialize map objects cam_screen = new cam_screen.icon = null @@ -51,7 +61,6 @@ qdel(cam_screen) QDEL_NULL(cam_background) qdel(cam_background) - range_turfs = null last_camera_turf = null concurrent_users = null return ..() @@ -74,6 +83,10 @@ if(inoperable()) return UI_DISABLED +//Closes UI if you move away from console. +/obj/structure/machinery/computer/cameras/ui_state(mob/user) + return GLOB.not_incapacitated_and_adjacent_strict_state + /obj/structure/machinery/computer/cameras/tgui_interact(mob/user, datum/tgui/ui) // Update UI ui = SStgui.try_update_ui(user, src, ui) @@ -94,6 +107,8 @@ // Register map objects user.client.register_map_obj(cam_screen) user.client.register_map_obj(cam_background) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) // Open UI ui = new(user, src, "CameraConsole", name) ui.open() @@ -176,13 +191,8 @@ var/list/visible_things = current.isXRay() ? range(current.view_range, cam_location) : view(current.view_range, cam_location) var/list/visible_turfs = list() - range_turfs.Cut() - var/area/A for(var/turf/visible_turf in visible_things) - range_turfs += visible_turf - A = visible_turf.loc - if(!A.lighting_use_dynamic || visible_turf.lighting_lumcount >= 1) - visible_turfs += visible_turf + visible_turfs += visible_turf var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 @@ -192,18 +202,6 @@ cam_background.icon_state = "clear" cam_background.fill_rect(1, 1, size_x, size_y) - START_PROCESSING(SSfastobj, src) // fastobj to somewhat keep pace with lighting updates - -/obj/structure/machinery/computer/cameras/process() - if(current) - var/list/visible_turfs = list() - var/area/A - for(var/turf/visible_turf as anything in range_turfs) - A = visible_turf.loc - if(!A.lighting_use_dynamic || visible_turf.lighting_lumcount >= 1) - visible_turfs += visible_turf - cam_screen.vis_contents = visible_turfs - /obj/structure/machinery/computer/cameras/ui_close(mob/user) var/user_ref = WEAKREF(user) var/is_living = isliving(user) @@ -215,10 +213,8 @@ if(length(concurrent_users) == 0 && is_living) current = null last_camera_turf = null - range_turfs = list() if(use_power) update_use_power(USE_POWER_IDLE) - STOP_PROCESSING(SSfastobj, src) user.unset_interaction() /obj/structure/machinery/computer/cameras/proc/show_camera_static() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index edc39faf3ddc..f7ea31fba36a 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -200,7 +200,7 @@ for(var/client/C in GLOB.admins) if((R_ADMIN|R_MOD) & C.admin_holder.rights) C << 'sound/effects/sos-morse-code.ogg' - message_admins("[key_name(usr)] has requested a Distress Beacon! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + SSticker.mode.request_ert(usr) to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) cooldown_request = world.time diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 8fa0b9b86a0c..adce72f7d8b6 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -56,7 +56,7 @@ else return -/obj/structure/machinery/computer/bullet_act(obj/item/projectile/Proj) +/obj/structure/machinery/computer/bullet_act(obj/projectile/Proj) if(exproof) visible_message("[Proj] ricochets off [src]!") return 0 diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ed7335ea8778..eb9aed4f71e4 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -185,7 +185,6 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li flags_atom |= USES_HEARING /obj/structure/machinery/cryopod/Destroy() - SetLuminosity(0) QDEL_NULL(occupant) QDEL_NULL(announce) . = ..() @@ -368,7 +367,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li qdel(G) icon_state = "body_scanner_open" - SetLuminosity(0) + set_light(0) if(occupant.key) occupant.ghostize(0) @@ -509,7 +508,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li mob.forceMove(src) occupant = mob icon_state = "body_scanner_closed" - SetLuminosity(2) + set_light(2) time_entered = world.time start_processing() @@ -532,7 +531,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li occupant = null stop_processing() icon_state = "body_scanner_open" - SetLuminosity(0) + set_light(0) playsound(src, 'sound/machines/pod_open.ogg', 30) #ifdef OBJECTS_PROXY_SPEECH diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e3e5fd3bee87..dc28cdca6f5c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -162,7 +162,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( else return FALSE -/obj/structure/machinery/door/airlock/bullet_act(obj/item/projectile/P) +/obj/structure/machinery/door/airlock/bullet_act(obj/projectile/P) bullet_ping(P) if(P.damage) if(P.ammo.flags_ammo_behavior & AMMO_ROCKET) diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index b6b9a6133a84..78fc05d8e0d0 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -33,8 +33,6 @@ var/alert = signal.data["alert"] var/area/our_area = get_area(src) - if (our_area.master) - our_area = our_area.master if(alarm_area == our_area.name) switch(alert) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b54658b24245..578ef368f5d9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -49,7 +49,7 @@ /obj/structure/machinery/door/Destroy() . = ..() if(filler && width > 1) - filler.SetOpacity(0)// Ehh... let's hope there are no walls there. Must fix this + filler.set_opacity(0)// Ehh... let's hope there are no walls there. Must fix this filler = null density = FALSE @@ -64,12 +64,12 @@ bound_width = width * world.icon_size bound_height = world.icon_size filler = get_step(src,EAST) - filler.SetOpacity(opacity) + filler.set_opacity(opacity) else bound_width = world.icon_size bound_height = width * world.icon_size filler = get_step(src,NORTH) - filler.SetOpacity(opacity) + filler.set_opacity(opacity) //process() //return @@ -222,9 +222,9 @@ operating = TRUE do_animate("opening") icon_state = "door0" - SetOpacity(FALSE) + set_opacity(FALSE) if(filler) - filler.SetOpacity(opacity) + filler.set_opacity(opacity) addtimer(CALLBACK(src, PROC_REF(finish_open)), openspeed) return TRUE @@ -255,9 +255,9 @@ /obj/structure/machinery/door/proc/finish_close() update_icon() if(visible && !glass) - SetOpacity(TRUE) + set_opacity(TRUE) if(filler) - filler.SetOpacity(opacity) + filler.set_opacity(opacity) operating = FALSE /obj/structure/machinery/door/proc/requiresID() @@ -279,15 +279,15 @@ if(dir in list(EAST, WEST)) bound_width = width * world.icon_size bound_height = world.icon_size - filler.SetOpacity(0) + filler.set_opacity(0) filler = (get_step(src,EAST)) //Find new turf - filler.SetOpacity(opacity) + filler.set_opacity(opacity) else bound_width = world.icon_size bound_height = width * world.icon_size - filler.SetOpacity(0) + filler.set_opacity(0) filler = (get_step(src,NORTH)) //Find new turf - filler.SetOpacity(opacity) + filler.set_opacity(opacity) /obj/structure/machinery/door/morgue diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 2a49b8696a9f..6123d56b8f23 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -66,6 +66,7 @@ icon = 'icons/obj/structures/doors/Door2x1research.dmi' opacity = FALSE glass = 1 + req_one_access = list(ACCESS_MARINE_RESEARCH, ACCESS_WY_RESEARCH, ACCESS_WY_EXEC) /obj/structure/machinery/door/airlock/multi_tile/research/colony req_access = null @@ -178,7 +179,7 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor/research name = "\improper Research Airlock" - req_one_access = list(ACCESS_MARINE_RESEARCH) + req_one_access = list(ACCESS_MARINE_RESEARCH, ACCESS_WY_RESEARCH, ACCESS_WY_EXEC) masterkey_resist = TRUE /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor/research/colony @@ -235,11 +236,11 @@ //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() for(var/turf/T in multi_filler) - T.SetOpacity(null) + T.set_opacity(null) multi_filler = list() for(var/turf/T in get_filler_turfs()) - T.SetOpacity(opacity) + T.set_opacity(opacity) multi_filler += list(T) /obj/structure/machinery/door/airlock/multi_tile/proc/get_filler_turfs() @@ -271,6 +272,7 @@ unacidable = TRUE no_panel = 1 not_weldable = 1 + var/queen_pryable = TRUE /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ex_act(severity) return @@ -285,6 +287,9 @@ if(xeno.hive_pos != XENO_QUEEN) return ..() + if(!queen_pryable) + return ..() + if(!locked) return ..() @@ -316,6 +321,7 @@ locked = TRUE opacity = FALSE glass = TRUE + queen_pryable = FALSE var/throw_dir = EAST /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/try_to_activate_door(mob/user) @@ -353,8 +359,8 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) . = ..() - if(istype(port, /obj/docking_port/mobile/lifeboat)) - var/obj/docking_port/mobile/lifeboat/lifeboat = port + if(istype(port, /obj/docking_port/mobile/crashable/lifeboat)) + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = port lifeboat.doors += src /// External airlock that is part of the lifeboat dock @@ -377,7 +383,8 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor/proc/vacate_premises() for(var/turf/self_turf as anything in locs) var/turf/near_turf = get_step(self_turf, throw_dir) - var/turf/projected = get_ranged_target_turf(near_turf, throw_dir, 50) + var/turf/space_turf = get_step(near_turf, throw_dir) + var/turf/projected = get_ranged_target_turf(space_turf, EAST, 50) for(var/atom/movable/atom_movable in near_turf) if(ismob(atom_movable) && !isobserver(atom_movable)) var/mob/mob = atom_movable @@ -389,7 +396,9 @@ continue else continue - INVOKE_ASYNC(atom_movable, TYPE_PROC_REF(/atom/movable, throw_atom), projected, 50, SPEED_FAST, null, TRUE) + atom_movable.forceMove(space_turf) + INVOKE_ASYNC(atom_movable, TYPE_PROC_REF(/atom/movable, throw_atom), projected, 50, SPEED_FAST, null, TRUE, HIGH_LAUNCH) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), atom_movable), 3 SECONDS) /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor/proc/bolt_explosion() var/turf/turf = get_step(src, throw_dir|dir) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index da6137e5e8cb..b2d836ee476f 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -16,9 +16,9 @@ /obj/structure/machinery/door/poddoor/Initialize() . = ..() if(density) - SetOpacity(1) + set_opacity(1) else - SetOpacity(0) + set_opacity(0) update_icon() /obj/structure/machinery/door/poddoor/update_icon() @@ -42,7 +42,7 @@ operating = 1 flick("[base_icon_state]c0", src) icon_state = "[base_icon_state]0" - SetOpacity(0) + set_opacity(0) sleep(15) density = FALSE operating = 0 @@ -84,7 +84,7 @@ playsound(loc, 'sound/machines/blastdoor.ogg', 20, 0) flick("[base_icon_state]c0", src) icon_state = "[base_icon_state]0" - SetOpacity(0) + set_opacity(0) addtimer(CALLBACK(src, PROC_REF(finish_open)), openspeed) return TRUE @@ -102,7 +102,7 @@ flick("[base_icon_state]c1", src) icon_state = "[base_icon_state]1" density = TRUE - SetOpacity(initial(opacity)) + set_opacity(initial(opacity)) addtimer(CALLBACK(src, PROC_REF(finish_close)), openspeed) return @@ -123,13 +123,13 @@ /obj/structure/machinery/door/poddoor/two_tile/proc/start_opening() flick("[base_icon_state]c0", src) icon_state = "[base_icon_state]0" - SetOpacity(0) - f1.SetOpacity(0) - f2.SetOpacity(0) + set_opacity(0) + f1.set_opacity(0) + f2.set_opacity(0) /obj/structure/machinery/door/poddoor/two_tile/four_tile/start_opening() - f3.SetOpacity(0) - f4.SetOpacity(0) + f3.set_opacity(0) + f4.set_opacity(0) ..() /obj/structure/machinery/door/poddoor/two_tile/proc/open_fully() @@ -169,14 +169,14 @@ ..() /obj/structure/machinery/door/poddoor/two_tile/proc/close_fully() - SetOpacity(initial(opacity)) - f1.SetOpacity(initial(opacity)) - f2.SetOpacity(initial(opacity)) + set_opacity(initial(opacity)) + f1.set_opacity(initial(opacity)) + f2.set_opacity(initial(opacity)) operating = 0 /obj/structure/machinery/door/poddoor/two_tile/four_tile/close_fully() - f3.SetOpacity(initial(opacity)) - f4.SetOpacity(initial(opacity)) + f3.set_opacity(initial(opacity)) + f4.set_opacity(initial(opacity)) ..() /obj/structure/machinery/door/poddoor/two_tile @@ -194,8 +194,8 @@ f2 = new/obj/structure/machinery/door/poddoor/filler_object (get_step(src,dir)) f1.density = density f2.density = density - f1.SetOpacity(opacity) - f2.SetOpacity(opacity) + f1.set_opacity(opacity) + f2.set_opacity(opacity) /obj/structure/machinery/door/poddoor/two_tile/Destroy() QDEL_NULL(f1) @@ -223,8 +223,8 @@ f4 = new/obj/structure/machinery/door/poddoor/filler_object (get_step(f3,dir)) f3.density = density f4.density = density - f3.SetOpacity(opacity) - f4.SetOpacity(opacity) + f3.set_opacity(opacity) + f4.set_opacity(opacity) /obj/structure/machinery/door/poddoor/two_tile/four_tile/Destroy() QDEL_NULL(f3) diff --git a/code/game/machinery/doors/railing.dm b/code/game/machinery/doors/railing.dm index 8449d5d52256..c86adb2e970b 100644 --- a/code/game/machinery/doors/railing.dm +++ b/code/game/machinery/doors/railing.dm @@ -22,7 +22,7 @@ if(density)//Allows preset-open to work layer = closed_layer - SetOpacity(initial(opacity)) + set_opacity(initial(opacity)) /obj/structure/machinery/door/poddoor/railing/update_icon() if(density) diff --git a/code/game/machinery/doors/runed_sandstone.dm b/code/game/machinery/doors/runed_sandstone.dm index d67398baa305..4bf66dfdc8d8 100644 --- a/code/game/machinery/doors/runed_sandstone.dm +++ b/code/game/machinery/doors/runed_sandstone.dm @@ -100,7 +100,7 @@ operating = TRUE do_animate("opening") icon_state = "door0" - SetOpacity(FALSE) + set_opacity(0) addtimer(CALLBACK(src, PROC_REF(finish_open)), openspeed) return @@ -109,9 +109,9 @@ layer = open_layer density = FALSE update_icon() - SetOpacity(0) + set_opacity(0) if(filler) - filler.SetOpacity(opacity) + filler.set_opacity(opacity) if(operating) operating = FALSE @@ -130,7 +130,7 @@ operating = TRUE density = TRUE - SetOpacity(TRUE) + set_opacity(1) layer = closed_layer do_animate("closing") diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 39ecbd806e64..da904f255c40 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -26,7 +26,7 @@ icon_state = "[base_icon_state]0" sleep(15) density = FALSE - SetOpacity(0) + set_opacity(0) operating = 0 return return @@ -46,7 +46,7 @@ /obj/structure/machinery/door/poddoor/shutters/finish_open() density = FALSE layer = open_layer - SetOpacity(0) + set_opacity(0) if(operating) //emag again operating = FALSE @@ -63,7 +63,7 @@ layer = closed_layer density = TRUE if(visible) - SetOpacity(1) + set_opacity(1) playsound(loc, 'sound/machines/blastdoor.ogg', 25) addtimer(CALLBACK(src, PROC_REF(finish_close)), openspeed) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index e9006a9f2fb4..2b57fbd0a44d 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -123,7 +123,7 @@ qdel(src) return -/obj/structure/machinery/door/window/bullet_act(obj/item/projectile/Proj) +/obj/structure/machinery/door/window/bullet_act(obj/projectile/Proj) bullet_ping(Proj) if(Proj.ammo.damage) take_damage(round(Proj.ammo.damage / 2)) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 556eab541363..75d0de56dec0 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -26,10 +26,10 @@ ..() if ( !(stat & NOPOWER) ) icon_state = "[base_state]1" -// src.sd_SetLuminosity(2) +// src.sd_set_light(2) else icon_state = "[base_state]1-p" -// src.sd_SetLuminosity(0) +// src.sd_set_light(0) //Don't want to render prison breaks impossible /obj/structure/machinery/flasher/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 8eec83ed7b70..5f6cd02a4bf8 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -6,38 +6,40 @@ icon_state = "flood00" density = TRUE anchored = TRUE - var/on = 0 var/obj/item/cell/cell = null var/use = 0 var/unlocked = 0 var/open = 0 - var/brightness_on = 7 //can't remember what the maxed out value is + light_power = 2 unslashable = TRUE unacidable = TRUE + var/on_light_range = 6 + /obj/structure/machinery/floodlight/Initialize(mapload, ...) . = ..() cell = new /obj/item/cell(src) + if(light_on) + set_light(on_light_range) /obj/structure/machinery/floodlight/Destroy() QDEL_NULL(cell) - SetLuminosity(0) return ..() +/obj/structure/machinery/floodlight/turn_light(mob/user, toggle_on) + . = ..() + if(. == NO_LIGHT_STATE_CHANGE) + return + + if(toggle_on) + set_light(on_light_range) + else + set_light(0) + + /obj/structure/machinery/floodlight/proc/updateicon() - icon_state = "flood[open ? "o" : ""][open && cell ? "b" : ""]0[on]" -/* -/obj/structure/machinery/floodlight/process() - if(on && cell) - if(cell.charge >= use) - cell.use(use) - else - on = 0 - updateicon() - SetLuminosity(0) - src.visible_message(SPAN_WARNING("[src] shuts down due to lack of power!")) - return -*/ + icon_state = "flood[open ? "o" : ""][open && cell ? "b" : ""]0[light_on]" + /obj/structure/machinery/floodlight/attack_hand(mob/user as mob) if(open && cell) if(ishuman(user)) @@ -55,10 +57,9 @@ updateicon() return - if(on) - on = 0 - to_chat(user, SPAN_NOTICE(" You turn off the light.")) - SetLuminosity(0) + if(light_on) + to_chat(user, SPAN_NOTICE("You turn off the light.")) + turn_light(user, toggle_on = FALSE) unslashable = TRUE unacidable = TRUE else @@ -66,9 +67,8 @@ return if(cell.charge <= 0) return - on = 1 - to_chat(user, SPAN_NOTICE(" You turn on the light.")) - SetLuminosity(brightness_on) + to_chat(user, SPAN_NOTICE("You turn on the light.")) + turn_light(user, toggle_on = TRUE) unacidable = FALSE updateicon() @@ -121,9 +121,8 @@ name = "Landing Light" desc = "A powerful light stationed near landing zones to provide better visibility." icon_state = "flood01" - on = 1 + light_on = TRUE in_use = 1 - luminosity = 6 use_power = USE_POWER_NONE /obj/structure/machinery/floodlight/landing/attack_hand() diff --git a/code/game/machinery/groundmap_geothermal.dm b/code/game/machinery/groundmap_geothermal.dm index 4be9c53f0094..808c717e8891 100644 --- a/code/game/machinery/groundmap_geothermal.dm +++ b/code/game/machinery/groundmap_geothermal.dm @@ -269,9 +269,9 @@ F.is_lit = !F.is_lit if(!F.damaged) if(F.is_lit) //Shut it down - F.SetLuminosity(F.lum_value) + F.set_light(F.lum_value) else - F.SetLuminosity(0) + F.set_light(0) F.update_icon() return 0 @@ -315,7 +315,6 @@ health = 150 /obj/structure/machinery/colony_floodlight/Destroy() - SetLuminosity(0) if(fswitch) fswitch.floodlist -= src fswitch = null @@ -362,7 +361,7 @@ user.visible_message(SPAN_NOTICE("[user] screws [src]'s maintenance hatch closed."), \ SPAN_NOTICE("You screw [src]'s maintenance hatch closed.")) if(is_lit) - SetLuminosity(lum_value) + set_light(lum_value) update_icon() return TRUE diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 1acb47370d96..2f8f113ddd23 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -142,8 +142,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. hologram.anchored = TRUE//So space wind cannot drag it. hologram.name = "[A.name] (Hologram)"//If someone decides to right click. - hologram.SetLuminosity(2) //hologram lighting - SetLuminosity(2) //pad lighting + hologram.set_light(2) //hologram lighting + set_light(2) //pad lighting icon_state = "holopad1" A.holo = src master = A//AI is the master. @@ -151,14 +151,14 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ return 1 /obj/structure/machinery/hologram/holopad/clear_holo() -// hologram.SetLuminosity(0)//Clear lighting. //handled by the lighting controller when its ower is deleted +// hologram.set_light(0)//Clear lighting. //handled by the lighting controller when its ower is deleted if(hologram) qdel(hologram)//Get rid of hologram. hologram = null if(master.holo == src) master.holo = null master = null//Null the master, since no-one is using it now. - SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) + set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) icon_state = "holopad0" use_power = USE_POWER_IDLE//Passive power usage. return 1 @@ -175,7 +175,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ var/area/holo_area = get_area(src) var/area/eye_area = get_area(master.eyeobj) - if(eye_area in holo_area.master.related) + if(eye_area == holo_area) return 1 clear_holo()//If not, we want to get rid of the hologram. diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 5564ed0220a7..33f75c50e341 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -60,10 +60,10 @@ if ( !(stat & NOPOWER) && disable == 0 ) icon_state = "[base_state]" -// src.sd_SetLuminosity(2) +// src.sd_set_light(2) else icon_state = "[base_state]-p" -// src.sd_SetLuminosity(0) +// src.sd_set_light(0) /obj/structure/machinery/sparker/attackby(obj/item/W as obj, mob/user as mob) if (HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index ecf63a2a7902..f52350aa8db3 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -520,7 +520,7 @@ return 0 /obj/structure/machinery/smartfridge/chemistry/antag - req_one_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) /obj/structure/machinery/smartfridge/chemistry/virology name = "\improper Smart Virus Storage" diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index ae57f27f2162..66eb0386713f 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -10,7 +10,6 @@ var/on = 1 var/area/area = null var/otherarea = null - // luminosity = 1 /obj/structure/machinery/light_switch/Initialize() . = ..() @@ -43,15 +42,14 @@ /obj/structure/machinery/light_switch/attack_hand(mob/user) on = !on - for(var/area/A in area.master.related) - A.lightswitch = on - A.updateicon() + area.lightswitch = on + area.updateicon() - for(var/obj/structure/machinery/light_switch/L in A) - L.on = on - L.updateicon() + for(var/obj/structure/machinery/light_switch/L in area) + L.on = on + L.updateicon() - area.master.power_change() + area.power_change() /obj/structure/machinery/light_switch/power_change() diff --git a/code/game/machinery/mining.dm b/code/game/machinery/mining.dm index 4f663c5fbca7..0662817174fc 100644 --- a/code/game/machinery/mining.dm +++ b/code/game/machinery/mining.dm @@ -26,4 +26,4 @@ icon_state = "furnace" density = TRUE anchored = TRUE - luminosity = 3 + light_range = 3 diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index ad8f5a189267..89c9e9277f4c 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -93,7 +93,6 @@ var/list/obj/structure/machinery/newscaster/allCasters = list() //Global list th var/c_locked=0; //Will our new channel be locked to public submissions? var/hitstaken = 0 //Death at 3 hits from an item with force>=15 var/datum/feed_channel/viewing_channel = null - luminosity = 0 anchored = TRUE @@ -111,7 +110,6 @@ var/list/obj/structure/machinery/newscaster/allCasters = list() //Global list th /obj/structure/machinery/newscaster/security_unit/Destroy() allCasters -= src - SetLuminosity(0) return ..() /obj/structure/machinery/newscaster/update_icon() diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 47d4bb20849b..b327bd6fdf26 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -76,7 +76,7 @@ if(!on) msg_admin_niche("Portable communication relay shut down for Z-Level [src.z] [ADMIN_JMP(src)]") -/obj/structure/machinery/telecomms/relay/preset/tower/bullet_act(obj/item/projectile/P) +/obj/structure/machinery/telecomms/relay/preset/tower/bullet_act(obj/projectile/P) ..() if(istype(P.ammo, /datum/ammo/xeno/boiler_gas)) update_health(50) @@ -340,6 +340,8 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) for(var/obj/effect/alien/weeds/weed in new_pylon.node.children) weed.parent = new_pylon.node + weed.spread_on_semiweedable = TRUE + weed.weed_expand() RegisterSignal(new_pylon, COMSIG_PARENT_QDELETING, PROC_REF(uncorrupt)) @@ -421,7 +423,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) id = "Receiver B" network = "tcommsat" autolinkers = list("receiverB") // link to relay - freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ, MED_FREQ, REQ_FREQ, SENTRY_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ) + freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ, MED_FREQ, REQ_FREQ, SENTRY_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) //Common and other radio frequencies for people to freely use /obj/structure/machinery/telecomms/receiver/preset/Initialize(mapload, ...) @@ -433,7 +435,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) id = "CentComm Receiver" network = "tcommsat" autolinkers = list("receiverCent") - freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, SOF_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) //Buses @@ -453,7 +455,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/bus/preset_three id = "Bus 3" network = "tcommsat" - freq_listening = list(SEC_FREQ, COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, SOF_FREQ) + freq_listening = list(SEC_FREQ, COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) autolinkers = list("processor3", "security", "command", "JTAC") /obj/structure/machinery/telecomms/bus/preset_four @@ -469,7 +471,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/bus/preset_cent id = "CentComm Bus" network = "tcommsat" - freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, SOF_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) autolinkers = list("processorCent", "centcomm") //Processors @@ -534,7 +536,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/server/presets/command id = "Command Server" - freq_listening = list(COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, SOF_FREQ) + freq_listening = list(COMM_FREQ, WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) autolinkers = list("command") /obj/structure/machinery/telecomms/server/presets/engineering @@ -549,7 +551,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) /obj/structure/machinery/telecomms/server/presets/centcomm id = "CentComm Server" - freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, SOF_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ) autolinkers = list("centcomm") diff --git a/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm b/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm index df047d6cf5fb..85210e1aaa3f 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm @@ -5,7 +5,8 @@ name = "\improper Suspicious Automated Equipment Rack" desc = "While similar in function to ColMarTech automated racks, this one is clearly not of USCM origin. Contains various equipment." icon_state = "antag_clothing" - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null listed_products = list() diff --git a/code/game/machinery/vending/vendor_types/antag/antag_gear.dm b/code/game/machinery/vending/vendor_types/antag/antag_gear.dm index c2b27dc91ef1..3e847b4919de 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_gear.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_gear.dm @@ -5,7 +5,8 @@ desc = "While similar in function to ColMarTech automated racks, this one is clearly not of USCM origin. Contains various gear." icon_state = "gear" - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null listed_products = list() /obj/structure/machinery/cm_vending/gear/antag/Initialize() @@ -49,9 +50,9 @@ /obj/effect/essentials_set/upp_heavy spawned_gear_list = list( - /obj/item/weapon/gun/minigun/upp, - /obj/item/ammo_magazine/minigun, - /obj/item/ammo_magazine/minigun, + /obj/item/weapon/gun/pkp, + /obj/item/ammo_magazine/pkp, + /obj/item/ammo_magazine/pkp, ) /obj/effect/essentials_set/leader/upp diff --git a/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm b/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm index a2cd462cd6a2..73a2c7346a4c 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm @@ -4,7 +4,8 @@ name = "\improper Suspicious Automated Guns Rack" desc = "While similar in function to ColMarTech automated racks, this one is clearly not of USCM origin. Contains various weapons, ammunition and explosives." icon_state = "antag_guns" - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null use_snowflake_points = TRUE diff --git a/code/game/machinery/vending/vendor_types/antag/antag_guns_sorted.dm b/code/game/machinery/vending/vendor_types/antag/antag_guns_sorted.dm index 6267db911b09..ab319f1eca1d 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_guns_sorted.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_guns_sorted.dm @@ -4,7 +4,8 @@ name = "\improper Suspicious Automated Guns Rack" desc = "While similar in function to ColMarTech automated racks, this one is clearly not of USCM origin. Contains various weapons." icon_state = "antag_guns" - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null listed_products = list() /obj/structure/machinery/cm_vending/sorted/cargo_guns/antag_guns/Initialize() diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index 0496530be861..8ddd8df4c3a2 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -232,6 +232,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( list("MP Cap", 12, /obj/item/clothing/head/beret/marine/mp/mpcap, null, VENDOR_ITEM_REGULAR), list("RO Cap", 12, /obj/item/clothing/head/cmcap/req, null, VENDOR_ITEM_REGULAR), list("Officer Cap", 12, /obj/item/clothing/head/cmcap/ro, null, VENDOR_ITEM_REGULAR), + list("Marine Helmet", 12, /obj/item/clothing/head/helmet/marine, null, VENDOR_ITEM_REGULAR), + list("Grey Marine Helmet", 12, /obj/item/clothing/head/helmet/marine/grey, null, VENDOR_ITEM_REGULAR), + list("Technician Helmet", 12, /obj/item/clothing/head/helmet/marine/tech, null, VENDOR_ITEM_REGULAR), + list("Corpsman Helmet", 12, /obj/item/clothing/head/helmet/marine/medic, null, VENDOR_ITEM_REGULAR), + list("Attachable Helmet Shield", 12, /obj/item/prop/helmetgarb/riot_shield, null, VENDOR_ITEM_REGULAR), + list("SUIT", 0, null, null, null), list("Bomber Jacket, Brown", 12, /obj/item/clothing/suit/storage/bomber, null, VENDOR_ITEM_REGULAR), @@ -303,7 +309,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( /obj/structure/machinery/cm_vending/own_points/experimental_tools/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/coin/marine/synth)) if(user.drop_inv_item_to_loc(W, src)) - available_points = 45 + available_points = 30 available_points_to_display = available_points to_chat(user, SPAN_NOTICE("You insert \the [W] into \the [src].")) return diff --git a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm index fb9b662be1bc..891a2a907b39 100644 --- a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm +++ b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm @@ -306,7 +306,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_vehicle_crew, list( list("Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Tanker Armor", 0, /obj/item/clothing/suit/storage/marine/tanker, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("M50 Tanker Helmet", 0, /obj/item/clothing/head/helmet/marine/tech/tanker, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), - list("SensorMate HUD", 0, /obj/item/clothing/glasses/hud/sensor, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY), + list("Medical Helmet Optic", 0, /obj/item/device/helmet_visor/medical, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY), list("Welding Kit", 0, /obj/item/tool/weldpack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/engineering.dm b/code/game/machinery/vending/vendor_types/engineering.dm index 2fe6962e93bb..1983365bd661 100644 --- a/code/game/machinery/vending/vendor_types/engineering.dm +++ b/code/game/machinery/vending/vendor_types/engineering.dm @@ -94,7 +94,8 @@ ) /obj/structure/machinery/cm_vending/sorted/tech/tool_storage/antag - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage name = "\improper Electronics Vendor" @@ -117,7 +118,8 @@ ) /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage/antag - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null /obj/structure/machinery/cm_vending/sorted/tech/comp_storage name = "\improper Component Storage Machine" @@ -146,7 +148,8 @@ ) /obj/structure/machinery/cm_vending/sorted/tech/comp_storage/antag - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null //------COLONY-SPECIFIC VENDORS------- diff --git a/code/game/machinery/vending/vendor_types/intelligence_officer.dm b/code/game/machinery/vending/vendor_types/intelligence_officer.dm index a2afe897b495..ab38fcb1dfeb 100644 --- a/code/game/machinery/vending/vendor_types/intelligence_officer.dm +++ b/code/game/machinery/vending/vendor_types/intelligence_officer.dm @@ -14,8 +14,9 @@ GLOBAL_LIST_INIT(cm_vending_gear_intelligence_officer, list( list("Fulton Recovery Device", 10, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), + list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Welding Goggles", 5, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR), - list("Sensor Medical HUD", 5, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_REGULAR), list("POUCHES", 0, null, null, null), list("Large Magazine Pouch", 10, /obj/item/storage/pouch/magazine/large, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm index 70ac7701973b..7073dc383dcd 100644 --- a/code/game/machinery/vending/vendor_types/medical.dm +++ b/code/game/machinery/vending/vendor_types/medical.dm @@ -26,7 +26,6 @@ /obj/item/reagent_container/hypospray/autoinjector/oxycodone, /obj/item/reagent_container/hypospray/autoinjector/tramadol, /obj/item/reagent_container/hypospray/autoinjector/tricord, - /obj/item/reagent_container/hypospray/autoinjector/emergency, /obj/item/reagent_container/hypospray/autoinjector/skillless, /obj/item/reagent_container/hypospray/autoinjector/skillless/tramadol, @@ -227,7 +226,8 @@ /obj/structure/machinery/cm_vending/sorted/medical/antag name = "\improper Medical Equipment Vendor" desc = "A vending machine dispensing various pieces of medical equipment." - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null vendor_theme = VENDOR_THEME_CLF /obj/structure/machinery/cm_vending/sorted/medical/marinemed @@ -267,7 +267,8 @@ /obj/structure/machinery/cm_vending/sorted/medical/marinemed/antag name = "\improper Basic Medical Supplies Vendor" desc = "A vending machine dispensing basic medical supplies." - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null vendor_theme = VENDOR_THEME_CLF /obj/structure/machinery/cm_vending/sorted/medical/blood @@ -298,7 +299,8 @@ return /obj/structure/machinery/cm_vending/sorted/medical/blood/antag - req_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) + req_access = null vendor_theme = VENDOR_THEME_CLF /obj/structure/machinery/cm_vending/sorted/medical/wall_med 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 faff01f7f299..d43e53db4f0d 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 @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( list("M56D Heavy Machine Gun", 24, /obj/item/storage/box/guncase/m56d, null, VENDOR_ITEM_REGULAR), list("UTILITIES", 0, null, null, null), - list("SensorMate Medical HUD", 12, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_REGULAR), + list("Medical Helmet Optic", 12, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("M3 B12 Pattern Armor", 24, /obj/item/clothing/suit/storage/marine/leader, null, VENDOR_ITEM_REGULAR), 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 9757576e6d0b..935469b13b47 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 @@ -67,7 +67,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR), list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR), - list("SensorMate Medical HUD", 4, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_RECOMMENDED), + list("Medical Helmet Optic", 4, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_RECOMMENDED), list("Roller Bed", 2, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("SPECIAL AMMUNITION", 0, null, null, null), 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 7c9682985298..65169a7591ae 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 @@ -29,7 +29,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list( list("Autoinjector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR), list("Autoinjector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR), list("Autoinjector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR), - list("Autoinjector (Emergency)", 2, /obj/item/reagent_container/hypospray/autoinjector/emergency, null, VENDOR_ITEM_REGULAR), list("PILL BOTTLES", 0, null, null, null), list("Pill Bottle (Bicaridine)", 5, /obj/item/storage/pill_bottle/bicaridine, null, VENDOR_ITEM_RECOMMENDED), @@ -42,7 +41,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list( list("MEDICAL UTILITIES", 0, null, null, null), list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR), - list("Medical HUD Glasses", 4, /obj/item/clothing/glasses/hud/health, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Stasis Bag", 6, /obj/item/bodybag/cryobag, null, VENDOR_ITEM_REGULAR), list("Pressurized Reagent Canister Pouch (EMPTY)", 3, /obj/item/storage/pouch/pressurized_reagent_canister, null, VENDOR_ITEM_REGULAR), @@ -110,7 +108,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( 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("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, 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("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index d2e50aee9042..c02748fea509 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -79,10 +79,10 @@ list("WEBBINGS", -1, null, null), list("Brown Webbing Vest", round(scale * 1.25), /obj/item/clothing/accessory/storage/black_vest/brown_vest, VENDOR_ITEM_REGULAR), - list("Black Webbing Vest", round(scale * 0.5), /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR), + list("Black Webbing Vest", round(max(1,(scale * 0.5))), /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR), list("Webbing", round(scale * 2), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR), - list("Drop Pouch", round(scale * 0.5), /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR), - list("Shoulder Holster", round(scale * 0.5), /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR), + list("Drop Pouch", round(max(1,(scale * 0.5))), /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", round(max(1,(scale * 0.5))), /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR), list("ARMOR", -1, null, null), list("M3 Pattern Carrier Marine Armor", round(scale * 15), /obj/item/clothing/suit/storage/marine/carrier, VENDOR_ITEM_REGULAR), @@ -107,7 +107,7 @@ list("RESTRICTED BACKPACKS", -1, null, null), list("USCM Technician Welderpack", round(scale * 1.25), /obj/item/storage/backpack/marine/engineerpack, VENDOR_ITEM_REGULAR), list("Technician Welder-Satchel", round(scale * 2), /obj/item/storage/backpack/marine/engineerpack/satchel, VENDOR_ITEM_REGULAR), - list("Radio Telephone Backpack", round(scale * 0.5), /obj/item/storage/backpack/marine/satchel/rto, VENDOR_ITEM_REGULAR), + list("Radio Telephone Backpack", round(max(1,(scale * 0.5))), /obj/item/storage/backpack/marine/satchel/rto, VENDOR_ITEM_REGULAR), list("BELTS", -1, null, null), list("M276 Pattern Ammo Load Rig", round(scale * 15), /obj/item/storage/belt/marine, VENDOR_ITEM_REGULAR), @@ -155,6 +155,8 @@ list("M10 Helmet Rain Cover", round(scale * 10), /obj/item/prop/helmetgarb/raincover, VENDOR_ITEM_REGULAR), list("Firearm Lubricant", round(scale * 15), /obj/item/prop/helmetgarb/gunoil, VENDOR_ITEM_REGULAR), list("USCM Flair", round(scale * 15), /obj/item/prop/helmetgarb/flair_uscm, VENDOR_ITEM_REGULAR), + list("Falling Falcons Shoulder Patch", round(scale * 15), /obj/item/clothing/accessory/patch/falcon, VENDOR_ITEM_REGULAR), + list("USCM Shoulder Patch", round(scale * 15), /obj/item/clothing/accessory/patch, VENDOR_ITEM_REGULAR), ) //--------------SQUAD SPECIFIC VERSIONS-------------- @@ -272,11 +274,11 @@ list("Wirecutters", round(scale * 5), /obj/item/tool/wirecutters, VENDOR_ITEM_REGULAR), list("Crowbar", round(scale * 5), /obj/item/tool/crowbar, VENDOR_ITEM_REGULAR), list("Wrench", round(scale * 5), /obj/item/tool/wrench, VENDOR_ITEM_REGULAR), - list("ME3 hand welder", round(scale * 2), /obj/item/tool/weldingtool/simple, VENDOR_ITEM_REGULAR), + list("Multitool", round(scale * 1), /obj/item/device/multitool, VENDOR_ITEM_REGULAR), + list("ME3 hand welder", round(scale * 1), /obj/item/tool/weldingtool/simple, VENDOR_ITEM_REGULAR), list("FLARE AND LIGHT", -1, null, null), list("Combat Flashlight", round(scale * 5), /obj/item/device/flashlight/combat, VENDOR_ITEM_REGULAR), - list("Flashlight", round(scale * 5), /obj/item/device/flashlight/combat, VENDOR_ITEM_REGULAR), list("Box of Flashlight", round(scale * 1), /obj/item/ammo_box/magazine/misc/flashlight, VENDOR_ITEM_REGULAR), list("Box of Flares", round(scale * 1), /obj/item/ammo_box/magazine/misc/flares, VENDOR_ITEM_REGULAR), list("M94 Marking Flare Pack", round(scale * 10), /obj/item/storage/box/m94, VENDOR_ITEM_REGULAR), @@ -286,6 +288,8 @@ list("Toolkit", round(scale * 1), /obj/item/storage/firstaid/toolkit/empty, VENDOR_ITEM_REGULAR), list("Map", round(scale * 5), /obj/item/map/current_map, VENDOR_ITEM_REGULAR), list("Extinguisher", round(scale * 5), /obj/item/tool/extinguisher, VENDOR_ITEM_REGULAR), + list("Fire Extinguisher (Portable)", round(scale * 1), /obj/item/tool/extinguisher/mini, VENDOR_ITEM_REGULAR), + list("Roller Bed", round(scale * 1), /obj/item/roller, VENDOR_ITEM_REGULAR), list("Machete Scabbard (Full)", round(scale * 5), /obj/item/storage/large_holster/machete/full, VENDOR_ITEM_REGULAR), list("Binoculars", round(scale * 1), /obj/item/device/binoculars, VENDOR_ITEM_REGULAR), list("MB-6 Folding Barricades (x3)", round(scale * 2), /obj/item/stack/folding_barricade/three, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm index d92eaabf52c1..09881536901e 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm @@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Brown Webbing Vest", 15, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_REGULAR), list("Black Webbing Vest", 15, /obj/item/clothing/accessory/storage/black_vest, null, VENDOR_ITEM_REGULAR), list("Drop Pouch", 15, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR), - list("SensorMate Medical HUD", 15, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_REGULAR), + list("Medical Helmet Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("B12 Pattern Marine Armor", 30, /obj/item/clothing/suit/storage/marine/leader, null, VENDOR_ITEM_REGULAR), 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 5560508ca4c1..d3a606ae6b41 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 @@ -34,6 +34,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_smartgun, list( list("Powerloader Certification", 45, /obj/item/pamphlet/skill/powerloader, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), + list("Medical Helmet Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("RADIO KEYS", 0, null, null, null), list("Engineering Radio Encryption Key", 5, /obj/item/device/encryptionkey/engi, null, VENDOR_ITEM_REGULAR), 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 e0900c3fd3c8..b09ae4aa15c5 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 @@ -38,7 +38,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list( list("UTILITIES", 0, null, null, null), list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), - list("SensorMate Medical HUD", 15, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_REGULAR), + list("Medical Helmet Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Fuel Tank Strap Pouch", 5, /obj/item/storage/pouch/flamertank, null, VENDOR_ITEM_REGULAR), 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 ceef80ab6952..4f64ca7e81fa 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 @@ -35,7 +35,9 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), list("Breaching Charge", 10, /obj/item/explosive/plastic/breaching_charge, null, VENDOR_ITEM_REGULAR), - list("SensorMate Medical HUD", 15, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_REGULAR), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), + list("Medical Helmet Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), + list("Welding Goggles", 5, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR), list("M2 Night Vision Goggles", 30, /obj/item/prop/helmetgarb/helmet_nvg, null, VENDOR_ITEM_RECOMMENDED), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), @@ -44,7 +46,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("Machete Pouch (Full)", 15, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR), list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), - list("Welding Goggles", 5, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR), list("Powerloader Certification", 45, /obj/item/pamphlet/skill/powerloader, null, VENDOR_ITEM_REGULAR), list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/supplies.dm b/code/game/machinery/vending/vendor_types/supplies.dm index 2a2f35de8c19..376edf7ffc5d 100644 --- a/code/game/machinery/vending/vendor_types/supplies.dm +++ b/code/game/machinery/vending/vendor_types/supplies.dm @@ -23,8 +23,6 @@ list("FOOD AND BEVERAGE", -1, null, null), list("MRE", 25, /obj/item/storage/box/MRE, VENDOR_ITEM_REGULAR), list("Water Bottle", 25, /obj/item/reagent_container/food/drinks/cans/waterbottle, VENDOR_ITEM_REGULAR), - list("Aspen Beer", 10, /obj/item/storage/beer_pack, VENDOR_ITEM_REGULAR),//NOTE TO SELF, LOCK THIS ALCOHOL BEHIND SHIP ESCAPE - list("Wey-Yu Sake", 5, /obj/item/reagent_container/food/drinks/bottle/sake, VENDOR_ITEM_REGULAR), list("UTILITY", -1, null, null), list("M94 Marking Flare Pack", 5, /obj/item/storage/box/m94, VENDOR_ITEM_REGULAR), diff --git a/code/game/objects/effects/acid_hole.dm b/code/game/objects/effects/acid_hole.dm index 549ab45953d2..415df0e7e5a7 100644 --- a/code/game/objects/effects/acid_hole.dm +++ b/code/game/objects/effects/acid_hole.dm @@ -165,7 +165,7 @@ F.forceMove(Target) F.setDir(pick(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) step_away(F,src,rand(1,5)) - F.SetLuminosity(0) + F.set_light(0) if(F.on && loc != user) - F.SetLuminosity(F.brightness_on) + F.set_light_on(F.on) return diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index b94ee6902321..49d758b52b19 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -332,7 +332,7 @@ if(!acids_area) return - if(SSweather.is_weather_event && locate(acids_area.master) in SSweather.weather_areas) + 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 in_weather = SSweather.weather_event_instance.fire_smothering_strength else diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 43c3500813a4..9cf2aa3d8e09 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -35,12 +35,8 @@ name = "glowing goo" acid_damage = 1 icon_state = "greenglow" - luminosity = 1 - -/obj/effect/decal/cleanable/dirt/greenglow/Destroy() - SetLuminosity(0) - return ..() - + light_range = 1 + light_color = COLOUR_GREEN /obj/effect/decal/cleanable/flour name = "flour" desc = "It's still good. Four second rule!" @@ -58,7 +54,8 @@ density = FALSE anchored = TRUE layer = TURF_LAYER - luminosity = 1 + light_range = 1 + light_color = COLOUR_GREEN icon = 'icons/effects/effects.dmi' icon_state = "greenglow" @@ -68,10 +65,6 @@ . = ..() QDEL_IN(WEAKREF(src), 2 MINUTES) -/obj/effect/decal/cleanable/greenglow/Destroy() - SetLuminosity(0) - return ..() - /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 5391ed2710a8..338f8b9a7e8e 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -79,7 +79,7 @@ deconstruct(FALSE) return -/obj/effect/decal/mecha_wreckage/bullet_act(obj/item/projectile/Proj) +/obj/effect/decal/mecha_wreckage/bullet_act(obj/projectile/Proj) return 1 /obj/effect/decal/mecha_wreckage/attack_alien(mob/living/carbon/xenomorph/M) diff --git a/code/game/objects/effects/effect_system/chemsmoke.dm b/code/game/objects/effects/effect_system/chemsmoke.dm index c2323c32c934..eeb17f7c98d0 100644 --- a/code/game/objects/effects/effect_system/chemsmoke.dm +++ b/code/game/objects/effects/effect_system/chemsmoke.dm @@ -199,10 +199,10 @@ smoke.pixel_x = -32 + rand(-8,8) smoke.pixel_y = -32 + rand(-8,8) walk_to(smoke, T) - smoke.SetOpacity(1) //switching opacity on after the smoke has spawned, and then + smoke.set_opacity(1) //switching opacity on after the smoke has spawned, and then sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner if(smoke.opacity) - smoke.SetOpacity(0) + smoke.set_opacity(0) fadeOut(smoke) qdel(smoke) diff --git a/code/game/objects/effects/effect_system/foam.dm b/code/game/objects/effects/effect_system/foam.dm index a7647dbd4489..f26736c8bfc4 100644 --- a/code/game/objects/effects/effect_system/foam.dm +++ b/code/game/objects/effects/effect_system/foam.dm @@ -188,7 +188,7 @@ /obj/structure/foamed_metal/ex_act(severity) take_damage(severity * FOAMED_METAL_EXPLOSION_DMG) -/obj/structure/foamed_metal/bullet_act(obj/item/projectile/P) +/obj/structure/foamed_metal/bullet_act(obj/projectile/P) if(P.ammo.damage_type == HALLOSS || P.ammo.damage_type == TOX || P.ammo.damage_type == CLONE || P.damage == 0) return diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index 2eb36930c542..78aa01b5dacb 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -36,7 +36,7 @@ /obj/effect/particle_effect/smoke/Destroy() . = ..() if(opacity) - SetOpacity(0) + set_opacity(0) active_smoke_effects -= src cause_data = null @@ -51,9 +51,10 @@ qdel(src) return else if(time_to_live == 1) - alpha = 180 + if(alpha > 180) + alpha = 180 amount = 0 - SetOpacity(0) + set_opacity(0) apply_smoke_effect(get_turf(src)) @@ -63,8 +64,8 @@ /obj/effect/particle_effect/smoke/Crossed(atom/movable/M) ..() - if(istype(M, /obj/item/projectile/beam)) - var/obj/item/projectile/beam/B = M + if(istype(M, /obj/projectile/beam)) + var/obj/projectile/beam/B = M B.damage = (B.damage/2) if(iscarbon(M)) affect(M) @@ -254,45 +255,79 @@ name = "CN20 nerve gas" smokeranking = SMOKE_RANK_HIGH color = "#80c7e4" + var/xeno_affecting = FALSE + opacity = FALSE + alpha = 75 + +/obj/effect/particle_effect/smoke/cn20/xeno + name = "CN20-X nerve gas" + color = "#2da9da" + xeno_affecting = TRUE /obj/effect/particle_effect/smoke/cn20/Move() . = ..() - for(var/mob/living/carbon/human/creature in get_turf(src)) - affect(creature) - -/obj/effect/particle_effect/smoke/cn20/affect(mob/living/carbon/human/creature) + if(!xeno_affecting) + for(var/mob/living/carbon/human/human in get_turf(src)) + affect(human) + else + for(var/mob/living/carbon/creature in get_turf(src)) + affect(creature) + +/obj/effect/particle_effect/smoke/cn20/affect(mob/living/carbon/creature) + var/mob/living/carbon/xenomorph/xeno_creature + var/mob/living/carbon/human/human_creature + if(isxeno(creature)) + xeno_creature = creature + else if(ishuman(creature)) + human_creature = creature if(!istype(creature) || issynth(creature) || creature.stat == DEAD) return FALSE + if(!xeno_affecting && xeno_creature) + return FALSE if(isyautja(creature) && prob(75)) return FALSE - if (creature.wear_mask && (creature.wear_mask.flags_inventory & BLOCKGASEFFECT)) + if(creature.wear_mask && (creature.wear_mask.flags_inventory & BLOCKGASEFFECT)) + return FALSE + if(human_creature && (human_creature.head && (human_creature.head.flags_inventory & BLOCKGASEFFECT))) return FALSE var/effect_amt = round(6 + amount*6) - creature.apply_damage(12, OXY) + if(xeno_creature) + if(xeno_creature.interference < 4) + to_chat(xeno_creature, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) + xeno_creature.interference = 10 + xeno_creature.blinded = TRUE + else + creature.apply_damage(12, OXY) creature.SetEarDeafness(max(creature.ear_deaf, round(effect_amt*1.5))) //Paralysis of hearing system, aka deafness - if(!creature.eye_blind) //Eye exposure damage + if(!xeno_creature && !creature.eye_blind) //Eye exposure damage to_chat(creature, SPAN_DANGER("Your eyes sting. You can't see!")) - creature.SetEyeBlind(round(effect_amt/3)) - if(creature.coughedtime != 1 && !creature.stat) //Coughing/gasping + creature.SetEyeBlind(round(effect_amt/3)) + if(!xeno_creature && creature.coughedtime != 1 && !creature.stat) //Coughing/gasping creature.coughedtime = 1 if(prob(50)) creature.emote("cough") else creature.emote("gasp") addtimer(VARSET_CALLBACK(creature, coughedtime, 0), 1.5 SECONDS) - if (prob(20)) + var/stun_chance = 20 + if(xeno_affecting) + stun_chance = 35 + if(prob(stun_chance)) creature.apply_effect(1, WEAKEN) //Topical damage (neurotoxin on exposed skin) - to_chat(creature, SPAN_DANGER("Your body is going numb, almost as if paralyzed!")) + if(xeno_creature) + to_chat(xeno_creature, SPAN_XENODANGER("You are struggling to move, it's as if you're paralyzed!")) + else + to_chat(creature, SPAN_DANGER("Your body is going numb, almost as if paralyzed!")) if(prob(60 + round(amount*15))) //Highly likely to drop items due to arms/hands seizing up creature.drop_held_item() - if(ishuman(creature)) - creature.temporary_slowdown = max(creature.temporary_slowdown, 4) //One tick every two second - creature.recalculate_move_delay = TRUE + if(human_creature) + human_creature.temporary_slowdown = max(human_creature.temporary_slowdown, 4) //One tick every two second + human_creature.recalculate_move_delay = TRUE return TRUE ////////////////////////////////////// @@ -595,6 +630,9 @@ /datum/effect_system/smoke_spread/cn20 smoke_type = /obj/effect/particle_effect/smoke/cn20 +/datum/effect_system/smoke_spread/cn20/xeno + smoke_type = /obj/effect/particle_effect/smoke/cn20/xeno + // XENO SMOKES /datum/effect_system/smoke_spread/xeno_acid diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index e54607d6f930..bebe0ec8b27f 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -39,13 +39,9 @@ else //if on the floor, glowshroom on-floor sprite icon_state = "glowshroomf" - SetLuminosity(round(potency/15)) + set_light(round(potency/15)) lastTick = world.timeofday -/obj/effect/glowshroom/Destroy() - SetLuminosity(0) - . = ..() - /obj/effect/glowshroom/proc/CalcDir(turf/location = loc) set background = 1 var/direction = 16 diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm index d19bbbe49516..25cc1a80d0b4 100644 --- a/code/game/objects/effects/landmarks/survivor_spawner.dm +++ b/code/game/objects/effects/landmarks/survivor_spawner.dm @@ -142,25 +142,44 @@ /obj/effect/landmark/survivor_spawner/upp/soldier equipment = /datum/equipment_preset/survivor/upp/soldier synth_equipment = /datum/equipment_preset/synth/survivor/upp - spawn_priority = SPAWN_PRIORITY_MEDIUM + intro_text = list("

You are a member of a UPP recon force!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?" + spawn_priority = SPAWN_PRIORITY_LOW /obj/effect/landmark/survivor_spawner/upp_sapper equipment = /datum/equipment_preset/survivor/upp/sapper synth_equipment = /datum/equipment_preset/synth/survivor/upp + intro_text = list("

You are a member of a UPP recon force!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?" spawn_priority = SPAWN_PRIORITY_MEDIUM /obj/effect/landmark/survivor_spawner/upp_medic equipment = /datum/equipment_preset/survivor/upp/medic synth_equipment = /datum/equipment_preset/synth/survivor/upp - spawn_priority = SPAWN_PRIORITY_HIGH + intro_text = list("

You are a member of a UPP recon force!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?" + spawn_priority = SPAWN_PRIORITY_MEDIUM /obj/effect/landmark/survivor_spawner/upp_specialist equipment = /datum/equipment_preset/survivor/upp/specialist synth_equipment = /datum/equipment_preset/synth/survivor/upp + intro_text = list("

You are a member of a UPP recon force!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?" spawn_priority = SPAWN_PRIORITY_HIGH /obj/effect/landmark/survivor_spawner/squad_leader equipment = /datum/equipment_preset/survivor/upp/squad_leader synth_equipment = /datum/equipment_preset/synth/survivor/upp + intro_text = list("

You are a member of a UPP recon force!

",\ + "You ARE aware of the xenomorph threat.",\ + "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route, but is the enemy of my enemy truly your friend?" spawn_priority = SPAWN_PRIORITY_VERY_HIGH - diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index d4cd293030c2..16f30eaf0fd2 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -145,7 +145,7 @@ name = "laser" anchored = TRUE mouse_opacity = MOUSE_OPACITY_ICON - luminosity = 2 + light_range = 2 icon = 'icons/obj/items/weapons/projectiles.dmi' icon_state = "laser_target_coordinate" effect_duration = 600 @@ -156,14 +156,13 @@ source_binoc.laser_cooldown = world.time + source_binoc.cooldown_duration source_binoc.coord = null source_binoc = null - SetLuminosity(0) . = ..() /obj/effect/overlay/temp/laser_target name = "laser" anchored = TRUE mouse_opacity = MOUSE_OPACITY_ICON - luminosity = 2 + light_range = 2 icon = 'icons/obj/items/weapons/projectiles.dmi' icon_state = "laser_target2" effect_duration = 600 @@ -198,7 +197,6 @@ source_binoc.laser = null source_binoc = null - SetLuminosity(0) . = ..() /obj/effect/overlay/temp/laser_target/ex_act(severity) //immune to explosions @@ -214,16 +212,12 @@ /obj/effect/overlay/temp/blinking_laser name = "blinking laser" anchored = TRUE - luminosity = 2 + light_range = 2 effect_duration = 10 mouse_opacity = MOUSE_OPACITY_TRANSPARENT icon = 'icons/obj/items/weapons/projectiles.dmi' icon_state = "laser_target3" -/obj/effect/overlay/temp/blinking_laser/Destroy() - SetLuminosity(0) - . = ..() - /obj/effect/overlay/temp/emp_sparks icon = 'icons/effects/effects.dmi' icon_state = "empdisable" diff --git a/code/game/objects/effects/spawners/random.dm b/code/game/objects/effects/spawners/random.dm index 4d5bf88b9e6c..77390d533c9e 100644 --- a/code/game/objects/effects/spawners/random.dm +++ b/code/game/objects/effects/spawners/random.dm @@ -400,7 +400,6 @@ /obj/item/weapon/gun/revolver/small = /obj/item/ammo_magazine/revolver/small, /obj/item/weapon/gun/pistol/heavy = /obj/item/ammo_magazine/pistol/heavy, /obj/item/weapon/gun/pistol/skorpion = /obj/item/ammo_magazine/pistol/skorpion, - /obj/item/weapon/gun/pistol/skorpion/upp = /obj/item/ammo_magazine/pistol/skorpion, ) /obj/effect/spawner/random/gun/pistol/lowchance @@ -494,7 +493,7 @@ /obj/item/weapon/gun/smg/mp27 = /obj/item/ammo_magazine/smg/mp27, /obj/item/weapon/gun/smg/mp27 = /obj/item/ammo_magazine/smg/mp27, /obj/item/weapon/gun/smg/mp27 = /obj/item/ammo_magazine/smg/mp27, - /obj/item/weapon/gun/smg/ppsh = /obj/item/ammo_magazine/smg/ppsh, + /obj/item/weapon/gun/smg/pps43 = /obj/item/ammo_magazine/smg/pps43, /obj/item/weapon/gun/smg/mac15 = /obj/item/ammo_magazine/smg/mac15, /obj/item/weapon/gun/smg/mac15 = /obj/item/ammo_magazine/smg/mac15, /obj/item/weapon/gun/smg/uzi = /obj/item/ammo_magazine/smg/uzi, diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 9c74cd71fbad..f9b5ddb42f68 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -38,7 +38,7 @@ health -= damage healthcheck() -/obj/effect/spider/bullet_act(obj/item/projectile/Proj) +/obj/effect/spider/bullet_act(obj/projectile/Proj) ..() health -= Proj.ammo.damage healthcheck() @@ -67,7 +67,7 @@ if(prob(50)) to_chat(mover, SPAN_WARNING("You get stuck in [src] for a moment.")) return BLOCKED_MOVEMENT - else if(istype(mover, /obj/item/projectile)) + else if(istype(mover, /obj/projectile)) if(prob(30)) return BLOCKED_MOVEMENT return NO_BLOCKED_MOVEMENT diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4d35b99e186f..2ad355d98bbb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/items/items.dmi' mouse_drag_pointer = MOUSE_ACTIVE_POINTER layer = ITEM_LAYER + light_system = MOVABLE_LIGHT /// this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/image/blood_overlay = null var/randpixel = 6 @@ -236,14 +237,14 @@ cases. Override_icon_state should be a list.*/ new_icon_state = override_icon_state[SSmapping.configs[GROUND_MAP].map_name] if(override_protection && override_protection.len) new_protection = override_protection[SSmapping.configs[GROUND_MAP].map_name] - switch(SSmapping.configs[GROUND_MAP].map_name) // maploader TODO: json - if(MAP_ICE_COLONY, MAP_ICE_COLONY_V3, MAP_CORSAT, MAP_SOROKYNE_STRATA) + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("snow") icon_state = new_icon_state ? new_icon_state : "s_" + icon_state item_state = new_item_state ? new_item_state : "s_" + item_state - if(MAP_WHISKEY_OUTPOST, MAP_DESERT_DAM, MAP_BIG_RED, MAP_KUTJEVO) + if("desert") icon_state = new_icon_state ? new_icon_state : "d_" + icon_state item_state = new_item_state ? new_item_state : "d_" + item_state - if(MAP_PRISON_STATION, MAP_PRISON_STATION_V3, MAP_LV522_CHANCES_CLAIM) + if("classic") icon_state = new_icon_state ? new_icon_state : "c_" + icon_state item_state = new_item_state ? new_item_state : "c_" + item_state if(new_protection) @@ -367,6 +368,7 @@ cases. Override_icon_state should be a list.*/ /obj/item/proc/pickup(mob/user, silent) SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) + SEND_SIGNAL(user, COMSIG_MOB_PICKUP_ITEM, src) setDir(SOUTH)//Always rotate it south. This resets it to default position, so you wouldn't be putting things on backwards if(pickup_sound && !silent && src.loc?.z) playsound(src, pickup_sound, pickupvol, pickup_vary) @@ -634,6 +636,8 @@ cases. Override_icon_state should be a list.*/ return FALSE if(flags_equip_slot & SLOT_SUIT_STORE) return TRUE + if(flags_equip_slot & SLOT_BLOCK_SUIT_STORE) + return FALSE if(!H.wear_suit && (WEAR_JACKET in mob_equip)) if(!disable_warning) to_chat(H, SPAN_WARNING("You need a suit before you can attach this [name].")) diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index b2707a20aa90..fc9bb015ece0 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -160,7 +160,7 @@ 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(usr)] has requested a Distress Beacon! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + SSticker.mode.request_ert(usr) to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) COOLDOWN_START(src, distress_cooldown, COOLDOWN_COMM_REQUEST) return TRUE diff --git a/code/game/objects/items/devices/device.dm b/code/game/objects/items/devices/device.dm index 148d47249201..d3058960233c 100644 --- a/code/game/objects/items/devices/device.dm +++ b/code/game/objects/items/devices/device.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/items/devices.dmi' var/serial_number -/obj/item/device/Initialize() +/obj/item/device/Initialize(mapload, ...) . = ..() serial_number = "[rand(0,9)][pick(alphabet_uppercase)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][pick(alphabet_uppercase)]" diff --git a/code/game/objects/items/devices/dummy_tablet.dm b/code/game/objects/items/devices/dummy_tablet.dm index 92cfa4b90e26..d1036ebfa93b 100644 --- a/code/game/objects/items/devices/dummy_tablet.dm +++ b/code/game/objects/items/devices/dummy_tablet.dm @@ -12,6 +12,20 @@ linked_dummy = null . = ..() +/** + * Checks if the user is adjacent to the dummy + * + * Returns TRUE if the user is adjacent to the dummy, FALSE otherwise + * + * * arg-1: The user + */ +/obj/item/device/professor_dummy_tablet/proc/is_adjacent_to_dummy(mob/user) + if (get_dist(linked_dummy, user) > 1) + to_chat(user, "You are too far away to use the tablet.") + return FALSE + + return TRUE + /obj/item/device/professor_dummy_tablet/proc/link_mob(mob/living/carbon/human/H) linked_dummy = H @@ -20,6 +34,12 @@ interact(user) /obj/item/device/professor_dummy_tablet/interact(mob/user as mob) + if (isnull(linked_dummy)) + return + + if (!is_adjacent_to_dummy(user)) + return + user.set_interaction(src) var/dat = "Professor DUMMY Control Tablet" @@ -90,9 +110,11 @@ /obj/item/device/professor_dummy_tablet/Topic(href, href_list) if(..()) return FALSE - usr.set_interaction(src) + if (!is_adjacent_to_dummy(usr)) + return FALSE + usr.set_interaction(src) switch(href_list["operation"]) if ("brute_damage_organ") diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9bcda4a82bbb..6795f8b436dc 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -10,9 +10,11 @@ matter = list("metal" = 50,"glass" = 20) + light_range = 5 + light_power = 1 + actions_types = list(/datum/action/item_action) var/on = FALSE - var/brightness_on = 5 //luminosity when on var/raillight_compatible = TRUE //Can this be turned into a rail light ? var/toggleable = TRUE @@ -22,6 +24,7 @@ /obj/item/device/flashlight/Initialize() . = ..() update_icon() + set_light_on(on) /obj/item/device/flashlight/update_icon() . = ..() @@ -30,27 +33,13 @@ else icon_state = initial(icon_state) -/obj/item/device/flashlight/Destroy() - if(on) - if(ismob(src.loc)) - src.loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - . = ..() - /obj/item/device/flashlight/proc/update_brightness(mob/user = null) if(on) + set_light_range(light_range) + set_light_on(TRUE) update_icon() - if(loc && loc == user) - user.SetLuminosity(brightness_on, FALSE, src) - else if(isturf(loc)) - SetLuminosity(brightness_on) else - icon_state = initial(icon_state) - if(loc && loc == user) - user.SetLuminosity(0, FALSE, src) - else if(isturf(loc)) - SetLuminosity(0) + set_light_on(FALSE) /obj/item/device/flashlight/attack_self(mob/user) ..() @@ -64,7 +53,8 @@ return FALSE on = !on - update_brightness(user) + set_light_on(on) + update_icon() for(var/X in actions) var/datum/action/A = X A.update_button_icon() @@ -73,8 +63,8 @@ /obj/item/device/flashlight/proc/turn_off_light(mob/bearer) if(on) - on = 0 - update_brightness(bearer) + on = FALSE + set_light_on(on) for(var/X in actions) var/datum/action/A = X A.update_button_icon() @@ -142,21 +132,7 @@ if(on && can_be_broken) if(breaking_sound) playsound(src.loc, breaking_sound, 25, 1) - on = FALSE - update_brightness() - -/obj/item/device/flashlight/pickup(mob/user) - if(on) - user.SetLuminosity(brightness_on, FALSE, src) - SetLuminosity(0) - ..() - - -/obj/item/device/flashlight/dropped(mob/user) - if(on && src.loc != user) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(brightness_on) - ..() + turn_off_light() /obj/item/device/flashlight/on on = TRUE @@ -167,7 +143,7 @@ icon_state = "penlight" item_state = "" flags_atom = FPRINT|CONDUCT - brightness_on = 2 + light_range = 2 w_class = SIZE_TINY raillight_compatible = 0 @@ -176,7 +152,7 @@ desc = "A miniature lamp, that might be used by small robots." icon_state = "penlight" item_state = "" - brightness_on = 2 + light_range = 2 w_class = SIZE_TINY raillight_compatible = 0 @@ -186,23 +162,15 @@ desc = "A desk lamp with an adjustable mount." icon_state = "lamp" item_state = "lamp" - brightness_on = 5 + light_range = 5 w_class = SIZE_LARGE on = 0 raillight_compatible = 0 breaking_sound = 'sound/effects/Glasshit.ogg' -/obj/item/device/flashlight/lamp/Initialize() - . = ..() - - if(on) - update_brightness() - -/obj/item/device/flashlight/lamp/on/Initialize() //unused, but im leaving it here anyways :D - . = ..() - on = 1 - update_brightness() +/obj/item/device/flashlight/lamp/on + on = TRUE //Menorah! /obj/item/device/flashlight/lamp/menorah @@ -210,7 +178,7 @@ desc = "For celebrating Chanukah." icon_state = "menorah" item_state = "menorah" - brightness_on = 2 + light_range = 2 w_class = SIZE_LARGE on = 1 breaking_sound = null @@ -230,13 +198,13 @@ desc = "A classic green-shaded desk lamp." icon_state = "lampgreen" item_state = "lampgreen" - brightness_on = 5 + light_range = 5 /obj/item/device/flashlight/lamp/tripod name = "tripod lamp" desc = "An emergency light tube mounted onto a tripod. It seemingly lasts forever." icon_state = "tripod_lamp" - brightness_on = 6//pretty good + light_range = 6//pretty good w_class = SIZE_LARGE on = 1 @@ -261,7 +229,8 @@ name = "flare" desc = "A red USCM issued flare. There are instructions on the side, it reads 'pull cord, make light'." w_class = SIZE_SMALL - brightness_on = 5 //As bright as a flashlight, but more disposable. Doesn't burn forever though + light_power = 2 + light_range = 7 icon_state = "flare" item_state = "flare" actions = list() //just pull it manually, neckbeard. @@ -287,6 +256,7 @@ /obj/item/device/flashlight/flare/Initialize() . = ..() fuel = rand(9.5 MINUTES, 10.5 MINUTES) + set_light_color(flame_tint) /obj/item/device/flashlight/flare/update_icon() overlays?.Cut() @@ -353,7 +323,7 @@ START_PROCESSING(SSobj, src) /obj/item/device/flashlight/flare/proc/turn_off() - on = 0 + on = FALSE heat_source = 0 force = initial(force) damtype = initial(damtype) @@ -401,7 +371,6 @@ /// Flares deployed by a flare gun /obj/item/device/flashlight/flare/on/gun - brightness_on = 7 //Special flare subtype for the illumination flare shell //Acts like a flare, just even stronger, and set length @@ -409,9 +378,7 @@ name = "illumination flare" desc = "It's really bright, and unreachable." icon_state = "" //No sprite - invisibility = 101 //Can't be seen or found, it's "up in the sky" mouse_opacity = MOUSE_OPACITY_TRANSPARENT - brightness_on = 7 //Way brighter than most lights show_flame = FALSE /obj/item/device/flashlight/flare/on/illumination/Initialize() @@ -432,7 +399,6 @@ name = "burning star shell ash" desc = "Bright burning ash from a Star Shell 40mm. Don't touch, or it'll burn ya'." icon_state = "starshell_ash" - brightness_on = 7 anchored = TRUE//can't be picked up ammo_datum = /datum/ammo/flare/starshell show_flame = FALSE @@ -445,14 +411,14 @@ /obj/item/device/flashlight/flare/on/illumination/chemical name = "chemical light" - brightness_on = 0 + light_range = 0 /obj/item/device/flashlight/flare/on/illumination/chemical/Initialize(mapload, amount) . = ..() - brightness_on = round(amount * 0.04) - if(!brightness_on) + light_range = round(amount * 0.04) + if(!light_range) return INITIALIZE_HINT_QDEL - SetLuminosity(brightness_on) + set_light(light_range) fuel = amount * 5 SECONDS /obj/item/device/flashlight/slime @@ -464,7 +430,7 @@ icon_state = "floor1" item_state = "slime" w_class = SIZE_TINY - brightness_on = 6 + light_range = 6 // Bio-luminesence has one setting, on. on = TRUE raillight_compatible = FALSE @@ -473,7 +439,7 @@ /obj/item/device/flashlight/slime/Initialize() . = ..() - SetLuminosity(brightness_on) + set_light(light_range) update_brightness() icon_state = initial(icon_state) @@ -483,7 +449,7 @@ name = "lantern" icon_state = "lantern" desc = "A mining lantern." - brightness_on = 6 // luminosity when on + light_range = 6 // luminosity when on //Signal Flare /obj/item/device/flashlight/flare/signal diff --git a/code/game/objects/items/devices/helmet_visors.dm b/code/game/objects/items/devices/helmet_visors.dm new file mode 100644 index 000000000000..dd913daf7620 --- /dev/null +++ b/code/game/objects/items/devices/helmet_visors.dm @@ -0,0 +1,98 @@ +/obj/item/device/helmet_visor + name = "squad optic" + desc = "An insertable visor HUD into a standard USCM helmet." + icon = 'icons/obj/items/clothing/helmet_visors.dmi' + icon_state = "hud_sight" + w_class = SIZE_TINY + + ///The type of HUD our visor shows + var/hud_type = MOB_HUD_FACTION_USCM + + ///The sound when toggling on the visor + var/toggle_on_sound = 'sound/handling/hud_on.ogg' + + ///The sound when toggling off the visor + var/toggle_off_sound = 'sound/handling/hud_off.ogg' + + ///The icon name for our helmet's action + var/action_icon_string = "hud_sight_down" + + ///The overlay name for when our visor is active + var/helmet_overlay = "hud_sight_right" + +/// Called to see if the user can even use this visor +/obj/item/device/helmet_visor/proc/can_toggle(mob/living/carbon/human/user) + return TRUE + +/// Called to see if this visor is a special non-HUD visor +/obj/item/device/helmet_visor/proc/visor_function(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user, silent = FALSE) + if(attached_helmet == user.head && attached_helmet.active_visor == src) + var/datum/mob_hud/current_mob_hud = huds[hud_type] + current_mob_hud.add_hud_to(user, attached_helmet) + if(!silent) + to_chat(user, SPAN_NOTICE("You activate [src] on [attached_helmet].")) + return TRUE + + var/datum/mob_hud/current_mob_hud = huds[hud_type] + current_mob_hud.remove_hud_from(user, attached_helmet) + if(!silent) + to_chat(user, SPAN_NOTICE("You deactivate [src] on [attached_helmet].")) + return TRUE + +/obj/item/device/helmet_visor/medical + name = "basic medical optic" + icon_state = "med_sight" + hud_type = MOB_HUD_MEDICAL_ADVANCED + action_icon_string = "med_sight_down" + helmet_overlay = "med_sight_right" + +/obj/item/device/helmet_visor/medical/advanced + name = "advanced medical optic" + helmet_overlay = "med_sight_left" + +/obj/item/device/helmet_visor/medical/advanced/can_toggle(mob/living/carbon/human/user) + if(!skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) + to_chat(user, SPAN_NOTICE("You are not skilled enough to use [src].")) + return FALSE + + return TRUE + +/obj/item/device/helmet_visor/security + name = "security optic" + icon_state = "sec_sight" + hud_type = MOB_HUD_SECURITY_ADVANCED + action_icon_string = "sec_sight_down" + helmet_overlay = "sec_sight_right" + +/obj/item/device/helmet_visor/welding_visor + name = "welding visor" + icon_state = "sight_empty" + hud_type = null + action_icon_string = "blank_hud_sight_down" + helmet_overlay = "weld_visor" + +/obj/item/device/helmet_visor/welding_visor/visor_function(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user, silent = FALSE) + if(attached_helmet == user.head && attached_helmet.active_visor == src) + attached_helmet.vision_impair = VISION_IMPAIR_MAX + attached_helmet.flags_inventory |= COVEREYES|COVERMOUTH + attached_helmet.flags_inv_hide |= HIDEEYES|HIDEFACE + attached_helmet.eye_protection = EYE_PROTECTION_WELDING + user.update_tint() + if(!silent) + to_chat(user, SPAN_NOTICE("You activate [src] on [attached_helmet].")) + return TRUE + + attached_helmet.vision_impair = VISION_IMPAIR_NONE + attached_helmet.flags_inventory &= ~(COVEREYES|COVERMOUTH) + attached_helmet.flags_inv_hide &= ~(HIDEEYES|HIDEFACE) + attached_helmet.eye_protection = EYE_PROTECTION_NONE + if(!silent) + to_chat(user, SPAN_NOTICE("You deactivate [src] on [attached_helmet].")) + user.update_tint() + return TRUE + +/obj/item/device/helmet_visor/welding_visor/mercenary + helmet_overlay = "" + +/obj/item/device/helmet_visor/welding_visor/tanker + helmet_overlay = "tanker_weld_visor" diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index d724e1cec10f..310e9dba0199 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -309,13 +309,24 @@ /obj/item/device/encryptionkey/highcom name = "\improper USCM High Command Radio Encryption Key" icon_state = "binary_key" - channels = list(RADIO_CHANNEL_HIGHCOM = TRUE, SQUAD_SOF = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE) + channels = list(RADIO_CHANNEL_HIGHCOM = TRUE, SQUAD_SOF = TRUE, RADIO_CHANNEL_PROVOST = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = FALSE, RADIO_CHANNEL_JTAC = FALSE, RADIO_CHANNEL_INTEL = TRUE) + +/obj/item/device/encryptionkey/provost + name = "\improper USCM Provost Radio Encryption Key" + icon_state = "sec_key" + channels = list(RADIO_CHANNEL_PROVOST = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = FALSE, RADIO_CHANNEL_JTAC = FALSE, RADIO_CHANNEL_INTEL = TRUE) + /obj/item/device/encryptionkey/contractor name = "\improper Vanguard's Arrow Incorporated Radio Encryption Key" icon_state = "sl_key" channels = list("Command" = TRUE, "Engi" = TRUE, "MedSci" = TRUE, "Req" = TRUE, "JTAC" = TRUE, "Intel" = TRUE, "Almayer" = TRUE) +/obj/item/device/encryptionkey/royal_marine + name = "\improper Royal Marine Radio Encryption Key" + icon_state = "sl_key" + channels = list("Command" = TRUE, "Almayer" = TRUE,) + /obj/item/device/encryptionkey/cmb name = "\improper Colonial Marshal Bureau Radio Encryption Key" icon_state = "cmb_key" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 7e6b0db056d0..bfd5754ea627 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -238,7 +238,7 @@ RegisterSignal(user, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(update_minimap_icon)) if(headset_hud_on) var/datum/mob_hud/H = huds[hud_type] - H.add_hud_to(user) + H.add_hud_to(user, src) //squad leader locator is no longer invisible on our player HUD. if(user.mind && (user.assigned_squad || misc_tracking) && user.hud_used && user.hud_used.locate_leader) user.show_hud_tracker() @@ -257,7 +257,7 @@ )) if(istype(user) && user.has_item_in_ears(src)) //dropped() is called before the inventory reference is update. var/datum/mob_hud/H = huds[hud_type] - H.remove_hud_from(user) + H.remove_hud_from(user, src) //squad leader locator is invisible again if(user.hud_used && user.hud_used.locate_leader) user.hide_hud_tracker() @@ -290,14 +290,14 @@ if(user.has_item_in_ears(src)) //worn var/datum/mob_hud/H = huds[hud_type] if(headset_hud_on) - H.add_hud_to(usr) + H.add_hud_to(usr, src) if(user.mind && (misc_tracking || user.assigned_squad) && user.hud_used?.locate_leader) user.show_hud_tracker() if(misc_tracking) SStracking.start_misc_tracking(user) update_minimap_icon() else - H.remove_hud_from(usr) + H.remove_hud_from(usr, src) if(user.hud_used?.locate_leader) user.hide_hud_tracker() if(misc_tracking) @@ -850,7 +850,7 @@ /obj/item/device/radio/headset/distress/pmc/hvh desc = "A special headset used by corporate personnel. Channels are as follows: :o - colony." - initial_keys = list(/obj/item/device/encryptionkey/colony) + initial_keys = list(/obj/item/device/encryptionkey/colony, /obj/item/device/encryptionkey/WY) misc_tracking = FALSE /obj/item/device/radio/headset/distress/pmc/cct @@ -967,6 +967,16 @@ initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/contractor) has_hud = TRUE +/obj/item/device/radio/headset/distress/royal_marine + name = "Royal Marine Headset" + desc = "A sleek headset used by the Royal Marines Commando. Low profile enough to fit under their unique helmets." + frequency = RMC_FREQ + icon_state = "vai_headset" + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/royal_marine) + has_hud = TRUE + hud_type = MOB_HUD_FACTION_TWE + volume = RADIO_VOLUME_IMPORTANT + //CMB Headsets /obj/item/device/radio/headset/distress/CMB name = "\improper CMB Earpiece" @@ -992,9 +1002,17 @@ name = "USCM High Command headset" desc = "Issued to members of USCM High Command and their immediate subordinates. Channels are as follows: :v - marine command, :p - military police, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel, :z - HighCom" icon_state = "mhc_headset" + frequency = HC_FREQ initial_keys = list(/obj/item/device/encryptionkey/highcom) volume = RADIO_VOLUME_CRITICAL - ignore_z = TRUE + +/obj/item/device/radio/headset/almayer/provost + name = "USCM Provost headset" + desc = "Issued to members of the USCM Provost Office and their immediate subordinates." + icon_state = "pvst_headset" + frequency = PVST_FREQ + initial_keys = list(/obj/item/device/encryptionkey/provost) + volume = RADIO_VOLUME_CRITICAL /obj/item/device/radio/headset/almayer/sof name = "USCM SOF headset" @@ -1003,7 +1021,6 @@ frequency = SOF_FREQ initial_keys = list(/obj/item/device/encryptionkey/soc) volume = RADIO_VOLUME_IMPORTANT - ignore_z = TRUE /obj/item/device/radio/headset/almayer/sof/survivor_forecon name = "USCM SOF headset" @@ -1012,7 +1029,6 @@ frequency = SOF_FREQ initial_keys = list(/obj/item/device/encryptionkey/soc/forecon) volume = RADIO_VOLUME_QUIET - ignore_z = FALSE has_hud = TRUE hud_type = MOB_HUD_FACTION_USCM @@ -1022,3 +1038,13 @@ initial_keys = list(/obj/item/device/encryptionkey/vc) volume = RADIO_VOLUME_RAISED multibroadcast_cooldown = HIGH_MULTIBROADCAST_COOLDOWN + +/obj/item/device/radio/headset/distress/UPP/recon + name = "\improper UPP headset" + desc = "A special headset used by recon elements of the UPP military." + frequency = UPP_FREQ + initial_keys = list(/obj/item/device/encryptionkey/upp) + volume = RADIO_VOLUME_QUIET + ignore_z = FALSE + has_hud = TRUE + hud_type = MOB_HUD_FACTION_UPP diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index aef577779c06..6aecacd27916 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -64,10 +64,10 @@ on = FALSE else var/area/A = src.loc.loc - if(!A || !isarea(A) || !A.master) + if(!A || !isarea(A)) on = FALSE else - on = A.master.powered(POWER_CHANNEL_EQUIP) // set "on" to the power status + on = A.powered(POWER_CHANNEL_EQUIP) // set "on" to the power status if(!on) icon_state = "intercom-p" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3e2c1445f8e5..83976e6a9077 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -145,7 +145,7 @@ FORENSIC SCANNER /obj/item/device/healthanalyzer/alien name = "\improper YMX scanner" icon = 'icons/obj/items/hunter/pred_gear.dmi' - icon_state = "Tracker" + icon_state = "scanner" item_state = "analyzer" desc = "An alien design hand-held body scanner able to distinguish vital signs of the subject. The front panel is able to provide the basic readout of the subject's status." alien = TRUE diff --git a/code/game/objects/items/devices/vulture_spotter.dm b/code/game/objects/items/devices/vulture_spotter.dm new file mode 100644 index 000000000000..b89009efde7e --- /dev/null +++ b/code/game/objects/items/devices/vulture_spotter.dm @@ -0,0 +1,41 @@ +/obj/item/device/vulture_spotter_scope + name = "\improper M707 spotter scope" + desc = "A scope that, when mounted on a tripod, allows a user to assist the M707's firer in target acquisition." + icon_state = "vulture_scope" + item_state = "electronic" + flags_atom = FPRINT|CONDUCT + unacidable = TRUE + indestructible = TRUE + /// A weakref to the corresponding rifle + var/datum/weakref/bound_rifle + +/obj/item/device/vulture_spotter_scope/Initialize(mapload, datum/weakref/rifle) + . = ..() + if(rifle) + bound_rifle = rifle + +/obj/item/device/vulture_spotter_scope/attack_self(mob/user) + . = ..() + to_chat(user, SPAN_WARNING("[src] needs to be mounted on a tripod to use!")) + +/obj/item/device/vulture_spotter_tripod + name = "\improper M707 spotter tripod" + desc = "A tripod, meant for stabilizing a spotting scope for the M707 anti-materiel rifle." + icon_state = "vulture_tripod" + item_state = "electronic" + flags_atom = FPRINT|CONDUCT + unacidable = TRUE + indestructible = TRUE + +/obj/item/device/vulture_spotter_tripod/get_examine_text(mob/user) + . = ..() + . += SPAN_NOTICE("[src] can be set down by using in-hand.") + +/obj/item/device/vulture_spotter_tripod/attack_self(mob/user) + . = ..() + user.balloon_alert(user, "setting up tripod...") + if(!do_after(user, 1.5 SECONDS, target = user)) + return + + new /obj/structure/vulture_spotter_tripod(get_turf(user)) + qdel(src) diff --git a/code/game/objects/items/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm index a8e0e1803a33..2abb28075496 100644 --- a/code/game/objects/items/explosives/grenades/marines.dm +++ b/code/game/objects/items/explosives/grenades/marines.dm @@ -465,6 +465,45 @@ icon_state = "grenade_phos_clf" item_state = "grenade_phos_clf" +/* +//================================================ + Nerve Gas Grenades +//================================================ +*/ +/obj/item/explosive/grenade/nerve_gas + name = "\improper CN20 canister grenade" + desc = "A canister grenade of deadly nerve gas. It is set to detonate in 4 seconds." + icon_state = "flashbang2"//temp icon + det_time = 40 + item_state = "grenade_phos_clf"//temp icon + underslug_launchable = FALSE + harmful = TRUE + antigrief_protection = TRUE + var/datum/effect_system/smoke_spread/cn20/nerve_gas + var/nerve_gas_radius = 2 + +/obj/item/explosive/grenade/nerve_gas/New() + ..() + nerve_gas = new /datum/effect_system/smoke_spread/cn20 + nerve_gas.attach(src) + +/obj/item/explosive/grenade/nerve_gas/Destroy() + QDEL_NULL(nerve_gas) + return ..() + +/obj/item/explosive/grenade/nerve_gas/prime() + playsound(src.loc, 'sound/effects/smoke.ogg', 25, 1, 4) + nerve_gas.set_up(nerve_gas_radius, 0, get_turf(src), null, 6) + nerve_gas.start() + qdel(src) + +/obj/item/explosive/grenade/nerve_gas/xeno + name = "\improper CN20-X canister grenade" + +/obj/item/explosive/grenade/nerve_gas/xeno/New() + nerve_gas = new /datum/effect_system/smoke_spread/cn20/xeno + nerve_gas.attach(src) + /* //================================================ Airburst Smoke Grenades @@ -689,3 +728,23 @@ burn_level = BURN_LEVEL_TIER_3 radius = 2 fire_type = FIRE_VARIANT_DEFAULT + +//Royal marine grenades + +/obj/item/explosive/grenade/high_explosive/rmc + name = "\improper R2175/A HEDP grenade" + desc = "High-Explosive Dual-Purpose. A small, but deceptively strong blast grenade that has recently been added to the arsenal of the RMC." + icon_state = "rmc_grenade" + item_state = "grenade_hedp" + explosion_power = 130 + explosion_falloff = 30 + +/obj/item/explosive/grenade/incendiary/rmc + name = "\improper R2175/B HIDP grenade" + desc = "The R2175/B HIDP is a small, but deceptively strong incendiary grenade designed to rapidly clear areas with fast-acting potent fire. It is set to detonate in 4 seconds." + icon_state = "rmc_grenade_fire" + item_state = "grenade_fire" + flame_level = BURN_TIME_TIER_1 + burn_level = BURN_LEVEL_TIER_8 + radius = 3 + fire_type = FIRE_VARIANT_DEFAULT diff --git a/code/game/objects/items/lightstick.dm b/code/game/objects/items/lightstick.dm index 453d965926ff..70418049994b 100644 --- a/code/game/objects/items/lightstick.dm +++ b/code/game/objects/items/lightstick.dm @@ -7,10 +7,18 @@ desc = "You can stick them in the ground" icon = 'icons/obj/items/lighting.dmi' icon_state = "lightstick_blue0" + light_range = 2 + light_color = COLOUR_BLUE var/s_color = "blue" var/trample_chance = 30 var/can_trample = TRUE +/obj/item/lightstick/Initialize(mapload, ...) + . = ..() + + if(!light_on) + set_light_range(0) + /obj/item/lightstick/Crossed(mob/living/O) if(anchored && prob(trample_chance) && can_trample) if(!istype(O,/mob/living/carbon/xenomorph/larva)) @@ -22,13 +30,13 @@ else anchored = FALSE icon_state = "lightstick_[s_color][anchored]" - SetLuminosity(0) + set_light_range(0) pixel_x = 0 pixel_y = 0 else anchored = FALSE icon_state = "lightstick_[s_color][anchored]" - SetLuminosity(0) + set_light_range(0) pixel_x = 0 pixel_y = 0 @@ -45,31 +53,27 @@ anchored = FALSE user.visible_message("[user.name] removes \the [src] from the ground.","You remove the [src] from the ground.") icon_state = "lightstick_[s_color][anchored]" - SetLuminosity(0) + set_light(0) pixel_x = 0 pixel_y = 0 playsound(user, 'sound/weapons/Genhit.ogg', 25, 1) - //Remove lightsource -/obj/item/lightstick/Destroy() - SetLuminosity(0) - return ..() - //Red /obj/item/lightstick/planted icon_state = "lightstick_blue1" anchored = TRUE - luminosity = 2 + light_on = TRUE /obj/item/lightstick/red name = "red lightstick" icon_state = "lightstick_red0" s_color = "red" + light_color = COLOUR_RED /obj/item/lightstick/red/planted icon_state = "lightstick_red1" anchored = TRUE - luminosity = 2 + light_on = TRUE /obj/item/lightstick/red/spoke name = "red lightstick" @@ -80,7 +84,7 @@ /obj/item/lightstick/red/spoke/planted icon_state = "lightstick_spoke1" anchored = TRUE - luminosity = 2 + light_on = TRUE /obj/item/lightstick/red/variant name = "red lightstick" @@ -90,7 +94,7 @@ /obj/item/lightstick/red/variant/planted icon_state = "lightstick_red_variant1" anchored = TRUE - luminosity = 2 + light_on = TRUE /obj/item/lightstick/variant //blue name = "blue lightstick" @@ -100,4 +104,4 @@ /obj/item/lightstick/variant/planted icon_state = "lightstick_blue_variant1" anchored = TRUE - luminosity = 2 + light_on = TRUE diff --git a/code/game/objects/items/pamphlets.dm b/code/game/objects/items/pamphlets.dm index dd96f275ef17..682215be67bb 100644 --- a/code/game/objects/items/pamphlets.dm +++ b/code/game/objects/items/pamphlets.dm @@ -186,3 +186,38 @@ desc = "A piece of paper covered in crude depictions of bananas and various types of primates. Probably drawn by a three-year-old child - or an unusually intelligent marine." trait = /datum/character_trait/language/primitive + +/obj/item/pamphlet/trait + bypass_pamphlet_limit = TRUE + /// What trait to give the user + var/trait_to_give + +/obj/item/pamphlet/trait/can_use(mob/living/carbon/human/user) + if(!istype(user)) + return FALSE + + if(HAS_TRAIT(user, trait_to_give)) + to_chat(user, SPAN_WARNING("You know this already!")) + return FALSE + + if(user.job != JOB_SQUAD_MARINE) + to_chat(user, SPAN_WARNING("Only squad riflemen can use this.")) + return FALSE + + if(user.has_used_pamphlet && !bypass_pamphlet_limit) + to_chat(user, SPAN_WARNING("You've already used a pamphlet!")) + return FALSE + + return TRUE + +/obj/item/pamphlet/trait/on_use(mob/living/carbon/human/user) + to_chat(user, SPAN_NOTICE(flavour_text)) + ADD_TRAIT(user, trait_to_give, "pamphlet") + if(!bypass_pamphlet_limit) + user.has_used_pamphlet = TRUE + +/obj/item/pamphlet/trait/vulture + name = "\improper M707 instructional pamphlet" + desc = "A pamphlet used to quickly impart vital knowledge of how to shoot big guns and spot for them." + icon_state = "pamphlet_vulture" + trait_to_give = TRAIT_VULTURE_USER diff --git a/code/game/objects/items/reagent_containers/autoinjectors.dm b/code/game/objects/items/reagent_containers/autoinjectors.dm index 4c1e8af88ee5..46463e628c1d 100644 --- a/code/game/objects/items/reagent_containers/autoinjectors.dm +++ b/code/game/objects/items/reagent_containers/autoinjectors.dm @@ -191,8 +191,10 @@ /obj/item/reagent_container/hypospray/autoinjector/emergency name = "emergency autoinjector (CAUTION)" + desc = "An auto-injector loaded with a special cocktail of chemicals, to be used in life-threatening situations. Doesn't require any training to use." + icon_state = "emptyskill" + item_state = "emptyskill" chemname = "emergency" - desc = "An auto-injector loaded with a special cocktail of chemicals, to be used in life-threatening situations." amount_per_transfer_from_this = (REAGENTS_OVERDOSE-1)*2 + (MED_REAGENTS_OVERDOSE-1) volume = (REAGENTS_OVERDOSE-1)*2 + (MED_REAGENTS_OVERDOSE-1) mixed_chem = TRUE @@ -201,12 +203,6 @@ injectVOL = 70//limited-supply emergency injector with v.large injection of drugs. Variable sfx freq sometimes rolls too quiet. display_maptext = TRUE //see anaesthetic injector maptext_label = "!!" - -/obj/item/reagent_container/hypospray/autoinjector/emergency/skillless - name = "EZ emergency autoinjector (CAUTION)" - desc = "An auto-injector loaded with a special cocktail of chemicals, to be used in life-threatening situations. Doesn't require any training to use." - icon_state = "emptyskill" - item_state = "emptyskill" skilllock = SKILL_MEDICAL_DEFAULT /obj/item/reagent_container/hypospray/autoinjector/emergency/Initialize() diff --git a/code/game/objects/items/reagent_containers/food/drinks/bottle.dm b/code/game/objects/items/reagent_containers/food/drinks/bottle.dm index e1936fbaaec4..0e63a19c7ef1 100644 --- a/code/game/objects/items/reagent_containers/food/drinks/bottle.dm +++ b/code/game/objects/items/reagent_containers/food/drinks/bottle.dm @@ -13,7 +13,7 @@ var/isGlass = TRUE black_market_value = 25 -/obj/item/reagent_container/food/drinks/bottle/bullet_act(obj/item/projectile/P) +/obj/item/reagent_container/food/drinks/bottle/bullet_act(obj/projectile/P) . = ..() if(isGlass) smash() diff --git a/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm b/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm index 31a0e517c725..eea71cd1a4bc 100644 --- a/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/game/objects/items/reagent_containers/food/drinks/drinkingglass.dm @@ -682,7 +682,7 @@ return -/obj/item/reagent_container/food/drinks/drinkingglass/bullet_act(obj/item/projectile/P) +/obj/item/reagent_container/food/drinks/drinkingglass/bullet_act(obj/projectile/P) . = ..() smash() diff --git a/code/game/objects/items/reagent_containers/food/snacks/grown.dm b/code/game/objects/items/reagent_containers/food/snacks/grown.dm index d2fdda7d0975..12a5a704f663 100644 --- a/code/game/objects/items/reagent_containers/food/snacks/grown.dm +++ b/code/game/objects/items/reagent_containers/food/snacks/grown.dm @@ -189,26 +189,16 @@ /obj/item/reagent_container/food/snacks/grown/glowberries name = "bunch of glow-berries" desc = "Nutritious!" - var/light_on = 1 var/brightness_on = 2 //luminosity when on filling_color = "#D3FF9E" icon_state = "glowberrypile" plantname = "glowberries" -/obj/item/reagent_container/food/snacks/grown/glowberries/Destroy() - if(istype(loc,/mob)) - loc.SetLuminosity(0, FALSE, src) +/obj/item/reagent_container/food/snacks/grown/glowberries/Initialize() . = ..() -/obj/item/reagent_container/food/snacks/grown/glowberries/pickup(mob/user) - . = ..() - src.SetLuminosity(0) - user.SetLuminosity(round((potency/5),1), FALSE, src) - -/obj/item/reagent_container/food/snacks/grown/glowberries/dropped(mob/user) - user.SetLuminosity(0, FALSE, src) - src.SetLuminosity(round(potency/5,1)) - ..() + set_light_range(brightness_on) + set_light_on(TRUE) /obj/item/reagent_container/food/snacks/grown/cocoapod name = "cocoa pod" @@ -568,22 +558,6 @@ to_chat(user, SPAN_NOTICE("You plant the glowshroom.")) -/obj/item/reagent_container/food/snacks/grown/mushroom/glowshroom/Destroy() - if(istype(loc,/mob)) - loc.SetLuminosity(0, FALSE, src) - . = ..() - -/obj/item/reagent_container/food/snacks/grown/mushroom/glowshroom/pickup(mob/user) - . = ..() - SetLuminosity(0) - user.SetLuminosity(round((potency/10),1), FALSE, src) - -/obj/item/reagent_container/food/snacks/grown/mushroom/glowshroom/dropped(mob/user) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(round(potency/10,1)) - ..() - - // ************************************* // Complex Grown Object Defines - // Putting these at the bottom so they don't clutter the list up. -Cheridan diff --git a/code/game/objects/items/reagent_containers/hypospray.dm b/code/game/objects/items/reagent_containers/hypospray.dm index 5014c85547aa..fcea8997f0b5 100644 --- a/code/game/objects/items/reagent_containers/hypospray.dm +++ b/code/game/objects/items/reagent_containers/hypospray.dm @@ -10,7 +10,7 @@ icon_state = "hypo" amount_per_transfer_from_this = 5 volume = 30 - possible_transfer_amounts = list(5,10,15,30) + possible_transfer_amounts = list(3, 5, 10, 15, 30) flags_atom = FPRINT|OPENCONTAINER flags_equip_slot = SLOT_WAIST flags_item = NOBLUDGEON diff --git a/code/game/objects/items/shards.dm b/code/game/objects/items/shards.dm index f46f5b5a5fc0..84c3d5b83427 100644 --- a/code/game/objects/items/shards.dm +++ b/code/game/objects/items/shards.dm @@ -75,7 +75,7 @@ // Shrapnel. -// on_embed is called from projectile.dm, bullet_act(obj/item/projectile/P). +// on_embed is called from projectile.dm, bullet_act(obj/projectile/P). // on_embedded_movement is called from human.dm, handle_embedded_objects(). /obj/item/large_shrapnel/proc/on_embedded_movement(mob/living/embedded_mob) @@ -232,13 +232,13 @@ organ.take_damage(damage_on_move * count, 0, 0, no_limb_loss = TRUE) embedded_mob.pain.apply_pain(damage_on_move * count) -/obj/item/shard/shrapnel/nagant +/obj/item/shard/shrapnel/upp name = "small shrapnel" desc = "Some shrapnel that used to be embedded underneath someone's skin." icon_state = "small" damage_on_move = 2 -/obj/item/shard/shrapnel/nagant/bits +/obj/item/shard/shrapnel/upp/bits name = "tiny shrapnel" desc = "A tiny piece of shrapnel that used to be embedded underneath someone's skin." icon_state = "tiny" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 3bf3656f4bd2..e0b3a4bde9dc 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -497,7 +497,7 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r var/obj/structure/transmitter/internal/internal_transmitter var/phone_category = PHONE_MARINE - var/network_receive = FACTION_MARINE + var/list/networks_receive = list(FACTION_MARINE) var/list/networks_transmit = list(FACTION_MARINE) var/base_icon @@ -523,7 +523,7 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r internal_transmitter.relay_obj = src internal_transmitter.phone_category = phone_category internal_transmitter.enabled = FALSE - internal_transmitter.network_receive = network_receive + internal_transmitter.networks_receive = networks_receive internal_transmitter.networks_transmit = networks_transmit RegisterSignal(internal_transmitter, COMSIG_TRANSMITTER_UPDATE_ICON, PROC_REF(check_for_ringing)) GLOB.radio_packs += src @@ -593,7 +593,8 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r . = ..() /obj/item/storage/backpack/marine/satchel/rto/upp_net - network_receive = FACTION_UPP + name = "\improper UPP Radio Telephone Pack" + networks_receive = list(FACTION_UPP) networks_transmit = list(FACTION_UPP) /obj/item/storage/backpack/marine/satchel/rto/small @@ -602,7 +603,8 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r /obj/item/storage/backpack/marine/satchel/rto/small/upp_net - network_receive = FACTION_UPP + name = "\improper UPP Radio Telephone Pack" + networks_receive = list(FACTION_UPP) networks_transmit = list(FACTION_UPP) phone_category = PHONE_UPP_SOLDIER @@ -1103,3 +1105,57 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r max_storage_space = 21 camo_alpha = 10 + +//----------TWE SECTION---------- +/obj/item/storage/backpack/rmc + has_gamemode_skin = FALSE + +/obj/item/storage/backpack/rmc/heavy + name = "heavyweight RMC backpack" + desc = "The heavy-carry pack of the RMC forces. Designed to lug the most amount of gear into the battlefield." + icon_state = "backpack_large" + item_state = "backpack_large" + max_storage_space = 27 + +/obj/item/storage/backpack/rmc/medium + name = "standard RMC backpack" + desc = "A TWE military standard-carry RMC combat pack MK3." + icon_state = "backpack_medium" + item_state = "backpack_medium" + worn_accessible = TRUE + max_storage_space = 24 + +/obj/item/storage/backpack/rmc/light + name = "lightweight RMC backpack" + desc = "A TWE military light-carry RMC combat pack MK3." + icon_state = "backpack_small" + item_state = "backpack_small" + worn_accessible = TRUE + max_storage_space = 21 + +/obj/item/storage/backpack/rmc/frame //One sorry sod should have to lug this about spawns in their shuttle currently + name = "\improper RMC carry-frame" + desc = "A backpack specifically designed to hold equipment for commandos." + icon_state = "backpack_frame" + item_state = "backpack_frame" + max_w_class = SIZE_HUGE + storage_slots = 7 + can_hold = list( + /obj/item/ammo_box/magazine/misc/mre, + /obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/adv, + /obj/item/storage/firstaid/surgical, + /obj/item/device/defibrillator/compact, + /obj/item/tool/surgery/surgical_line, + /obj/item/tool/surgery/synthgraft, + /obj/item/storage/box/packet/rmc/he, + /obj/item/storage/box/packet/rmc/incin, + ) + +/obj/item/storage/backpack/general_belt/rmc //the breachers belt + name = "\improper RMC general utility belt" + desc = "A small, lightweight pouch that can be clipped onto armor to provide additional storage. This new RMC model, while uncomfortable, can also be clipped around the waist." + icon_state = "rmc_general" + item_state = "rmc_general" + has_gamemode_skin = FALSE + max_storage_space = 15 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 7721a9643fb5..bf267bb23abf 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -391,6 +391,7 @@ new /obj/item/weapon/baton(src) new /obj/item/handcuffs(src) new /obj/item/reagent_container/spray/pepper(src) + new /obj/item/ammo_magazine/revolver/upp/shrapnel(src) /obj/item/storage/belt/security/MP/CMB name = "\improper CMB duty belt" @@ -529,7 +530,6 @@ for(var/i = 1 to storage_slots) new /obj/item/ammo_magazine/handful/shotgun/buckshot(src) - /obj/item/storage/belt/marine/smartgunner name = "\improper M280 pattern smartgunner drum belt" desc = "Despite the fact that 1. drum magazines are incredibly non-ergonomical, and 2. require incredibly precise machining in order to fit universally (spoiler, they don't, adding further to the myth of 'Smartgun Personalities'), the USCM decided to issue a modified marine belt (more formally known by the designation M280) with hooks and dust covers (overly complex for the average jarhead) for the M56B system's drum munitions. When the carry catch on the drum isn't getting stuck in the oiled up velcro, the rig actually does do a decent job at holding a plentiful amount of drums. But at the end of the day, compared to standard rigs... it sucks, but isn't that what being a Marine is all about?" @@ -1405,37 +1405,50 @@ /obj/item/storage/belt/gun/type47 name = "\improper Type 47 pistol holster rig" - desc = "This UPP-designed sidearm rig can very snugly and securely fit either a Nagant-Yamasaki revolver or a Korovin PK-9, and both their magazines or speedloaders. However, it lacks versatility in stored weaponry." + desc = "This UPP-designed sidearm rig can very snugly and securely fit a Type-73, NP92, or a ZHNK-72, and their magazines or speedloaders. However, it lacks versatility in stored weaponry." icon_state = "korovin_holster" item_state = "upp_belt" storage_slots = 7 can_hold = list( - /obj/item/weapon/gun/pistol/c99, - /obj/item/ammo_magazine/pistol/c99, - /obj/item/ammo_magazine/pistol/c99/tranq, - /obj/item/weapon/gun/revolver/nagant, + /obj/item/weapon/gun/pistol/t73, + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73_impact, + /obj/item/weapon/gun/pistol/np92, + /obj/item/ammo_magazine/pistol/np92, + /obj/item/ammo_magazine/pistol/np92/tranq, + /obj/item/weapon/gun/revolver/upp, /obj/item/ammo_magazine/revolver/upp, /obj/item/ammo_magazine/revolver/upp/shrapnel, ) holster_slots = list("1" = list("icon_x" = -1)) -/obj/item/storage/belt/gun/type47/PK9/fill_preset_inventory() - handle_item_insertion(new /obj/item/weapon/gun/pistol/c99/upp()) +/obj/item/storage/belt/gun/type47/np92/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/np92()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/np92(src) + +/obj/item/storage/belt/gun/type47/np92/suppressed/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/np92/suppressed()) for(var/i = 1 to storage_slots - 1) - new /obj/item/ammo_magazine/pistol/c99(src) + new /obj/item/ammo_magazine/pistol/np92/suppressed(src) -/obj/item/storage/belt/gun/type47/PK9/tranq/fill_preset_inventory() - handle_item_insertion(new /obj/item/weapon/gun/pistol/c99/upp/tranq()) +/obj/item/storage/belt/gun/type47/t73/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/t73()) for(var/i = 1 to storage_slots - 1) - new /obj/item/ammo_magazine/pistol/c99/tranq(src) + new /obj/item/ammo_magazine/pistol/t73(src) -/obj/item/storage/belt/gun/type47/NY/fill_preset_inventory() - handle_item_insertion(new /obj/item/weapon/gun/revolver/nagant()) +/obj/item/storage/belt/gun/type47/t73/leader/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/t73/leader()) + for(var/i = 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/t73_impact(src) + +/obj/item/storage/belt/gun/type47/revolver/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/upp()) for(var/total_storage_slots in 1 to storage_slots - 1) new /obj/item/ammo_magazine/revolver/upp(src) -/obj/item/storage/belt/gun/type47/NY/shrapnel/fill_preset_inventory() - handle_item_insertion(new /obj/item/weapon/gun/revolver/nagant/shrapnel()) +/obj/item/storage/belt/gun/type47/revolver/shrapnel/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/revolver/upp/shrapnel()) for(var/total_storage_slots in 1 to storage_slots - 1) new /obj/item/ammo_magazine/revolver/upp/shrapnel(src) @@ -1752,3 +1765,52 @@ item_state = "souto_man[length(contents)]" if(istype(user)) user.update_inv_belt() //Makes sure the onmob updates. + + + +//ROYAL MARINES COMMNADO + +/obj/item/storage/belt/marine/rmc + name = "\improper L70 pattern ammo load rig" + desc = "Good for carrying around extra ammo in the heat of the jungle. Made of special rot-resistant fabric." + icon_state = "rmc_ammo" + item_state = "rmc_ammo" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + has_gamemode_skin = FALSE + +/obj/item/storage/belt/marine/rmc/rmc_f90_ammo/fill_preset_inventory() + for(var/i in 1 to storage_slots) + new /obj/item/ammo_magazine/rifle/rmc_f90(src) + +/obj/item/storage/belt/marine/rmc/rmc_f90_ammo/marksman/fill_preset_inventory() + for(var/i in 1 to storage_slots) + new /obj/item/ammo_magazine/rifle/rmc_f90/marksman(src) + +/obj/item/storage/belt/medical/rmc + name = "\improper L75 pattern medical storage rig" + desc = "The L75 is the standard load-bearing equipment of the RMC. It consists of a modular belt with various clips. This version is designed to transport medical supplies and pistol ammunition. \nRight click its sprite and click \"toggle belt mode\" to take pills out of bottles by simply clicking them." + icon_state = "rmc_medical" + item_state = "rmc_medical" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + +/obj/item/storage/belt/gun/l905 + name = "\improper L905 gunbelt" + desc = "Finely-tooled leather, a L905, and six magazines. More than enough for the standard RMC commando." + icon_state = "rmc_pistol" + item_state = "rmc_pistol" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + storage_slots = 7 + can_hold = list( + /obj/item/weapon/gun/pistol/vp78, + /obj/item/ammo_magazine/pistol/vp78, + ) + has_gamemode_skin = FALSE + holster_slots = list( + "1" = list( + "icon_x" = -1, + "icon_y" = -3)) + +/obj/item/storage/belt/gun/l905/full/fill_preset_inventory() + handle_item_insertion(new /obj/item/weapon/gun/pistol/vp78()) + for(var/i in 1 to storage_slots - 1) + new /obj/item/ammo_magazine/pistol/vp78(src) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 50a6cc92cb5f..afeaff89ae07 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -51,6 +51,7 @@ /obj/item/storage/lockbox/loyalty name = "\improper Wey-Yu equipment lockbox" + req_access = null req_one_access = list(ACCESS_WY_EXEC, ACCESS_WY_SECURITY) /obj/item/storage/lockbox/loyalty/fill_preset_inventory() diff --git a/code/game/objects/items/storage/misc.dm b/code/game/objects/items/storage/misc.dm index eb6f100f6e8b..424a4f5be0e8 100644 --- a/code/game/objects/items/storage/misc.dm +++ b/code/game/objects/items/storage/misc.dm @@ -124,6 +124,20 @@ new /obj/item/weapon/gun/pistol/clfpistol(src) new /obj/item/ammo_magazine/pistol/clfpistol(src) +/obj/item/storage/box/upp //war trophy luger + name = "Type 73 storing case" + desc = "A small case containing the once-standard sidearm of the UPP, the Type 73, and two additional magazines. The contained sidearm is probably looted off a dead officer or from a captured stockpile, either way this thing is worth a pretty penny." + icon = 'icons/obj/items/storage.dmi' + icon_state = "matebacase" + w_class = SIZE_MEDIUM + max_w_class = SIZE_MEDIUM + storage_slots = 3 + +/obj/item/storage/box/upp/fill_preset_inventory() + new /obj/item/weapon/gun/pistol/t73(src) + new /obj/item/ammo_magazine/pistol/t73(src) + new /obj/item/ammo_magazine/pistol/t73(src) + /obj/item/storage/box/co2_knife name = "M8 cartridge bayonet packaging" desc = "Contains one M8 Cartridge Bayonet and two sister CO2 cartridges. Thanks for being a dedicated Boots magazine subscriber!" diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index 6397c33b76c1..b43ce5c47479 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -205,13 +205,13 @@ desc = "Contains a painkiller autoinjector, first-aid autoinjector, some ointment, and some bandages." /obj/item/storage/pouch/firstaid/full/fill_preset_inventory() - new /obj/item/reagent_container/hypospray/autoinjector/bicaridine/skillless(src) - new /obj/item/reagent_container/hypospray/autoinjector/kelotane/skillless(src) - new /obj/item/reagent_container/hypospray/autoinjector/tramadol/skillless(src) - new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless(src) + new /obj/item/reagent_container/hypospray/autoinjector/bicaridine(src) + new /obj/item/reagent_container/hypospray/autoinjector/kelotane(src) + new /obj/item/reagent_container/hypospray/autoinjector/tramadol(src) + new /obj/item/reagent_container/hypospray/autoinjector/emergency(src) /obj/item/storage/pouch/firstaid/full/alternate/fill_preset_inventory() - new /obj/item/reagent_container/hypospray/autoinjector/tricord/skillless(src) + new /obj/item/reagent_container/hypospray/autoinjector/tricord(src) new /obj/item/stack/medical/splint(src) new /obj/item/stack/medical/ointment(src) new /obj/item/stack/medical/bruise_pack(src) @@ -231,7 +231,7 @@ new /obj/item/reagent_container/hypospray/autoinjector/bicaridine/skillless(src) new /obj/item/reagent_container/hypospray/autoinjector/kelotane/skillless(src) new /obj/item/reagent_container/hypospray/autoinjector/tramadol/skillless(src) - new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless(src) + new /obj/item/reagent_container/hypospray/autoinjector/emergency(src) new /obj/item/stack/medical/bruise_pack(src) @@ -906,6 +906,9 @@ update_icon() /obj/item/storage/pouch/pressurized_reagent_canister/afterattack(obj/target, mob/user, flag) //refuel at fueltanks & chem dispensers. + if(get_dist(user,target) > 1) + return ..() + if(!inner) to_chat(user, SPAN_WARNING("[src] has no internal container!")) return ..() @@ -925,8 +928,7 @@ if(!istype(target, /obj/structure/reagent_dispensers/fueltank)) return ..() - if(get_dist(user,target) > 1) - return ..() + var/obj/O = target if(!O.reagents || O.reagents.reagent_list.len < 1) diff --git a/code/game/objects/items/storage/smartpack.dm b/code/game/objects/items/storage/smartpack.dm index 8d6057e16ce9..8df079c92ca4 100644 --- a/code/game/objects/items/storage/smartpack.dm +++ b/code/game/objects/items/storage/smartpack.dm @@ -22,9 +22,6 @@ var/show_exoskeleton = TRUE - var/flashlight_cooldown = 0 //Cooldown for toggling the light - var/light_state = FALSE //Is the light on or off - var/battery_charge = SMARTPACK_MAX_POWER_STORED //How much power are we storing var/activated_form = FALSE var/immobile_form = FALSE @@ -83,7 +80,7 @@ else LAZYSET(item_state_slots, WEAR_BACK, initial(item_state)) - if(light_state) + if(light_on) overlays += "+lamp_on" else overlays += "+lamp_off" @@ -116,7 +113,7 @@ var/image/ret = ..() var/light = "+lamp_on" - if(!light_state) + if(!light_on) light = "+lamp_off" var/image/lamp = overlay_image('icons/mob/humans/onmob/back.dmi', light, color, RESET_COLOR) @@ -134,17 +131,14 @@ else to_chat(M, SPAN_DANGER("[name] beeps, \"Unathorized user!\"")) - if(light_state && loc != M) - M.SetLuminosity(BACKPACK_LIGHT_LEVEL, FALSE, src) - SetLuminosity(0) ..() /obj/item/storage/backpack/marine/smartpack/dropped(mob/living/M) for(var/datum/action/human_action/smartpack/S in M.actions) S.remove_from(M) - if(light_state && loc != M) - toggle_light(M) + if(light_on && loc != M) + turn_light(M, toggle_on = FALSE) if(immobile_form) immobile_form = FALSE @@ -153,47 +147,34 @@ M.unfreeze() ..() -/obj/item/storage/backpack/marine/smartpack/Destroy() - if(ismob(loc)) - loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - . = ..() - /obj/item/storage/backpack/marine/smartpack/attack_self(mob/user) ..() - if(!isturf(user.loc) || flashlight_cooldown > world.time || !ishuman(user)) + if(!isturf(user.loc) || !ishuman(user)) return var/mob/living/carbon/human/H = user if(H.back != src) return - toggle_light(user) + turn_light(user, toggle_on = !light_on) return TRUE -/obj/item/storage/backpack/marine/smartpack/proc/toggle_light(mob/user) - flashlight_cooldown = world.time + 20 //2 seconds cooldown every time the light is toggled - if(light_state) //Turn it off. - if(user) - user.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - playsound(src, 'sound/handling/click_2.ogg', 50, TRUE) - else //Turn it on. - if(user) - user.SetLuminosity(BACKPACK_LIGHT_LEVEL, FALSE, src) - else - SetLuminosity(BACKPACK_LIGHT_LEVEL) +/obj/item/storage/backpack/marine/smartpack/turn_light(mob/user, toggle_on, cooldown, sparks, forced, light_again) + . = ..() + if(. != CHECKS_PASSED) + return - light_state = !light_state + if(toggle_on) + set_light_range(BACKPACK_LIGHT_LEVEL) + set_light_on(TRUE) + else + set_light_on(FALSE) + playsound(src, 'sound/handling/click_2.ogg', 50, TRUE) playsound(src, 'sound/handling/light_on_1.ogg', 50, TRUE) - update_icon(user) - /obj/item/storage/backpack/marine/smartpack/proc/protective_form(mob/living/carbon/human/user) if(!istype(user) || activated_form || immobile_form) return diff --git a/code/game/objects/items/tools/flame_tools.dm b/code/game/objects/items/tools/flame_tools.dm index 6ebd8ee5982e..862906ec1971 100644 --- a/code/game/objects/items/tools/flame_tools.dm +++ b/code/game/objects/items/tools/flame_tools.dm @@ -42,10 +42,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/tool/candle/Destroy() if(heat_source) STOP_PROCESSING(SSobj, src) - if(ismob(src.loc)) - src.loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) + . = ..() /obj/item/tool/candle/attackby(obj/item/W as obj, mob/user as mob) @@ -65,7 +62,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM flavor_text = SPAN_NOTICE("[usr] lights [src].") for(var/mob/O in viewers(usr, null)) O.show_message(flavor_text, SHOW_MESSAGE_VISIBLE) - SetLuminosity(CANDLE_LUM) + set_light(CANDLE_LUM) update_icon() START_PROCESSING(SSobj, src) @@ -80,34 +77,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM return update_icon() - - /obj/item/tool/candle/attack_self(mob/user) ..() if(heat_source) heat_source = 0 update_icon() - SetLuminosity(0) - user.SetLuminosity(0, FALSE, src) + set_light(0) STOP_PROCESSING(SSobj, src) - -/obj/item/tool/candle/pickup(mob/user) - . = ..() - if(heat_source) - SetLuminosity(0) - user.SetLuminosity(CANDLE_LUM, FALSE, src) - - -/obj/item/tool/candle/dropped(mob/user) - ..() - if(heat_source && src.loc != user) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(CANDLE_LUM) - - - /////////// //MATCHES// /////////// @@ -120,6 +98,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/smoketime = 10 SECONDS var/burnt_name = "burnt match" w_class = SIZE_TINY + light_range = 2 + light_power = 1 attack_verb = list("burnt", "singed") @@ -149,6 +129,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM burn_out(user) return ..() +/obj/item/tool/match/turn_light(mob/user, toggle_on) + . = ..() + if(. == NO_LIGHT_STATE_CHANGE) + return + + set_light_on(toggle_on) + /obj/item/tool/match/proc/light_match() if(heat_source || burnt) return @@ -156,10 +143,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM playsound(src.loc,"match",15, 1, 3) damtype = "burn" icon_state = "[initial(icon_state)]_lit" - if(ismob(loc)) - loc.SetLuminosity(2, FALSE, src) - else - SetLuminosity(2) + turn_light(toggle_on = TRUE) START_PROCESSING(SSobj, src) update_icon() return TRUE @@ -170,32 +154,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM damtype = "brute" icon_state = "[initial(icon_state)]_burnt" item_state = "cigoff" - SetLuminosity(0) + turn_light(toggle_on = FALSE) name = burnt_name desc = "A match. This one has seen better days." STOP_PROCESSING(SSobj, src) - if(user) - user.SetLuminosity(0, FALSE, src) - return - - if(ismob(loc)) - user = loc - user.SetLuminosity(0, FALSE, src) - return - /obj/item/tool/match/paper name = "paper match" desc = "A simple match stick, used for lighting fine smokables." icon_state = "papermatch" burnt_name = "burnt paper match" -/obj/item/tool/lighter/dropped(mob/user) - if(heat_source && src.loc != user) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(2) - return ..() - ////////////////// //FINE SMOKABLES// ////////////////// @@ -211,6 +180,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM flags_atom = CAN_BE_SYRINGED attack_verb = list("burnt", "singed") blood_overlay_type = "" + light_color = LIGHT_COLOUR_ORANGE /// Note - these are in masks.dmi not in cigarette.dmi var/icon_on = "cigon" var/icon_off = "cigoff" @@ -339,6 +309,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.handle_reactions() icon_state = icon_on item_state = icon_on + set_light_range(1) + set_light_power(0.5) + set_light_on(TRUE) if(iscarbon(loc)) var/mob/living/carbon/C = loc if(C.r_hand == src) @@ -372,7 +345,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return var/mob/living/carbon/C = loc - if(prob(15)) // so it's not an instarape in case of acid + if(prob(15)) reagents.reaction(C, INGEST) reagents.trans_to(C, REAGENTS_METABOLISM) else // else just remove some of the reagents @@ -404,6 +377,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM qdel(src) . = butt else + set_light_on(FALSE) heat_source = 0 icon_state = icon_off item_state = icon_off @@ -679,6 +653,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon = 'icons/obj/items/items.dmi' icon_state = "lighter_g" item_state = "lighter_g" + light_color = LIGHT_COLOUR_LAVA var/icon_on = "lighter_g_on" var/icon_off = "lighter_g" var/clr = "g" @@ -732,13 +707,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_off = "lighter_[clr]" icon_state = icon_off -/obj/item/tool/lighter/Destroy() - if(ismob(src.loc)) - src.loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - . = ..() - /obj/item/tool/lighter/attack_self(mob/living/user) if(user.r_hand == src || user.l_hand == src) if(!heat_source) @@ -761,7 +729,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.apply_damage(2,BURN,"r_hand") user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")) - user.SetLuminosity(2, FALSE, src) + set_light_range(2) + set_light_on(TRUE) START_PROCESSING(SSobj, src) else turn_off(user, 0) @@ -781,7 +750,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else bearer.visible_message(SPAN_NOTICE("[bearer] quietly shuts off the [src].")) - bearer.SetLuminosity(0, FALSE, src) + set_light_on(FALSE) STOP_PROCESSING(SSobj, src) return 1 return 0 @@ -805,18 +774,3 @@ CIGARETTE PACKETS ARE IN FANCY.DM else ..() -/obj/item/tool/lighter/process() - - -/obj/item/tool/lighter/pickup(mob/user) - . = ..() - if(heat_source) - SetLuminosity(0) - user.SetLuminosity(2, FALSE, src) - - -/obj/item/tool/lighter/dropped(mob/user) - if(heat_source && src.loc != user) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(2) - return ..() diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm index b8affb0de616..65e8f2986679 100644 --- a/code/game/objects/items/tools/maintenance_tools.dm +++ b/code/game/objects/items/tools/maintenance_tools.dm @@ -175,6 +175,9 @@ inherent_traits = list(TRAIT_TOOL_BLOWTORCH) + light_range = 2 + light_power = 2 + //blowtorch specific stuff /// Whether or not the blowtorch is off(0), on(1) or currently welding(2) @@ -191,13 +194,8 @@ reagents.add_reagent("fuel", max_fuel) return - /obj/item/tool/weldingtool/Destroy() if(welding) - if(ismob(loc)) - loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) STOP_PROCESSING(SSobj, src) . = ..() @@ -205,8 +203,6 @@ . = ..() . += "It contains [get_fuel()]/[max_fuel] units of fuel!" - - /obj/item/tool/weldingtool/process() if(QDELETED(src)) STOP_PROCESSING(SSobj, src) @@ -218,7 +214,6 @@ else //should never be happening, but just in case toggle(TRUE) - /obj/item/tool/weldingtool/attack(mob/target, mob/user) if(ishuman(target)) @@ -285,6 +280,13 @@ ..() toggle() +/obj/item/tool/weldingtool/turn_light(mob/user, toggle_on) + . = ..() + if(. == NO_LIGHT_STATE_CHANGE) + return + + set_light_on(toggle_on) + //Returns the amount of fuel in the welder /obj/item/tool/weldingtool/proc/get_fuel() if(!reagents) @@ -330,9 +332,7 @@ welding = 1 if(M) to_chat(M, SPAN_NOTICE("You switch [src] on.")) - M.SetLuminosity(2, FALSE, src) - else - SetLuminosity(2) + turn_light((M ? M : null), toggle_on = TRUE) weld_tick += 8 //turning the tool on does not consume fuel directly, but it advances the process that regularly consumes fuel. force = 15 damtype = "fire" @@ -357,13 +357,13 @@ to_chat(M, SPAN_NOTICE("You switch [src] off.")) else to_chat(M, SPAN_WARNING("[src] shuts off!")) - M.SetLuminosity(0, FALSE, src) if(M.r_hand == src) M.update_inv_r_hand() if(M.l_hand == src) M.update_inv_l_hand() - else - SetLuminosity(0) + + turn_light((M ? M : null), toggle_on = FALSE) + STOP_PROCESSING(SSobj, src) //Decides whether or not to damage a player's eyes based on what they're wearing as protection @@ -380,22 +380,27 @@ if(E.robotic == ORGAN_ROBOT) return switch(safety) - if(1) + if(EYE_PROTECTION_FLASH) + to_chat(user, SPAN_DANGER("You see a bright light in the corner of your vision.")) + E.take_damage(rand(0, 1), TRUE) + if(E.damage > 10) + E.take_damage(rand(3, 5), TRUE) + if(EYE_PROTECTION_FLAVOR) to_chat(user, SPAN_DANGER("Your eyes sting a little.")) E.take_damage(rand(1, 2), TRUE) - if(E.damage > 12) - H.AdjustEyeBlur(3,6) - if(0) + if(E.damage > 8) // dont abuse your funny flavor glasses + E.take_damage(2, TRUE) + if(EYE_PROTECTION_NONE) to_chat(user, SPAN_WARNING("Your eyes burn.")) - E.take_damage(rand(2, 4), TRUE) + E.take_damage(rand(3, 4), TRUE) if(E.damage > 10) E.take_damage(rand(4, 10), TRUE) - if(-1) + if(EYE_PROTECTION_NEGATIVE) to_chat(user, SPAN_WARNING("Your thermals intensify [src]'s glow. Your eyes itch and burn severely.")) H.AdjustEyeBlur(12,20) E.take_damage(rand(12, 16), TRUE) - if(safety < 2) + if(safety < EYE_PROTECTION_WELDING) if (E.damage >= E.min_broken_damage) to_chat(H, SPAN_WARNING("You go blind! Maybe welding without protection wasn't such a great idea...")) return FALSE @@ -406,20 +411,6 @@ to_chat(H, SPAN_WARNING("Your eyes are really starting to hurt. This can't be good for you!")) return FALSE -/obj/item/tool/weldingtool/pickup(mob/user) - . = ..() - if(welding) - SetLuminosity(0) - user.SetLuminosity(2, FALSE, src) - - -/obj/item/tool/weldingtool/dropped(mob/user) - if(welding && loc != user) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(2) - return ..() - - /obj/item/tool/weldingtool/largetank name = "industrial blowtorch" max_fuel = 40 @@ -732,7 +723,7 @@ Welding backpack else . += "No punctures are seen on \the [src] upon closer inspection." -/obj/item/tool/weldpack/bullet_act(obj/item/projectile/P) +/obj/item/tool/weldpack/bullet_act(obj/projectile/P) var/damage = P.damage health -= damage ..() diff --git a/code/game/objects/items/weapons/blades.dm b/code/game/objects/items/weapons/blades.dm index dccbf56049e0..4b4b31539064 100644 --- a/code/game/objects/items/weapons/blades.dm +++ b/code/game/objects/items/weapons/blades.dm @@ -32,6 +32,23 @@ icon_state = "machete" w_class = SIZE_LARGE +/obj/item/weapon/claymore/mercsword/machete/attack_self(mob/user) + if(user.action_busy) + return + + var/turf/root = get_turf(user) + var/facing = user.dir + var/turf/in_front = get_step(root, facing) + + // We check the tile in front of us, if it has flora that can be cut we will attempt to cut it + for(var/obj/structure/flora/target in in_front) + if(target.cut_level > 1) + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + target.attackby(src, user) + + return ..() + /obj/item/weapon/claymore/mercsword/machete/arnold name = "\improper M2100 \"Ngájhe\" machete" desc = "An older issue USCM machete, never left testing. Designed in the Central African Republic. The notching made it hard to clean, and as such the USCM refused to adopt it - despite the superior bludgeoning power offered. Difficult to carry with the usual kit." diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index 26a0a59b8090..d46619e581e9 100644 --- a/code/game/objects/items/weapons/misc.dm +++ b/code/game/objects/items/weapons/misc.dm @@ -27,7 +27,7 @@ edge = 0 var/icon/broken_outline = icon('icons/obj/items/drinks.dmi', "broken") -/obj/item/weapon/broken_bottle/bullet_act(obj/item/projectile/P) +/obj/item/weapon/broken_bottle/bullet_act(obj/projectile/P) . = ..() new/obj/item/shard(src.loc) new/obj/item/shard(src.loc) @@ -50,7 +50,7 @@ edge = 0 var/icon/broken_outline = icon('icons/obj/items/drinks.dmi', "broken") -/obj/item/weapon/broken_glass/bullet_act(obj/item/projectile/P) +/obj/item/weapon/broken_glass/bullet_act(obj/projectile/P) . = ..() new/obj/item/shard(src.loc) new/obj/item/shard(src.loc) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 80af739a2410..20bf8ac951e9 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -71,6 +71,10 @@ throw_range = 4 w_class = SIZE_LARGE matter = list("glass" = 7500, "metal" = 1000) + item_icons = list( + WEAR_L_HAND = 'icons/mob/humans/onmob/items_lefthand_1.dmi', + WEAR_R_HAND = 'icons/mob/humans/onmob/items_righthand_1.dmi' + ) attack_verb = list("shoved", "bashed") var/cooldown = 0 //shield bash cooldown. based on world.time @@ -108,3 +112,22 @@ attack_verb = list("shoved", "bashed") var/active = 0 + +/obj/item/weapon/shield/riot/metal + name = "metal shield" + name = "A metal riot shield effective, but heavy." + icon_state = "riotmetal" + item_state = "riotmetal" + base_icon_state = "riotmetal" + passive_block = 40 + readied_block = 60 + +/obj/item/weapon/shield/riot/ballistic //FOR THE ROYAL MARINE SPEC DO NOT TOUCH SMELLY MAN + name = "FBS-B Ballistic shield" + desc = "Ballistic shield used by the royal marines commando. This shield is commonly used during boarding actions due to its lightweight but durible design." + desc_lore = "The Fox Ballistic Shield-B (FBS-B), was originally introduced as the FBS, attempting to be a solution to high-impact operations following increased counter-insurgency deployments since 2151. It was designed to provide maximum protection, and for the user to be able to utilize their primary armament in tandem. By 2163 tertiary ballistics trials were undertaken to ascertain it's effectiveness against improved munitions, and was additionally used as an opportunity to deal with user complaints making their way up from quartermasters. The complaints of the original FBS were twofold: weight and extended usage in combat causing the side to melt closest to the barrel. After further material research and in the field tests were conducted, by 2171, the FBS had attained a ballistics protection classification of D, the highest available for a portable shield, by being able to stop a singular armor piercing round. This reported success was due to the usage of a new fibre reinforced lightweight composite. In the wake of the successful improvements, the FBS was later christened the FBS-B as with the enhanced shield, the user had a tendency for maximum aggression during engagements. The nickname 'Bellicose' was given to breachers by their squaddies and later became it's official designation." + icon_state = "ballisticshield" + item_state = "ballisticshield" + base_icon_state = "ballisticshield" + passive_block = 60 + readied_block = 90 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 24f019b9f89f..184fc51bd507 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -42,7 +42,7 @@ if(garbage) add_to_garbage(src) -/obj/Destroy() +/obj/Destroy(force) if(buckled_mob) unbuckle() . = ..() @@ -353,7 +353,7 @@ return ..() -/obj/bullet_act(obj/item/projectile/P) +/obj/bullet_act(obj/projectile/P) //Tasers and the like should not damage objects. if(P.ammo.damage_type == HALLOSS || P.ammo.damage_type == TOX || P.ammo.damage_type == CLONE || P.damage == 0) return 0 diff --git a/code/game/objects/shrapnel.dm b/code/game/objects/shrapnel.dm index 23fff8cbd906..d201584c7f3a 100644 --- a/code/game/objects/shrapnel.dm +++ b/code/game/objects/shrapnel.dm @@ -29,7 +29,7 @@ for(var/i=0;i= EXPLOSION_THRESHOLD_VLOW) deconstruct(FALSE) -/obj/structure/flora/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/flora/get_projectile_hit_boolean(obj/projectile/P) . = ..() return FALSE @@ -603,11 +603,7 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE. name = "strange tree" desc = "Some kind of bizarre alien tree. It oozes with a sickly yellow sap." icon_state = "alienplant1" - luminosity = 2 - -/obj/structure/flora/jungle/alienplant1/Destroy() - SetLuminosity(0) - return ..() + light_range = 2 /obj/structure/flora/jungle/planttop1 name = "strange tree" @@ -633,15 +629,15 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE. /obj/structure/flora/jungle/vines/light_1 icon_state = "light_1" - icon_tag = "light_1" + icon_tag = "light" /obj/structure/flora/jungle/vines/light_2 icon_state = "light_2" - icon_tag = "light_2" + icon_tag = "light" /obj/structure/flora/jungle/vines/light_3 icon_state = "light_3" - icon_tag = "light_3" + icon_tag = "light" //heavy hide you /obj/structure/flora/jungle/vines/heavy diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d014ebfe3b94..e719359ab439 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -316,7 +316,7 @@ return FALSE -/obj/structure/girder/bullet_act(obj/item/projectile/P) +/obj/structure/girder/bullet_act(obj/projectile/P) //Tasers and the like should not damage girders. if(P.ammo.damage_type == HALLOSS || P.ammo.damage_type == TOX || P.ammo.damage_type == CLONE || P.damage == 0) return FALSE diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 5386e50bc9f3..0f864ee2f116 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -101,12 +101,12 @@ /obj/structure/grille/BlockedPassDirs(atom/movable/mover, target_dir) - if(istype(mover, /obj/item/projectile) && prob(90)) + if(istype(mover, /obj/projectile) && prob(90)) return NO_BLOCKED_MOVEMENT return ..() -/obj/structure/grille/bullet_act(obj/item/projectile/Proj) +/obj/structure/grille/bullet_act(obj/projectile/Proj) //Tasers and the like should not damage grilles. if(Proj.ammo.damage_type == HALLOSS) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 1c7f616f52cb..c67c7381f723 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -44,7 +44,7 @@ health = 50 var/deflated = FALSE -/obj/structure/inflatable/bullet_act(obj/item/projectile/Proj) +/obj/structure/inflatable/bullet_act(obj/projectile/Proj) health -= Proj.damage ..() if(health <= 0 && !deflated) diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index dd9a0c19db9b..fbae7a387a63 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -26,7 +26,7 @@ deconstruct(FALSE) -/obj/structure/lamarr/bullet_act(obj/item/projectile/Proj) +/obj/structure/lamarr/bullet_act(obj/projectile/Proj) health -= Proj.damage ..() src.healthcheck() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 5d0d61e59862..21d66efce270 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -167,11 +167,7 @@ /obj/structure/mineral_door/uranium mineralType = "uranium" hardness = 3 - luminosity = 2 - -/obj/structure/mineral_door/uranium/Destroy() - SetLuminosity(0) - . = ..() + light_range = 2 /obj/structure/mineral_door/sandstone mineralType = "sandstone" diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 5660f342f90b..a8d76843313a 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -89,7 +89,7 @@ shard_target.take_damage(15) -/obj/structure/mirror/bullet_act(obj/item/projectile/Proj) +/obj/structure/mirror/bullet_act(obj/projectile/Proj) if(prob(Proj.damage * 2)) if(!shattered) shatter() diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index 9323bca2877e..d290925d4cdf 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -12,7 +12,7 @@ if (PF) PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY -/obj/structure/showcase/bullet_act(obj/item/projectile/P) +/obj/structure/showcase/bullet_act(obj/projectile/P) var/damage = P.damage health -= damage ..() diff --git a/code/game/objects/structures/pipes/vents/vents.dm b/code/game/objects/structures/pipes/vents/vents.dm index 2b3d5409dc8a..298fbc57f4ad 100644 --- a/code/game/objects/structures/pipes/vents/vents.dm +++ b/code/game/objects/structures/pipes/vents/vents.dm @@ -18,8 +18,6 @@ . = ..() initial_loc = get_area(loc) - if(initial_loc.master) - initial_loc = initial_loc.master area_uid = initial_loc.uid if(!id_tag) assign_uid() @@ -130,6 +128,32 @@ initial_loc.air_vent_names -= id_tag . = ..() +/obj/structure/pipes/vents/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION(VV_HK_GAS, "Release Gas") + +/obj/structure/pipes/vents/vv_do_topic(list/href_list) + . = ..() + var/mob/user = usr + if(href_list[VV_HK_GAS] && check_rights(R_EVENT)) + if(welded) + to_chat(usr, SPAN_WARNING("You cannot release gas from a welded vent.")) + return FALSE + var/list/options = list(VENT_GAS_SMOKE, VENT_GAS_CN20, VENT_GAS_CN20_XENO) + var/gas_choice = tgui_input_list(user, "What gas do you wish to use?", "Gas Choice", options, 20 SECONDS) + if(!gas_choice) + return FALSE + var/radius_choice = tgui_input_number(user, "What radius do you wish to use?", "Gas Radius", 4, 10, 1, 20 SECONDS) + var/warn_choice = tgui_input_number(user, "How many seconds warning do you wish to give?", "Release Warning", 5, 30, 1, 20 SECONDS) + warn_choice = warn_choice SECONDS + + var/confirm = alert(user, "Confirm gas setup. \n\nGas: '[gas_choice]'\nRadius: '[radius_choice]'\nWarn Time: '[warn_choice / 10] seconds' \n\n Is this correct?", "Confirmation", "Yes", "No") + if(confirm != "Yes") + return FALSE + log_admin("[key_name(user)] released gas (Gas: [gas_choice], Radius: [radius_choice], Delay: [warn_choice]) from [name] at X[x], Y[y], Z[z].") + create_gas(gas_choice, radius_choice, warn_choice) + return TRUE + /obj/structure/pipes/vents/proc/create_gas(gas_type = VENT_GAS_SMOKE, radius = 4, warning_time = 5 SECONDS) if(welded) to_chat(usr, SPAN_WARNING("You cannot release gas from a welded vent.")) @@ -140,6 +164,8 @@ spreader = new /datum/effect_system/smoke_spread/bad if(VENT_GAS_CN20) spreader = new /datum/effect_system/smoke_spread/cn20 + if(VENT_GAS_CN20_XENO) + spreader = new /datum/effect_system/smoke_spread/cn20/xeno if(!spreader) return FALSE gas_holder = spreader diff --git a/code/game/objects/structures/props.dm b/code/game/objects/structures/props.dm index 66598d602691..3e3150040cb6 100644 --- a/code/game/objects/structures/props.dm +++ b/code/game/objects/structures/props.dm @@ -33,10 +33,10 @@ /obj/structure/prop/dam/drill/proc/update() icon_state = "thumper[on ? "-on" : ""]" if(on) - SetLuminosity(3) + set_light(3) playsound(src, 'sound/machines/turbine_on.ogg') else - SetLuminosity(0) + set_light(0) playsound(src, 'sound/machines/turbine_off.ogg') return @@ -114,9 +114,9 @@ underlays += "shadow[lit ? "-lit" : ""]" icon_state = "torii[lit ? "-lit" : ""]" if(lit) - SetLuminosity(6) + set_light(6) else - SetLuminosity(0) + set_light(0) return /obj/structure/prop/dam/torii/attack_hand(mob/user as mob) @@ -510,10 +510,10 @@ /obj/structure/prop/turbine/proc/Update() icon_state = "biomass_turbine[on ? "-on" : ""]" if (on) - SetLuminosity(3) + set_light(3) playsound(src, 'sound/machines/turbine_on.ogg') else - SetLuminosity(0) + set_light(0) playsound(src, 'sound/machines/turbine_off.ogg') return @@ -650,12 +650,19 @@ icon_state = "brazier" density = TRUE health = 150 - luminosity = 6 + light_range = 6 + light_on = TRUE /// What obj this becomes when it gets to its next stage of construction / ignition var/frame_type /// What is used to progress to the next stage var/state = STATE_COMPLETE +/obj/structure/prop/brazier/Initialize() + . = ..() + + if(!light_on) + set_light(0) + /obj/structure/prop/brazier/get_examine_text(mob/user) . = ..() switch(state) @@ -686,20 +693,11 @@ new frame_type(loc) qdel(src) -/obj/structure/prop/brazier/Destroy() - SetLuminosity(0) - return ..() - -/obj/structure/prop/brazier/Initialize() - . = ..() - if(luminosity) - SetLuminosity(luminosity) - /obj/structure/prop/brazier/frame name = "empty brazier" desc = "An empty brazier." icon_state = "brazier_frame" - luminosity = 0 + light_on = FALSE frame_type = /obj/structure/prop/brazier/frame/full state = STATE_FUEL @@ -715,7 +713,7 @@ desc = "It's a torch." icon_state = "torch" density = FALSE - luminosity = 5 + light_range = 5 /obj/structure/prop/brazier/frame/full/torch name = "unlit torch" @@ -840,7 +838,6 @@ addtimer(CALLBACK(src, PROC_REF(fuel_drain), TRUE), fuel_stage_time) /obj/structure/prop/brazier/campfire/Destroy() - SetLuminosity(0) STOP_PROCESSING(SSobj, src) return ..() @@ -979,6 +976,13 @@ icon_state = "crawler" density = TRUE +/obj/structure/prop/vehicles/tank/twe + name = "\improper FV150 Shobo MKII" + desc = "The FV150 Shobo MKII is a Combat Reconnaissance Vehicle Tracked, abbreviated to CVR(T) in official documentation. It was co-developed in 2175 by Weyland-Yutani and Gallar Co., a Titan based heavy vehicle manufacturer. Taking into account lessons learned from the MkI's performance in the Australian Wars, major structual changes were made, and the MKII went into production in 2178. It is armed with a twin 30mm cannon and a L56A2 10x28mm coaxial, complimented by its ammunition stores of 170 rounds of 30mm and 1600 rounds of 10x28mm. The maximum speed of the Shobo is 60 mph, but on a standard deployment after the ammo stores are fully loaded and the terrain is taken into account, it consistently sits at 55mph." + icon = 'icons/obj/vehicles/twe_tank.dmi' + icon_state = "twe_tank" + density = TRUE + //overhead prop sets /obj/structure/prop/invuln/overhead @@ -1119,7 +1123,8 @@ icon = 'icons/effects/fire.dmi' icon_state = "dynamic_2" layer = MOB_LAYER - luminosity = 3 + light_range = 3 + light_on = TRUE /obj/structure/prop/invuln/fusion_reactor name = "\improper S-52 fusion reactor" @@ -1338,7 +1343,7 @@ attacked() return ..() -/obj/structure/prop/invuln/joey/bullet_act(obj/item/projectile/P) +/obj/structure/prop/invuln/joey/bullet_act(obj/projectile/P) attacked() return ..() diff --git a/code/game/objects/structures/props/requests_console.dm b/code/game/objects/structures/props/requests_console.dm index 95311bce9bad..7c4dd0b42992 100644 --- a/code/game/objects/structures/props/requests_console.dm +++ b/code/game/objects/structures/props/requests_console.dm @@ -4,7 +4,6 @@ anchored = TRUE icon = 'icons/obj/structures/machinery/terminals.dmi' icon_state = "req_comp0" - luminosity = 0 /obj/structure/machinery/requests_console/power_change() ..() diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index f20a7cfc25d6..7dc6d883a2d5 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -68,7 +68,7 @@ if(health <= 0) deconstruct(FALSE) -/obj/structure/reagent_dispensers/bullet_act(obj/item/projectile/Proj) +/obj/structure/reagent_dispensers/bullet_act(obj/projectile/Proj) health -= Proj.damage if(Proj.firer) msg_admin_niche("[key_name_admin(Proj.firer)] fired a projectile at [name] in [loc.loc.name] ([loc.x],[loc.y],[loc.z]) [ADMIN_JMP(loc)].") @@ -296,7 +296,7 @@ return ..() -/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj) +/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/projectile/Proj) if(exploding) return 0 if(ismob(Proj.firer)) source_mob = WEAKREF(Proj.firer) diff --git a/code/game/objects/structures/stool_bed_chair_nest/janicart.dm b/code/game/objects/structures/stool_bed_chair_nest/janicart.dm index ba5e46a2ce7a..15baa15aa1a4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/janicart.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/janicart.dm @@ -103,7 +103,7 @@ buckled_mob.pixel_y = 7 -/obj/structure/bed/chair/janicart/bullet_act(obj/item/projectile/Proj) +/obj/structure/bed/chair/janicart/bullet_act(obj/projectile/Proj) if(buckled_mob) if(prob(85)) return buckled_mob.bullet_act(Proj) diff --git a/code/game/objects/structures/vulture_spotter.dm b/code/game/objects/structures/vulture_spotter.dm new file mode 100644 index 000000000000..a668cb562028 --- /dev/null +++ b/code/game/objects/structures/vulture_spotter.dm @@ -0,0 +1,305 @@ +/obj/structure/vulture_spotter_tripod + name = "\improper M707 spotting tripod" + desc = "A tripod for an M707 anti-materiel rifle's spotting scope." + icon_state = "vulture_tripod" + density = TRUE + anchored = TRUE + unacidable = TRUE + /// Weakref to the associated rifle + var/datum/weakref/bound_rifle + /// Weakref to the scope user, if any + var/datum/weakref/scope_user + /// If the tripod has an attached spotting scope + var/scope_attached = FALSE + /// If the scope is currently being used + var/scope_using = FALSE + /// Ref to the action to give the user of the scope + var/datum/action/vulture_tripod_unscope/unscope_action + /// How far out the scope zooms + var/scope_zoom = 10 + /// How much to increase the user's dark vision by + var/darkness_view = 12 + /// The maximum distance this can be from the sniper scope + var/max_sniper_distance = 7 + +/obj/structure/vulture_spotter_tripod/Initialize(mapload) + . = ..() + desc = initial(desc) + " Though, it doesn't seem to have one attached yet." + +/obj/structure/vulture_spotter_tripod/Destroy() + if(scope_user) + var/mob/user = scope_user.resolve() + user.unset_interaction() + QDEL_NULL(unscope_action) + return ..() + +/obj/structure/vulture_spotter_tripod/deconstruct(disassembled) + . = ..() + if(scope_attached && bound_rifle) + new /obj/item/device/vulture_spotter_scope(get_turf(src), bound_rifle) + new /obj/item/device/vulture_spotter_tripod(get_turf(src)) + +/obj/structure/vulture_spotter_tripod/get_examine_text(mob/user) + . = ..() + if(scope_attached) + . += SPAN_NOTICE("You can remove the scope from [src] with a screwdriver.") + else + . += SPAN_NOTICE("You can pick up [src] by dragging it to your sprite.") + . += SPAN_NOTICE("You can rotate [src] with Alt-click.") + +/obj/structure/vulture_spotter_tripod/attackby(obj/item/thing, mob/user) + if(istype(thing, /obj/item/device/vulture_spotter_scope)) + on_scope_attach(user, thing) + return + + if(HAS_TRAIT(thing, TRAIT_TOOL_SCREWDRIVER)) + on_screwdriver(user) + return + + return ..() + +/obj/structure/vulture_spotter_tripod/MouseDrop(over_object, src_location, over_location) + if(!ishuman(usr)) + return + var/mob/living/carbon/human/user = usr //this is us + + if(!HAS_TRAIT(user, TRAIT_VULTURE_USER)) + to_chat(user, SPAN_WARNING("You don't know how to use this!")) + return + + if(!scope_attached) + fold_up(user) + return + + try_scope(user) + +/obj/structure/vulture_spotter_tripod/on_set_interaction(mob/user) + var/obj/item/attachable/vulture_scope/scope = get_vulture_scope() + scope.spotter_spotting = TRUE + to_chat(scope.scope_user, SPAN_NOTICE("You notice that [scope] drifts less.")) + RegisterSignal(scope, COMSIG_VULTURE_SCOPE_MOVED, PROC_REF(on_vulture_move)) + RegisterSignal(scope, COMSIG_VULTURE_SCOPE_UNSCOPED, PROC_REF(on_vulture_unscope)) + if(user.client) + RegisterSignal(user.client, COMSIG_PARENT_QDELETING, PROC_REF(do_unscope)) + user.client.change_view(scope_zoom, src) + RegisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED), PROC_REF(do_unscope)) + user.see_in_dark += darkness_view + user.lighting_alpha = 127 + user.sync_lighting_plane_alpha() + user.overlay_fullscreen("vulture_spotter", /atom/movable/screen/fullscreen/vulture/spotter) + user.freeze() + user.status_flags |= IMMOBILE_ACTION + user.visible_message(SPAN_NOTICE("[user] looks through [src]."),SPAN_NOTICE("You look through [src], ready to go!")) + user.forceMove(loc) + user.setDir(dir) + scope_user = WEAKREF(user) + update_pixels(TRUE) + give_action(user, /datum/action/vulture_tripod_unscope, null, null, src) + set_scope_loc(user, scope) + +/obj/structure/vulture_spotter_tripod/on_unset_interaction(mob/user) + user.status_flags &= ~IMMOBILE_ACTION + user.visible_message(SPAN_NOTICE("[user] looks up from [src]."),SPAN_NOTICE("You look up from [src].")) + user.unfreeze() + user.reset_view(null) + user.Move(get_step(src, reverse_direction(src.dir))) + user.client?.change_view(world_view_size, src) + user.setDir(dir) //set the direction of the player to the direction the gun is facing + update_pixels(FALSE) + remove_action(user, /datum/action/vulture_tripod_unscope) + unscope() + +/obj/structure/vulture_spotter_tripod/clicked(mob/user, list/mods) + if(mods["alt"]) + if(in_range(src, user) && !user.is_mob_incapacitated()) + rotate(user) + return TRUE + return ..() + +/// Rotates the tripod 90* counter-clockwise +/obj/structure/vulture_spotter_tripod/proc/rotate(mob/user) + if(scope_using) + to_chat(user, SPAN_WARNING("You can't rotate [src] while someone is using it!")) + return FALSE + + playsound(src, 'sound/items/Ratchet.ogg', 25, 1) + user.visible_message("[user] rotates [src].","You rotate [src].") + setDir(turn(dir, -90)) + update_pixels(TRUE) + +/// Updates the direction the operator should be facing, and their pixel offset +/obj/structure/vulture_spotter_tripod/proc/update_pixels(mounting = TRUE) + if(!scope_user) + return + + var/mob/user = scope_user.resolve() + if(mounting) + var/diff_x = 0 + var/diff_y = 0 + switch(dir) + if(NORTH) + diff_y = -16 + if(SOUTH) + diff_y = 16 + if(EAST) + diff_x = -16 + if(WEST) + diff_x = 16 + + user.pixel_x = diff_x + user.pixel_y = diff_y + else + user.pixel_x = 0 + user.pixel_y = 0 + +/// Handler for when the scope is being attached to the tripod +/obj/structure/vulture_spotter_tripod/proc/on_scope_attach(mob/user, obj/structure/vulture_spotter_tripod/scope) + if(scope_attached) + return + + user.visible_message(SPAN_NOTICE("[user] attaches [scope] to [src]."), SPAN_NOTICE("You attach [scope] to [src].")) + icon_state = "vulture_scope" + setDir(user.dir) + bound_rifle = scope.bound_rifle + scope_attached = TRUE + desc = initial(desc) + qdel(scope) + +/// Handler for when the scope is being detached from the tripod by screwdriver +/obj/structure/vulture_spotter_tripod/proc/on_screwdriver(mob/user) + if(!scope_attached) + to_chat(user, SPAN_NOTICE("You don't need a screwdriver to pick this up!")) + return + user.visible_message(SPAN_NOTICE("[user] unscrews the scope from [src] before detaching it."), SPAN_NOTICE("You unscrew the scope from [src], detaching it.")) + icon_state = initial(icon_state) + unscope() + scope_attached = FALSE + desc = initial(desc) + " Though, it doesn't seem to have one attached yet." + new /obj/item/device/vulture_spotter_scope(get_turf(src), bound_rifle) + +/// Handler for user folding up the tripod, picking it up +/obj/structure/vulture_spotter_tripod/proc/fold_up(mob/user) + user.visible_message(SPAN_NOTICE("[user] folds up [src]."), SPAN_NOTICE("You fold up [src].")) + var/obj/item/device/vulture_spotter_tripod/tripod = new(get_turf(src)) + user.put_in_hands(tripod, TRUE) + qdel(src) + +/// Checks if the user is able to use the scope, uses it if so +/obj/structure/vulture_spotter_tripod/proc/try_scope(mob/living/carbon/human/user) + if(!user.client) + return + + if(user.l_hand || user.r_hand) + to_chat(user, SPAN_WARNING("Your hands need to be free to use [src]!")) + return + + var/obj/item/attachable/vulture_scope/scope = get_vulture_scope() + if(!scope) + return + + if(get_dist(get_turf(scope), get_turf(src)) > max_sniper_distance) + to_chat(user, SPAN_WARNING("[src] needs to be closer to the M707 to be used!")) + return + + if(!scope.scoping) + to_chat(user, SPAN_WARNING("The M707's sight needs to be in use to be able to look through [src]!")) + return + + user.set_interaction(src) + +/// Handler for when the user should be unscoping +/obj/structure/vulture_spotter_tripod/proc/do_unscope() + SIGNAL_HANDLER + + if(!scope_user) + return + + var/mob/user = scope_user.resolve() + user.unset_interaction() + +/// Unscopes the user, cleaning up everything related +/obj/structure/vulture_spotter_tripod/proc/unscope() + SIGNAL_HANDLER + if(scope_user) + var/mob/living/carbon/human/user = scope_user.resolve() + user.see_in_dark -= darkness_view + user.lighting_alpha = user.default_lighting_alpha + user.sync_lighting_plane_alpha() + user.clear_fullscreen("vulture_spotter") + UnregisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED)) + user.pixel_x = 0 + user.pixel_y = 0 + if(user.client) + user.client.change_view(world_view_size, src) + user.client.pixel_x = 0 + user.client.pixel_y = 0 + UnregisterSignal(user.client, COMSIG_PARENT_QDELETING) + + var/obj/item/attachable/vulture_scope/scope = get_vulture_scope() + if(scope) + scope.spotter_spotting = FALSE + to_chat(scope.scope_user, SPAN_NOTICE("You notice that [scope] starts drifting more.")) + UnregisterSignal(scope, list(COMSIG_VULTURE_SCOPE_MOVED, COMSIG_VULTURE_SCOPE_UNSCOPED)) + + QDEL_NULL(unscope_action) + +/// Sets the scope's sight location to the same as the sniper's +/obj/structure/vulture_spotter_tripod/proc/set_scope_loc(mob/living/carbon/human/user, obj/item/attachable/vulture_scope/scope) + if(!user.client || !scope) + return + + var/turf/user_turf = get_turf(user) + var/x_off = scope.scope_x - user_turf.x + var/y_off = scope.scope_y - user_turf.y + var/pixels_per_tile = 32 + + user.client.pixel_x = x_off * pixels_per_tile + user.client.pixel_y = y_off * pixels_per_tile + +/// Handler for when the vulture spotter scope moves +/obj/structure/vulture_spotter_tripod/proc/on_vulture_move(datum/source) + SIGNAL_HANDLER + if(!scope_user) + return + + set_scope_loc(scope_user.resolve(), get_vulture_scope()) + +/// Handler for when the sniper unscopes +/obj/structure/vulture_spotter_tripod/proc/on_vulture_unscope(datum/source) + SIGNAL_HANDLER + if(!scope_user) + return + + var/mob/user = scope_user.resolve() + + to_chat(user, SPAN_WARNING("[src]'s sight disengages as the linked rifle unscopes.")) + unscope() + +/// Getter for the vulture scope on the sniper +/obj/structure/vulture_spotter_tripod/proc/get_vulture_scope() + RETURN_TYPE(/obj/item/attachable/vulture_scope) + if(!bound_rifle) + return + + var/obj/item/weapon/gun/boltaction/vulture/rifle = bound_rifle.resolve() + if(!("rail" in rifle.attachments) || !istype(rifle.attachments["rail"], /obj/item/attachable/vulture_scope)) + return + + return rifle.attachments["rail"] + +/datum/action/vulture_tripod_unscope + name = "Stop Using Scope" + action_icon_state = "vulture_tripod_close" + /// Weakref to the tripod that this is linked to + var/datum/weakref/tripod + +/datum/action/vulture_tripod_unscope/New(Target, override_icon_state, obj/structure/vulture_spotter_tripod/spotting_tripod) + . = ..() + tripod = WEAKREF(spotting_tripod) + +/datum/action/vulture_tripod_unscope/action_activate() + if(!tripod) + return + + var/obj/structure/vulture_spotter_tripod/spotting_tripod = tripod.resolve() + spotting_tripod.do_unscope() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 090c5ad56f87..d0651eb5e993 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -36,7 +36,7 @@ LAZYADD(debris, shardtype) update_nearby_icons() -/obj/structure/window/Destroy() +/obj/structure/window/Destroy(force) density = FALSE if(is_full_window()) update_nearby_icons() @@ -117,7 +117,7 @@ if(make_hit_sound) playsound(loc, 'sound/effects/Glasshit.ogg', 25, 1) -/obj/structure/window/bullet_act(obj/item/projectile/Proj) +/obj/structure/window/bullet_act(obj/projectile/Proj) //Tasers and the like should not damage windows. var/ammo_flags = Proj.ammo.flags_ammo_behavior | Proj.projectile_override_flags if(Proj.ammo.damage_type == HALLOSS || Proj.damage <= 0 || ammo_flags == AMMO_ENERGY) @@ -507,7 +507,7 @@ relativewall() relativewall_neighbours() -/obj/structure/window/framed/Destroy() +/obj/structure/window/framed/Destroy(force) for(var/obj/effect/alien/weeds/weedwall/window/found_weedwall in get_turf(src)) qdel(found_weedwall) var/list/turf/cardinal_neighbors = list(get_step(src, NORTH), get_step(src, SOUTH), get_step(src, EAST), get_step(src, WEST)) @@ -854,9 +854,11 @@ //icon_state = "rwindow0_debug" //Uncomment to check hull in the map editor var/triggered = FALSE //indicates if the shutters have already been triggered -/obj/structure/window/framed/prison/reinforced/hull/Destroy() +/obj/structure/window/framed/prison/reinforced/hull/Destroy(force) + if(force) + return ..() spawn_shutters() - .=..() + . = ..() /obj/structure/window/framed/prison/reinforced/hull/proc/spawn_shutters(from_dir = 0) if(triggered) @@ -864,16 +866,17 @@ triggered = TRUE for(var/direction in cardinal) - if(direction == from_dir) continue //doesn't check backwards + if(direction == from_dir) + continue //doesn't check backwards for(var/obj/structure/window/framed/prison/reinforced/hull/W in get_step(src,direction) ) W.spawn_shutters(turn(direction,180)) - var/obj/structure/machinery/door/poddoor/shutters/almayer/pressure/P = new(get_turf(src)) + var/obj/structure/machinery/door/poddoor/shutters/almayer/pressure/pressure_door = new(get_turf(src)) switch(junction) if(4,5,8,9,12) - P.setDir(SOUTH) + pressure_door.setDir(SOUTH) else - P.setDir(EAST) - P.close() + pressure_door.setDir(EAST) + pressure_door.close() /obj/structure/window/framed/prison/cell name = "cell window" @@ -943,9 +946,12 @@ window_frame = /obj/structure/window_frame/corsat/security health = 400 -/obj/structure/window/framed/corsat/hull/Destroy() +/obj/structure/window/framed/corsat/hull/Destroy(force) + if(force) + return ..() + spawn_shutters() - .=..() + . = ..() /obj/structure/window/framed/corsat/hull/proc/spawn_shutters(from_dir = 0) if(triggered) @@ -959,14 +965,14 @@ for(var/obj/structure/window/framed/corsat/hull/W in get_step(src,direction) ) W.spawn_shutters(turn(direction,180)) - var/obj/structure/machinery/door/poddoor/shutters/almayer/pressure/P = new(get_turf(src)) + var/obj/structure/machinery/door/poddoor/shutters/almayer/pressure/pressure_door = new(get_turf(src)) switch(junction) if(4,5,8,9,12) - P.setDir(SOUTH) + pressure_door.setDir(SOUTH) else - P.setDir(EAST) + pressure_door.setDir(EAST) - INVOKE_ASYNC(P, TYPE_PROC_REF(/obj/structure/machinery/door, close)) + INVOKE_ASYNC(pressure_door, TYPE_PROC_REF(/obj/structure/machinery/door, close)) /obj/structure/window/framed/corsat/indestructible/ name = "hull window" diff --git a/code/game/objects/structures/window_frame.dm b/code/game/objects/structures/window_frame.dm index 810b0560bf8b..2c165b424dad 100644 --- a/code/game/objects/structures/window_frame.dm +++ b/code/game/objects/structures/window_frame.dm @@ -148,7 +148,7 @@ . = ..() -/obj/structure/window_frame/bullet_act(obj/item/projectile/P) +/obj/structure/window_frame/bullet_act(obj/projectile/P) bullet_ping(P) take_damage(P.damage) return TRUE diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 350d6047b2a4..22a3f48c837e 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -18,30 +18,26 @@ var/datum/controller/supply/supply_controller = new() /area/supply/station //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS. name = "Supply Shuttle" icon_state = "shuttle3" - luminosity = 1 - lighting_use_dynamic = 0 + base_lighting_alpha = 255 requires_power = 0 ambience_exterior = AMBIENCE_ALMAYER /area/supply/dock //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS. name = "Supply Shuttle" icon_state = "shuttle3" - luminosity = 1 - lighting_use_dynamic = 0 + base_lighting_alpha = 255 requires_power = 0 /area/supply/station_vehicle //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS. name = "Vehicle ASRS" icon_state = "shuttle3" - luminosity = 1 - lighting_use_dynamic = 0 + base_lighting_alpha = 255 requires_power = 0 /area/supply/dock_vehicle //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS. name = "Vehicle ASRS" icon_state = "shuttle3" - luminosity = 1 - lighting_use_dynamic = 0 + base_lighting_alpha = 255 requires_power = 0 //SUPPLY PACKS MOVED TO /code/defines/obj/supplypacks.dm @@ -1035,8 +1031,9 @@ var/datum/controller/supply/supply_controller = new() var/pack_name = supply_pack.name if(supply_pack.dollar_cost) pack_source = "Unknown" - pack_name = "Unknown" - link.log_ares_requisition(pack_source, pack_name, usr) + if(prob(90)) + pack_name = "Unknown" + link.log_ares_requisition(pack_source, pack_name, usr.name) else temp = "Not enough money left.
" temp += "
Back Main Menu" diff --git a/code/game/turfs/auto_turf.dm b/code/game/turfs/auto_turf.dm index 4556289da9ea..45756c30bb9c 100644 --- a/code/game/turfs/auto_turf.dm +++ b/code/game/turfs/auto_turf.dm @@ -183,7 +183,7 @@ L.forceMove(src) L.pixel_x += rand(-5,5) L.pixel_y += rand(-5,5) - L.SetLuminosity(2) + L.set_light(2) playsound(user, 'sound/weapons/Genhit.ogg', 25, 1) //Digging up snow diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 92bce17e50f6..bf84bc04bf10 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -259,6 +259,14 @@ /turf/closed/shuttle/dropship2/transparent opacity = FALSE +/turf/closed/shuttle/twe_dropship + name = "\improper UD4-UK" + icon = 'icons/turf/twedropship.dmi' + icon_state = "0,0" + +/turf/closed/shuttle/twe_dropship/transparent + opacity = FALSE + /turf/closed/shuttle/dropship2/tornado name = "\improper Tornado" icon = 'icons/turf/dropship3.dmi' diff --git a/code/game/turfs/floor.dm b/code/game/turfs/floor.dm index dc2cda0c2c2a..5f99aba26c09 100644 --- a/code/game/turfs/floor.dm +++ b/code/game/turfs/floor.dm @@ -96,7 +96,7 @@ else if(is_light_floor()) icon_state = "light_broken" broken = 1 - SetLuminosity(0) + set_light(0) else if(is_plating()) icon_state = "platingdmg[pick(1, 2, 3)]" broken = 1 @@ -135,7 +135,7 @@ //This proc auto corrects the grass tiles' siding. /turf/open/floor/proc/make_plating() - SetLuminosity(0) + set_light(0) intact_tile = FALSE broken = FALSE burnt = FALSE diff --git a/code/game/turfs/floors/desert.dm b/code/game/turfs/floors/desert.dm index 4ecc0bf47cf7..46a481e3bc64 100644 --- a/code/game/turfs/floors/desert.dm +++ b/code/game/turfs/floors/desert.dm @@ -111,13 +111,13 @@ ..() switch(toxic) if(1) - SetLuminosity(2) + set_light(2) icon = 'icons/turf/floors/desert_water_toxic.dmi' if(0) - SetLuminosity(1) + set_light(1) icon = 'icons/turf/floors/desert_water.dmi' if(-1) - SetLuminosity(1) + set_light(1) icon = 'icons/turf/floors/desert_water_transition.dmi' /turf/open/desert/desert_shore/is_weedable() @@ -196,13 +196,13 @@ ..() switch(toxic) if(1) - SetLuminosity(2) + set_light(2) icon = 'icons/turf/floors/desert_water_toxic.dmi' if(0) - SetLuminosity(1) + set_light(1) icon = 'icons/turf/floors/desert_water.dmi' if(-1) - SetLuminosity(1) + set_light(1) icon = 'icons/turf/floors/desert_water_transition.dmi' //Desert River Toxic @@ -221,13 +221,13 @@ ..() switch(toxic) if(1) - SetLuminosity(2) + set_light(2) icon = 'icons/turf/floors/desert_water_toxic.dmi' if(0) - SetLuminosity(1) + set_light(1) icon = 'icons/turf/floors/desert_water.dmi' if(-1) - SetLuminosity(1) + set_light(1) icon = 'icons/turf/floors/desert_water_transition.dmi' update_overlays() diff --git a/code/game/turfs/light.dm b/code/game/turfs/light.dm index 694a51aad83a..219e79e93ef2 100644 --- a/code/game/turfs/light.dm +++ b/code/game/turfs/light.dm @@ -14,32 +14,32 @@ switch(state) if(0) icon_state = "light_on" - SetLuminosity(5) + set_light(5) if(1) icon_state = "light_on-r" - SetLuminosity(5) + set_light(5) if(2) icon_state = "light_on-g" - SetLuminosity(5) + set_light(5) if(3) icon_state = "light_on-y" - SetLuminosity(5) + set_light(5) if(4) icon_state = "light_on-p" - SetLuminosity(5) + set_light(5) if(5,-1) icon_state = "light_on-w" - SetLuminosity(5) + set_light(5) state = -1 else return //Should never happen ever but what if... returns into the other else which close the light else if(broken) icon_state = "light_broken" //It's the same sprite as light off, my artistic skill stops at stickmans anyone feel free to make a better one! - SetLuminosity(0) + set_light(0) else icon_state = "light_off" - SetLuminosity(0) + set_light(0) on = FALSE /turf/open/floor/light/attackby(obj/item/item_in_hand, mob/user) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 41ac80bfdc58..c88f79b43293 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -304,7 +304,7 @@ L.forceMove(src) L.pixel_x += rand(-5,5) L.pixel_y += rand(-5,5) - L.SetLuminosity(2) + L.set_light(2) playsound(user, 'sound/weapons/Genhit.ogg', 25, 1) return @@ -797,7 +797,7 @@ L.forceMove(src) L.pixel_x += rand(-5,5) L.pixel_y += rand(-5,5) - L.SetLuminosity(2) + L.set_light(2) playsound(user, 'sound/weapons/Genhit.ogg', 25, 1) return diff --git a/code/game/turfs/snow.dm b/code/game/turfs/snow.dm index cd5fcf56d15c..72b1f35d0aff 100644 --- a/code/game/turfs/snow.dm +++ b/code/game/turfs/snow.dm @@ -30,7 +30,7 @@ L.forceMove(src) L.pixel_x += rand(-5,5) L.pixel_y += rand(-5,5) - L.SetLuminosity(2) + L.set_light(2) playsound(user, 'sound/weapons/Genhit.ogg', 25, 1) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index bc0375e0b850..837610d5d7fe 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -55,6 +55,14 @@ // Fishing var/supports_fishing = FALSE // set to false when MRing, this is just for testing + ///Lumcount added by sources other than lighting datum objects, such as the overlay lighting component. + var/dynamic_lumcount = 0 + ///List of light sources affecting this turf. + ///Which directions does this turf block the vision of, taking into account both the turf's opacity and the movable opacity_sources. + var/directional_opacity = NONE + ///Lazylist of movable atoms providing opacity sources. + var/list/atom/movable/opacity_sources + /turf/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) // this doesn't parent call for optimisation reasons if(flags_atom & INITIALIZED) @@ -85,10 +93,21 @@ for(var/atom/movable/AM in src) Entered(AM) - if(luminosity) - if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.") - trueLuminosity = luminosity * luminosity - light = new(src) + if(light_power && light_range) + update_light() + + //Get area light + var/area/current_area = loc + if(current_area?.lighting_effect) + overlays += current_area.lighting_effect + + if(opacity) + directional_opacity = ALL_CARDINALS + + //Get area light + var/area/A = loc + if(A?.lighting_effect) + overlays += A.lighting_effect return INITIALIZE_HINT_NORMAL @@ -154,7 +173,7 @@ if(override) return override & COMPONENT_TURF_ALLOW_MOVEMENT - if(isobserver(mover) || istype(mover, /obj/item/projectile)) + if(isobserver(mover) || istype(mover, /obj/projectile)) return TRUE var/fdir = get_dir(mover, src) @@ -356,8 +375,6 @@ if(/turf/baseturf_bottom) path = /turf/open/floor/plating - var/old_lumcount = lighting_lumcount - initial(lighting_lumcount) - //if(src.type == new_turf_path) // Put this back if shit starts breaking // return src @@ -365,6 +382,16 @@ var/list/old_baseturfs = baseturfs + //static lighting + var/old_lighting_object = static_lighting_object + var/old_lighting_corner_NE = lighting_corner_NE + var/old_lighting_corner_SE = lighting_corner_SE + var/old_lighting_corner_SW = lighting_corner_SW + var/old_lighting_corner_NW = lighting_corner_NW + //hybrid lighting + var/list/old_hybrid_lights_affecting = hybrid_lights_affecting?.Copy() + var/old_directional_opacity = directional_opacity + changing_turf = TRUE qdel(src) //Just get the side effects and call Destroy var/turf/W = new path(src) @@ -380,10 +407,34 @@ W.linked_pylons = pylons - W.lighting_lumcount += old_lumcount - if(old_lumcount != W.lighting_lumcount) - W.lighting_changed = 1 - SSlighting.changed_turfs += W + W.hybrid_lights_affecting = old_hybrid_lights_affecting + W.dynamic_lumcount = dynamic_lumcount + + lighting_corner_NE = old_lighting_corner_NE + lighting_corner_SE = old_lighting_corner_SE + lighting_corner_SW = old_lighting_corner_SW + lighting_corner_NW = old_lighting_corner_NW + + //static Update + if(SSlighting.initialized) + recalculate_directional_opacity() + + W.static_lighting_object = old_lighting_object + + if(static_lighting_object && !static_lighting_object.needs_update) + static_lighting_object.update() + + //Since the old turf was removed from hybrid_lights_affecting, readd the new turf here + if(W.hybrid_lights_affecting) + for(var/atom/movable/lighting_mask/mask as anything in W.hybrid_lights_affecting) + LAZYADD(mask.affecting_turfs, W) + + if(W.directional_opacity != old_directional_opacity) + W.reconsider_lights() + + var/area/thisarea = get_area(W) + if(thisarea.lighting_effect) + W.overlays += thisarea.lighting_effect W.levelupdate() return W @@ -760,13 +811,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/proc/copyTurf(turf/T) if(T.type != type) - var/obj/O - if(underlays.len) //we have underlays, which implies some sort of transparency, so we want to a snapshot of the previous turf as an underlay - O = new() - O.underlays.Add(T) T.ChangeTurf(type) - if(underlays.len) - T.underlays = O.underlays if(T.icon_state != icon_state) T.icon_state = icon_state if(T.icon != icon) diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index 8b8ee00bcf53..9e47612964c4 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -19,6 +19,8 @@ icon_state = "blank" var/image/I + flags_atom |= HTML_USE_INITAL_ICON + if(!density) I = image(icon, "[walltype]fwall_open") overlays += I diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 5338ae26c000..2548801cc7b1 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -125,7 +125,7 @@ operating = TRUE flick("containment_wall_divide_lowering", src) icon_state = "containment_wall_divide_lowered" - SetOpacity(0) + set_opacity(0) density = FALSE operating = FALSE change_weeds() @@ -136,7 +136,7 @@ operating = TRUE flick("containment_wall_divide_rising", src) icon_state = "containment_wall_divide" - SetOpacity(1) + set_opacity(1) density = TRUE operating = FALSE @@ -993,10 +993,10 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) else return attack_hand(user) -/obj/structure/alien/movable_wall/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/alien/movable_wall/get_projectile_hit_boolean(obj/projectile/P) return TRUE -/obj/structure/alien/movable_wall/bullet_act(obj/item/projectile/P) +/obj/structure/alien/movable_wall/bullet_act(obj/projectile/P) . = ..() take_damage(P.damage) @@ -1110,7 +1110,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) var/explosive_multiplier = 0.3 var/reflection_multiplier = 0.5 -/turf/closed/wall/resin/reflective/bullet_act(obj/item/projectile/P) +/turf/closed/wall/resin/reflective/bullet_act(obj/projectile/P) if(src in P.permutated) return @@ -1122,7 +1122,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) // Bullet gets absorbed if it has IFF or can't be reflected. return - var/obj/item/projectile/new_proj = new(src, construction_data ? construction_data : create_cause_data(initial(name))) + var/obj/projectile/new_proj = new(src, construction_data ? construction_data : create_cause_data(initial(name))) new_proj.generate_bullet(P.ammo) new_proj.damage = P.damage * reflection_multiplier // don't make it too punishing new_proj.accuracy = HIT_ACCURACY_TIER_7 // 35% chance to hit something @@ -1138,7 +1138,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) return TRUE -/turf/closed/wall/resin/reflective/proc/bullet_ignore_turf(obj/item/projectile/P, turf/T) +/turf/closed/wall/resin/reflective/proc/bullet_ignore_turf(obj/projectile/P, turf/T) SIGNAL_HANDLER if(T == src) return COMPONENT_BULLET_PASS_THROUGH diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5e527e6a5442..7d9127313094 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -135,7 +135,8 @@ var/list/admin_verbs_minor_event = list( /client/proc/adminpanelweapons, /client/proc/admin_general_quarters, /client/proc/admin_biohazard_alert, - /client/proc/toggle_hardcore_perma + /client/proc/toggle_hardcore_perma, + /client/proc/toggle_bypass_joe_restriction, ) var/list/admin_verbs_major_event = list( diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index 1298d6150036..e0a8c540ea85 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -331,7 +331,7 @@ if(SUBTLE_MESSAGE_IN_HEAD) message = SPAN_ANNOUNCEMENT_HEADER_BLUE("You hear a voice in your head... [input]") else - message = SPAN_DANGER("Message received through headset. [message_option] Transmission \"[input]\"") + message = SPAN_ANNOUNCEMENT_HEADER_BLUE("Message received through headset. [message_option] Transmission \"[input]\"") for(var/mob/living/carbon/human/mob in view(usr.client)) if(message_option == SUBTLE_MESSAGE_IN_HEAD) @@ -839,3 +839,16 @@ SSticker.mode.toggleable_flags ^= MODE_HARDCORE_PERMA message_admins("[src] has toggled Hardcore [MODE_HAS_TOGGLEABLE_FLAG(MODE_HARDCORE_PERMA) ? "on, causing all humans to instantly go perma on death" : "off, causing all humans to die like normal"].") +/client/proc/toggle_bypass_joe_restriction() + set name = "Toggle Working Joe Restrictions" + set category = "Admin.Flags" + + if(!admin_holder || !check_rights(R_EVENT, FALSE)) + return + + if(!SSticker.mode) + to_chat(usr, SPAN_WARNING("A mode hasn't been selected yet!")) + return + + SSticker.mode.toggleable_flags ^= MODE_BYPASS_JOE + message_admins("[src] has [MODE_HAS_TOGGLEABLE_FLAG(MODE_BYPASS_JOE) ? "allowed players to bypass (except whitelist)" : "prevented players from bypassing"] Working Joe spawn conditions.") diff --git a/code/modules/admin/verbs/freeforghosts.dm b/code/modules/admin/verbs/freeforghosts.dm index a2f3912030e5..24c261ee18f3 100644 --- a/code/modules/admin/verbs/freeforghosts.dm +++ b/code/modules/admin/verbs/freeforghosts.dm @@ -6,22 +6,27 @@ to_chat(src, "Only staff members may use this.") return - free_for_ghosts(M) + free_for_ghosts(M, notify = TRUE) message_admins("[key_name_admin(usr)] freed [key_name(M)] for ghosts to take.") -/client/proc/free_for_ghosts(mob/living/M in GLOB.living_mob_list) +/client/proc/free_for_ghosts(mob/living/M in GLOB.living_mob_list, notify) if(!ismob(M)) return - M.free_for_ghosts() + M.free_for_ghosts(notify) -/mob/proc/free_for_ghosts() +/mob/proc/free_for_ghosts(notify) if(mind || client) ghostize(FALSE) GLOB.freed_mob_list |= WEAKREF(src) + if(!notify) + return + + notify_ghosts(header = "Freed Mob", message = "A mob is now available for ghosts. Name: [real_name], Job: [job ? job : ""]", enter_link = "claim_freed=[REF(src)]", source = src, action = NOTIFY_ORBIT) + /client/proc/free_all_mobs_in_view() set name = "Free All Mobs" set category = "Admin.InView" @@ -34,6 +39,6 @@ return for(var/mob/living/M in view()) - free_for_ghosts(M) + free_for_ghosts(M, notify = FALSE) message_admins(WRAP_STAFF_LOG(usr, "freed all mobs in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) diff --git a/code/modules/admin/verbs/mob_verbs.dm b/code/modules/admin/verbs/mob_verbs.dm index 376115c0d630..4809d9b2e6ee 100644 --- a/code/modules/admin/verbs/mob_verbs.dm +++ b/code/modules/admin/verbs/mob_verbs.dm @@ -81,7 +81,7 @@ H = huds[MOB_HUD_XENO_STATUS] else return - H.add_hud_to(M) + H.add_hud_to(M, HUD_SOURCE_ADMIN) to_chat(src, SPAN_INFO("[hud_choice] enabled.")) message_admins(SPAN_INFO("[key_name(usr)] has given a [hud_choice] to [M].")) diff --git a/code/modules/asset_cache/asset_cache_item.dm b/code/modules/asset_cache/asset_cache_item.dm index 72d976bf11f1..ade73f79c7ca 100644 --- a/code/modules/asset_cache/asset_cache_item.dm +++ b/code/modules/asset_cache/asset_cache_item.dm @@ -21,11 +21,20 @@ /// TRUE for keeping local asset names when browse_rsc backend is used var/keep_local_name = FALSE -/datum/asset_cache_item/New(name, file) +///pass in a valid file_hash if you have one to save it from needing to do it again. +///pass in a valid dmi file path string e.g. "icons/path/to/dmi_file.dmi" to make generating the hash less expensive +/datum/asset_cache_item/New(name, file, file_hash, dmi_file_path) if (!isfile(file)) file = fcopy_rsc(file) - hash = md5asfile(file) //icons sent to the rsc sometimes md5 incorrectly + hash = file_hash + + //the given file is directly from a dmi file and is thus in the rsc already, we know that its file_hash will be correct + if(!hash) + if(dmi_file_path) + hash = md5(file) + else + hash = md5asfile(file) //icons sent to the rsc md5 incorrectly when theyre given incorrect data if (!hash) CRASH("invalid asset sent to asset cache") src.name = name diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm index a8d45e4cd21f..2e165229f19b 100644 --- a/code/modules/asset_cache/transports/asset_transport.dm +++ b/code/modules/asset_cache/transports/asset_transport.dm @@ -22,15 +22,21 @@ addtimer(CALLBACK(src, PROC_REF(send_assets_slow), C, preload), 1 SECONDS) -/// Register a browser asset with the asset cache system -/// asset_name - the identifier of the asset -/// asset - the actual asset file (or an asset_cache_item datum) -/// returns a /datum/asset_cache_item. -/// mutiple calls to register the same asset under the same asset_name return the same datum -/datum/asset_transport/proc/register_asset(asset_name, asset) +/** + * Register a browser asset with the asset cache system. + * returns a /datum/asset_cache_item. + * mutiple calls to register the same asset under the same asset_name return the same datum. + * + * Arguments: + * * asset_name - the identifier of the asset. + * * asset - the actual asset file (or an asset_cache_item datum). + * * file_hash - optional, a hash of the contents of the asset files contents. used so asset_cache_item doesnt have to hash it again + * * dmi_file_path - optional, means that the given asset is from the rsc and thus we dont need to do some expensive operations + */ +/datum/asset_transport/proc/register_asset(asset_name, asset, file_hash, dmi_file_path) var/datum/asset_cache_item/ACI = asset if (!istype(ACI)) - ACI = new(asset_name, asset) + ACI = new(asset_name, asset, file_hash, dmi_file_path) if (!ACI || !ACI.hash) CRASH("ERROR: Invalid asset: [asset_name]:[asset]:[ACI]") if (SSassets.cache[asset_name]) diff --git a/code/modules/autowiki/pages/guns.dm b/code/modules/autowiki/pages/guns.dm index 0946b552fe31..ad675c51a409 100644 --- a/code/modules/autowiki/pages/guns.dm +++ b/code/modules/autowiki/pages/guns.dm @@ -97,9 +97,10 @@ )) gun_data["attachments"] = attachments - - upload_icon(getFlatIcon(generating_gun, no_anim = TRUE), filename) - gun_data["icon"] = filename + var/icon/generated_icon = getFlatIcon(generating_gun, no_anim = TRUE) + if(generated_icon) + upload_icon(generated_icon, filename) + gun_data["icon"] = filename output += include_template("Autowiki/Gun", gun_data) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 3722b32fb2b4..a7149c07d3e7 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -436,6 +436,9 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( //if(prefs.window_skin & TOGGLE_WINDOW_SKIN) // set_night_skin() + if(!tooltips && prefs.tooltips) + tooltips = new(src) + load_player_data() view = world_view_size diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4f1161709657..d9eb01511344 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -42,7 +42,7 @@ var/const/MAX_SAVE_SLOTS = 10 var/warns = 0 var/muted = 0 var/last_ip - var/fps = 20 + var/fps = 60 var/last_id var/save_cooldown = 0 //5s cooldown between saving slots var/reload_cooldown = 0 //5s cooldown between loading slots @@ -87,6 +87,7 @@ var/const/MAX_SAVE_SLOTS = 10 var/predator_age = 100 var/predator_h_style = "Standard" var/predator_skin_color = "tan" + var/predator_use_legacy = "None" var/predator_translator_type = "Modern" var/predator_mask_type = 1 var/predator_armor_type = 1 @@ -234,6 +235,9 @@ var/const/MAX_SAVE_SLOTS = 10 /// if this client has custom cursors enabled var/custom_cursors = TRUE + /// if this client has tooltips enabled + var/tooltips = TRUE + /datum/preferences/New(client/C) key_bindings = deepCopyList(GLOB.hotkey_keybinding_list_by_key) // give them default keybinds and update their movement keys macros = new(C, src) @@ -508,6 +512,8 @@ var/const/MAX_SAVE_SLOTS = 10 dat += "
" dat += "

Equipment Setup:

" + if(RoleAuthority.roles_whitelist[user.ckey] & WHITELIST_YAUTJA_LEGACY) + dat += "Legacy Gear: [predator_use_legacy]
" dat += "Translator Type: [predator_translator_type]
" dat += "Mask Style: ([predator_mask_type])
" dat += "Armor Style: ([predator_armor_type])
" @@ -573,6 +579,7 @@ var/const/MAX_SAVE_SLOTS = 10 dat += "Ambient Occlusion: [toggle_prefs & TOGGLE_AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]
" dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
" dat += "Adaptive Zoom: [adaptive_zoom ? "[adaptive_zoom * 2]x" : "Disabled"]
" + dat += "Tooltips: [tooltips ? "Enabled" : "Disabled"]
" dat += "tgui Window Mode: [(tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]
" dat += "tgui Window Placement: [(tgui_lock) ? "Primary monitor" : "Free (default)"]
" dat += "Play Admin Midis: [(toggles_sound & SOUND_MIDI) ? "Yes" : "No"]
" @@ -1233,6 +1240,11 @@ var/const/MAX_SAVE_SLOTS = 10 var/new_predator_age = tgui_input_number(user, "Choose your Predator's age(175 to 3000):", "Character Preference", 1234, 3000, 175) if(new_predator_age) predator_age = max(min( round(text2num(new_predator_age)), 3000),175) + if("pred_use_legacy") + var/legacy_choice = tgui_input_list(user, "What legacy set do you wish to use?", "Legacy Set", PRED_LEGACIES) + if(!legacy_choice) + return + predator_use_legacy = legacy_choice if("pred_trans_type") var/new_translator_type = tgui_input_list(user, "Choose your translator type.", "Translator Type", PRED_TRANSLATORS) if(!new_translator_type) @@ -1862,6 +1874,17 @@ var/const/MAX_SAVE_SLOTS = 10 adaptive_zoom = 0 owner?.adaptive_zoom() + if("tooltips") + tooltips = !tooltips + save_preferences() + + if(!tooltips) + closeToolTip() + return + + if(!owner.tooltips) + owner.tooltips = new(owner) + if("inputstyle") var/result = tgui_alert(user, "Which input style do you want?", "Input Style", list("Modern", "Legacy")) if(!result) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index e712e267fb2d..106da02a00b6 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -515,6 +515,12 @@ var/global/list/gear_datums_by_name = list() display_name = "D18 Holdout Pistol" path = /obj/item/storage/box/clf +/datum/gear/weapon/upppistol //ww2 war trophy luger + display_name = "Type 73 Pistol" + path = /obj/item/storage/box/upp + slot = WEAR_IN_BACK + cost = 4 + /datum/gear/weapon/m4a3_custom display_name = "M4A3 Custom Pistol" path = /obj/item/weapon/gun/pistol/m4a3/custom diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 0f482fa7f894..0e01fc75c013 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -157,6 +157,7 @@ S["pred_name"] >> predator_name S["pred_gender"] >> predator_gender S["pred_age"] >> predator_age + S["pred_use_legacy"] >> predator_use_legacy S["pred_trans_type"] >> predator_translator_type S["pred_mask_type"] >> predator_mask_type S["pred_armor_type"] >> predator_armor_type @@ -193,6 +194,7 @@ S["custom_cursors"] >> custom_cursors S["autofit_viewport"] >> auto_fit_viewport S["adaptive_zoom"] >> adaptive_zoom + S["tooltips"] >> tooltips //Sanitize ooccolor = sanitize_hexcolor(ooccolor, CONFIG_GET(string/ooc_color_default)) @@ -225,12 +227,14 @@ no_radial_labels_preference = sanitize_integer(no_radial_labels_preference, FALSE, TRUE, FALSE) auto_fit_viewport = sanitize_integer(auto_fit_viewport, FALSE, TRUE, TRUE) adaptive_zoom = sanitize_integer(adaptive_zoom, 0, 2, 0) + tooltips = sanitize_integer(tooltips, FALSE, TRUE, TRUE) synthetic_name = synthetic_name ? sanitize_text(synthetic_name, initial(synthetic_name)) : initial(synthetic_name) synthetic_type = sanitize_inlist(synthetic_type, PLAYER_SYNTHS, initial(synthetic_type)) predator_name = predator_name ? sanitize_text(predator_name, initial(predator_name)) : initial(predator_name) predator_gender = sanitize_text(predator_gender, initial(predator_gender)) predator_age = sanitize_integer(predator_age, 100, 10000, initial(predator_age)) + predator_use_legacy = sanitize_inlist(predator_use_legacy, PRED_LEGACIES, initial(predator_use_legacy)) predator_translator_type = sanitize_inlist(predator_translator_type, PRED_TRANSLATORS, initial(predator_translator_type)) predator_mask_type = sanitize_integer(predator_mask_type,1,1000000,initial(predator_mask_type)) predator_armor_type = sanitize_integer(predator_armor_type,1,1000000,initial(predator_armor_type)) @@ -337,6 +341,7 @@ S["pred_name"] << predator_name S["pred_gender"] << predator_gender S["pred_age"] << predator_age + S["pred_use_legacy"] << predator_use_legacy S["pred_trans_type"] << predator_translator_type S["pred_mask_type"] << predator_mask_type S["pred_armor_type"] << predator_armor_type diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index b81411a26440..b600b39a0018 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -623,7 +623,7 @@ if(!isobserver(usr)) return - var/mob/dead/observer/O = usr + var/mob/dead/observer/observer_user = usr var/datum/mob_hud/H switch(hud_choice) if("Medical HUD") @@ -643,11 +643,11 @@ if("Faction CLF HUD") H = huds[MOB_HUD_FACTION_CLF] - O.HUD_toggled[hud_choice] = prefs.observer_huds[hud_choice] - if(O.HUD_toggled[hud_choice]) - H.add_hud_to(O) + observer_user.HUD_toggled[hud_choice] = prefs.observer_huds[hud_choice] + if(observer_user.HUD_toggled[hud_choice]) + H.add_hud_to(observer_user, observer_user) else - H.remove_hud_from(O) + H.remove_hud_from(observer_user, observer_user) /client/proc/toggle_ghost_health_scan() set name = "Toggle Health Scan" diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 7bcf1dd6645c..b31e6281dba1 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -70,10 +70,10 @@ if(hud_type) var/datum/mob_hud/MH = huds[hud_type] if(active) - MH.add_hud_to(H) + MH.add_hud_to(H, src) playsound(H, 'sound/handling/hud_on.ogg', 25, 1) else - MH.remove_hud_from(H) + MH.remove_hud_from(H, src) playsound(H, 'sound/handling/hud_off.ogg', 25, 1) if(active) //turning it on? then add the traits for(var/trait in clothing_traits) @@ -95,7 +95,7 @@ else if(hud_type) var/datum/mob_hud/MH = huds[hud_type] - MH.add_hud_to(user) + MH.add_hud_to(user, src) user.update_sight() ..() @@ -103,7 +103,7 @@ if(hud_type && active && istype(user)) if(src == user.glasses) //dropped is called before the inventory reference is updated. var/datum/mob_hud/H = huds[hud_type] - H.remove_hud_from(user) + H.remove_hud_from(user, src) user.glasses = null user.update_inv_glasses() user.update_sight() @@ -140,6 +140,11 @@ req_skill_level = SKILL_RESEARCH_TRAINED clothing_traits = list(TRAIT_REAGENT_SCANNER) +/obj/item/clothing/glasses/science/prescription + name = "prescription reagent scanner HUD goggles" + desc = "These goggles are probably of use to someone who isn't holding a rifle and actively seeking to lower their combat life expectancy. Contains prescription lenses." + prescription = TRUE + /obj/item/clothing/glasses/science/get_examine_text(mob/user) . = ..() . += SPAN_INFO("While wearing them, you can examine items to see their reagent contents.") diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index f5baeb804412..1a133eee0dfe 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -109,7 +109,7 @@ deactive_state = "sensorhud_d" flags_armor_protection = 0 toggleable = TRUE - hud_type = MOB_HUD_MEDICAL_BASIC + hud_type = MOB_HUD_MEDICAL_ADVANCED actions_types = list(/datum/action/item_action/toggle) req_skill = SKILL_MEDICAL req_skill_level = SKILL_MEDICAL_DEFAULT diff --git a/code/modules/clothing/glasses/night.dm b/code/modules/clothing/glasses/night.dm index 63d0c8f364af..afb711c3ca15 100644 --- a/code/modules/clothing/glasses/night.dm +++ b/code/modules/clothing/glasses/night.dm @@ -15,6 +15,7 @@ vision_flags = SEE_TURFS lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE fullscreen_vision = null + eye_protection = EYE_PROTECTION_NEGATIVE /obj/item/clothing/glasses/night/helmet //for the integrated NVGs that are in helmetgarb code name = "\improper M2 night vision goggles" diff --git a/code/modules/clothing/glasses/thermal.dm b/code/modules/clothing/glasses/thermal.dm index bfc60d271724..b2ec7597e270 100644 --- a/code/modules/clothing/glasses/thermal.dm +++ b/code/modules/clothing/glasses/thermal.dm @@ -12,7 +12,7 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE darkness_view = 12 invisa_view = 2 - eye_protection = -1 + eye_protection = EYE_PROTECTION_NEGATIVE deactive_state = "goggles_off" fullscreen_vision = /atom/movable/screen/fullscreen/thermal var/blinds_on_emp = TRUE diff --git a/code/modules/clothing/gloves/marine_gloves.dm b/code/modules/clothing/gloves/marine_gloves.dm index 04d0b2f1c0cb..09c84b9b4d40 100644 --- a/code/modules/clothing/gloves/marine_gloves.dm +++ b/code/modules/clothing/gloves/marine_gloves.dm @@ -184,3 +184,11 @@ armor_internaldamage = CLOTHING_ARMOR_MEDIUM unacidable = TRUE adopts_squad_color = FALSE + +//=ROYAL MARINES=\\ + +/obj/item/clothing/gloves/marine/veteran/royal_marine + name = "\improper L6 pattern combat gloves" + desc = "Standard issue tactical gloves used by the royal marines." + icon_state = "rmc_gloves" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 165dc03f25e2..d94789651b75 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -3,8 +3,8 @@ desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." icon_state = "hardhat0_yellow" item_state = "hardhat0_yellow" - var/brightness_on = 4 //luminosity when on - var/on = FALSE + light_range = 4 + light_power = 2 var/hardhat_color = "yellow" //Determines used sprites: hardhat[on]_[hardhat_color] var/toggleable = TRUE armor_melee = CLOTHING_ARMOR_MEDIUM @@ -30,87 +30,52 @@ /obj/item/clothing/head/hardhat/update_icon() . = ..() - if(on) - icon_state = "hardhat[on]_[hardhat_color]" - item_state = "hardhat[on]_[hardhat_color]" + if(light_on) + icon_state = "hardhat[light_on]_[hardhat_color]" + item_state = "hardhat[light_on]_[hardhat_color]" else icon_state = initial(icon_state) item_state = initial(item_state) -/obj/item/clothing/head/hardhat/proc/update_brightness(mob/user) - if(on) - update_icon() - if(loc == user) - user.SetLuminosity(brightness_on, FALSE, src) - else if(isturf(loc)) - SetLuminosity(brightness_on) - else - icon_state = initial(icon_state) - if(loc == user) - user.SetLuminosity(0, FALSE, src) - else if(isturf(loc)) - SetLuminosity(0) - /obj/item/clothing/head/hardhat/attack_self(mob/user) - ..() + . = ..() if(!toggleable) to_chat(user, SPAN_WARNING("You cannot toggle [src] on or off.")) return FALSE if(!isturf(user.loc)) - to_chat(user, SPAN_WARNING("You cannot turn the light [on ? "off" : "on"] while in [user.loc].")) //To prevent some lighting anomalies. + to_chat(user, SPAN_WARNING("You cannot turn the light [light_on ? "off" : "on"] while in [user.loc].")) //To prevent some lighting anomalies. return FALSE - on = !on - update_brightness(user) + turn_light(user, !light_on) + +/obj/item/clothing/head/hardhat/turn_light(mob/user, toggle_on) + + . = ..() + if(. != CHECKS_PASSED) + return + + set_light_on(toggle_on) + if(user == loc) + user.update_inv_head() + for(var/datum/action/current_action as anything in actions) current_action.update_button_icon() - if(ismob(loc)) - var/mob/M = loc - M.update_inv_head() - - return TRUE + update_icon() -/obj/item/clothing/head/hardhat/proc/turn_off_light(mob/bearer) - if(on) - on = FALSE - update_brightness(bearer) - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() - return TRUE - return FALSE +/obj/item/clothing/head/hardhat/attack_alien(mob/living/carbon/xenomorph/attacking_xeno) + if(!can_be_broken) + return -/obj/item/clothing/head/hardhat/attack_alien(mob/living/carbon/xenomorph/M) - . = ..() + if(turn_light(attacking_xeno, toggle_on = FALSE) != CHECKS_PASSED) + return - if(on && can_be_broken) - if(breaking_sound) - playsound(src.loc, breaking_sound, 25, 1) - on = FALSE - update_brightness() - -/obj/item/clothing/head/hardhat/pickup(mob/user) - if(on) - user.SetLuminosity(brightness_on, FALSE, src) - SetLuminosity(0) - ..() - -/obj/item/clothing/head/hardhat/dropped(mob/user) - if(on) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(brightness_on) - ..() - -/obj/item/clothing/head/hardhat/Destroy() - if(ismob(src.loc)) - src.loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - return ..() + if(!breaking_sound) + return + playsound(loc, breaking_sound, 25, 1) /obj/item/clothing/head/hardhat/orange icon_state = "hardhat0_orange" diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm index 0916ecfb34e9..24e1d0231c85 100644 --- a/code/modules/clothing/head/head.dm +++ b/code/modules/clothing/head/head.dm @@ -537,7 +537,7 @@ //==========================//PROTECTIVE\\===============================\\ //=======================================================================\\ -D + /obj/item/clothing/head/ushanka name = "ushanka" desc = "Perfect for winter in Siberia, da?" @@ -766,3 +766,37 @@ D WEAR_HEAD = 'icons/mob/humans/onmob/head_1.dmi' ) item_state = "owlf_hood" + + +//=ROYAL MARINES=\\ + +/obj/item/clothing/head/beanie/royal_marine + name = "royal marine beanie" + desc = "A standard military beanie." + icon_state = "rmc_beanie" + item_state = "rmc_beanie" + icon = 'icons/obj/items/clothing/cm_hats.dmi' + item_icons = list( + WEAR_HEAD = 'icons/mob/humans/onmob/head_1.dmi' + ) + +/obj/item/clothing/head/beanie/royal_marine/turban + name = "royal marine turban" + desc = "A standard military turban found in the royal marines. Considered a rare item, these kind of turbans are prized by collectors in the UA." + icon_state = "rmc_turban" + item_state = "rmc_turban" + +/obj/item/clothing/head/beret/royal_marine + name = "royal marine beret" + desc = "A green beret belonging to the royal marines commando. This beret symbolizes a royal marines ability to fight in any environment, desert, sea, artic or space a royal marine will always be ready." + icon_state = "rmc_beret" + item_state = "rmc_beret" + icon = 'icons/obj/items/clothing/cm_hats.dmi' + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + item_icons = list( + WEAR_HEAD = 'icons/mob/humans/onmob/head_1.dmi' + ) + +/obj/item/clothing/head/beret/royal_marine/team_leader + icon_state = "rmc_beret_tl" + item_state = "rmc_beret_tl" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 0181d239c574..d5698fd4be32 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -360,6 +360,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( var/flags_marine_helmet = HELMET_SQUAD_OVERLAY|HELMET_GARB_OVERLAY|HELMET_DAMAGE_OVERLAY var/helmet_bash_cooldown = 0 + //speciality does NOTHING if you have NO_NAME_OVERRIDE var/specialty = "M10 pattern marine" //Give them a specialty var so that they show up correctly in vendors. speciality does NOTHING if you have NO_NAME_OVERRIDE. valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C) restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C) @@ -372,11 +373,27 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( var/storage_slots_reserved_for_garb = 1 var/storage_max_w_class = SIZE_TINY // can hold tiny items only, EXCEPT for glasses & metal flask. var/storage_max_storage_space = 4 + /// The dmi where the grayscale squad overlays are contained var/helmet_overlay_icon = 'icons/mob/humans/onmob/head_1.dmi' -/obj/item/clothing/head/helmet/marine/New(loc, - new_protection[] = list(MAP_ICE_COLONY = ICE_PLANET_MIN_COLD_PROT)) + ///Any visors built into the helmet + var/list/built_in_visors = list(new /obj/item/device/helmet_visor) + + ///Any visors that have been added into the helmet + var/list/inserted_visors = list() + + ///Max amount of inserted visors + var/max_inserted_visors = 1 + + ///The current active visor that is shown + var/obj/item/device/helmet_visor/active_visor = null + + ///Designates a visor type that should start down when initialized + var/start_down_visor_type + +/obj/item/clothing/head/helmet/marine/Initialize(mapload, new_protection[] = list(MAP_ICE_COLONY = ICE_PLANET_MIN_COLD_PROT)) + . = ..() if(!(flags_atom & NO_NAME_OVERRIDE)) name = "[specialty]" if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) @@ -385,7 +402,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( name += " helmet" if(!(flags_atom & NO_SNOW_TYPE)) - select_gamemode_skin(type,null,new_protection) + select_gamemode_skin(type, null, new_protection) helmet_overlays = list() //To make things simple. @@ -399,7 +416,24 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( camera = new /obj/structure/machinery/camera(src) camera.network = list(CAMERA_NET_OVERWATCH) - ..() + if(length(inserted_visors) || length(built_in_visors)) + var/datum/action/item_action/cycle_helmet_huds/new_action = new(src) + LAZYADD(actions, new_action) + if(ishuman(loc)) + var/mob/living/carbon/human/holding_human = loc + if(holding_human.head == src) + new_action.give_to(holding_human) + + if(start_down_visor_type) + for(var/obj/item/device/helmet_visor/cycled_visor in (built_in_visors + inserted_visors)) + if(cycled_visor.type == start_down_visor_type) + active_visor = cycled_visor + break + + if(active_visor) + var/datum/action/item_action/cycle_helmet_huds/cycle_action = locate() in actions + if(cycle_action) + cycle_action.set_action_overlay(active_visor) /obj/item/clothing/head/helmet/marine/Destroy(force) helmet_overlays = null @@ -421,9 +455,9 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( if(pockets.handle_mousedrop(usr, over_object)) ..() -/obj/item/clothing/head/helmet/marine/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/ammo_magazine) && world.time > helmet_bash_cooldown && user) - var/obj/item/ammo_magazine/M = W +/obj/item/clothing/head/helmet/marine/attackby(obj/item/attacking_item, mob/user) + if(istype(attacking_item, /obj/item/ammo_magazine) && world.time > helmet_bash_cooldown && user) + var/obj/item/ammo_magazine/M = attacking_item var/ammo_level = "somewhat" playsound(user, 'sound/items/trayhit1.ogg', 15, FALSE) if(M.current_rounds > (M.max_rounds/2)) @@ -436,9 +470,49 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( ammo_level = "empty. Uh oh." user.visible_message("[user] bashes [M] against their helmet", "You bash [M] against your helmet. It is [ammo_level]") helmet_bash_cooldown = world.time + 20 SECONDS - else - ..() - return pockets.attackby(W, user) + return + + if(istype(attacking_item, /obj/item/device/helmet_visor)) + if(length(inserted_visors) >= max_inserted_visors) + to_chat(user, SPAN_NOTICE("[src] has used all of its visor attachment sockets.")) + return + + var/obj/item/device/helmet_visor/new_visor = attacking_item + for(var/obj/item/device/helmet_visor/cycled_visor as anything in (built_in_visors + inserted_visors)) + if(cycled_visor.type == new_visor.type) + to_chat(user, SPAN_NOTICE("[src] already has this type of HUD connected.")) + return + if(!user.drop_held_item()) + return + + inserted_visors += new_visor + to_chat(user, SPAN_NOTICE("You connect [new_visor] to [src].")) + new_visor.forceMove(src) + if(!(locate(/datum/action/item_action/cycle_helmet_huds) in actions)) + var/datum/action/item_action/cycle_helmet_huds/new_action = new(src) + new_action.give_to(user) + return + + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER) && length(inserted_visors)) + for(var/obj/item/device/helmet_visor/visor as anything in inserted_visors) + visor.forceMove(get_turf(src)) + + inserted_visors = list() + to_chat(user, SPAN_NOTICE("You remove the inserted visors.")) + var/obj/item/device/helmet_visor/temp_visor_holder = active_visor + active_visor = null + turn_off_visor(user, temp_visor_holder, TRUE) + + var/datum/action/item_action/cycle_helmet_huds/cycle_action = locate() in actions + cycle_action.set_default_overlay() + if(!length(built_in_visors)) + cycle_action.remove_from(user) + + recalculate_visors(user) + return + + ..() + return pockets.attackby(attacking_item, user) /obj/item/clothing/head/helmet/marine/on_pocket_insertion() update_icon() @@ -478,6 +552,9 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( else helmet_overlays = above_band_layer + below_band_layer + if(active_visor) + helmet_overlays += active_visor.helmet_overlay + if(ismob(loc)) var/mob/M = loc M.update_inv_head() @@ -485,22 +562,28 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( /obj/item/clothing/head/helmet/marine/equipped(mob/living/carbon/human/mob, slot) if(camera) camera.c_tag = mob.name + if(active_visor) + recalculate_visors(mob) ..() /obj/item/clothing/head/helmet/marine/unequipped(mob/user, slot) . = ..() if(pockets) for(var/obj/item/attachable/flashlight/F in pockets) - if(F.activated) + if(F.light_on) F.activate_attachment(src, user, TRUE) + if(active_visor) + recalculate_visors(user) /obj/item/clothing/head/helmet/marine/dropped(mob/living/carbon/human/mob) if(camera) camera.c_tag = "Unknown" if(pockets) for(var/obj/item/attachable/flashlight/F in pockets) - if(F.activated) + if(F.light_on) F.activate_attachment(src, mob, TRUE) + if(active_visor) + recalculate_visors(mob) ..() /obj/item/clothing/head/helmet/marine/has_garb_overlay() @@ -518,59 +601,128 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( return pockets return ..() -/obj/item/clothing/head/helmet/marine/tech - name = "\improper M10 technician helmet" - desc = "A modified M10 marine helmet for ComTechs. Features a toggleable welding screen for eye protection." - icon_state = "tech_helmet" - specialty = "M10 technician" - var/protection_on = FALSE - ///To remember the helmet's map variant-adjusted icon state - var/base_icon_state +/// Recalculates and sets the proper visor effects +/obj/item/clothing/head/helmet/marine/proc/recalculate_visors(mob/user) + turn_off_visors(user) + + if(!active_visor) + return + + if(user != loc) + return + + var/mob/living/carbon/human/human_user = user + if(!human_user || human_user.head != src) + return + + turn_on_visor(human_user) - actions_types = list(/datum/action/item_action/toggle) - vision_impair = VISION_IMPAIR_NONE +/// Turns on the current active visor +/obj/item/clothing/head/helmet/marine/proc/turn_on_visor(mob/user) + if(!active_visor) + return + + if(active_visor.can_toggle(user)) + active_visor.visor_function(src, user) + + playsound_client(user.client, active_visor.toggle_on_sound, null, 75) + update_icon() + +/// Turns off the specified visor +/obj/item/clothing/head/helmet/marine/proc/turn_off_visor(mob/user, obj/item/device/helmet_visor/current_visor, sound = FALSE) + if(!current_visor) + return -/obj/item/clothing/head/helmet/marine/tech/Initialize() + if(current_visor.can_toggle(user)) + current_visor.visor_function(src, user) + + if(sound) + playsound_client(user.client, current_visor.toggle_off_sound, null, 75) + update_icon() + +/// Attempts to turn off all visors +/obj/item/clothing/head/helmet/marine/proc/turn_off_visors(mob/user) + var/list/total_visors = built_in_visors + inserted_visors + + for(var/obj/item/device/helmet_visor/cycled_helmet_visor in total_visors) + if(cycled_helmet_visor.can_toggle(user)) + cycled_helmet_visor.visor_function(src, user, TRUE) + + update_icon() + +///Cycles the active HUD to the next between built_in_visors and inserted_visors, nullifies if at end and removes all HUDs +/obj/item/clothing/head/helmet/marine/proc/cycle_huds(mob/user) + var/list/total_visors = built_in_visors + inserted_visors + + if(!length(total_visors)) + return FALSE + + if(active_visor) + var/iterator = 1 + for(var/hud_type in total_visors) + if(hud_type == active_visor) + if(length(total_visors) > iterator) + turn_off_visor(user, active_visor, FALSE) + active_visor = total_visors[(iterator + 1)] + recalculate_visors(user) + return active_visor + else + turn_off_visor(user, active_visor, TRUE) + active_visor = null + recalculate_visors(user) + return FALSE + iterator++ + + if(total_visors[1]) + active_visor = total_visors[1] + recalculate_visors(user) + return active_visor + + active_visor = null + recalculate_visors(user) + return FALSE + +/datum/action/item_action/cycle_helmet_huds/New(Target, obj/item/holder) . = ..() - base_icon_state = icon_state + name = "Cycle helmet HUD" + button.name = name + set_default_overlay() -/obj/item/clothing/head/helmet/marine/tech/attack_self(mob/user) - ..() - toggle() +/datum/action/item_action/cycle_helmet_huds/action_activate() + . = ..() + var/obj/item/clothing/head/helmet/marine/holder_helmet = holder_item + var/cycled_hud = holder_helmet.cycle_huds(usr) -/obj/item/clothing/head/helmet/marine/tech/verb/toggle() - set category = "Object" - set name = "Toggle Tech Helmet" - set src in usr + set_action_overlay(cycled_hud) - if(usr.canmove && !usr.stat && !usr.is_mob_restrained()) - if(protection_on) - vision_impair = VISION_IMPAIR_NONE - flags_inventory &= ~(COVEREYES|COVERMOUTH) - flags_inv_hide &= ~(HIDEEYES|HIDEFACE) - icon_state = base_icon_state - eye_protection = EYE_PROTECTION_NONE - to_chat(usr, "You deactivate the [src]'s welding screen.") - else - vision_impair = VISION_IMPAIR_MAX - flags_inventory |= COVEREYES|COVERMOUTH - flags_inv_hide |= HIDEEYES|HIDEFACE - icon_state = "[base_icon_state]_on" - eye_protection = EYE_PROTECTION_WELDING - to_chat(usr, "You activate the [src]'s welding screen.") +/// Sets the action overlay based on the visor type +/datum/action/item_action/cycle_helmet_huds/proc/set_action_overlay(obj/item/device/helmet_visor/new_visor) + if(!new_visor) + set_default_overlay() + return - protection_on = !protection_on + action_icon_state = new_visor.action_icon_string + button.overlays.Cut() + button.overlays += image('icons/obj/items/clothing/helmet_visors.dmi', button, action_icon_state) - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.head == src) - H.update_tint() +/// Sets the action overlay to default hud sight up +/datum/action/item_action/cycle_helmet_huds/proc/set_default_overlay() + action_icon_state = "hud_sight_up" + button.overlays.Cut() + button.overlays += image('icons/obj/items/clothing/helmet_visors.dmi', button, action_icon_state) - update_clothing_icon() //so our mob-overlays update +/obj/item/clothing/head/helmet/marine/tech + name = "\improper M10 technician helmet" + desc = "A modified M10 marine helmet for ComTechs. Features a toggleable welding screen for eye protection." + icon_state = "tech_helmet" + specialty = "M10 technician" + built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/welding_visor) - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() +/obj/item/clothing/head/helmet/marine/grey + desc = "A standard M10 Pattern Helmet. This one has not had a camouflage pattern applied to it yet. There is a built-in camera on the right side." + icon_state = "c_helmet" + item_state = "c_helmet" + flags_atom = NO_SNOW_TYPE /obj/item/clothing/head/helmet/marine/tech/tanker name = "\improper M50 tanker helmet" @@ -583,12 +735,15 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( flags_inventory = BLOCKSHARPOBJ flags_inv_hide = HIDEEARS|HIDETOPHAIR specialty = "M50 tanker" + built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/welding_visor/tanker) /obj/item/clothing/head/helmet/marine/medic name = "\improper M10 corpsman helmet" desc = "An M10 marine helmet version worn by marine hospital corpsmen. Has red cross painted on its front." icon_state = "med_helmet" specialty = "M10 pattern medic" + built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced) + start_down_visor_type = /obj/item/device/helmet_visor/medical/advanced /obj/item/clothing/head/helmet/marine/covert name = "\improper M10 covert helmet" @@ -613,16 +768,17 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( /obj/item/clothing/head/helmet/marine/rto name = "\improper M12 pattern dust helmet" - desc = "An experimental brain-bucket. A dust ruffle hangs from back instead of the standard lobster shell design. Moderately better at deflecting blunt objects at the cost of humiliation. But who will be laughing at the memorial? Not you, you'll be busy getting medals for your fantastic leadership." + desc = "An experimental brain-bucket. A dust ruffle hangs from back instead of the standard lobster shell design. Moderately better at deflecting blunt objects at the cost of humiliation, can also hold a second visor optic. But who will be laughing at the memorial? Not you, you'll be busy getting medals for your fantastic leadership." icon_state = "io" item_state = "io" armor_melee = CLOTHING_ARMOR_MEDIUMHIGH armor_bio = CLOTHING_ARMOR_MEDIUMHIGH specialty = "M12 pattern" + max_inserted_visors = 2 /obj/item/clothing/head/helmet/marine/rto/intel name = "\improper XM12 pattern intelligence helmet" - desc = "An experimental brain-bucket. A dust ruffle hangs from back. Moderately better at deflecting blunt objects at the cost of humiliation. But who will be laughing at the memorial? Not you, you'll be busy getting medals for your intel work." + desc = "An experimental brain-bucket. A dust ruffle hangs from back. Moderately better at deflecting blunt objects at the cost of humiliation, can also hold a second visor optic. But who will be laughing at the memorial? Not you, you'll be busy getting medals for your intel work." specialty = "XM12 pattern intel" /obj/item/clothing/head/helmet/marine/specialist @@ -729,6 +885,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_bio = CLOTHING_ARMOR_MEDIUMHIGH specialty = "M10 pattern captain" flags_atom = NO_SNOW_TYPE + built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced, new /obj/item/device/helmet_visor/security) /obj/item/clothing/head/helmet/marine/MP name = "\improper M10 pattern MP helmet" @@ -737,6 +894,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( item_state = "mp_helmet" armor_energy = CLOTHING_ARMOR_MEDIUMLOW specialty = "M10 pattern military police" + built_in_visors = list(new /obj/item/device/helmet_visor/security) /obj/item/clothing/head/helmet/marine/MP/WO name = "\improper M3 pattern chief MP helmet" @@ -751,6 +909,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( icon_state = "helmet" item_state = "helmet" specialty = "M10 pattern officer" + built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced) /obj/item/clothing/head/helmet/marine/mp/provost/marshal name = "\improper Provost Marshal Cap" @@ -770,6 +929,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_bio = CLOTHING_ARMOR_MEDIUMHIGH specialty = "M10 pattern SOF" flags_atom = NO_SNOW_TYPE + built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical, new /obj/item/device/helmet_visor/security) //=============================//PMCS\\==================================\\ @@ -777,6 +937,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( /obj/item/clothing/head/helmet/marine/veteran flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE //Let's make these keep their name and icon. + built_in_visors = list() /obj/item/clothing/head/helmet/marine/veteran/pmc name = "\improper PMC tactical cap" @@ -926,6 +1087,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_rad = CLOTHING_ARMOR_MEDIUMLOW armor_internaldamage = CLOTHING_ARMOR_HIGH min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROT + clothing_traits = list(TRAIT_EAR_PROTECTION) //the sprites clearly fully cover the ears and most of the head /obj/item/clothing/head/helmet/marine/veteran/UPP/engi name = "\improper UM4-V helmet" @@ -1137,44 +1299,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( /obj/item/clothing/head/helmet/marine/veteran/mercenary/support/engineer desc = "A sturdy helmet worn by an unknown mercenary group. Features a toggleable welding screen for eye protection." - var/protection_on = FALSE - - actions_types = list(/datum/action/item_action/toggle) - vision_impair = VISION_IMPAIR_NONE - -/obj/item/clothing/head/helmet/marine/veteran/mercenary/support/engineer/attack_self(mob/user) - ..() - toggle() - -/obj/item/clothing/head/helmet/marine/veteran/mercenary/support/engineer/verb/toggle() - set category = "Object" - set name = "Toggle Helmet Welding Visor" - set src in usr - - if(usr.canmove && !usr.stat && !usr.is_mob_restrained()) - if(protection_on) - vision_impair = VISION_IMPAIR_NONE - flags_inventory &= ~(COVEREYES|COVERMOUTH) - flags_inv_hide &= ~(HIDEEYES|HIDEFACE) - eye_protection = EYE_PROTECTION_NONE - to_chat(usr, "You deactivate the [src]'s welding screen.") - else - vision_impair = VISION_IMPAIR_MAX - flags_inventory |= COVEREYES|COVERMOUTH - flags_inv_hide |= HIDEEYES|HIDEFACE - eye_protection = EYE_PROTECTION_WELDING - to_chat(usr, "You activate the [src]'s welding screen.") - - protection_on = !protection_on - - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.head == src) - H.update_tint() - - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() + built_in_visors = list(new /obj/item/device/helmet_visor/welding_visor/mercenary) //=============================//MEME\\==================================\\ //=======================================================================\\ @@ -1193,6 +1318,8 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_melee = CLOTHING_ARMOR_VERYHIGH armor_bomb = CLOTHING_ARMOR_GIGAHIGH + built_in_visors = list() + var/mob/activator = null var/active = FALSE var/det_time = 40 @@ -1243,4 +1370,37 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( contained_sprite = TRUE flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + built_in_visors = list() + #undef HELMET_GARB_RELAY_ICON_STATE + +//=ROYAL MARINES=\\ + +/obj/item/clothing/head/helmet/marine/veteran/royal_marine + name = "\improper L5A2 ballistic helmet" + desc = "A High-cut ballistic helmet. Designed by Lindenthal-Ehrenfeld Militärindustrie it is intended to be used by Royal Marines Commando as part of the kestrel armour system." + icon_state = "rmc_helm1" + item_state = "rmc_helm1" + armor_melee = CLOTHING_ARMOR_MEDIUM + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_LOW + armor_internaldamage = CLOTHING_ARMOR_LOW + min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROT + flags_inventory = BLOCKSHARPOBJ + flags_inv_hide = NO_FLAGS + flags_marine_helmet = NO_FLAGS + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + +/obj/item/clothing/head/helmet/marine/veteran/royal_marine/breacher + name = "\improper L5A3 ballistic helmet" + desc = "A High-cut ballistic helmet featuring an attached mandible. Designed by Lindenthal-Ehrenfeld Militärindustrie it is intended to be used by Royal Marines Commando as part of the kestrel armour system" + icon_state = "rmc_helm_br" + item_state = "rmc_helm_br" + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_HIGHPLUS + armor_energy = CLOTHING_ARMOR_MEDIUMHIGH + armor_bomb = CLOTHING_ARMOR_MEDIUMHIGH + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_LOW diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index e6dd7be603df..102d8241754f 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -137,25 +137,7 @@ icon_state = "hardhat[on]_pumpkin" if(on) - user.SetLuminosity(brightness_on, FALSE, src) + set_light_range(brightness_on) + set_light_on(TRUE) else - user.SetLuminosity(0, FALSE, src) - -/obj/item/clothing/head/pumpkinhead/pickup(mob/user) - ..() - if(on) - user.SetLuminosity(brightness_on, FALSE, src) - SetLuminosity(0) - -/obj/item/clothing/head/pumpkinhead/dropped(mob/user) - ..() - if(on) - user.SetLuminosity(0, FALSE, src) - SetLuminosity(brightness_on) - -/obj/item/clothing/head/pumpkinhead/Destroy() - if(ismob(src.loc)) - src.loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - return ..() + set_light_on(FALSE) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 8d6a2b4ac0ca..d4b1d6f3dd84 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -145,3 +145,11 @@ unacidable = TRUE // flags_item = NODROP|DELONDROP flags_inventory = CANTSTRIP|COVEREYES|COVERMOUTH|ALLOWINTERNALS|ALLOWREBREATH|BLOCKGASEFFECT|ALLOWCPR|BLOCKSHARPOBJ + +//=ROYAL MARINES=\\ + +/obj/item/clothing/mask/gas/pmc/royal_marine + name = "\improper L7 gasmask" + desc = "The L7 Gasmask used by members of the three world empires royal marines commando." + icon_state = "rmc_mask" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE diff --git a/code/modules/clothing/shoes/marine_shoes.dm b/code/modules/clothing/shoes/marine_shoes.dm index d4c772336e2a..40bec976c337 100644 --- a/code/modules/clothing/shoes/marine_shoes.dm +++ b/code/modules/clothing/shoes/marine_shoes.dm @@ -196,3 +196,37 @@ /obj/item/clothing/shoes/hiking/proc/handle_weed_slowdown(mob/user, list/slowdata) SIGNAL_HANDLER slowdata["movement_slowdown"] *= weed_slowdown_mult + +//=ROYAL MARINES=\\ + +/obj/item/clothing/shoes/royal_marine + name = "\improper L10 pattern combat boots" + desc = "Standard issue combat boots for combat scenarios or combat situations. Used by the three world empires royal marines commando units." + icon_state = "rmc_boots" + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_laser = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_rad = CLOTHING_ARMOR_NONE + armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW + min_cold_protection_temperature = SHOE_MIN_COLD_PROT + max_heat_protection_temperature = SHOE_MAX_HEAT_PROT + flags_cold_protection = BODY_FLAG_FEET + flags_heat_protection = BODY_FLAG_FEET + flags_inventory = FPRINT|NOSLIPPING + siemens_coefficient = 0.6 + items_allowed = list( + /obj/item/attachable/bayonet, + /obj/item/weapon/throwing_knife, + /obj/item/weapon/gun/pistol/holdout, + /obj/item/weapon/gun/pistol/clfpistol, + ) + flags_atom = NO_NAME_OVERRIDE + +/obj/item/clothing/shoes/royal_marine/knife +/obj/item/clothing/shoes/royal_marine/knife/Initialize(mapload, ...) + . = ..() + stored_item = new /obj/item/attachable/bayonet/rmc(src) + update_icon() diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm index 910bb032349e..df7a8bc65b19 100644 --- a/code/modules/clothing/suits/marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor.dm @@ -69,6 +69,7 @@ /obj/item/attachable/bayonet, /obj/item/storage/backpack/general_belt, /obj/item/storage/large_holster/machete, + /obj/item/storage/belt/gun/type47, /obj/item/storage/belt/gun/m4a3, /obj/item/storage/belt/gun/m44, /obj/item/storage/belt/gun/smartpistol, @@ -79,7 +80,10 @@ ) valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_PONCHO) - var/brightness_on = 6 //Average attachable pocket light + light_power = 3 + light_range = 4 + light_system = MOVABLE_LIGHT + var/flashlight_cooldown = 0 //Cooldown for toggling the light var/locate_cooldown = 0 //Cooldown for SL locator var/armor_overlays[] @@ -98,6 +102,8 @@ /// The dmi where the grayscale squad overlays are contained var/squad_overlay_icon = 'icons/mob/humans/onmob/suit_1.dmi' + var/atom/movable/marine_light/light_holder + /obj/item/clothing/suit/storage/marine/Initialize(mapload) . = ..() if(!(flags_atom & NO_NAME_OVERRIDE)) @@ -121,6 +127,12 @@ ) pockets.max_storage_space = 8 + light_holder = new(src) + +/obj/item/clothing/suit/storage/marine/Destroy() + QDEL_NULL(light_holder) + return ..() + /obj/item/clothing/suit/storage/marine/update_icon(mob/user) var/image/I armor_overlays["lamp"] = null @@ -150,42 +162,11 @@ icon_state = replacetext(icon_state,"1","[new_look]") update_icon(user) -/obj/item/clothing/suit/storage/marine/pickup(mob/user) - if(flags_marine_armor & ARMOR_LAMP_ON) - user.SetLuminosity(brightness_on, FALSE, src) - SetLuminosity(0) - ..() - -/obj/item/clothing/suit/storage/marine/dropped(mob/user) - if(loc != user) - turn_off_light(user) - ..() - - -/obj/item/clothing/suit/storage/marine/proc/is_light_on() - return flags_marine_armor & ARMOR_LAMP_ON - -/obj/item/clothing/suit/storage/marine/proc/turn_off_light(mob/wearer) - if(is_light_on()) - if(wearer) - wearer.SetLuminosity(0, FALSE, src) - SetLuminosity(brightness_on) - toggle_armor_light() //turn the light off - return 1 - return 0 - -/obj/item/clothing/suit/storage/marine/Destroy() - if(ismob(src.loc)) - src.loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) - return ..() - /obj/item/clothing/suit/storage/marine/attack_self(mob/user) ..() if(!isturf(user.loc)) - to_chat(user, SPAN_WARNING("You cannot turn the light [is_light_on() ? "off" : "on"] while in [user.loc].")) //To prevent some lighting anomalies. + to_chat(user, SPAN_WARNING("You cannot turn the light [light_on ? "off" : "on"] while in [user.loc].")) //To prevent some lighting anomalies. return if(flashlight_cooldown > world.time) @@ -197,26 +178,33 @@ if(H.wear_suit != src) return - toggle_armor_light(user) + turn_light(user, !light_on) /obj/item/clothing/suit/storage/marine/item_action_slot_check(mob/user, slot) - if(!ishuman(user)) return FALSE - if(slot != WEAR_JACKET) return FALSE + if(!ishuman(user)) + return FALSE + if(slot != WEAR_JACKET) + return FALSE return TRUE //only give action button when armor is worn. -/obj/item/clothing/suit/storage/marine/proc/toggle_armor_light(mob/user) - flashlight_cooldown = world.time + 20 //2 seconds cooldown every time the light is toggled - if(is_light_on()) //Turn it off. - if(user) user.SetLuminosity(0, FALSE, src) - else SetLuminosity(0) - playsound(src,'sound/handling/click_2.ogg', 50, 1) - else //Turn it on. - if(user) user.SetLuminosity(brightness_on, FALSE, src) - else SetLuminosity(brightness_on) - +/obj/item/clothing/suit/storage/marine/turn_light(mob/user, toggle_on) + . = ..() + if(. != CHECKS_PASSED) + return + set_light_range(initial(light_range)) + set_light_power(FLOOR(initial(light_power) * 0.5, 1)) + set_light_on(toggle_on) flags_marine_armor ^= ARMOR_LAMP_ON - playsound(src,'sound/handling/suitlight_on.ogg', 50, 1) + light_holder.set_light_flags(LIGHT_ATTACHED) + light_holder.set_light_range(initial(light_range)) + light_holder.set_light_power(initial(light_power)) + light_holder.set_light_on(toggle_on) + + if(!toggle_on) + playsound(src, 'sound/handling/click_2.ogg', 50, 1) + + playsound(src, 'sound/handling/suitlight_on.ogg', 50, 1) update_icon(user) for(var/X in actions) @@ -267,7 +255,7 @@ armor_bio = CLOTHING_ARMOR_MEDIUMHIGH armor_rad = CLOTHING_ARMOR_MEDIUM storage_slots = 4 - brightness_on = 7 //slightly higher + light_range = 5 //slightly higher specialty = "M4 pattern marine" /obj/item/clothing/suit/storage/marine/rto/intel @@ -1198,7 +1186,7 @@ armor_bomb = CLOTHING_ARMOR_HIGH armor_rad = CLOTHING_ARMOR_MEDIUM storage_slots = 2 - brightness_on = 9 + light_range = 7 slowdown = SLOWDOWN_ARMOR_VERY_LIGHT uniform_restricted = list(/obj/item/clothing/under/marine/veteran/dutch) @@ -1268,9 +1256,10 @@ storage_slots = 1 uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP, /obj/item/clothing/under/marine/veteran/UPP/medic, /obj/item/clothing/under/marine/veteran/UPP/engi) -/obj/item/clothing/suit/storage/marine/faction/support - name = "\improper UM5B personal armor" - desc = "Standard body armor of the UPP military, the UM5B (Union Medium MK5 Beta) is a light body armor, slightly weaker than the M3 pattern body armor in service with the USCM, specialized towards ballistics protection. This set of personal armor lacks the iconic neck piece and some of the armor in favor of user mobility." +/obj/item/clothing/suit/storage/marine/faction/UPP/support + name = "\improper UL6 personal armor" + desc = "Standard body armor of the UPP military, the UL6 (Union Light MK6) is a light body armor, slightly weaker than the M3 pattern body armor in service with the USCM, specialized towards ballistics protection. This set of personal armor lacks the iconic neck piece and some of the armor in favor of user mobility." + storage_slots = 3 icon_state = "upp_armor_support" slowdown = SLOWDOWN_ARMOR_LIGHT armor_melee = CLOTHING_ARMOR_HIGH @@ -1278,7 +1267,6 @@ armor_bio = CLOTHING_ARMOR_MEDIUMLOW armor_rad = CLOTHING_ARMOR_MEDIUMLOW armor_internaldamage = CLOTHING_ARMOR_HIGH - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) /obj/item/clothing/suit/storage/marine/faction/UPP/commando name = "\improper UM5CU personal armor" @@ -1291,6 +1279,7 @@ name = "\improper UH7 heavy plated armor" desc = "An extremely heavy-duty set of body armor in service with the UPP military, the UH7 (Union Heavy MK7) is known for having powerful ballistic protection, alongside a noticeable neck guard, fortified in order to allow the wearer to endure the stresses of the bulky helmet." icon_state = "upp_armor_heavy" + storage_slots = 3 slowdown = SLOWDOWN_ARMOR_HEAVY flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN flags_armor_protection = BODY_FLAG_ALL_BUT_HEAD @@ -1306,19 +1295,20 @@ /obj/item/clothing/suit/storage/marine/faction/UPP/heavy/Initialize() . = ..() pockets.bypass_w_limit = list( - /obj/item/ammo_magazine/minigun + /obj/item/ammo_magazine/minigun, + /obj/item/ammo_magazine/pkp, ) /obj/item/clothing/suit/storage/marine/faction/UPP/officer - name = "\improper UL6 officers jacket" - desc = "A lightweight jacket, issued to officers of the UPP's military. Still studded to the brim with kevlar shards, though the synthread construction reduces its effectiveness." + name = "\improper UL4 officer jacket" + desc = "A lightweight jacket, issued to officers of the UPP's military. Slightly protective from incoming damage, best off with proper armor however." icon_state = "upp_coat_officer" - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + slowdown = SLOWDOWN_ARMOR_NONE flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - armor_melee = CLOTHING_ARMOR_LOW - armor_bullet = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat + armor_bullet = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW armor_bio = CLOTHING_ARMOR_LOW armor_rad = CLOTHING_ARMOR_LOW armor_internaldamage = CLOTHING_ARMOR_LOW @@ -1326,31 +1316,31 @@ uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) /obj/item/clothing/suit/storage/marine/faction/UPP/kapitan - name = "\improper UL6 Kapitan's jacket" - desc = "A lightweight jacket, issued to the Kapitans of the UPP's military. Made of high-quality materials, even going as far as having the ranks and insignia of the Kapitan and their Company emblazoned on the shoulders and front of the jacket." + name = "\improper UL4 senior officer jacket" + desc = "A lightweight jacket, issued to senior officers of the UPP's military. Made of high-quality materials, even going as far as having the ranks and insignia of the Kapitan and their Company emblazoned on the shoulders and front of the jacket. Slightly protective from incoming damage, best off with proper armor however." icon_state = "upp_coat_kapitan" - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - armor_melee = CLOTHING_ARMOR_LOW - armor_bullet = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + slowdown = SLOWDOWN_ARMOR_NONE + armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat + armor_bullet = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW armor_bio = CLOTHING_ARMOR_LOW armor_rad = CLOTHING_ARMOR_LOW armor_internaldamage = CLOTHING_ARMOR_LOW + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS storage_slots = 4 uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) /obj/item/clothing/suit/storage/marine/faction/UPP/mp - name = "\improper UL6 camouflaged jacket" + name = "\improper UL4 camouflaged jacket" desc = "A lightweight jacket, issued to troops when they're not expected to engage in combat. Still studded to the brim with kevlar shards, though the synthread construction reduces its effectiveness." icon_state = "upp_coat_mp" - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + slowdown = SLOWDOWN_ARMOR_NONE flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - armor_melee = CLOTHING_ARMOR_LOW - armor_bullet = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat + armor_bullet = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW armor_bio = CLOTHING_ARMOR_LOW armor_rad = CLOTHING_ARMOR_LOW armor_internaldamage = CLOTHING_ARMOR_LOW @@ -1360,8 +1350,8 @@ restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) /obj/item/clothing/suit/storage/marine/faction/UPP/jacket/ivan - name = "\improper UH6 Camo Jacket" - desc = "An experimental heavily armored variant of the UL6 given to only the most elite units... usually." + name = "\improper UH4 Camo Jacket" + desc = "An experimental heavily armored variant of the UL4 given to only the most elite units... usually." slowdown = SLOWDOWN_ARMOR_MEDIUM flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS|BODY_FLAG_HANDS|BODY_FLAG_FEET armor_melee = CLOTHING_ARMOR_HIGH @@ -1727,3 +1717,68 @@ icon_state = "wc_armor" flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE contained_sprite = TRUE + + +//=ROYAL MARINES=\\ + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine + name = "kestrel armoured vest" + desc = "A customizable personal armor system used by the Three World Empire's Royal Marines Commandos. Designers from a Weyland Yutani subsidary, Lindenthal-Ehrenfeld Militärindustrie, iterated on the USCMC's M3 pattern personal armor in their Tokonigara lab to create an armor systemed to suit the unique needs of the Three World Empire's smaller but better equipped Royal Marines." + icon_state = "rmc_light" + item_state = "rmc_light" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/explosive/grenade, + /obj/item/storage/bible, + /obj/item/weapon/claymore/mercsword/machete, + /obj/item/attachable/bayonet, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/light //RMC Rifleman Armor + icon_state = "rmc_light" + item_state = "rmc_light" + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + slowdown = SLOWDOWN_ARMOR_LIGHT + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/light/team_leader //RMC TL & LT Armor + name = "kestrel armoured carry vest" + icon_state = "rmc_light_padded" + item_state = "rmc_light_padded" + storage_slots = 7 + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/smartgun //Smartgun Spec Armor + name = "kestrel armoured smartgun harness" + icon_state = "rmc_smartgun" + item_state = "rmc_smartgun" + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN|SMARTGUN_HARNESS + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/pointman //Pointman Spec Armor + name = "kestrel pointman armour" + desc = "A heavier version of the armor system used by the Three World Empire's Royal Marines Commandos. Designers from a Weyland Yutani subsidary, Lindenthal-Ehrenfeld Militärindustrie, iterated on the USCMC's M3 pattern personal armor in their Tokonigara lab to create an armor systemed to suit the unique needs of the Three World Empire's smaller but better equipped Royal Marines." + icon_state = "rmc_pointman" + item_state = "rmc_pointman" + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_HIGHPLUS + armor_bomb = CLOTHING_ARMOR_HIGHPLUS + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + storage_slots = 7 + slowdown = SLOWDOWN_ARMOR_LOWHEAVY + movement_compensation = SLOWDOWN_ARMOR_MEDIUM + +/atom/movable/marine_light + light_system = DIRECTIONAL_LIGHT diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index a4b38b657735..fb9d889b4584 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -933,3 +933,24 @@ worn_state = "working_joe_overalls" armor_bio = CLOTHING_ARMOR_MEDIUMHIGH unacidable = TRUE + +//=ROYAL MARINES=\\ + +/obj/item/clothing/under/marine/veteran/royal_marine + name = "royal marines commando uniform" + desc = "The field uniform of the royal marines commando. They have shards of light Kevlar to help protect against stabbing weapons and bullets. Onpar with similar USCM equipment" + icon_state = "rmc_uniform" + worn_state = "rmc_uniform" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + contained_sprite = TRUE + icon = 'icons/mob/humans/onmob/contained/royal_marines_commando.dmi' + +/obj/item/clothing/under/marine/veteran/royal_marine/tl + icon_state = "rmc_uniform_teaml" + worn_state = "rmc_uniform_teaml" + +/obj/item/clothing/under/marine/veteran/royal_marine/lt + name = "royal marines commando officers uniform" + desc = "The officers uniform of the royal marines commando. They have shards of light Kevlar to help protect against stabbing weapons and bullets. Onpar with similar USCM equipment" + icon_state = "rmc_uniform_lt" + worn_state = "rmc_uniform_lt" diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 329e2055778e..a7da554a7992 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -359,6 +359,11 @@ desc = "A fire-resistant shoulder patch, worn by the men and women of the USS Hanyut, USCM FORECON." icon_state = "forecon_patch" +/obj/item/clothing/accessory/patch/royal_marines + name = "TWE Royal Marines Commando patch" + desc = "A fire-resistant shoulder patch, worn by the men and women of the royal marines commando." + icon_state = "commandopatch" + /obj/item/clothing/accessory/patch/upp name = "UPP Airborne Reconnaissance patch" desc = "A fire-resistant shoulder patch, worn by the men and women of the 173rd Airborne Reconnaissance Platoon." diff --git a/code/modules/cm_aliens/Ovipositor.dm b/code/modules/cm_aliens/Ovipositor.dm index 9758497b7009..07d3466a279d 100644 --- a/code/modules/cm_aliens/Ovipositor.dm +++ b/code/modules/cm_aliens/Ovipositor.dm @@ -89,9 +89,9 @@ SPAN_DANGER("You nudge your head against [src].")) // Density override -/obj/ovipositor/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/ovipositor/get_projectile_hit_boolean(obj/projectile/P) return TRUE -/obj/ovipositor/bullet_act(obj/item/projectile/Proj) +/obj/ovipositor/bullet_act(obj/projectile/Proj) health -= Proj.damage return 1 diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index 08e451407989..73ced8099427 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -50,7 +50,7 @@ health -= 50 healthcheck() -/obj/effect/alien/resin/bullet_act(obj/item/projectile/Proj) +/obj/effect/alien/resin/bullet_act(obj/projectile/Proj) health -= Proj.damage ..() healthcheck() @@ -375,7 +375,7 @@ health -= dam healthcheck() -/obj/structure/mineral_door/resin/bullet_act(obj/item/projectile/Proj) +/obj/structure/mineral_door/resin/bullet_act(obj/projectile/Proj) health -= Proj.damage ..() healthcheck() @@ -630,7 +630,7 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/obj/effect/alien/resin/acid_pillar/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/effect/alien/resin/acid_pillar/get_projectile_hit_boolean(obj/projectile/P) return TRUE /obj/effect/alien/resin/acid_pillar/proc/forsaken_handling() @@ -758,7 +758,7 @@ SIGNAL_HANDLER hitby(AM) -/obj/effect/alien/resin/resin_pillar/proc/handle_bullet(turf/T, obj/item/projectile/P) +/obj/effect/alien/resin/resin_pillar/proc/handle_bullet(turf/T, obj/projectile/P) SIGNAL_HANDLER bullet_act(P) return COMPONENT_BULLET_ACT_OVERRIDE @@ -897,7 +897,7 @@ var/range = 3 -/obj/item/explosive/grenade/alien/acid/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/item/explosive/grenade/alien/acid/get_projectile_hit_boolean(obj/projectile/P) return FALSE /obj/item/explosive/grenade/alien/acid/prime(force) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index cf6fa4e3665e..a0e8e5054d45 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -151,7 +151,7 @@ else child.go_idle() -/obj/effect/alien/egg/bullet_act(obj/item/projectile/P) +/obj/effect/alien/egg/bullet_act(obj/projectile/P) ..() var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & (AMMO_XENO)) diff --git a/code/modules/cm_aliens/structures/fruit.dm b/code/modules/cm_aliens/structures/fruit.dm index bb899a6ff25b..e54cb9417d7c 100644 --- a/code/modules/cm_aliens/structures/fruit.dm +++ b/code/modules/cm_aliens/structures/fruit.dm @@ -86,7 +86,7 @@ qdel(src) ..() -/obj/effect/alien/resin/fruit/bullet_act(obj/item/projectile/P) +/obj/effect/alien/resin/fruit/bullet_act(obj/projectile/P) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & (AMMO_XENO)) return diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 068ffeb659eb..c24c34de099c 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -8,7 +8,7 @@ desc = "A towering spike of resin. Its base pulsates with large tendrils." icon_state = "pylon" health = 1800 - luminosity = 2 + light_range = 2 block_range = 0 var/cover_range = WEED_RANGE_PYLON var/node_type = /obj/effect/alien/weeds/node/pylon @@ -21,6 +21,11 @@ var/protection_level = TURF_PROTECTION_CAS + /// How many lesser drone spawns this pylon is able to spawn currently + var/lesser_drone_spawns = 0 + /// The maximum amount of lesser drone spawns this pylon can hold + var/lesser_drone_spawn_limit = 5 + plane = FLOOR_PLANE /obj/effect/alien/resin/special/pylon/Initialize(mapload, hive_ref) @@ -31,6 +36,9 @@ LAZYADD(A.linked_pylons, src) linked_turfs += A + if(light_range) + set_light(light_range) + /obj/effect/alien/resin/special/pylon/Destroy() for(var/turf/A as anything in linked_turfs) LAZYREMOVE(A.linked_pylons, src) @@ -39,6 +47,11 @@ QDEL_NULL(node) . = ..() +/obj/effect/alien/resin/special/pylon/process(delta_time) + if(lesser_drone_spawns < lesser_drone_spawn_limit) + // One every 10 seconds while on ovi, one every 120-ish seconds while off ovi + lesser_drone_spawns = min(lesser_drone_spawns + ((linked_hive.living_xeno_queen?.ovipositor ? 0.1 : 0.008) * delta_time), lesser_drone_spawn_limit) + /obj/effect/alien/resin/special/pylon/attack_alien(mob/living/carbon/xenomorph/M) if(isxeno_builder(M) && M.a_intent == INTENT_HELP && M.hivenumber == linked_hive.hivenumber) do_repair(M) //This handles the delay itself. @@ -46,6 +59,20 @@ else return ..() +/obj/effect/alien/resin/special/pylon/get_examine_text(mob/user) + . = ..() + + var/lesser_count = 0 + for(var/mob/living/carbon/xenomorph/lesser_drone/lesser in linked_hive.totalXenos) + lesser_count++ + + . += "Currently holding [SPAN_NOTICE("[Floor(lesser_drone_spawns)]")]/[SPAN_NOTICE("[lesser_drone_spawn_limit]")] lesser drones." + . += "There are currently [SPAN_NOTICE("[lesser_count]")] lesser drones in the hive. The hive can support [SPAN_NOTICE("[linked_hive.lesser_drone_limit]")] lesser drones." + +/obj/effect/alien/resin/special/pylon/attack_ghost(mob/dead/observer/user) + . = ..() + spawn_lesser_drone(user) + /obj/effect/alien/resin/special/pylon/proc/do_repair(mob/living/carbon/xenomorph/xeno) if(!istype(xeno)) return @@ -91,6 +118,25 @@ pylon_node.resin_parent = src return pylon_node +/obj/effect/alien/resin/special/pylon/proc/spawn_lesser_drone(mob/xeno_candidate) + if(!linked_hive.can_spawn_as_lesser_drone(xeno_candidate, src)) + return FALSE + + if(tgui_alert(xeno_candidate, "Are you sure you want to become a lesser drone?", "Confirmation", list("Yes", "No")) != "Yes") + return FALSE + + if(!linked_hive.can_spawn_as_lesser_drone(xeno_candidate, src)) + return FALSE + + var/mob/living/carbon/xenomorph/lesser_drone/new_drone = new(loc, null, linked_hive.hivenumber) + xeno_candidate.mind.transfer_to(new_drone, TRUE) + lesser_drone_spawns -= 1 + new_drone.visible_message(SPAN_XENODANGER("A lesser drone emerges out of [src]!"), SPAN_XENODANGER("You emerge out of [src] and awaken from your slumber. For the Hive!")) + playsound(new_drone, 'sound/effects/xeno_newlarva.ogg', 25, TRUE) + new_drone.generate_name() + + return TRUE + /obj/effect/alien/resin/special/pylon/endgame cover_range = WEED_RANGE_CORE var/activated = FALSE @@ -166,7 +212,7 @@ desc = "A giant pulsating mound of mass. It looks very much alive." icon_state = "core" health = 1200 - luminosity = 4 + light_range = 4 cover_range = WEED_RANGE_CORE node_type = /obj/effect/alien/weeds/node/pylon/core var/hardcore = FALSE @@ -186,6 +232,7 @@ protection_level = TURF_PROTECTION_OB + lesser_drone_spawn_limit = 10 /obj/effect/alien/resin/special/pylon/core/Initialize(mapload, datum/hive_status/hive_ref) . = ..() @@ -202,6 +249,7 @@ SSminimaps.add_marker(src, z, MINIMAP_FLAG_XENO, "core[health < (initial(health) * 0.5) ? "_warn" : "_passive"]") /obj/effect/alien/resin/special/pylon/core/process() + . = ..() update_minimap_icon() // Handle spawning larva if core is connected to a hive @@ -233,14 +281,13 @@ last_surge_time = world.time linked_hive.stored_larva++ linked_hive.hijack_burrowed_left-- - announce_dchat("The hive has gained another burrowed larva! Use the Join As Xeno verb to take it.", src) + 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") 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) linked_hive.hijack_burrowed_surge = FALSE xeno_message(SPAN_XENOANNOUNCE("The hive's power wanes. You will no longer gain pooled larva over time."), 3, linked_hive.hivenumber) - // Hive core can repair itself over time if(health < maxhealth && last_healed <= world.time) health += min(heal_amount, maxhealth-health) @@ -397,22 +444,5 @@ // Tell admins that this condition is reached so they know what has happened if it fails somehow return -/obj/effect/alien/resin/special/pylon/core/proc/spawn_lesser_drone(mob/xeno_candidate) - if(!linked_hive.can_spawn_as_lesser_drone(xeno_candidate)) - return FALSE - - var/mob/living/carbon/xenomorph/lesser_drone/new_drone = new /mob/living/carbon/xenomorph/lesser_drone(loc, null, linked_hive.hivenumber) - xeno_candidate.mind.transfer_to(new_drone, TRUE) - new_drone.visible_message(SPAN_XENODANGER("A lesser drone emerges out of [src]!"), SPAN_XENODANGER("You emerge out of [src] and awaken from your slumber. For the Hive!")) - playsound(new_drone, 'sound/effects/xeno_newlarva.ogg', 25, TRUE) - new_drone.generate_name() - - return TRUE - -/obj/effect/alien/resin/special/pylon/core/attack_ghost(mob/dead/observer/user) - . = ..() - if(SSticker.mode.check_xeno_late_join(user)) - SSticker.mode.attempt_to_join_as_lesser_drone(user) - #undef PYLON_REPAIR_TIME #undef PYLON_WEEDS_REGROWTH_TIME diff --git a/code/modules/cm_aliens/structures/trap.dm b/code/modules/cm_aliens/structures/trap.dm index 5e1c51538ce6..bc8eb7e6c7c0 100644 --- a/code/modules/cm_aliens/structures/trap.dm +++ b/code/modules/cm_aliens/structures/trap.dm @@ -85,7 +85,7 @@ trigger_trap(TRUE) ..() -/obj/effect/alien/resin/trap/bullet_act(obj/item/projectile/P) +/obj/effect/alien/resin/trap/bullet_act(obj/projectile/P) var/mob/living/carbon/xenomorph/X = P.firer if(istype(X) && HIVE_ALLIED_TO_HIVE(X.hivenumber, hivenumber)) return diff --git a/code/modules/cm_aliens/structures/tunnel.dm b/code/modules/cm_aliens/structures/tunnel.dm index 0e1008cfbf12..f716d69b5b7e 100644 --- a/code/modules/cm_aliens/structures/tunnel.dm +++ b/code/modules/cm_aliens/structures/tunnel.dm @@ -76,7 +76,7 @@ visible_message(SPAN_DANGER("[src] suddenly collapses!")) qdel(src) -/obj/structure/tunnel/bullet_act(obj/item/projectile/Proj) +/obj/structure/tunnel/bullet_act(obj/projectile/Proj) return FALSE /obj/structure/tunnel/ex_act(severity) diff --git a/code/modules/cm_aliens/structures/xeno_structures_boilertrap.dm b/code/modules/cm_aliens/structures/xeno_structures_boilertrap.dm index 965238e81b65..0194ea74d3a6 100644 --- a/code/modules/cm_aliens/structures/xeno_structures_boilertrap.dm +++ b/code/modules/cm_aliens/structures/xeno_structures_boilertrap.dm @@ -43,7 +43,7 @@ . = ..() qdel(src) -/obj/effect/alien/resin/boilertrap/bullet_act(obj/item/projectile/P) +/obj/effect/alien/resin/boilertrap/bullet_act(obj/projectile/P) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & (AMMO_XENO)) return diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm index 58b8d448a92f..28b92b3fca0c 100644 --- a/code/modules/cm_marines/Donator_Items.dm +++ b/code/modules/cm_marines/Donator_Items.dm @@ -74,6 +74,19 @@ flags_inventory = BLOCKSHARPOBJ flags_marine_armor = NO_FLAGS +//LIGHT SUIT TEMPLATE (for armor/exosuit) ONLY TAKE NAME, DESC, ICON_STATE, AND ITEM_STATE. Make a copy of those, and put the ckey of the person at the end after fluff +/obj/item/clothing/suit/storage/marine/light/fluff + name = "ITEM NAME" + desc = "ITEM DESCRIPTION. DONOR ITEM" //Add UNIQUE if Unique + icon_state = null + item_state = null + flags_atom = NO_NAME_OVERRIDE + //DON'T GRAB STUFF BETWEEN THIS LINE + icon = 'icons/obj/items/clothing/suits.dmi' + icon_override = 'icons/mob/humans/onmob/suit_0.dmi' //Don't fuck with this in the future please. + flags_inventory = BLOCKSHARPOBJ + flags_marine_armor = NO_FLAGS + /obj/item/clothing/suit/storage/marine/fluff/verb/toggle_squad_markings() set src in usr if(!ishuman(usr)) return @@ -223,11 +236,10 @@ item_state = "swat_suit" /obj/item/clothing/suit/storage/marine/fluff/tristan //CKEY=tristan63 - name = "Sciency Teleport Armor" - desc = "Some fancy looking armor, with lots of lights and buttons. DONOR ITEM" - icon_state = "reactive" - item_state = "reactive" - blood_overlay_type = "armor" + name = "M3X Pattern Armor" + desc = "A set of experimental M3 pattern armor, modernized to include form fitting ceramic plates for better protection against projectiles. Unfortunately the plates appear to be broken beyond repair, leaving only the base M3 protection. DONOR ITEM" + icon_state = "tristan_armor" + item_state = "tristan_armor" /obj/item/clothing/suit/storage/marine/fluff/sas_legion //CKEY=sasoperative (UNIQUE) name = "Legion Armor" @@ -266,11 +278,11 @@ item_state = "hos" blood_overlay_type = "coat" -/obj/item/clothing/suit/storage/marine/fluff/biolock //CKEY=biolock - name = "Medic Armor" - desc = "Medical armor, designed to protect medics from things that hurt medics. DONOR ITEM." - item_state = "medarmor" - icon_state = "medarmor" +/obj/item/clothing/suit/storage/marine/light/fluff/biolock //CKEY=biolock + name = "M3-L Custom" + desc = "A lighter, cut down version of the standard M3 pattern armor. This armor looks to have heavy modifications and a custom paint-job. DONOR ITEM." + item_state = "bio_armor" + icon_state = "bio_armor" /obj/item/clothing/suit/storage/marine/fluff/sas_elite //CKEY=sasoperative (UNIQUE) name = "Elite Combat Armor" @@ -632,9 +644,10 @@ desc = "Thought I walk through the valley in the shadow of death... Donor Item" /obj/item/clothing/head/helmet/marine/fluff/biolock //CKEY=biolock - name = "Medic Helmet" - desc = "Medical Helmet designed to protect the head of a medic. DONOR ITEM" - icon_state = "helmetm" + name = "M10-Custom" + desc = "A custom M10 Pattern Helmet. The inside of the helmet has smaller, slicker pads. There is a built-in camera on the right side. DONOR ITEM" + icon_state = "bio_helmet" + item_state = "bio_helmet" /obj/item/clothing/head/helmet/marine/fluff/haveatya //CKEY=haveatya name = "Pararescue Beret" diff --git a/code/modules/cm_marines/Donator_Kits.dm b/code/modules/cm_marines/Donator_Kits.dm index 2576732736aa..6c8347f3280e 100644 --- a/code/modules/cm_marines/Donator_Kits.dm +++ b/code/modules/cm_marines/Donator_Kits.dm @@ -70,7 +70,7 @@ donor_key = "biolock" donor_gear = list( /obj/item/clothing/head/helmet/marine/fluff/biolock, - /obj/item/clothing/suit/storage/marine/fluff/biolock, + /obj/item/clothing/suit/storage/marine/light/fluff/biolock, ) /obj/item/storage/box/donator_kit/bunny232 diff --git a/code/modules/cm_marines/anti_air.dm b/code/modules/cm_marines/anti_air.dm index fc67f9a2018d..cdb162cddfa3 100644 --- a/code/modules/cm_marines/anti_air.dm +++ b/code/modules/cm_marines/anti_air.dm @@ -110,12 +110,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)].") + link.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.") + link.log_ares_antiair("[usr] Deactivated Anti Air systems.") . = TRUE add_fingerprint(usr) diff --git a/code/modules/cm_marines/dropship_ammo.dm b/code/modules/cm_marines/dropship_ammo.dm index d3d0266e5982..264400caa0dd 100644 --- a/code/modules/cm_marines/dropship_ammo.dm +++ b/code/modules/cm_marines/dropship_ammo.dm @@ -146,6 +146,8 @@ fire_mission_delay = 2 var/bullet_spread_range = 4 //how far from the real impact turf can bullets land var/shrapnel_type = /datum/ammo/bullet/shrapnel/gau //For siming 30mm bullet impacts. + var/directhit_damage = 105 //how much damage is to be inficted to a mob, this is here so that we can hit resting mobs. + var/penetration = 10 //AP value pretty much /obj/structure/ship_ammo/heavygun/get_examine_text(mob/user) . = ..() @@ -165,25 +167,27 @@ var/soundplaycooldown = 0 var/debriscooldown = 0 for(var/i = 1 to ammo_used_per_firing) - var/turf/U = pick(turf_list) + var/turf/impact_tile = pick(turf_list) sleep(1) var/datum/cause_data/cause_data = create_cause_data(initial(name), source_mob) - U.ex_act(EXPLOSION_THRESHOLD_VLOW, pick(alldirs), cause_data) - create_shrapnel(U,1,0,0,shrapnel_type,cause_data,FALSE,100) //simulates a bullet - for(var/atom/movable/AM in U) - if(iscarbon(AM)) - AM.ex_act(EXPLOSION_THRESHOLD_VLOW, null, cause_data) + impact_tile.ex_act(EXPLOSION_THRESHOLD_VLOW, pick(alldirs), cause_data) + create_shrapnel(impact_tile,1,0,0,shrapnel_type,cause_data,FALSE,100) //simulates a bullet + for(var/atom/movable/explosion_effect in impact_tile) + if(iscarbon(explosion_effect)) + var/mob/living/carbon/bullet_effect = explosion_effect + explosion_effect.ex_act(EXPLOSION_THRESHOLD_VLOW, null, cause_data) + bullet_effect.apply_armoured_damage(directhit_damage,ARMOR_BULLET,BRUTE,null,penetration) else - AM.ex_act(EXPLOSION_THRESHOLD_VLOW) + explosion_effect.ex_act(EXPLOSION_THRESHOLD_VLOW) if(!soundplaycooldown) //so we don't play the same sound 20 times very fast. - playsound(U, 'sound/effects/gauimpact.ogg',40,1,20) + playsound(impact_tile, 'sound/effects/gauimpact.ogg',40,1,20) soundplaycooldown = 3 soundplaycooldown-- if(!debriscooldown) - U.ceiling_debris_check(1) + impact_tile.ceiling_debris_check(1) debriscooldown = 6 debriscooldown-- - new /obj/effect/particle_effect/expl_particles(U) + new /obj/effect/particle_effect/expl_particles(impact_tile) sleep(11) //speed of sound simulation playsound(impact, 'sound/effects/gau.ogg',100,1,60) @@ -200,6 +204,8 @@ point_cost = 325 fire_mission_delay = 2 shrapnel_type = /datum/ammo/bullet/shrapnel/gau/at + directhit_damage = 80 //how much damage is to be inficted to a mob, this is here so that we can hit resting mobs. + penetration = 40 //AP value pretty much //laser battery diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index 3568f001c977..707811e77ce1 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -453,19 +453,16 @@ var/spotlights_cooldown var/brightness = 11 -/obj/structure/dropship_equipment/electronics/spotlights/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_SHIPLIGHTS) - /obj/structure/dropship_equipment/electronics/spotlights/equipment_interact(mob/user) if(spotlights_cooldown > world.time) to_chat(user, SPAN_WARNING("[src] is busy.")) return //prevents spamming deployment/undeployment if(luminosity != brightness) - SetLuminosity(brightness) + set_light(brightness) icon_state = "spotlights_on" to_chat(user, SPAN_NOTICE("You turn on [src].")) else - SetLuminosity(0) + set_light(0) icon_state = "spotlights_off" to_chat(user, SPAN_NOTICE("You turn off [src].")) spotlights_cooldown = world.time + 50 @@ -480,13 +477,13 @@ else icon_state = "spotlights" if(luminosity) - SetLuminosity(0) + set_light(0) /obj/structure/dropship_equipment/electronics/spotlights/on_launch() - SetLuminosity(0) + set_light(0) /obj/structure/dropship_equipment/electronics/spotlights/on_arrival() - SetLuminosity(brightness) + set_light(brightness) #undef LIGHTING_MAX_LUMINOSITY_SHIPLIGHTS diff --git a/code/modules/cm_marines/equipment/gear.dm b/code/modules/cm_marines/equipment/gear.dm index ff6c715b520b..b3ec6c800c68 100644 --- a/code/modules/cm_marines/equipment/gear.dm +++ b/code/modules/cm_marines/equipment/gear.dm @@ -7,7 +7,7 @@ desc = "A Flashlight designed to be held in the hand, or attached to a rifle" icon_state = "flashlight" item_state = "flashlight" - brightness_on = 5 //Pretty luminous, but still a flashlight that fits in a pocket + light_range = 5 //Pretty luminous, but still a flashlight that fits in a pocket //MARINE SNIPER TARPS diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm index a9a3855a53e4..33684aa29d0a 100644 --- a/code/modules/cm_marines/equipment/guncases.dm +++ b/code/modules/cm_marines/equipment/guncases.dm @@ -296,6 +296,35 @@ new /obj/item/ammo_magazine/handful/revolver/marksman/six_rounds(src) new /obj/item/ammo_magazine/handful/revolver/marksman/six_rounds(src) +/obj/item/storage/box/guncase/vulture + name = "\improper M707 anti-materiel rifle case" + desc = "A gun case containing the M707 \"Vulture\" anti-materiel rifle and its requisite spotting tools." + icon_state = "guncase_blue" + storage_slots = 7 + can_hold = list( + /obj/item/weapon/gun/boltaction/vulture, + /obj/item/ammo_magazine/rifle/boltaction/vulture, + /obj/item/device/vulture_spotter_tripod, + /obj/item/device/vulture_spotter_scope, + /obj/item/tool/screwdriver, + /obj/item/pamphlet/trait/vulture, + ) + +/obj/item/storage/box/guncase/vulture/update_icon() + if(LAZYLEN(contents)) + icon_state = "guncase_blue" + else + icon_state = "guncase_blue_e" + +/obj/item/storage/box/guncase/vulture/fill_preset_inventory() + var/obj/item/weapon/gun/boltaction/vulture/rifle = new(src) + new /obj/item/ammo_magazine/rifle/boltaction/vulture(src) + new /obj/item/device/vulture_spotter_tripod(src) + new /obj/item/device/vulture_spotter_scope(src, WEAKREF(rifle)) + new /obj/item/tool/screwdriver(src) // Spotter scope needs a screwdriver to disassemble + new /obj/item/pamphlet/trait/vulture(src) //both pamphlets give use of the scope and the rifle + new /obj/item/pamphlet/trait/vulture(src) + //Handgun case for Military police vendor three mag , a railflashligh and the handgun. //88 Mod 4 Combat Pistol @@ -315,16 +344,16 @@ //M44 Combat Revolver /obj/item/storage/box/guncase/m44 name = "\improper M44 Combat Revolver case" - desc = "A gun case containing an M44 Combat Revolver." + desc = "A gun case containing an M44 Combat Revolver loaded with marksman ammo." storage_slots = 5 can_hold = list(/obj/item/attachable/flashlight, /obj/item/weapon/gun/revolver/m44, /obj/item/ammo_magazine/revolver) /obj/item/storage/box/guncase/m44/fill_preset_inventory() new /obj/item/attachable/flashlight(src) - new /obj/item/weapon/gun/revolver/m44(src) - new /obj/item/ammo_magazine/revolver(src) - new /obj/item/ammo_magazine/revolver(src) - new /obj/item/ammo_magazine/revolver(src) + new /obj/item/weapon/gun/revolver/m44/mp(src) + new /obj/item/ammo_magazine/revolver/marksman(src) + new /obj/item/ammo_magazine/revolver/marksman(src) + new /obj/item/ammo_magazine/revolver/marksman(src) //M4A3 Service Pistol /obj/item/storage/box/guncase/m4a3 diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index a552b8eb0927..43cf733adb75 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -429,7 +429,7 @@ new /obj/item/pamphlet/skill/medical(src) new /obj/item/storage/pouch/first_responder/full(src) new /obj/item/storage/pouch/autoinjector/full(src) - new /obj/item/clothing/glasses/hud/sensor(src) + new /obj/item/device/helmet_visor/medical(src) new /obj/item/roller(src) @@ -483,7 +483,7 @@ name = "\improper Cryo Self Defense Kit" desc = "A basic self-defense kit reserved for emergencies. As you might expect, not much care was put into keeping the stock fresh, who would be insane enough to attack a USCM ship directly?" icon_state = "cryo_defense_kit" - storage_slots = 2 + storage_slots = 3 /obj/item/storage/box/kit/cryo_self_defense/update_icon() if(LAZYLEN(contents)) diff --git a/code/modules/cm_marines/equipment/mortar/mortars.dm b/code/modules/cm_marines/equipment/mortar/mortars.dm index f78fc9d94837..86bc3f5917c0 100644 --- a/code/modules/cm_marines/equipment/mortar/mortars.dm +++ b/code/modules/cm_marines/equipment/mortar/mortars.dm @@ -50,7 +50,7 @@ if (PF) PF.flags_can_pass_all = PASS_OVER -/obj/structure/mortar/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/mortar/get_projectile_hit_boolean(obj/projectile/P) if(P.original == src) return TRUE else diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm index 070cf1f6c1cf..d2d55a8cadb1 100644 --- a/code/modules/cm_marines/overwatch.dm +++ b/code/modules/cm_marines/overwatch.dm @@ -1,3 +1,5 @@ +#define MAX_SAVED_COORDINATES 3 + #define HIDE_ALMAYER 2 #define HIDE_GROUND 1 #define HIDE_NONE 0 @@ -28,10 +30,18 @@ var/datum/tacmap/tacmap var/minimap_type = MINIMAP_FLAG_USCM + + ///List of saved coordinates, format of ["x", "y", "comment"] + var/list/saved_coordinates = list() + ///Currently selected UI theme + var/ui_theme = "crtblue" + + /obj/structure/machinery/computer/overwatch/Initialize() . = ..() tacmap = new(src, minimap_type) + /obj/structure/machinery/computer/overwatch/Destroy() QDEL_NULL(tacmap) return ..() @@ -39,7 +49,7 @@ /obj/structure/machinery/computer/overwatch/attackby(obj/I as obj, mob/user as mob) //Can't break or disassemble. return -/obj/structure/machinery/computer/overwatch/bullet_act(obj/item/projectile/Proj) //Can't shoot it +/obj/structure/machinery/computer/overwatch/bullet_act(obj/projectile/Proj) //Can't shoot it return FALSE /obj/structure/machinery/computer/overwatch/attack_remote(mob/user as mob) @@ -53,441 +63,349 @@ if(istype(src, /obj/structure/machinery/computer/overwatch/almayer/broken)) return - if(!ishighersilicon(usr) && !skillcheck(user, SKILL_LEADERSHIP, SKILL_LEAD_EXPERT) && SSmapping.configs[GROUND_MAP].map_name != MAP_WHISKEY_OUTPOST) + if(!ishighersilicon(usr) && !skillcheck(user, SKILL_OVERWATCH, SKILL_OVERWATCH_TRAINED) && SSmapping.configs[GROUND_MAP].map_name != MAP_WHISKEY_OUTPOST) to_chat(user, SPAN_WARNING("You don't have the training to use [src].")) return - user.set_interaction(src) - var/dat = "" + tgui_interact(user) - if(!operator) - dat += "
Operator: ----------
" - else - dat += "
Operator: [operator.name]
" - dat += " Stop Overwatch
" - dat += "
" - - switch(state) - if(0) // Base menu - dat += get_base_menu_text() - if(1) //Info screen. - dat += get_info_screen_text() - if(2) - dat += get_supply_drop_menu_text() - if(3) - dat += get_orbital_bombardment_control_text() - - show_browser(user, dat, "Overwatch Console", "overwatch", "size=550x550") - return +/obj/structure/machinery/computer/overwatch/get_examine_text(mob/user) + . = ..() -/obj/structure/machinery/computer/overwatch/proc/get_base_menu_text() - var/dat = "" + . += SPAN_NOTICE("Alt-Click this machine to change the UI theme.") - if(!current_squad) //No squad has been set yet. Pick one. - dat += "Current Squad: ----------
" - return dat; +/obj/structure/machinery/computer/overwatch/clicked(mob/user, list/mods) - dat += "Current Squad: [current_squad.name] Squad " - dat += "Message Squad

" - dat += "Toggle Tactical Map" - dat += "

" - if(current_squad.squad_leader) - dat += "Squad Leader: [current_squad.squad_leader.name] " - dat += "MSG " - dat += "CHANGE SQUAD LEADER

" - else - dat += "Squad Leader: NONE ASSIGN SQUAD LEADER

" + if(!ishuman(user)) + return ..() + if(mods["alt"]) //Changing UI theme + var/list/possible_options = list("Blue"= "crtblue", "Green" = "crtgreen", "Yellow" = "crtyellow", "Red" = "crtred") + var/chosen_theme = tgui_input_list(user, "Choose a UI theme:", "UI Theme", list("Blue", "Green", "Yellow", "Red")) + if(possible_options[chosen_theme]) + ui_theme = possible_options[chosen_theme] + return TRUE + . = ..() - dat += "Primary Objective: " - if(current_squad.primary_objective) - dat += "Check Set
" - else - dat += "NONE! Set
" - dat += "Secondary Objective: " - if(current_squad.secondary_objective) - dat += "Check Set
" - else - dat += "NONE! Set
" - dat += "
" - dat += "Report a marine for insubordination
" - dat += "Transfer a marine to another squad

" - - dat += "Supply Drop Control
" - dat += "Orbital Bombardment Control
" - dat += "Squad Monitor
" - dat += "
" - dat += "Refresh" - - return dat - -/obj/structure/machinery/computer/overwatch/proc/get_info_screen_text() - var/dat = "" - - dat += {" - - "} +/obj/structure/machinery/computer/overwatch/ui_static_data(mob/user) + var/list/data = list() + data["mapRef"] = tacmap.map_holder.map_ref + return data + +/obj/structure/machinery/computer/overwatch/tgui_interact(mob/user, datum/tgui/ui) + + if(!tacmap.map_holder) + var/level = SSmapping.levels_by_trait(tacmap.targeted_ztrait) + if(!level[1]) + return + tacmap.map_holder = SSminimaps.fetch_tacmap_datum(level[1], tacmap.allowed_flags) + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + user.client.register_map_obj(tacmap.map_holder.map) + ui = new(user, src, "OverwatchConsole", "Overwatch Console") + ui.open() + +/obj/structure/machinery/computer/overwatch/ui_data(mob/user) + var/list/data = list() + + data["theme"] = ui_theme if(!current_squad) - dat += "No Squad selected!
" - else - var/leader_text = "" - var/leader_count = 0 - var/tl_text = "" - var/tl_count = 0 - var/spec_text = "" - var/spec_count = 0 - var/medic_text = "" - var/medic_count = 0 - var/engi_text = "" - var/engi_count = 0 - var/smart_text = "" - var/smart_count = 0 - var/marine_text = "" - var/marine_count = 0 - var/misc_text = "" - var/living_count = 0 - - var/conscious_text = "" - var/unconscious_text = "" - var/dead_text = "" - - var/SL_z //z level of the Squad Leader - if(current_squad.squad_leader) - var/turf/SL_turf = get_turf(current_squad.squad_leader) - SL_z = SL_turf.z - - - for(var/X in current_squad.marines_list) - if(!X) - continue //just to be safe - var/mob_name = "unknown" - var/mob_state = "" - var/role = "unknown" - var/act_sl = "" - var/fteam = "" - var/dist = "???" - var/area_name = "???" - var/mob/living/carbon/human/H - - var/is_filtered = FALSE - if(X && ("\ref[X]" in marine_filter)) - is_filtered = TRUE - - if(ishuman(X)) - H = X - mob_name = H.real_name - var/area/A = get_area(H) - var/turf/M_turf = get_turf(H) - if(!M_turf) - continue - if(A) - area_name = sanitize_area(A.name) - - switch(z_hidden) - if(HIDE_ALMAYER) - if(is_mainship_level(M_turf.z)) - continue - if(HIDE_GROUND) - if(is_ground_level(M_turf.z)) - continue - - if(H.job) - role = H.job - else if(istype(H.wear_id, /obj/item/card/id)) //decapitated marine is mindless, - var/obj/item/card/id/ID = H.wear_id //we use their ID to get their role. - if(ID.rank) role = ID.rank - - if(current_squad.squad_leader) - if(H == current_squad.squad_leader) - dist = "N/A" - if(current_squad.name == SQUAD_SOF) - if(H.job == JOB_MARINE_RAIDER_CMD) - act_sl = " (direct command)" - else if(H.job != JOB_MARINE_RAIDER_SL) - act_sl = " (acting TL)" - else if(H.job != JOB_SQUAD_LEADER) - act_sl = " (acting SL)" - else if(M_turf && (M_turf.z == SL_z)) - dist = "[get_dist(H, current_squad.squad_leader)] ([dir2text_short(get_dir(current_squad.squad_leader, H))])" - - if(is_filtered && marine_filter_enabled) - continue - - switch(H.stat) - if(CONSCIOUS) - mob_state = "Conscious" - living_count++ - conscious_text += "[mob_name][role][act_sl][mob_state][area_name][dist][is_filtered ? "Show" : "Hide"]" - - if(UNCONSCIOUS) - mob_state = "Unconscious" - living_count++ - unconscious_text += "[mob_name][role][act_sl][mob_state][area_name][dist][is_filtered ? "Show" : "Hide"]" - - if(DEAD) - if(dead_hidden) - continue - mob_state = SET_CLASS("DEAD", INTERFACE_RED) - dead_text += "[mob_name][role][act_sl][mob_state][area_name][dist][is_filtered ? "Show" : "Hide"]" - - if(!istype(H.head, /obj/item/clothing/head/helmet/marine)) - mob_state += SET_CLASS(" (NO HELMET)", INTERFACE_ORANGE) - - if(!H.key || !H.client) - if(H.stat != DEAD) - mob_state += " (SSD)" - - - if(H.assigned_fireteam) - fteam = " [H.assigned_fireteam]" - - else //listed marine was deleted or gibbed, all we have is their name - if(dead_hidden) - continue - if(z_hidden) //gibbed marines are neither on the colony nor on the almayer - continue - for(var/datum/data/record/t in GLOB.data_core.general) - if(t.fields["name"] == X) - role = t.fields["real_rank"] - break - mob_state = SET_CLASS("DEAD", INTERFACE_RED) - mob_name = X - - dead_text += "[mob_name][role][act_sl][mob_state][area_name][dist][is_filtered ? "Show" : "Hide"]" - - - var/marine_infos = "[mob_name][role][act_sl][fteam][mob_state][area_name][dist][is_filtered ? "Show" : "Hide"]" - switch(role) - if(JOB_SQUAD_LEADER) - leader_text += marine_infos - leader_count++ - if(JOB_SQUAD_TEAM_LEADER) - tl_text += marine_infos - tl_count++ - if(JOB_SQUAD_SPECIALIST) - spec_text += marine_infos - spec_count++ - if(JOB_SQUAD_MEDIC) - medic_text += marine_infos - medic_count++ - if(JOB_SQUAD_ENGI) - engi_text += marine_infos - engi_count++ - if(JOB_SQUAD_SMARTGUN) - smart_text += marine_infos - smart_count++ - if(JOB_SQUAD_MARINE) - marine_text += marine_infos - marine_count++ - else - misc_text += marine_infos - - dat += "[leader_count ? "Squad Leader Deployed" : SET_CLASS("No Squad Leader Deployed!", INTERFACE_RED)]
" - dat += "Fireteam Leaders: [tl_count ? "[tl_count]" : SET_CLASS("No Fireteam Leaders Deployed!", INTERFACE_RED)]
" - dat += "[spec_count ? "Squad Specialist Deployed" : SET_CLASS("No Specialist Deployed!", INTERFACE_RED)]
" - dat += "[smart_count ? "Squad Smartgunner Deployed" : SET_CLASS("No Smartgunner Deployed!", INTERFACE_RED)]
" - dat += "Squad Hospital Corpsmen: [medic_count] Deployed | Squad Combat Technicians: [engi_count] Deployed
" - dat += "Squad Riflemen: [marine_count] Deployed
" - dat += "Total: [current_squad.marines_list.len] Deployed
" - dat += "Marines alive: [living_count]


" - dat += "
Search:
" - dat += "" - dat += "" - if(!living_marines_sorting) - dat += leader_text + tl_text + spec_text + medic_text + engi_text + smart_text + marine_text + misc_text - else - dat += conscious_text + unconscious_text + dead_text - dat += "
NameRoleStateLocationSL DistanceFilter
" - dat += "

" - dat += "Refresh
" - dat += "Change Sorting Method
" - dat += "[dead_hidden ? "Show Dead Marines" : "Hide Dead Marines" ]
" - dat += "[marine_filter_enabled ? "Disable Marine Filter" : "Enable Marine Filter"]
" - dat += "Change Locations Ignored
" - dat += "
Back" - return dat - -/obj/structure/machinery/computer/overwatch/proc/get_supply_drop_menu_text() - var/dat = "Supply Drop Control

" - if(!current_squad) - dat += "No squad selected!" - else - dat += "Current Supply Drop Status: " - var/cooldown_left = COOLDOWN_TIMELEFT(current_squad, next_supplydrop) - if(cooldown_left > 0) - dat += "Launch tubes resetting ([round(cooldown_left/10)] seconds)
" - else - dat += SET_CLASS("Ready!", INTERFACE_GREEN) - dat += "
" - dat += "Launch Pad Status: " - var/obj/structure/closet/crate/C = locate() in current_squad.drop_pad.loc - if(C) - dat += SET_CLASS("Supply crate loaded", INTERFACE_GREEN) - dat += "
" - else - dat += "Empty
" - dat += "Longitude: [x_supply] Change
" - dat += "Latitude: [y_supply] Change

" - dat += "LAUNCH!" - dat += "

" - dat += "Refresh
" - dat += "Back" - return dat - -/obj/structure/machinery/computer/overwatch/proc/get_orbital_bombardment_control_text() - var/dat = "Orbital Bombardment Control

" - if(!current_squad) - dat += "No squad selected!" - else - dat += "Current Cannon Status: " - var/cooldown_left = COOLDOWN_TIMELEFT(almayer_orbital_cannon, ob_firing_cooldown) - if(almayer_orbital_cannon.is_disabled) - dat += "Cannon is disabled!
" - else if(cooldown_left > 0) - dat += "Cannon on cooldown ([round(cooldown_left/10)] seconds)
" - else if(!almayer_orbital_cannon.chambered_tray) - dat += SET_CLASS("No ammo chambered in the cannon.", INTERFACE_RED) - dat += "
" - else - dat += SET_CLASS("Ready!", INTERFACE_GREEN) - dat += "
" - dat += "Longitude: [x_bomb] Change
" - dat += "Latitude: [y_bomb] Change

" - dat += "FIRE!" - dat += "

" - dat += "Refresh
" - dat += "Back" - return dat - -/obj/structure/machinery/computer/overwatch/Topic(href, href_list) - if(..()) - return - if(!href_list["operation"]) - return - - if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (ishighersilicon(usr))) - usr.set_interaction(src) - - switch(href_list["operation"]) - // main interface - if("mapview") - tacmap.tgui_interact(usr) - if("back") - state = 0 - if("monitor") - state = 1 - if("supplies") - state = 2 - if("bombs") - state = 3 - if("change_operator") - if(operator != usr) - if(operator && ishighersilicon(operator)) - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("AI override in progress. Access denied.")]") - return - if(!current_squad || current_squad.assume_overwatch(usr)) - operator = usr - if(ishighersilicon(usr)) - to_chat(usr, "[icon2html(src, usr)] [SPAN_BOLDNOTICE("Overwatch system AI override protocol successful.")]") - current_squad?.send_squad_message("Attention. [operator.name] has engaged overwatch system control override.", displayed_icon = src) - else - var/mob/living/carbon/human/H = operator - var/obj/item/card/id/ID = H.get_idcard() - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Basic overwatch systems initialized. Welcome, [ID ? "[ID.rank] ":""][operator.name]. Please select a squad.")]") - current_squad?.send_squad_message("Attention. Your Overwatch officer is now [ID ? "[ID.rank] ":""][operator.name].", displayed_icon = src) + data["squad_list"] = list() + for(var/datum/squad/current_squad in RoleAuthority.squads) + if(current_squad.active && !current_squad.overwatch_officer && current_squad.faction == faction && current_squad.name != "Root") + data["squad_list"] += current_squad.name + return data + + data["current_squad"] = current_squad.name + + data["primary_objective"] = current_squad.primary_objective + data["secondary_objective"] = current_squad.secondary_objective + + data["marines"] = list() + + var/leader_count = 0 + var/ftl_count = 0 + var/spec_count = 0 + var/medic_count = 0 + var/engi_count = 0 + var/smart_count = 0 + var/marine_count = 0 + + var/leaders_alive = 0 + var/ftl_alive = 0 + var/spec_alive= 0 + var/medic_alive= 0 + var/engi_alive = 0 + var/smart_alive = 0 + var/marines_alive = 0 + + var/specialist_type + + var/SL_z //z level of the Squad Leader + if(current_squad.squad_leader) + var/turf/SL_turf = get_turf(current_squad.squad_leader) + SL_z = SL_turf.z + + for(var/marine in current_squad.marines_list) + if(!marine) + continue //just to be safe + var/mob_name = "unknown" + var/mob_state = "" + var/has_helmet = TRUE + var/role = "unknown" + var/acting_sl = "" + var/fteam = "" + var/distance = "???" + var/area_name = "???" + var/is_squad_leader = FALSE + var/mob/living/carbon/human/marine_human + + + if(ishuman(marine)) + marine_human = marine + if(istype(marine_human.loc, /obj/structure/machinery/cryopod)) //We don't care much for these + continue + mob_name = marine_human.real_name + var/area/current_area = get_area(marine_human) + var/turf/current_turf = get_turf(marine_human) + if(!current_turf) + continue + if(current_area) + area_name = sanitize_area(current_area.name) + + switch(z_hidden) + if(HIDE_ALMAYER) + if(is_mainship_level(current_turf.z)) + continue + if(HIDE_GROUND) + if(is_ground_level(current_turf.z)) + continue + + if(marine_human.job) + role = marine_human.job + else if(istype(marine_human.wear_id, /obj/item/card/id)) //decapitated marine is mindless, + var/obj/item/card/id/ID = marine_human.wear_id //we use their ID to get their role. + if(ID.rank) + role = ID.rank + + + if(current_squad.squad_leader) + if(marine_human == current_squad.squad_leader) + distance = "N/A" + if(current_squad.name == SQUAD_SOF) + if(marine_human.job == JOB_MARINE_RAIDER_CMD) + acting_sl = " (direct command)" + else if(marine_human.job != JOB_MARINE_RAIDER_SL) + acting_sl = " (acting TL)" + else if(marine_human.job != JOB_SQUAD_LEADER) + acting_sl = " (acting SL)" + is_squad_leader = TRUE + else if(current_turf && (current_turf.z == SL_z)) + distance = "[get_dist(marine_human, current_squad.squad_leader)] ([dir2text_short(get_dir(current_squad.squad_leader, marine_human))])" + + + switch(marine_human.stat) + if(CONSCIOUS) + mob_state = "Conscious" + + if(UNCONSCIOUS) + mob_state = "Unconscious" + + if(DEAD) + mob_state = "Dead" + + if(!istype(marine_human.head, /obj/item/clothing/head/helmet/marine)) + has_helmet = FALSE + + if(!marine_human.key || !marine_human.client) + if(marine_human.stat != DEAD) + mob_state += " (SSD)" + + + if(marine_human.assigned_fireteam) + fteam = " [marine_human.assigned_fireteam]" + + else //listed marine was deleted or gibbed, all we have is their name + for(var/datum/data/record/marine_record as anything in GLOB.data_core.general) + if(marine_record.fields["name"] == marine) + role = marine_record.fields["real_rank"] + break + mob_state = "Dead" + mob_name = marine + + + switch(role) + if(JOB_SQUAD_LEADER) + leader_count++ + if(mob_state != "Dead") + leaders_alive++ + if(JOB_SQUAD_TEAM_LEADER) + ftl_count++ + if(mob_state != "Dead") + ftl_alive++ + if(JOB_SQUAD_SPECIALIST) + spec_count++ + if(marine_human) + if(istype(marine_human.wear_id, /obj/item/card/id)) //decapitated marine is mindless, + var/obj/item/card/id/ID = marine_human.wear_id //we use their ID to get their role. + if(ID.assignment) + if(specialist_type) + specialist_type = "MULTIPLE" + else + var/list/spec_type = splittext(ID.assignment, "(") + if(islist(spec_type) && (length(spec_type) > 1)) + specialist_type = splittext(spec_type[2], ")")[1] + else if(!specialist_type) + specialist_type = "UNKNOWN" + if(mob_state != "Dead") + spec_alive++ + if(JOB_SQUAD_MEDIC) + medic_count++ + if(mob_state != "Dead") + medic_alive++ + if(JOB_SQUAD_ENGI) + engi_count++ + if(mob_state != "Dead") + engi_alive++ + if(JOB_SQUAD_SMARTGUN) + smart_count++ + if(mob_state != "Dead") + smart_alive++ + if(JOB_SQUAD_MARINE) + marine_count++ + if(mob_state != "Dead") + marines_alive++ + + var/marine_data = list(list("name" = mob_name, "state" = mob_state, "has_helmet" = has_helmet, "role" = role, "acting_sl" = acting_sl, "fteam" = fteam, "distance" = distance, "area_name" = area_name,"ref" = REF(marine))) + data["marines"] += marine_data + if(is_squad_leader) + if(!data["squad_leader"]) + data["squad_leader"] = marine_data[1] + + data["total_deployed"] = leader_count + ftl_count + spec_count + medic_count + engi_count + smart_count + marine_count + data["living_count"] = leaders_alive + ftl_alive + spec_alive + medic_alive + engi_alive + smart_alive + marines_alive + + data["leader_count"] = leader_count + data["ftl_count"] = ftl_count + data["spec_count"] = spec_count + data["medic_count"] = medic_count + data["engi_count"] = engi_count + data["smart_count"] = smart_count + + data["leaders_alive"] = leaders_alive + data["ftl_alive"] = ftl_alive + data["spec_alive"] = spec_alive + data["medic_alive"] = medic_alive + data["engi_alive"] = engi_alive + data["smart_alive"] = smart_alive + data["specialist_type"] = specialist_type ? specialist_type : "NONE" + + data["z_hidden"] = z_hidden + + data["saved_coordinates"] = list() + for(var/i in 1 to length(saved_coordinates)) + data["saved_coordinates"] += list(list("x" = saved_coordinates[i]["x"], "y" = saved_coordinates[i]["y"], "comment" = saved_coordinates[i]["comment"], "index" = i)) + + var/has_supply_pad = FALSE + var/obj/structure/closet/crate/supply_crate + if(current_squad.drop_pad) + supply_crate = locate() in current_squad.drop_pad.loc + has_supply_pad = TRUE + data["can_launch_crates"] = has_supply_pad + data["has_crate_loaded"] = supply_crate + data["supply_cooldown"] = COOLDOWN_TIMELEFT(current_squad, next_supplydrop) + data["ob_cooldown"] = COOLDOWN_TIMELEFT(almayer_orbital_cannon, ob_firing_cooldown) + data["ob_loaded"] = almayer_orbital_cannon.chambered_tray + + data["operator"] = operator.name + + return data + +/obj/structure/machinery/computer/overwatch/ui_state(mob/user) + return GLOB.not_incapacitated_and_adjacent_strict_state + +/obj/structure/machinery/computer/overwatch/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/mob/user = usr + + if((user.contents.Find(src) || (in_range(src, user) && istype(loc, /turf))) || (ishighersilicon(user))) + user.set_interaction(src) + + switch(action) + if("pick_squad") + if(current_squad) + return + var/datum/squad/selected_squad + for(var/datum/squad/searching_squad in RoleAuthority.squads) + if(searching_squad.active && !searching_squad.overwatch_officer && searching_squad.faction == faction && searching_squad.name != "Root" && searching_squad.name == params["squad"]) + selected_squad = searching_squad + break + + if(!selected_squad) + return + + if(selected_squad.assume_overwatch(user)) + current_squad = selected_squad + operator = user + current_squad.send_squad_message("Attention - Your squad has been selected for Overwatch. Check your Status pane for objectives.", displayed_icon = src) + current_squad.send_squad_message("Your Overwatch officer is: [operator.name].", displayed_icon = src) + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Tactical data for squad '[current_squad]' loaded. All tactical functions initialized.")]") + return TRUE if("logout") if(current_squad?.release_overwatch()) - if(ishighersilicon(usr)) + if(ishighersilicon(user)) current_squad.send_squad_message("Attention. [operator.name] has released overwatch system control. Overwatch functions deactivated.", displayed_icon = src) - to_chat(usr, "[icon2html(src, usr)] [SPAN_BOLDNOTICE("Overwatch system control override disengaged.")]") + to_chat(user, "[icon2html(src, user)] [SPAN_BOLDNOTICE("Overwatch system control override disengaged.")]") else - var/mob/living/carbon/human/H = operator - var/obj/item/card/id/ID = H.get_idcard() + var/mob/living/carbon/human/human_operator = operator + var/obj/item/card/id/ID = human_operator.get_idcard() current_squad.send_squad_message("Attention. [ID ? "[ID.rank] ":""][operator ? "[operator.name]":"sysadmin"] is no longer your Overwatch officer. Overwatch functions deactivated.", displayed_icon = src) visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Overwatch systems deactivated. Goodbye, [ID ? "[ID.rank] ":""][operator ? "[operator.name]":"sysadmin"].")]") operator = null current_squad = null - if(cam && !ishighersilicon(usr)) - usr.reset_view(null) - usr.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) + if(cam && !ishighersilicon(user)) + user.reset_view(null) + user.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) cam = null - state = 0 - if("pick_squad") - if(operator == usr) - if(current_squad) - to_chat(usr, SPAN_WARNING("[icon2html(src, usr)] You are already selecting a squad.")) - else - var/list/squad_list = list() - for(var/datum/squad/S in RoleAuthority.squads) - if(S.active && !S.overwatch_officer && S.faction == faction && S.name != "Root") - squad_list += S.name - - var/name_sel = tgui_input_list(usr, "Which squad would you like to claim for Overwatch?", "Claim Squad", squad_list) - if(!name_sel) - return - if(operator != usr) - return - if(current_squad) - to_chat(usr, SPAN_WARNING("[icon2html(src, usr)] You are already selecting a squad.")) - return - var/datum/squad/selected = get_squad_by_name(name_sel) - if(selected) - //Link everything together, squad, console, and officer - if(selected.assume_overwatch(usr)) - current_squad = selected - current_squad.send_squad_message("Attention - Your squad has been selected for Overwatch. Check your Status pane for objectives.", displayed_icon = src) - current_squad.send_squad_message("Your Overwatch officer is: [operator.name].", displayed_icon = src) - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Tactical data for squad '[current_squad]' loaded. All tactical functions initialized.")]") - attack_hand(usr) - else - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Invalid input. Aborting.")]") + ui.close() + return TRUE + if("message") - if(current_squad && operator == usr) - var/input = sanitize_control_chars(stripped_input(usr, "Please write a message to announce to the squad:", "Squad Message")) + if(current_squad) + var/input = sanitize_control_chars(stripped_input(user, "Please write a message to announce to the squad:", "Squad Message")) if(input) current_squad.send_message(input, 1) //message, adds username current_squad.send_maptext(input, "Squad Message:") visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Message '[input]' sent to all Marines of squad '[current_squad]'.")]") - log_overwatch("[key_name(usr)] sent '[input]' to squad [current_squad].") + log_overwatch("[key_name(user)] sent '[input]' to squad [current_squad].") + if("sl_message") - if(current_squad && operator == usr) - var/input = sanitize_control_chars(stripped_input(usr, "Please write a message to announce to the squad leader:", "SL Message")) + if(current_squad) + var/input = sanitize_control_chars(stripped_input(user, "Please write a message to announce to the squad leader:", "SL Message")) if(input) current_squad.send_message(input, 1, 1) //message, adds username, only to leader current_squad.send_maptext(input, "Squad Leader Message:", 1) visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Message '[input]' sent to Squad Leader [current_squad.squad_leader] of squad '[current_squad]'.")]") - log_overwatch("[key_name(usr)] sent '[input]' to Squad Leader [current_squad.squad_leader] of squad [current_squad].") + log_overwatch("[key_name(user)] sent '[input]' to Squad Leader [current_squad.squad_leader] of squad [current_squad].") + if("check_primary") if(current_squad) //This is already checked, but ehh. if(current_squad.primary_objective) - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Reminding primary objectives of squad '[current_squad]'.")]") - to_chat(usr, "[icon2html(src, usr)] Primary Objective: [current_squad.primary_objective]") + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Reminding '[current_squad]' of primary objectives: [current_squad.primary_objective].")]") + current_squad.send_message("Your primary objective is '[current_squad.primary_objective]'. See Status pane for details.") + current_squad.send_maptext(current_squad.primary_objective, "Primary Objective:") + if("check_secondary") if(current_squad) //This is already checked, but ehh. if(current_squad.secondary_objective) - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Reminding secondary objectives of squad '[current_squad]'.")]") - to_chat(usr, "[icon2html(src, usr)] Secondary Objective: [current_squad.secondary_objective]") + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Reminding '[current_squad]' of secondary objectives: [current_squad.secondary_objective].")]") + current_squad.send_message("Your secondary objective is '[current_squad.secondary_objective]'. See Status pane for details.") + current_squad.send_maptext(current_squad.secondary_objective, "Secondary Objective:") + if("set_primary") var/input = sanitize_control_chars(stripped_input(usr, "What will be the squad's primary objective?", "Primary Objective")) if(current_squad && input) @@ -496,6 +414,8 @@ current_squad.send_maptext(input, "Primary Objective Updated:") visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Primary objective of squad '[current_squad]' set to '[input]'.")]") log_overwatch("[key_name(usr)] set [current_squad]'s primary objective to '[input]'.") + return TRUE + if("set_secondary") var/input = sanitize_control_chars(stripped_input(usr, "What will be the squad's secondary objective?", "Secondary Objective")) if(input) @@ -504,108 +424,174 @@ current_squad.send_maptext(input, "Secondary Objective Updated:") visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Secondary objective of squad '[current_squad]' set to '[input]'.")]") log_overwatch("[key_name(usr)] set [current_squad]'s secondary objective to '[input]'.") - if("supply_x") - var/input = tgui_input_real_number(usr,"What longitude should be targetted? (Increments towards the east)", "X Coordinate", 0) - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Longitude is now [input].")]") - x_supply = input - if("supply_y") - var/input = tgui_input_real_number(usr,"What latitude should be targetted? (Increments towards the north)", "Y Coordinate", 0) - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Latitude is now [input].")]") - y_supply = input - if("bomb_x") - var/input = tgui_input_real_number(usr,"What longitude should be targetted? (Increments towards the east)", "X Coordinate", 0) - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Longitude is now [input].")]") - x_bomb = input - if("bomb_y") - var/input = tgui_input_real_number(usr,"What latitude should be targetted? (Increments towards the north)", "Y Coordinate", 0) - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Latitude is now [input].")]") - y_bomb = input - if("refresh") - attack_hand(usr) - if("change_sort") - living_marines_sorting = !living_marines_sorting - if(living_marines_sorting) - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Marines are now sorted by health status.")]") - else - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Marines are now sorted by rank.")]") - if("hide_dead") - dead_hidden = !dead_hidden - if(dead_hidden) - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Dead marines are now not shown.")]") - else - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Dead marines are now shown again.")]") - if("choose_z") + return TRUE + if("replace_lead") + if(!params["ref"]) + return + change_lead(user, params["ref"]) + + if("insubordination") + mark_insubordination() + if("transfer_marine") + transfer_squad() + + if("change_locations_ignored") switch(z_hidden) if(HIDE_NONE) z_hidden = HIDE_ALMAYER - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Marines on the Almayer are now hidden.")]") + to_chat(user, "[icon2html(src, usr)] [SPAN_NOTICE("Marines on the Almayer are now hidden.")]") if(HIDE_ALMAYER) z_hidden = HIDE_GROUND - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Marines on the ground are now hidden.")]") + to_chat(user, "[icon2html(src, usr)] [SPAN_NOTICE("Marines on the ground are now hidden.")]") else z_hidden = HIDE_NONE - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("No location is ignored anymore.")]") - - if("toggle_marine_filter") - if(marine_filter_enabled) - marine_filter_enabled = FALSE - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("All marines will now be shown regardless of filter.")]") + to_chat(user, "[icon2html(src, usr)] [SPAN_NOTICE("No location is ignored anymore.")]") + if("tacmap_unpin") + tacmap.tgui_interact(user) + if("dropbomb") + if(!params["x"] || !params["y"]) + return + x_bomb = text2num(params["x"]) + y_bomb = text2num(params["y"]) + if(almayer_orbital_cannon.is_disabled) + to_chat(user, "[icon2html(src, usr)] [SPAN_WARNING("Orbital bombardment cannon disabled!")]") + else if(!COOLDOWN_FINISHED(almayer_orbital_cannon, ob_firing_cooldown)) + to_chat(user, "[icon2html(src, usr)] [SPAN_WARNING("Orbital bombardment cannon not yet ready to fire again! Please wait [COOLDOWN_TIMELEFT(almayer_orbital_cannon, ob_firing_cooldown)/10] seconds.")]") else - marine_filter_enabled = TRUE - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Individual Marine Filter is now enabled.")]") - if("filter_marine") - if (current_squad) - var/squaddie = href_list["squaddie"] - if(!(squaddie in marine_filter)) - marine_filter += squaddie - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Marine now hidden.")]") - else - marine_filter -= squaddie - to_chat(usr, "[icon2html(src, usr)] [SPAN_NOTICE("Marine will now be shown.")]") - if("change_lead") - change_lead() - if("insubordination") - mark_insubordination() - if("squad_transfer") - transfer_squad() + handle_bombard(user) + if("dropsupply") + if(!params["x"] || !params["y"]) + return + x_supply = text2num(params["x"]) + y_supply = text2num(params["y"]) if(current_squad) if(!COOLDOWN_FINISHED(current_squad, next_supplydrop)) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Supply drop not yet ready to launch again!")]") + to_chat(user, "[icon2html(src, user)] [SPAN_WARNING("Supply drop not yet ready to launch again!")]") else handle_supplydrop() - if("dropbomb") - if(almayer_orbital_cannon.is_disabled) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Orbital bombardment cannon disabled!")]") - else if(!COOLDOWN_FINISHED(almayer_orbital_cannon, ob_firing_cooldown)) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Orbital bombardment cannon not yet ready to fire again! Please wait [COOLDOWN_TIMELEFT(almayer_orbital_cannon, ob_firing_cooldown)/10] seconds.")]") - else - handle_bombard(usr) - if("back") - state = 0 - if("use_cam") - if(isRemoteControlling(usr)) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Unable to override console camera viewer. Track with camera instead. ")]") + + if("save_coordinates") + if(!params["x"] || !params["y"]) + return + if(length(saved_coordinates) >= MAX_SAVED_COORDINATES) + popleft(saved_coordinates) + saved_coordinates += list(list("x" = text2num(params["x"]), "y" = text2num(params["y"]))) + return TRUE + if("change_coordinate_comment") + if(!params["index"] || !params["comment"]) + return + var/index = text2num(params["index"]) + if(length(saved_coordinates) + 1 < index) + return + saved_coordinates[index]["comment"] = params["comment"] + return TRUE + + if("watch_camera") + if(isRemoteControlling(user)) + to_chat(user, "[icon2html(src, user)] [SPAN_WARNING("Unable to override console camera viewer. Track with camera instead. ")]") + return + if(!params["target_ref"]) return if(current_squad) - var/mob/cam_target = locate(href_list["cam_target"]) + var/mob/cam_target = locate(params["target_ref"]) var/obj/structure/machinery/camera/new_cam = get_camera_from_target(cam_target) if(!new_cam || !new_cam.can_use()) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("Searching for helmet cam. No helmet cam found for this marine! Tell your squad to put their helmets on!")]") + to_chat(user, "[icon2html(src, user)] [SPAN_WARNING("Searching for helmet cam. No helmet cam found for this marine! Tell your squad to put their helmets on!")]") else if(cam && cam == new_cam)//click the camera you're watching a second time to stop watching. visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Stopping helmet cam view of [cam_target].")]") - usr.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) + user.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) cam = null - usr.reset_view(null) - else if(usr.client.view != world_view_size) - to_chat(usr, SPAN_WARNING("You're too busy peering through binoculars.")) + user.reset_view(null) + else if(user.client.view != world_view_size) + to_chat(user, SPAN_WARNING("You're too busy peering through binoculars.")) else if(cam) - usr.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) + user.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) cam = new_cam - usr.reset_view(cam) - usr.RegisterSignal(cam, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob, reset_observer_view_on_deletion)) - attack_hand(usr) //The above doesn't ever seem to work. + user.reset_view(cam) + user.RegisterSignal(cam, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob, reset_observer_view_on_deletion)) + if("change_operator") + if(operator != user) + if(operator && ishighersilicon(operator)) + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("AI override in progress. Access denied.")]") + return + if(!current_squad || current_squad.assume_overwatch(user)) + operator = user + if(ishighersilicon(user)) + to_chat(user, "[icon2html(src, usr)] [SPAN_BOLDNOTICE("Overwatch system AI override protocol successful.")]") + current_squad?.send_squad_message("Attention. [operator.name] has engaged overwatch system control override.", displayed_icon = src) + else + var/mob/living/carbon/human/H = operator + var/obj/item/card/id/ID = H.get_idcard() + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Basic overwatch systems initialized. Welcome, [ID ? "[ID.rank] ":""][operator.name]. Please select a squad.")]") + current_squad?.send_squad_message("Attention. Your Overwatch officer is now [ID ? "[ID.rank] ":""][operator.name].", displayed_icon = src) + + +/obj/structure/machinery/computer/overwatch/proc/change_lead(mob/user, sl_ref) + if(!user) + return + + if(!current_squad) + return + + var/mob/living/carbon/human/selected_sl = locate(sl_ref) in current_squad.marines_list + if(!selected_sl) + return + if(!istype(selected_sl)) + return + + if(!istype(selected_sl) || !selected_sl.mind || selected_sl.stat == DEAD) //marines_list replaces mob refs of gibbed marines with just a name string + to_chat(user, "[icon2html(src, usr)] [SPAN_WARNING("[selected_sl] is KIA!")]") + return + if(selected_sl == current_squad.squad_leader) + to_chat(user, "[icon2html(src, usr)] [SPAN_WARNING("[selected_sl] is already the Squad Leader!")]") + return + if(jobban_isbanned(selected_sl, JOB_SQUAD_LEADER)) + to_chat(user, "[icon2html(src, usr)] [SPAN_WARNING("[selected_sl] is unfit to lead!")]") + return + if(current_squad.squad_leader) + current_squad.send_message("Attention: [current_squad.squad_leader] is [current_squad.squad_leader.stat == DEAD ? "stepping down" : "demoted"]. A new Squad Leader has been set: [selected_sl.real_name].") + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Squad Leader [current_squad.squad_leader] of squad '[current_squad]' has been [current_squad.squad_leader.stat == DEAD ? "replaced" : "demoted and replaced"] by [selected_sl.real_name]! Logging to enlistment files.")]") + var/old_lead = current_squad.squad_leader + current_squad.demote_squad_leader(current_squad.squad_leader.stat != DEAD) + SStracking.start_tracking(current_squad.tracking_id, old_lead) + else + current_squad.send_message("Attention: A new Squad Leader has been set: [selected_sl.real_name].") + visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("[selected_sl.real_name] is the new Squad Leader of squad '[current_squad]'! Logging to enlistment file.")]") + + to_chat(selected_sl, "[icon2html(src, selected_sl)] Overwatch: You've been promoted to \'[selected_sl.job == JOB_SQUAD_LEADER ? "SQUAD LEADER" : "ACTING SQUAD LEADER"]\' for [current_squad.name]. Your headset has access to the command channel (:v).") + to_chat(user, "[icon2html(src, usr)] [selected_sl.real_name] is [current_squad]'s new leader!") + + if(selected_sl.assigned_fireteam) + if(selected_sl == current_squad.fireteam_leaders[selected_sl.assigned_fireteam]) + current_squad.unassign_ft_leader(selected_sl.assigned_fireteam, TRUE, FALSE) + current_squad.unassign_fireteam(selected_sl, FALSE) + + current_squad.squad_leader = selected_sl + current_squad.update_squad_leader() + current_squad.update_free_mar() + + SStracking.set_leader(current_squad.tracking_id, selected_sl) + SStracking.start_tracking("marine_sl", selected_sl) + + if(selected_sl.job == JOB_SQUAD_LEADER)//a real SL + selected_sl.comm_title = "SL" + else //an acting SL + selected_sl.comm_title = "aSL" + ADD_TRAIT(selected_sl, TRAIT_LEADERSHIP, TRAIT_SOURCE_SQUAD_LEADER) + + var/obj/item/device/radio/headset/almayer/marine/sl_headset = selected_sl.get_type_in_ears(/obj/item/device/radio/headset/almayer/marine) + if(sl_headset) + sl_headset.keys += new /obj/item/device/encryptionkey/squadlead/acting(sl_headset) + sl_headset.recalculateChannels() + if(istype(selected_sl.wear_id, /obj/item/card/id)) + var/obj/item/card/id/ID = selected_sl.wear_id + ID.access += ACCESS_MARINE_LEADER + selected_sl.hud_set_squad() + selected_sl.update_inv_head() //updating marine helmet leader overlays + selected_sl.update_inv_wear_suit() + /obj/structure/machinery/computer/overwatch/check_eye(mob/user) if(user.is_mob_incapacitated(TRUE) || get_dist(user, src) > 1 || user.blinded) //user can't see - not sure why canmove is here. @@ -621,6 +607,14 @@ cam = null user.reset_view(null) +/obj/structure/machinery/computer/overwatch/ui_close(mob/user) + ..() + if(!isRemoteControlling(user)) + if(cam) + user.UnregisterSignal(cam, COMSIG_PARENT_QDELETING) + cam = null + user.reset_view(null) + //returns the helmet camera the human is wearing /obj/structure/machinery/computer/overwatch/proc/get_camera_from_target(mob/living/carbon/human/H) if(current_squad) @@ -648,73 +642,9 @@ to_chat(M, SPAN_HIGHDANGER("Orbital bombardment launch command detected!")) to_chat(M, SPAN_DANGER("Launch command informs [ob_type] warhead. Estimated impact area: [ob_area.name]")) -/obj/structure/machinery/computer/overwatch/proc/change_lead() - if(!usr || usr != operator) - return - if(!current_squad) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("No squad selected!")]") - return - var/sl_candidates = list() - for(var/mob/living/carbon/human/H in current_squad.marines_list) - if(istype(H) && H.stat != DEAD && H.mind && !jobban_isbanned(H, JOB_SQUAD_LEADER)) - sl_candidates += H - var/new_lead = tgui_input_list(usr, "Choose a new Squad Leader", "Replace SL", sl_candidates) - if(!new_lead || new_lead == "Cancel") - return - var/mob/living/carbon/human/H = new_lead - if(!istype(H) || !H.mind || H.stat == DEAD) //marines_list replaces mob refs of gibbed marines with just a name string - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("[H] is KIA!")]") - return - if(H == current_squad.squad_leader) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("[H] is already the Squad Leader!")]") - return - if(jobban_isbanned(H, JOB_SQUAD_LEADER)) - to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("[H] is unfit to lead!")]") - return - if(current_squad.squad_leader) - current_squad.send_message("Attention: [current_squad.squad_leader] is [current_squad.squad_leader.stat == DEAD ? "stepping down" : "demoted"]. A new Squad Leader has been set: [H.real_name].") - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("Squad Leader [current_squad.squad_leader] of squad '[current_squad]' has been [current_squad.squad_leader.stat == DEAD ? "replaced" : "demoted and replaced"] by [H.real_name]! Logging to enlistment files.")]") - var/old_lead = current_squad.squad_leader - current_squad.demote_squad_leader(current_squad.squad_leader.stat != DEAD) - SStracking.start_tracking(current_squad.tracking_id, old_lead) - else - current_squad.send_message("Attention: A new Squad Leader has been set: [H.real_name].") - visible_message("[icon2html(src, viewers(src))] [SPAN_BOLDNOTICE("[H.real_name] is the new Squad Leader of squad '[current_squad]'! Logging to enlistment file.")]") - - to_chat(H, "[icon2html(src, H)] Overwatch: You've been promoted to \'[H.job == JOB_SQUAD_LEADER ? "SQUAD LEADER" : "ACTING SQUAD LEADER"]\' for [current_squad.name]. Your headset has access to the command channel (:v).") - to_chat(usr, "[icon2html(src, usr)] [H.real_name] is [current_squad]'s new leader!") - - if(H.assigned_fireteam) - if(H == current_squad.fireteam_leaders[H.assigned_fireteam]) - current_squad.unassign_ft_leader(H.assigned_fireteam, TRUE, FALSE) - current_squad.unassign_fireteam(H, FALSE) - - current_squad.squad_leader = H - current_squad.update_squad_leader() - current_squad.update_free_mar() - - SStracking.set_leader(current_squad.tracking_id, H) - SStracking.start_tracking("marine_sl", H) - - if(H.job == JOB_SQUAD_LEADER)//a real SL - H.comm_title = "SL" - else //an acting SL - H.comm_title = "aSL" - ADD_TRAIT(H, TRAIT_LEADERSHIP, TRAIT_SOURCE_SQUAD_LEADER) - - var/obj/item/device/radio/headset/almayer/marine/R = H.get_type_in_ears(/obj/item/device/radio/headset/almayer/marine) - if(R) - R.keys += new /obj/item/device/encryptionkey/squadlead/acting(R) - R.recalculateChannels() - if(istype(H.wear_id, /obj/item/card/id)) - var/obj/item/card/id/ID = H.wear_id - ID.access += ACCESS_MARINE_LEADER - H.hud_set_squad() - H.update_inv_head() //updating marine helmet leader overlays - H.update_inv_wear_suit() /obj/structure/machinery/computer/overwatch/proc/mark_insubordination() - if(!usr || usr != operator) + if(!usr) return if(!current_squad) to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("No squad selected!")]") @@ -748,7 +678,7 @@ return /obj/structure/machinery/computer/overwatch/proc/transfer_squad() - if(!usr || usr != operator) + if(!usr) return if(!current_squad) to_chat(usr, "[icon2html(src, usr)] [SPAN_WARNING("No squad selected!")]") @@ -862,12 +792,13 @@ return var/ob_name = lowertext(almayer_orbital_cannon.tray.warhead.name) - announce_dchat("\A [ob_name] targeting [A.name] has been fired!", T) + var/mutable_appearance/warhead_appearance = mutable_appearance(almayer_orbital_cannon.tray.warhead.icon, almayer_orbital_cannon.tray.warhead.icon_state) + notify_ghosts(header = "Bombardment Inbound", message = "\A [ob_name] targeting [A.name] has been fired!", source = T, alert_overlay = warhead_appearance, extra_large = TRUE) message_admins(FONT_SIZE_HUGE("ALERT: [key_name(user)] fired an orbital bombardment in [A.name] for squad '[current_squad]' [ADMIN_JMP(T)]")) 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, ob_name, "X[x_bomb], Y[y_bomb] in [A.name]") + GLOB.ares_link.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) @@ -877,7 +808,7 @@ /obj/structure/machinery/computer/overwatch/proc/handle_supplydrop() SHOULD_NOT_SLEEP(TRUE) - if(!usr || usr != operator) + if(!usr) return if(busy) diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index b72120d2038e..f1d5e56ee8d3 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -255,7 +255,7 @@ PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY|PASS_AROUND|PASS_OVER_THROW_ITEM //Making so rockets don't hit M56D -/obj/structure/machinery/m56d_post/calculate_cover_hit_boolean(obj/item/projectile/P, distance = 0, cade_direction_correct = FALSE) +/obj/structure/machinery/m56d_post/calculate_cover_hit_boolean(obj/projectile/P, distance = 0, cade_direction_correct = FALSE) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & AMMO_ROCKET) return 0 @@ -447,7 +447,7 @@ var/health_max = 200 //Why not just give it sentry-tier health for now. var/atom/target = null // required for shooting at things. var/datum/ammo/bullet/machinegun/ammo = /datum/ammo/bullet/machinegun - var/obj/item/projectile/in_chamber = null + var/obj/projectile/in_chamber = null var/locked = 0 //1 means its locked inplace (this will be for sandbag MGs) var/is_bursting = 0 var/muzzle_flash_lum = 4 @@ -479,7 +479,7 @@ PF.flags_can_pass_all = PASS_AROUND|PASS_OVER_THROW_ITEM|PASS_OVER_THROW_MOB //Making so rockets don't hit M56D -/obj/structure/machinery/m56d_hmg/calculate_cover_hit_boolean(obj/item/projectile/P, distance = 0, cade_direction_correct = FALSE) +/obj/structure/machinery/m56d_hmg/calculate_cover_hit_boolean(obj/projectile/P, distance = 0, cade_direction_correct = FALSE) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & AMMO_ROCKET) return 0 @@ -501,7 +501,6 @@ /obj/structure/machinery/m56d_hmg/Destroy() //Make sure we pick up our trash. if(operator) operator.unset_interaction() - SetLuminosity(0) STOP_PROCESSING(SSobj, src) . = ..() @@ -646,7 +645,7 @@ if(50 to 75) damage_state = M56D_DMG_SLIGHT if(75 to INFINITY) damage_state = M56D_DMG_NONE -/obj/structure/machinery/m56d_hmg/bullet_act(obj/item/projectile/P) //Nope. +/obj/structure/machinery/m56d_hmg/bullet_act(obj/projectile/P) //Nope. bullet_ping(P) visible_message(SPAN_WARNING("[src] is hit by the [P.name]!")) update_health(round(P.damage / 10)) //Universal low damage to what amounts to a post with a gun. @@ -671,7 +670,7 @@ return 0 //Out of ammo. var/datum/cause_data/cause_data = create_cause_data(initial(name)) - in_chamber = new /obj/item/projectile(loc, cause_data) //New bullet! + in_chamber = new /obj/projectile(loc, cause_data) //New bullet! in_chamber.generate_bullet(ammo) return 1 @@ -719,7 +718,7 @@ return if(load_into_chamber() == 1) - if(istype(in_chamber,/obj/item/projectile)) + if(istype(in_chamber,/obj/projectile)) in_chamber.original = target var/initial_angle = Get_Angle(T, U) @@ -818,9 +817,9 @@ if(isnull(angle)) return - SetLuminosity(muzzle_flash_lum) + set_light(muzzle_flash_lum) spawn(10) - SetLuminosity(-muzzle_flash_lum) + set_light(-muzzle_flash_lum) var/image_layer = layer + 0.1 diff --git a/code/modules/cm_phone/phone.dm b/code/modules/cm_phone/phone.dm index b3e0ecd87206..a99bb5603dcb 100644 --- a/code/modules/cm_phone/phone.dm +++ b/code/modules/cm_phone/phone.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter) var/timeout_timer_id var/timeout_duration = 30 SECONDS - var/network_receive = FACTION_MARINE + var/list/networks_receive = list(FACTION_MARINE) var/list/networks_transmit = list(FACTION_MARINE) /obj/structure/transmitter/hidden @@ -82,7 +82,12 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter) var/obj/structure/transmitter/target_phone = possible_phone if(TRANSMITTER_UNAVAILABLE(target_phone) || !target_phone.callable) // Phone not available continue - if(!(target_phone.network_receive in networks_transmit)) + var/net_link = FALSE + for(var/network in networks_transmit) + if(network in target_phone.networks_receive) + net_link = TRUE + continue + if(!net_link) continue var/id = target_phone.phone_id @@ -538,9 +543,19 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter) UnregisterSignal(attached_to, COMSIG_MOVABLE_MOVED) reset_tether() +//rotary desk phones (need a touch tone handset at some point) +/obj/structure/transmitter/rotary + name = "rotary telephone" + icon_state = "rotary_phone" + desc = "The finger plate is a little stiff." + +/obj/structure/transmitter/touchtone + name = "touch-tone telephone" + icon_state = "rotary_phone"//placeholder + desc = "Ancient aliens, it's all true. I'm an expert just like you!" /obj/structure/transmitter/colony_net - network_receive = FACTION_COLONIST + networks_receive = list(FACTION_COLONIST) networks_transmit = list(FACTION_COLONIST) /obj/structure/transmitter/colony_net/rotary @@ -548,13 +563,29 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter) icon_state = "rotary_phone" desc = "The finger plate is a little stiff." -//rotary desk phones (need a touch tone handset at some point) -/obj/structure/transmitter/rotary +/obj/structure/transmitter/upp_net + networks_receive = list(FACTION_UPP) + networks_transmit = list(FACTION_UPP) + +/obj/structure/transmitter/upp_net/rotary name = "rotary telephone" icon_state = "rotary_phone" desc = "The finger plate is a little stiff." -/obj/structure/transmitter/touchtone - name = "touch-tone telephone" - icon_state = "rotary_phone"//placeholder - desc = "Ancient aliens, it's all true. I'm an expert just like you!" +/obj/structure/transmitter/clf_net + networks_receive = list(FACTION_CLF) + networks_transmit = list(FACTION_CLF) + +/obj/structure/transmitter/clf_net/rotary + name = "rotary telephone" + icon_state = "rotary_phone" + desc = "The finger plate is a little stiff." + +/obj/structure/transmitter/wy_net + networks_receive = list(FACTION_WY) + networks_transmit = list(FACTION_WY) + +/obj/structure/transmitter/wy_net/rotary + name = "rotary telephone" + icon_state = "rotary_phone" + desc = "The finger plate is a little stiff." diff --git a/code/modules/cm_preds/smartdisc.dm b/code/modules/cm_preds/smartdisc.dm index 068ff3550024..f0262f5f140a 100644 --- a/code/modules/cm_preds/smartdisc.dm +++ b/code/modules/cm_preds/smartdisc.dm @@ -163,7 +163,7 @@ /mob/living/simple_animal/hostile/smartdisc/Collided(atom/movable/AM) return -/mob/living/simple_animal/hostile/smartdisc/bullet_act(obj/item/projectile/Proj) +/mob/living/simple_animal/hostile/smartdisc/bullet_act(obj/projectile/Proj) if(prob(60 - Proj.damage)) return 0 diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index a94cde9887c3..c9976c7fea89 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -308,7 +308,7 @@ embedded_id.set_user_data(user) //Any projectile can decloak a predator. It does defeat one free bullet though. -/obj/item/clothing/gloves/yautja/hunter/proc/bullet_hit(mob/living/carbon/human/H, obj/item/projectile/P) +/obj/item/clothing/gloves/yautja/hunter/proc/bullet_hit(mob/living/carbon/human/H, obj/projectile/P) SIGNAL_HANDLER var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index 31526ae908f3..9e56d0da7098 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -61,41 +61,39 @@ fire_intensity_resistance = 10 black_market_value = 100 -/obj/item/clothing/suit/armor/yautja/Initialize(mapload, armor_number = rand(1,7), armor_material = "ebony", elder_restricted = 0) +/obj/item/clothing/suit/armor/yautja/Initialize(mapload, armor_number = rand(1,7), armor_material = "ebony", legacy = "None") . = ..() if(thrall) return - if(elder_restricted) - switch(armor_number) - if(1341) - name = "\improper 'Armor of the Dragon'" + flags_cold_protection = flags_armor_protection + flags_heat_protection = flags_armor_protection + + if(legacy != "None") + switch(legacy) + if("dragon") icon_state = "halfarmor_elder_tr" LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor_elder_tr") - if(7128) - name = "\improper 'Armor of the Swamp Horror'" + return + if("swamp") icon_state = "halfarmor_elder_joshuu" LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor_elder_joshuu") - if(9867) - name = "\improper 'Armor of the Enforcer'" + return + if("enforcer") icon_state = "halfarmor_elder_feweh" LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor_elder_feweh") - if(4879) - name = "\improper 'Armor of the Ambivalent Collector'" + return + if("collector") icon_state = "halfarmor_elder_n" LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor_elder_n") - else - name = "clan elder's armor" - icon_state = "halfarmor_elder" - LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor_elder") - else - if(armor_number > 7) - armor_number = 1 - if(armor_number) //Don't change full armor number - icon_state = "halfarmor[armor_number]_[armor_material]" - LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor[armor_number]_[armor_material]") + return + + if(armor_number > 7) + armor_number = 1 + if(armor_number) //Don't change full armor number + icon_state = "halfarmor[armor_number]_[armor_material]" + LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor[armor_number]_[armor_material]") + - flags_cold_protection = flags_armor_protection - flags_heat_protection = flags_armor_protection /obj/item/clothing/suit/armor/yautja/hunter name = "clan armor" diff --git a/code/modules/cm_preds/yaut_mask.dm b/code/modules/cm_preds/yaut_mask.dm index be0aa8ed761a..ae27809a3ec7 100644 --- a/code/modules/cm_preds/yaut_mask.dm +++ b/code/modules/cm_preds/yaut_mask.dm @@ -44,16 +44,34 @@ var/thrall = FALSE //Used to affect icon generation. -/obj/item/clothing/mask/gas/yautja/New(location, mask_number = rand(1,12), armor_material = "ebony", elder_restricted = 0) +/obj/item/clothing/mask/gas/yautja/New(location, mask_number = rand(1,12), armor_material = "ebony", legacy = "None") ..() forceMove(location) if(thrall) return + if(legacy != "None") + switch(legacy) + if("Dragon") + icon_state = "pred_mask_elder_tr" + LAZYSET(item_state_slots, WEAR_FACE, "pred_mask_elder_tr") + return + if("Swamp") + icon_state = "pred_mask_elder_joshuu" + LAZYSET(item_state_slots, WEAR_FACE, "pred_mask_elder_joshuu") + return + if("Enforcer") + icon_state = "pred_mask_elder_feweh" + LAZYSET(item_state_slots, WEAR_FACE, "pred_mask_elder_feweh") + return + if("Collector") + icon_state = "pred_mask_elder_n" + LAZYSET(item_state_slots, WEAR_FACE, "pred_mask_elder_n") + return + if(mask_number > 12) mask_number = 1 icon_state = "pred_mask[mask_number]_[armor_material]" - LAZYSET(item_state_slots, WEAR_FACE, "pred_mask[mask_number]_[armor_material]") /obj/item/clothing/mask/gas/yautja/pickup(mob/living/user) @@ -155,7 +173,7 @@ if(istype(user) && user.wear_mask == src) //inventory reference is only cleared after dropped(). for(var/listed_hud in mask_huds) var/datum/mob_hud/H = huds[listed_hud] - H.remove_hud_from(user) + H.remove_hud_from(user, src) var/obj/item/visor = user.glasses if(visor) //make your hud fuck off if(istype(visor, /obj/item/clothing/glasses/night/yautja)) @@ -170,7 +188,7 @@ START_PROCESSING(SSobj, src) for(var/listed_hud in mask_huds) var/datum/mob_hud/H = huds[listed_hud] - H.add_hud_to(user) + H.add_hud_to(user, src) if(current_goggles) var/obj/item/clothing/gloves/yautja/bracer = user.gloves if(!bracer || !istype(bracer)) diff --git a/code/modules/cm_preds/yaut_procs.dm b/code/modules/cm_preds/yaut_procs.dm index 445dfb40bf9f..32d532da72a0 100644 --- a/code/modules/cm_preds/yaut_procs.dm +++ b/code/modules/cm_preds/yaut_procs.dm @@ -225,8 +225,7 @@ ambience_exterior = AMBIENCE_YAUTJA ceiling = CEILING_METAL requires_power = FALSE - luminosity = TRUE - lighting_use_dynamic = FALSE + base_lighting_alpha = 255 /mob/living/carbon/human/proc/pred_buy() set category = "Yautja.Misc" diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 5ff13c843ee3..762ab9ecbb0f 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -874,7 +874,7 @@ update_icon() return TRUE -/obj/item/weapon/gun/launcher/spike/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/launcher/spike/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(refund) spikes++ return TRUE @@ -960,8 +960,8 @@ /obj/item/weapon/gun/energy/yautja/plasmarifle/load_into_chamber() ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/bolt] charge_time -= 10 - var/obj/item/projectile/projectile = create_bullet(ammo, initial(name)) - projectile.SetLuminosity(1) + var/obj/projectile/projectile = create_bullet(ammo, initial(name)) + projectile.set_light(1) in_chamber = projectile return in_chamber @@ -972,7 +972,7 @@ update_icon() return TRUE -/obj/item/weapon/gun/energy/yautja/plasmarifle/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/energy/yautja/plasmarifle/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(refund) charge_time *= 2 return TRUE @@ -1057,8 +1057,8 @@ /obj/item/weapon/gun/energy/yautja/plasmapistol/load_into_chamber() if(charge_time < 1) return - var/obj/item/projectile/projectile = create_bullet(ammo, initial(name)) - projectile.SetLuminosity(1) + var/obj/projectile/projectile = create_bullet(ammo, initial(name)) + projectile.set_light(1) in_chamber = projectile charge_time -= shot_cost return in_chamber @@ -1070,7 +1070,7 @@ /obj/item/weapon/gun/energy/yautja/plasmapistol/reload_into_chamber() return TRUE -/obj/item/weapon/gun/energy/yautja/plasmapistol/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/energy/yautja/plasmapistol/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(refund) charge_time += shot_cost @@ -1259,7 +1259,7 @@ /obj/item/weapon/gun/energy/yautja/plasma_caster/reload_into_chamber() return TRUE -/obj/item/weapon/gun/energy/yautja/plasma_caster/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/energy/yautja/plasma_caster/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(refund) source.charge += charge_cost diff --git a/code/modules/cm_tech/droppod/gear_access_point.dm b/code/modules/cm_tech/droppod/gear_access_point.dm index cbd70f9d083d..b581764e2d3b 100644 --- a/code/modules/cm_tech/droppod/gear_access_point.dm +++ b/code/modules/cm_tech/droppod/gear_access_point.dm @@ -17,7 +17,7 @@ /obj/structure/techpod_vendor/attack_hand(mob/user) var/area/a = get_area(src) //no idea why it was made just a structure, so this is gonna be here for now - if(!a.master || a.master.requires_power && !a.master.unlimited_power && !a.master.power_equip) + if(!a || a.requires_power && !a.unlimited_power && !a.power_equip) return if(!ishuman(user) || !get_access_permission(user)) diff --git a/code/modules/cm_tech/implements/armor.dm b/code/modules/cm_tech/implements/armor.dm index de196647eaca..c08bf6d3c128 100644 --- a/code/modules/cm_tech/implements/armor.dm +++ b/code/modules/cm_tech/implements/armor.dm @@ -94,7 +94,7 @@ COMSIG_HUMAN_BULLET_ACT )) -/obj/item/clothing/accessory/health/proc/take_bullet_damage(mob/living/carbon/human/user, damage, ammo_flags, obj/item/projectile/P) +/obj/item/clothing/accessory/health/proc/take_bullet_damage(mob/living/carbon/human/user, damage, ammo_flags, obj/projectile/P) SIGNAL_HANDLER if(damage <= 0 || (ammo_flags & AMMO_IGNORE_ARMOR)) return diff --git a/code/modules/cm_tech/implements/medical_czsp.dm b/code/modules/cm_tech/implements/medical_czsp.dm index 3eed2fc9f619..30eda5b8af29 100644 --- a/code/modules/cm_tech/implements/medical_czsp.dm +++ b/code/modules/cm_tech/implements/medical_czsp.dm @@ -203,7 +203,7 @@ click_empty(user) return NONE - var/obj/item/projectile/pill/P = new /obj/item/projectile/pill(src, user, src) + var/obj/projectile/pill/P = new /obj/projectile/pill(src, user, src) P.generate_bullet(GLOB.ammo_list[/datum/ammo/pill], 0, 0) pill_to_use.forceMove(P) @@ -221,16 +221,16 @@ damage = 0 -/datum/ammo/pill/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/pill/on_hit_mob(mob/M, obj/projectile/P) . = ..() if(!ishuman(M)) return - if(!istype(P, /obj/item/projectile/pill)) + if(!istype(P, /obj/projectile/pill)) return - var/obj/item/projectile/pill/pill_projectile = P + var/obj/projectile/pill/pill_projectile = P if(QDELETED(pill_projectile.source_pill)) pill_projectile.source_pill = null @@ -240,9 +240,9 @@ pill_reagents.trans_to(M, pill_reagents.total_volume) -/obj/item/projectile/pill +/obj/projectile/pill var/obj/item/reagent_container/pill/source_pill -/obj/item/projectile/pill/Destroy() +/obj/projectile/pill/Destroy() . = ..() source_pill = null diff --git a/code/modules/cm_tech/implements/railgun.dm b/code/modules/cm_tech/implements/railgun.dm index b69f9a9d13a8..bef2f3d656ab 100644 --- a/code/modules/cm_tech/implements/railgun.dm +++ b/code/modules/cm_tech/implements/railgun.dm @@ -63,7 +63,7 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords) /obj/structure/machinery/computer/railgun/attackby(obj/I as obj, mob/user as mob) //Can't break or disassemble. return -/obj/structure/machinery/computer/railgun/bullet_act(obj/item/projectile/Proj) //Can't shoot it +/obj/structure/machinery/computer/railgun/bullet_act(obj/projectile/Proj) //Can't shoot it return FALSE /obj/structure/machinery/computer/railgun/proc/set_operator(mob/living/carbon/human/H) diff --git a/code/modules/cm_tech/implements/xeno_handler.dm b/code/modules/cm_tech/implements/xeno_handler.dm index 45cc99d7956e..cbafec7499ee 100644 --- a/code/modules/cm_tech/implements/xeno_handler.dm +++ b/code/modules/cm_tech/implements/xeno_handler.dm @@ -55,5 +55,6 @@ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_ENGINEER = SKILL_ENGINEER_ENGI, SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, ) diff --git a/code/modules/cm_tech/resources/resource.dm b/code/modules/cm_tech/resources/resource.dm index eda0af9f63b8..44af2234afd3 100644 --- a/code/modules/cm_tech/resources/resource.dm +++ b/code/modules/cm_tech/resources/resource.dm @@ -85,7 +85,7 @@ health = Clamp(health - damage, 0, max_health) healthcheck() -/obj/structure/resource_node/bullet_act(obj/item/projectile/P) +/obj/structure/resource_node/bullet_act(obj/projectile/P) take_damage(P.damage) /obj/structure/resource_node/ex_act(severity, direction) diff --git a/code/modules/cm_tech/tech_node.dm b/code/modules/cm_tech/tech_node.dm index a8f5e02c2303..4e16267b9123 100644 --- a/code/modules/cm_tech/tech_node.dm +++ b/code/modules/cm_tech/tech_node.dm @@ -19,6 +19,7 @@ info = tech name = tech.name tech.node = src + tech.update_icon(src) /obj/effect/node/update_icon() diff --git a/code/modules/cm_tech/techs/abstract/repeatable.dm b/code/modules/cm_tech/techs/abstract/repeatable.dm index 4b240814e0c6..62fa27540b7b 100644 --- a/code/modules/cm_tech/techs/abstract/repeatable.dm +++ b/code/modules/cm_tech/techs/abstract/repeatable.dm @@ -9,8 +9,6 @@ var/next_purchase = 0 var/increase_per_purchase = 0 - unlocked = TRUE - /datum/tech/repeatable/ui_static_data(mob/user) . = ..() if(increase_per_purchase) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm new file mode 100644 index 000000000000..98736d105a83 --- /dev/null +++ b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm @@ -0,0 +1,24 @@ +/datum/tech/cryomarine + name = "Wake Up Additional Specialist" + desc = "Wakes up an additional specialist to fight against any threats." + icon_state = "overshield" + + announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED" + announce_message = "An additional specialist is being taken out of cryo." + + required_points = 8 + + flags = TREE_FLAG_MARINE + tier = /datum/tier/three + +/datum/tech/cryomarine/can_unlock(mob/user) + . = ..() + if(!.) + return + if(!SSticker.mode) + to_chat(user, SPAN_WARNING("You can't do this right now!")) + return + +/datum/tech/cryomarine/on_unlock() + . = ..() + SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", FALSE, FALSE, announce_dispatch_message = FALSE) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm index 84361baa618f..56542e0000a6 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm @@ -7,8 +7,8 @@ announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED" announce_message = "Additional troops are being taken out of cryo." - required_points = 10 - increase_per_purchase = 5 + required_points = 6 + increase_per_purchase = 6 flags = TREE_FLAG_MARINE tier = /datum/tier/three @@ -23,4 +23,4 @@ /datum/tech/repeatable/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Squad)", FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", FALSE, FALSE, announce_dispatch_message = FALSE) diff --git a/code/modules/cm_tech/techs/marine/tier4/nuke.dm b/code/modules/cm_tech/techs/marine/tier4/nuke.dm index 441c9aba69fc..f970f37a3fab 100644 --- a/code/modules/cm_tech/techs/marine/tier4/nuke.dm +++ b/code/modules/cm_tech/techs/marine/tier4/nuke.dm @@ -1,11 +1,11 @@ -#define NUKE_UNLOCK_TIME (120 MINUTES) +#define NUKE_UNLOCK_TIME (115 MINUTES) /datum/tech/nuke name = "Nuclear Device" - //desc = "Purchase a nuclear device. Only able to purchase after X minutes into the operation. It's the only way to be sure." //See New() + desc = "Purchase a nuclear device. It's the only way to be sure." icon_state = "nuke" - required_points = 20 + required_points = 5 tier = /datum/tier/four @@ -15,7 +15,7 @@ flags = TREE_FLAG_MARINE /datum/tech/nuke/New() - desc = "Purchase a nuclear device. Only able to purchase [NUKE_UNLOCK_TIME / (1 MINUTES)] minutes into the operation. It's the only way to be sure." + SSticker.OnRoundstart(CALLBACK(src, PROC_REF(handle_description))) /datum/tech/nuke/on_unlock() . = ..() @@ -41,4 +41,5 @@ return TRUE -#undef NUKE_UNLOCK_TIME +/datum/tech/nuke/proc/handle_description() + desc = "Purchase a nuclear device. Only purchasable [Ceiling((NUKE_UNLOCK_TIME + SSticker.round_start_time) / (1 MINUTES))] minutes into the operation. It's the only way to be sure." diff --git a/code/modules/cm_tech/techtree.dm b/code/modules/cm_tech/techtree.dm index 5787adafc745..6c39d8ab9cf9 100644 --- a/code/modules/cm_tech/techtree.dm +++ b/code/modules/cm_tech/techtree.dm @@ -158,7 +158,12 @@ if(SEND_SIGNAL(M, COMSIG_MOB_ENTER_TREE, src, force) & COMPONENT_CANCEL_TREE_ENTRY) return - new/mob/hologram/techtree(entrance, M) + var/tech_hologram = new/mob/hologram/techtree(entrance, M) + + M.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + M.sync_lighting_plane_alpha() + + M.RegisterSignal(tech_hologram, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob, reset_lighting_alpha)) return TRUE diff --git a/code/modules/defenses/defenses.dm b/code/modules/defenses/defenses.dm index f47ae3e4d77b..d2c5e63fee29 100644 --- a/code/modules/defenses/defenses.dm +++ b/code/modules/defenses/defenses.dm @@ -448,7 +448,7 @@ return update_health(severity) -/obj/structure/machinery/defenses/bullet_act(obj/item/projectile/P) +/obj/structure/machinery/defenses/bullet_act(obj/projectile/P) bullet_ping(P) visible_message(SPAN_WARNING("[src] is hit by the [P]!")) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags diff --git a/code/modules/defenses/sentry.dm b/code/modules/defenses/sentry.dm index 86464d97f5a3..10d1b16dd9c3 100644 --- a/code/modules/defenses/sentry.dm +++ b/code/modules/defenses/sentry.dm @@ -21,7 +21,7 @@ var/sentry_type = "sentry" //Used for the icon display_additional_stats = TRUE /// Light strength when turned on - var/luminosity_strength = 7 + var/luminosity_strength = 5 /// Check if they have been upgraded or not, used for sentry post var/upgraded = FALSE var/omni_directional = FALSE @@ -72,7 +72,6 @@ QDEL_NULL(spark_system) QDEL_NULL(ammo) stop_processing() - SetLuminosity(0) . = ..() /obj/structure/machinery/defenses/sentry/process() @@ -181,7 +180,7 @@ /obj/structure/machinery/defenses/sentry/power_on_action() target = null - SetLuminosity(luminosity_strength) + set_light(luminosity_strength) visible_message("[icon2html(src, viewers(src))] [SPAN_NOTICE("The [name] hums to life and emits several beeps.")]") visible_message("[icon2html(src, viewers(src))] [SPAN_NOTICE("The [name] buzzes in a monotone voice: 'Default systems initiated'")]") @@ -189,7 +188,7 @@ set_range() /obj/structure/machinery/defenses/sentry/power_off_action() - SetLuminosity(0) + set_light(0) visible_message("[icon2html(src, viewers(src))] [SPAN_NOTICE("The [name] powers down and goes silent.")]") stop_processing() unset_range() @@ -309,7 +308,7 @@ low_ammo_timer = null /obj/structure/machinery/defenses/sentry/proc/actual_fire(atom/target) - var/obj/item/projectile/new_projectile = new(src, create_cause_data(initial(name), owner_mob, src)) + var/obj/projectile/new_projectile = new(src, create_cause_data(initial(name), owner_mob, src)) new_projectile.generate_bullet(new ammo.default_ammo) new_projectile.damage *= damage_mult new_projectile.accuracy *= accuracy_mult diff --git a/code/modules/defenses/sentry_computer.dm b/code/modules/defenses/sentry_computer.dm index a56be2bcac99..dd5726d6ccbf 100644 --- a/code/modules/defenses/sentry_computer.dm +++ b/code/modules/defenses/sentry_computer.dm @@ -56,8 +56,7 @@ /// camera screen which shows a blank error var/atom/movable/screen/background/cam_background - /// All turfs within range of the currently active camera - var/list/range_turfs = list() + var/list/cam_plane_masters /obj/item/device/sentry_computer/Initialize(mapload) . = ..() @@ -75,6 +74,16 @@ cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness) + var/atom/movable/screen/plane_master/instance = new plane() + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + if(instance.blend_mode_override) + instance.blend_mode = instance.blend_mode_override + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance + faction_group = FACTION_LIST_MARINE transceiver.forceMove(src) transceiver.set_frequency(SENTRY_FREQ) @@ -391,6 +400,8 @@ // Register map objects user.client.register_map_obj(cam_background) user.client.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) ui = new(user, src, "SentryGunUI", name) ui.open() @@ -474,13 +485,9 @@ var/list/guncamera_zone = range("[x_size]x[y_size]", target) var/list/visible_turfs = list() - range_turfs.Cut() for(var/turf/visible_turf in guncamera_zone) - range_turfs += visible_turf - var/area/visible_area = visible_turf.loc - if(!visible_area.lighting_use_dynamic || visible_turf.lighting_lumcount >= 1) - visible_turfs += visible_turf + visible_turfs += visible_turf var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 diff --git a/code/modules/defenses/sentry_flamer.dm b/code/modules/defenses/sentry_flamer.dm index 747435ccb285..9ae794e3c811 100644 --- a/code/modules/defenses/sentry_flamer.dm +++ b/code/modules/defenses/sentry_flamer.dm @@ -29,7 +29,7 @@ fire_delay = 0.5 /obj/structure/machinery/defenses/sentry/flamer/actual_fire(atom/A) - var/obj/item/projectile/P = new(create_cause_data(initial(name), owner_mob)) + var/obj/projectile/P = new(create_cause_data(initial(name), owner_mob)) P.generate_bullet(new ammo.default_ammo) GIVE_BULLET_TRAIT(P, /datum/element/bullet_trait_iff, faction_group) P.fire_at(A, src, owner_mob, P.ammo.max_range, P.ammo.shell_speed, null) diff --git a/code/modules/defenses/tesla_coil.dm b/code/modules/defenses/tesla_coil.dm index 3ba754db74c2..8dc8e6498ba1 100644 --- a/code/modules/defenses/tesla_coil.dm +++ b/code/modules/defenses/tesla_coil.dm @@ -49,12 +49,12 @@ overlays += image(icon, icon_state = "[defense_type] tesla_coil", pixel_y = 3) /obj/structure/machinery/defenses/tesla_coil/power_on_action() - SetLuminosity(7) + set_light(7) start_processing() visible_message("[icon2html(src, viewers(src))] [SPAN_NOTICE("The [name] gives a short zap, as it awakens.")]") /obj/structure/machinery/defenses/tesla_coil/power_off_action() - SetLuminosity(0) + set_light(0) stop_processing() visible_message("[icon2html(src, viewers(src))] [SPAN_NOTICE("The [name] dies out with a last spark.")]") @@ -155,7 +155,6 @@ if(targets) targets = null - SetLuminosity(0) . = ..() #define TESLA_COIL_STUN_FIRE_DELAY 3 SECONDS diff --git a/code/modules/dropships/attach_points/attach_point.dm b/code/modules/dropships/attach_points/attach_point.dm index 53a9129517ee..6724f5d18bd2 100644 --- a/code/modules/dropships/attach_points/attach_point.dm +++ b/code/modules/dropships/attach_points/attach_point.dm @@ -70,6 +70,7 @@ name = "weapon system attach point" icon_state = "equip_base_front" base_category = DROPSHIP_WEAPON + layer = ABOVE_OBJ_LAYER var/firing_arc_min var/firing_arc_max diff --git a/code/modules/dropships/attach_points/templates.dm b/code/modules/dropships/attach_points/templates.dm index be5eb24c3d29..51c870f04b0b 100644 --- a/code/modules/dropships/attach_points/templates.dm +++ b/code/modules/dropships/attach_points/templates.dm @@ -94,6 +94,7 @@ name = "electronic system attach point" base_category = DROPSHIP_ELECTRONICS icon_state = "equip_base_front" + layer = ABOVE_OBJ_LAYER /obj/effect/attach_point/electronics/dropship1 ship_tag = DROPSHIP_ALAMO diff --git a/code/modules/gear_presets/_select_equipment.dm b/code/modules/gear_presets/_select_equipment.dm index 94a628553252..4c3a4476d733 100644 --- a/code/modules/gear_presets/_select_equipment.dm +++ b/code/modules/gear_presets/_select_equipment.dm @@ -388,8 +388,7 @@ /obj/item/weapon/gun/pistol/b92fs = /obj/item/ammo_magazine/pistol/b92fs, /obj/item/weapon/gun/smg/mp27 = /obj/item/ammo_magazine/smg/mp27, /obj/item/weapon/gun/smg/mp5 = /obj/item/ammo_magazine/smg/mp5, - /obj/item/weapon/gun/pistol/skorpion = /obj/item/ammo_magazine/pistol/skorpion, - /obj/item/weapon/gun/pistol/skorpion/upp = /obj/item/ammo_magazine/pistol/skorpion, + /obj/item/weapon/gun/smg/bizon = /obj/item/ammo_magazine/smg/bizon, /obj/item/weapon/gun/smg/mac15 = /obj/item/ammo_magazine/smg/mac15, /obj/item/weapon/gun/smg/uzi = /obj/item/ammo_magazine/smg/uzi ) @@ -473,11 +472,10 @@ var/list/rebel_shotguns = list( ) var/list/rebel_smgs = list( - /obj/item/weapon/gun/smg/ppsh = /obj/item/ammo_magazine/smg/ppsh, + /obj/item/weapon/gun/smg/pps43 = /obj/item/ammo_magazine/smg/pps43, /obj/item/weapon/gun/smg/mp27 = /obj/item/ammo_magazine/smg/mp27, /obj/item/weapon/gun/smg/mp5 = /obj/item/ammo_magazine/smg/mp5, - /obj/item/weapon/gun/pistol/skorpion = /obj/item/ammo_magazine/pistol/skorpion, - /obj/item/weapon/gun/pistol/skorpion/upp = /obj/item/ammo_magazine/pistol/skorpion, + /obj/item/weapon/gun/smg/bizon = /obj/item/ammo_magazine/smg/bizon, /obj/item/weapon/gun/smg/mac15 = /obj/item/ammo_magazine/smg/mac15, /obj/item/weapon/gun/smg/uzi = /obj/item/ammo_magazine/smg/uzi, /obj/item/weapon/gun/smg/fp9000 = /obj/item/ammo_magazine/smg/fp9000 @@ -551,7 +549,6 @@ var/list/rebel_rifles = list( /obj/item/weapon/gun/pistol/holdout = /obj/item/ammo_magazine/pistol/holdout, /obj/item/weapon/gun/pistol/highpower = /obj/item/ammo_magazine/pistol/highpower, /obj/item/weapon/gun/smg/mp27 = /obj/item/ammo_magazine/smg/mp27, - /obj/item/weapon/gun/pistol/skorpion = /obj/item/ammo_magazine/pistol/skorpion, /obj/item/weapon/gun/smg/mac15 = /obj/item/ammo_magazine/smg/mac15, /obj/item/weapon/gun/smg/mac15 = /obj/item/ammo_magazine/smg/mac15/extended) @@ -565,6 +562,7 @@ var/list/rebel_rifles = list( /obj/item/weapon/gun/rifle/mar40/lmg = /obj/item/ammo_magazine/rifle/mar40/lmg, /obj/item/weapon/gun/rifle/m41aMK1 = /obj/item/ammo_magazine/rifle/m41aMK1, /obj/item/weapon/gun/smg/fp9000 = /obj/item/ammo_magazine/smg/fp9000, + /obj/item/weapon/gun/smg/bizon = /obj/item/ammo_magazine/smg/bizon, /obj/item/weapon/gun/rifle/m16 = /obj/item/ammo_magazine/rifle/m16) var/gunpath = sidearm? pick(merc_sidearms) : pick(merc_firearms) @@ -953,22 +951,43 @@ var/list/rebel_rifles = list( list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR) ) +/datum/equipment_preset/proc/load_upp_shotgun(mob/living/carbon/human/new_human) + var/random_shotgun = rand(1,3) + switch(random_shotgun) + if(1) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/breacher, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavybuck, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavybuck, WEAR_R_STORE) + if(2) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/breacher/slug, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyslug, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyslug, WEAR_R_STORE) + if(3) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/breacher/flechette, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyflechette, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyflechette, WEAR_R_STORE) + /datum/equipment_preset/proc/add_upp_weapon(mob/living/carbon/human/new_human) - var/random_gun = rand(1,3) + var/random_gun = rand(1,5) switch(random_gun) - if(1) + if(1, 2) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) - if(2) + if(3) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/carbine(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) - if(3) + if(4) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/buckshot(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/buckshot(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/buckshot(new_human), WEAR_IN_BACK) + if(5) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/bizon(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/bizon(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/bizon(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/bizon(new_human), WEAR_IN_BACK) /datum/equipment_preset/proc/spawn_random_upp_headgear(mob/living/carbon/human/new_human) var/random_hat = rand(1,10) @@ -983,7 +1002,7 @@ var/list/rebel_rifles = list( new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/ushanka(new_human), WEAR_HEAD) /datum/equipment_preset/proc/spawn_random_upp_armor(mob/living/carbon/human/new_human) - var/random_gear = rand(1, 4) + var/random_gear = rand(1, 5) switch(random_gear) if (1, 2, 3) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP (new_human), WEAR_BODY) @@ -994,11 +1013,17 @@ var/list/rebel_rifles = list( new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP (new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) + if (5) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP (new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/support(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) /datum/equipment_preset/proc/spawn_random_upp_belt(mob/living/carbon/human/new_human) - var/random_gun = rand(1, 3) + var/random_gun = rand(1, 4) switch(random_gun) - if (1, 2) - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY(new_human), WEAR_WAIST) + if (1 to 2) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92(new_human), WEAR_WAIST) if (3) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73(new_human), WEAR_WAIST) + if (4) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/upp(new_human), WEAR_WAIST) diff --git a/code/modules/gear_presets/agents.dm b/code/modules/gear_presets/agents.dm index e346cba373bf..dcf2a367b677 100644 --- a/code/modules/gear_presets/agents.dm +++ b/code/modules/gear_presets/agents.dm @@ -63,6 +63,9 @@ ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_COMMAND, ACCESS_MARINE_MAINT, + ACCESS_UPP_GENERAL, + ACCESS_UPP_FLIGHT, + ACCESS_UPP_LEADERSHIP, ) assignment = JOB_UPP_REPRESENTATIVE rank = JOB_UPP_REPRESENTATIVE @@ -96,6 +99,9 @@ ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_COMMAND, ACCESS_MARINE_MAINT, + ACCESS_TWE_GENERAL, + ACCESS_TWE_FLIGHT, + ACCESS_TWE_LEADERSHIP, ) assignment = JOB_TWE_REPRESENTATIVE rank = JOB_TWE_REPRESENTATIVE diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index 901de2c21ca3..81abf8bce550 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -675,7 +675,7 @@ list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR), list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR), - list("Sensor Medical HUD", 4, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_MANDATORY), + list("Medical Helmet Optic", 4, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_MANDATORY), list("SPECIAL AMMUNITION", 0, null, null, null), list("M16 AP Magazine (5.56x45mm)", 10, /obj/item/ammo_magazine/rifle/m16/ap, null, VENDOR_ITEM_REGULAR), @@ -996,7 +996,7 @@ list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR), list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR), - list("Sensor Medical HUD", 4, /obj/item/clothing/glasses/hud/sensor, null, VENDOR_ITEM_MANDATORY), + list("Medical Helmet Optic", 4, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_MANDATORY), list("SPECIAL AMMUNITION", 0, null, null, null), list("M16 AP Magazine (5.56x45mm)", 10, /obj/item/ammo_magazine/rifle/m16/ap, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index c42b1bf868f0..9da7ba70ae5b 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -433,7 +433,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/prop/helmetgarb/helmet_gasmask, WEAR_IN_HELMET) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless, WEAR_IN_HELMET) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light, WEAR_JACKET) @@ -481,7 +481,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/sensor, WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/leader, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/prop/helmetgarb/helmet_gasmask, WEAR_IN_HELMET) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless, WEAR_IN_HELMET) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/lead, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/leader, WEAR_JACKET) @@ -523,7 +523,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/rto, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/prop/helmetgarb/helmet_gasmask, WEAR_IN_HELMET) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless, WEAR_IN_HELMET) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding/superior, WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/tl, WEAR_L_EAR) @@ -571,7 +571,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/medic, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/prop/helmetgarb/helmet_gasmask, WEAR_IN_HELMET) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless, WEAR_IN_HELMET) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/med, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light, WEAR_JACKET) @@ -587,8 +587,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/adrenaline, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/adrenaline, WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless, WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency/skillless, WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency, WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/emergency, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, WEAR_IN_BELT) if(new_human.disabilities & NEARSIGHTED) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/prescription, WEAR_EYES) diff --git a/code/modules/gear_presets/other.dm b/code/modules/gear_presets/other.dm index 9780b739cf67..b440fe4533b2 100644 --- a/code/modules/gear_presets/other.dm +++ b/code/modules/gear_presets/other.dm @@ -807,7 +807,7 @@ for(var/hud_to_add in huds_to_add) var/datum/mob_hud/hud = huds[hud_to_add] - hud.add_hud_to(new_human) + hud.add_hud_to(new_human, new_human) var/list/actions_to_add = subtypesof(/datum/action/human_action/activable/cult) diff --git a/code/modules/gear_presets/royal_marines.dm b/code/modules/gear_presets/royal_marines.dm new file mode 100644 index 000000000000..373c41df49d8 --- /dev/null +++ b/code/modules/gear_presets/royal_marines.dm @@ -0,0 +1,339 @@ +/datum/equipment_preset/twe + name = "Three World Empire" + faction = FACTION_TWE + faction_group = list(FACTION_TWE, FACTION_USCM) + languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) + +/datum/equipment_preset/twe/royal_marine/load_name(mob/living/carbon/human/new_human, randomise) + new_human.gender = pick_weight(list(MALE = 80, FEMALE = 20,)) + var/datum/preferences/placeholder_pref = new() + placeholder_pref.randomize_appearance(new_human) + var/random_name + var/static/list/colors = list("BLACK" = list(15, 15, 25), "BROWN" = list(102, 51, 0), "AUBURN" = list(139, 62, 19)) + var/static/list/hair_colors = colors.Copy() + list("BLONDE" = list(197, 164, 30), "CARROT" = list(174, 69, 42)) + var/hair_color = pick(hair_colors) + new_human.r_hair = hair_colors[hair_color][1] + new_human.g_hair = hair_colors[hair_color][2] + new_human.b_hair = hair_colors[hair_color][3] + new_human.r_facial = hair_colors[hair_color][1] + new_human.g_facial = hair_colors[hair_color][2] + new_human.b_facial = hair_colors[hair_color][3] + var/eye_color = pick(colors) + new_human.r_eyes = colors[eye_color][1] + new_human.g_eyes = colors[eye_color][2] + new_human.b_eyes = colors[eye_color][3] + idtype = /obj/item/card/id/dogtag + if(new_human.gender == MALE) + random_name = "[pick(first_names_male)] [pick(last_names)]" + new_human.h_style = pick("Crewcut", "Shaved Head", "Buzzcut", "Undercut", "Side Undercut", "Pvt. Joker", "Marine Fade", "Low Fade", "Medium Fade", "High Fade", "No Fade", "Coffee House Cut", "Flat Top",) + new_human.f_style = pick("5 O'clock Shadow", "Shaved", "Full Beard", "3 O'clock Moustache", "5 O'clock Shadow", "5 O'clock Moustache", "7 O'clock Shadow", "7 O'clock Moustache",) + else + random_name = "[pick(first_names_female)] [pick(last_names)]" + new_human.h_style = pick("Ponytail 1", "Ponytail 2", "Ponytail 3", "Ponytail 4", "Pvt. Redding", "Pvt. Clarison", "Cpl. Dietrich", "Pvt. Vasquez", "Marine Bun", "Marine Bun 2", "Marine Flat Top",) + new_human.change_real_name(new_human, random_name) + new_human.age = rand(20,45) + new_human.r_hair = rand(15,35) + new_human.g_hair = rand(15,35) + new_human.b_hair = rand(25,45) + +/datum/equipment_preset/twe/royal_marine/load_id(mob/living/carbon/human/new_human, client/mob_client) + if(human_versus_human) + var/obj/item/clothing/under/uniform = new_human.w_uniform + if(istype(uniform)) + uniform.has_sensor = UNIFORM_HAS_SENSORS + uniform.sensor_faction = FACTION_TWE + return ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/twe/royal_marine + name = "Royal Marines Commando" + assignment = "Royal Marine" + rank = JOB_TWE_RMC_RIFLEMAN + var/human_versus_human = FALSE + ///Gives the Royal Marines their radios + var/headset_type = /obj/item/device/radio/headset/distress/royal_marine + idtype = /obj/item/card/id/dogtag + +//*****************************************************************************************************/ + +/datum/equipment_preset/twe/royal_marine/standard + name = "TWE Royal Marine Commando (Rifleman)" + paygrade = "RMC E1" + role_comm_title = "RMC" + flags = EQUIPMENT_PRESET_EXTRA + assignment = "Royal Marines Rifleman" + rank = JOB_TWE_RMC_RIFLEMAN + skills = /datum/skills/rmc + +/datum/equipment_preset/twe/royal_marine/standard/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/royal_marine, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/royal_marine, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/royal_marine, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/royal_marine/knife, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/royal_marines, 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/clothing/mask/gas/pmc/royal_marine, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/royal_marine, WEAR_IN_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/royal_marine/light, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/rmc_f90, WEAR_J_STORE) + + 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/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) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/incin, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/he, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + +/datum/equipment_preset/twe/royal_marine/standard/mre_pack + name = "TWE Royal Marine Commando (MRE Rifleman)" + +/datum/equipment_preset/twe/royal_marine/standard/mre_pack/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/frame, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_box/magazine/misc/mre, WEAR_IN_BACK) + ..() + +//*****************************************************************************************************/ +/datum/equipment_preset/twe/royal_marine/spec + paygrade = "RMC E2" + role_comm_title = "RMC SPC" + flags = EQUIPMENT_PRESET_EXTRA + skills = /datum/skills/rmc/specialist + +/datum/equipment_preset/twe/royal_marine/spec/marksman + name = "TWE Royal Marine Commando (Marksman)" + assignment = "Royal Marines Marksman" + rank = JOB_TWE_RMC_MARKSMAN + +/datum/equipment_preset/twe/royal_marine/spec/marksman/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/royal_marine, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/royal_marine, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/royal_marine, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/royal_marine/knife, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/royal_marines, 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/clothing/head/beret/royal_marine, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/royal_marine, WEAR_IN_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/royal_marine/light, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/rmc_f90/scope, WEAR_J_STORE) + + 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/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) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/incin, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/he, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + +//*****************************************************************************************************/ + +/datum/equipment_preset/twe/royal_marine/spec/breacher + name = "TWE Royal Marine Commando (Breacher)" + assignment = "Royal Marines Breacher" + rank = JOB_TWE_RMC_BREACHER + +/datum/equipment_preset/twe/royal_marine/spec/breacher/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/royal_marine/breacher, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/royal_marine, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/royal_marine, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/royal_marine/knife, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/royal_marines, 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/clothing/head/beret/royal_marine, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/royal_marine, WEAR_IN_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/royal_marine/pointman, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + + 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/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) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BELT) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/ballistic, WEAR_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + +//*****************************************************************************************************/ +/datum/equipment_preset/twe/royal_marine/spec/machinegun + name = "TWE Royal Marine Commando (Smartgunner)" + role_comm_title = "RMC SG" + assignment = "Royal Marines Smartgunner" + rank = JOB_TWE_RMC_SMARTGUNNER + skills = /datum/skills/rmc/smartgun + +/datum/equipment_preset/twe/royal_marine/spec/machinegun/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/royal_marine, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/royal_marine, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/royal_marine, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/royal_marine/knife, WEAR_FEET) + new_human.equip_to_slot(new /obj/item/clothing/glasses/night/m56_goggles, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/royal_marines, 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/clothing/mask/gas/pmc/royal_marine, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/royal_marine, WEAR_IN_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/royal_marine/smartgun, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun/rmc, WEAR_J_STORE) + + 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/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) + new_human.equip_to_slot(new /obj/item/smartgun_battery(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun/holo_targetting, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun/holo_targetting, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + +//*****************************************************************************************************/ +/datum/equipment_preset/twe/royal_marine/team_leader + name = "TWE Royal Marine Commando (Teamleader)" + paygrade = "RMC E4" + role_comm_title = "RMC TL" + flags = EQUIPMENT_PRESET_EXTRA + assignment = "Royal Marines Team Leader" + rank = JOB_TWE_RMC_TEAMLEADER + skills = /datum/skills/rmc/leader + +/datum/equipment_preset/twe/royal_marine/team_leader/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/royal_marine/team_leader, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/royal_marine/tl, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/royal_marine, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/royal_marine/knife, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/royal_marines, 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/clothing/head/helmet/marine/veteran/royal_marine, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/royal_marine, WEAR_IN_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/royal_marine/light/team_leader, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/rmc_f90/a_grip, WEAR_J_STORE) + + 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/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) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/incin, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/he, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + +//*****************************************************************************************************/ + +/datum/equipment_preset/twe/royal_marine/lieuteant //they better say it Lef-tenant or they should be banned for LRP. More importantly this guy doesn't spawn in the ERT + name = "TWE Royal Marine Commando (Officer)" + paygrade = "RMC O1" + role_comm_title = "RMC LT" + flags = EQUIPMENT_PRESET_EXTRA + assignment = "Royal Marines Team Commander" + rank = JOB_TWE_RMC_LIEUTENANT + skills = /datum/skills/rmc/leader + +/datum/equipment_preset/twe/royal_marine/lieuteant/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/royal_marine/team_leader, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/royal_marine/lt, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/royal_marine, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/royal_marine/knife, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/royal_marines, 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/clothing/head/helmet/marine/veteran/royal_marine, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/royal_marine, WEAR_IN_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/royal_marine/light/team_leader, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/rmc_f90, WEAR_IN_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/rmc_f90/a_grip, WEAR_J_STORE) + + 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/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) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/incin, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/rmc/he, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + diff --git a/code/modules/gear_presets/survivors.dm b/code/modules/gear_presets/survivors.dm index 78fdc20c8b9f..919e67e7cbf9 100644 --- a/code/modules/gear_presets/survivors.dm +++ b/code/modules/gear_presets/survivors.dm @@ -371,6 +371,7 @@ /datum/equipment_preset/survivor/corporate/shiva/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/formal(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) @@ -385,6 +386,7 @@ /datum/equipment_preset/survivor/corporate/solaris/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/outing/red(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY(new_human), WEAR_L_EAR) if(new_human.disabilities & NEARSIGHTED) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/prescription(new_human), WEAR_EYES) else @@ -457,6 +459,7 @@ /datum/equipment_preset/survivor/security/corsat/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/officer/formal/servicedress(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/security(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc(new_human), WEAR_HEAD) @@ -504,6 +507,7 @@ /datum/equipment_preset/survivor/security/lv/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/officer/formal/servicedress(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/security(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc(new_human), WEAR_HEAD) @@ -1614,11 +1618,13 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/med_small_stack(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/radio(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/recon(new_human), WEAR_L_EAR) /datum/equipment_preset/survivor/upp/soldier name = "Survivor - UPP Soldier" paygrade = "UE2" - assignment = "UPP Soldier" + assignment = JOB_UPP + rank = JOB_UPP skills = /datum/skills/military/survivor/upp_private /datum/equipment_preset/survivor/upp/soldier/load_gear(mob/living/carbon/human/new_human) @@ -1641,7 +1647,8 @@ /datum/equipment_preset/survivor/upp/sapper name = "Survivor - UPP Sapper" paygrade = "UE3S" - assignment = "UPP Sapper" + assignment = JOB_UPP_ENGI + rank = JOB_UPP_ENGI skills = /datum/skills/military/survivor/upp_sapper /datum/equipment_preset/survivor/upp/sapper/load_gear(mob/living/carbon/human/new_human) @@ -1667,7 +1674,8 @@ /datum/equipment_preset/survivor/upp/medic name = "Survivor - UPP Medic" paygrade = "UE3M" - assignment = "UPP Medic" + assignment = JOB_UPP_MEDIC + rank = JOB_UPP_MEDIC skills = /datum/skills/military/survivor/upp_medic /datum/equipment_preset/survivor/upp/medic/load_gear(mob/living/carbon/human/new_human) @@ -1694,8 +1702,9 @@ /datum/equipment_preset/survivor/upp/specialist name = "Survivor - UPP Specialist" + assignment = JOB_UPP_SPECIALIST + rank = JOB_UPP_SPECIALIST paygrade = "UE4" - assignment = "UPP Specialist" skills = /datum/skills/military/survivor/upp_spec /datum/equipment_preset/survivor/upp/specialist/load_gear(mob/living/carbon/human/new_human) @@ -1707,25 +1716,26 @@ 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/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/PK9(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73(new_human), WEAR_WAIST) ..() /datum/equipment_preset/survivor/upp/squad_leader name = "Survivor - UPP Squad Leader" paygrade = "UE5" + assignment = JOB_UPP_LEADER + rank = JOB_UPP_LEADER languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_GERMAN, LANGUAGE_CHINESE) - assignment = "UPP Squad Leader" role_comm_title = "UPP 173Rd RECON SL" skills = /datum/skills/military/survivor/upp_sl /datum/equipment_preset/survivor/upp/squad_leader/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP/officer (new_human), WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/officer (new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP (new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret(new_human), WEAR_HEAD) 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/belt/gun/type47/PK9(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/revolver(new_human), WEAR_WAIST) add_upp_weapon(new_human) ..() diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 32bcd61d6708..51b41c1387af 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -460,7 +460,7 @@ flags = EQUIPMENT_PRESET_EXTRA languages = ALL_SYNTH_LANGUAGES_UPP assignment = JOB_UPP_COMBAT_SYNTH - rank = JOB_SURVIVOR + rank = JOB_UPP_COMBAT_SYNTH faction = FACTION_UPP faction_group = list(FACTION_UPP, FACTION_SURVIVOR) skills = /datum/skills/colonial_synthetic @@ -479,7 +479,7 @@ new_human.equip_to_slot_or_del(uniform, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver, WEAR_R_EAR) - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/recon, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/multitool, WEAR_IN_BACK) diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index 63d1fd48e665..39a6c98aea0f 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -126,25 +126,9 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/box/m94, WEAR_IN_BACK) //3.25 new_human.equip_to_slot_or_del(new /obj/item/storage/box/m94, WEAR_IN_BACK) //4.25 //waist - var/gunbelt = prob(50) ? /obj/item/storage/belt/gun/type47/NY : /obj/item/storage/belt/gun/type47/PK9 - new_human.equip_to_slot_or_del(new gunbelt, WEAR_WAIST) - pick_ammotype(new_human) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92, WEAR_WAIST) + load_upp_shotgun(new_human) -/datum/equipment_preset/upp/soldier/proc/pick_ammotype(mob/living/carbon/human/new_human) - var/percentage = rand(1, 100) - switch(percentage) - if(1 to 33) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/breacher, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavybuck, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavybuck, WEAR_R_STORE) - if(34 to 66) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/breacher/slug, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyslug, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyslug, WEAR_R_STORE) - else - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/breacher/flechette, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyflechette, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/heavyflechette, WEAR_R_STORE) /datum/equipment_preset/upp/soldier/proc/load_upp_double(mob/living/carbon/human/new_human, obj/item/clothing/under/marine/veteran/UPP/UPP) //back @@ -266,18 +250,18 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) //body new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP/medic, WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP, WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/skorpion/upp/medic, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/support, WEAR_JACKET) //medic should move fast + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/bizon/upp, WEAR_J_STORE) //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //póckets - var/obj/item/storage/pouch/magazine/pistol/large/ppouch = new() + var/obj/item/storage/pouch/magazine/large/ppouch = new() new_human.equip_to_slot_or_del(ppouch, WEAR_R_STORE) for(var/i = 1 to ppouch.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/skorpion, WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/bizon, WEAR_IN_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical, WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE) @@ -292,7 +276,7 @@ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Medic Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("UM5 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/medic, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -557,9 +541,6 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, WEAR_IN_BACK) //1 new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) //1.33 new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) //1.66 - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //2 - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //2.33 - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //2.66 //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR) //head @@ -589,7 +570,8 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23/dragon, WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/dragonsbreath, WEAR_IN_JACKET) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY, WEAR_WAIST) + var/uppvetsidearm = prob(50) ? /obj/item/storage/belt/gun/type47/t73 : /obj/item/storage/belt/gun/type47/np92 + new_human.equip_to_slot_or_del(new uppvetsidearm, WEAR_WAIST) /datum/equipment_preset/upp/specialist/get_antag_clothing_equipment() return list( @@ -607,7 +589,7 @@ list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Bayonet Sheath", 0, /obj/item/storage/pouch/bayonet/upp, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -641,9 +623,9 @@ list("Essential Heavy Set", 0, /obj/effect/essentials_set/upp_heavy, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("SPECIAL AMMUNITION", 0, null, null, null), - list("Rotating Ammo Drum (7.62x51mm)", 15, /obj/item/ammo_magazine/minigun , null, VENDOR_ITEM_RECOMMENDED), + list("QYJ-72 Box Magazine(7.62x54mmR)", 15, /obj/item/ammo_magazine/pkp , null, VENDOR_ITEM_RECOMMENDED), - list("ATTACHMENTS (NONE FIT GSh-7.62)", 0, null, null, null), + list("ATTACHMENTS (NONE FIT QYJ-72)", 0, null, null, null), list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), @@ -670,8 +652,8 @@ //*****************************************************************************************************/ -/datum/equipment_preset/upp/minigunner - name = "UPP Minigunner" +/datum/equipment_preset/upp/machinegunner + name = "UPP Machinegunner" flags = EQUIPMENT_PRESET_EXTRA skills = /datum/skills/upp/specialist @@ -680,15 +662,12 @@ role_comm_title = "Spc" paygrade = "UE5" -/datum/equipment_preset/upp/minigunner/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/upp/machinegunner/load_gear(mob/living/carbon/human/new_human) //back new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, WEAR_IN_BACK) //1 new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) //1.33 new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) //1.66 - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //2 - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //2.33 - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //2.66 //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR) //head @@ -711,12 +690,15 @@ implant.on_implanted(new_human) //body - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/minigun/upp, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/minigun, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pkp, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pkp, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pkp, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pkp, WEAR_IN_JACKET) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY/shrapnel, WEAR_WAIST) + var/uppvetsidearm = prob(50) ? /obj/item/storage/belt/gun/type47/t73 : /obj/item/storage/belt/gun/type47/np92 + new_human.equip_to_slot_or_del(new uppvetsidearm, WEAR_WAIST) // 50/50 np92 or t73 -/datum/equipment_preset/upp/minigunner/get_antag_clothing_equipment() +/datum/equipment_preset/upp/machinegunner/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), @@ -760,15 +742,15 @@ list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR) ) -/datum/equipment_preset/upp/minigunner/get_antag_gear_equipment() +/datum/equipment_preset/upp/machinegunner/get_antag_gear_equipment() return list( list("HEAVY SET (MANDATORY)", 0, null, null, null), list("Essential Heavy Set", 0, /obj/effect/essentials_set/upp_heavy, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("SPECIAL AMMUNITION", 0, null, null, null), - list("Rotating Ammo Drum (7.62x51mm)", 15, /obj/item/ammo_magazine/minigun , null, VENDOR_ITEM_RECOMMENDED), + list("QYJ-72 Box Magazine (7.62x54mmR)", 15, /obj/item/ammo_magazine/pkp , null, VENDOR_ITEM_RECOMMENDED), - list("ATTACHMENTS (NONE FIT GSh-7.62)", 0, null, null, null), + list("ATTACHMENTS (NONE FIT QYJ-72)", 0, null, null, null), list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), @@ -806,8 +788,16 @@ paygrade = "UE6" /datum/equipment_preset/upp/leader/load_gear(mob/living/carbon/human/new_human) + var/UPPleadsidearm = rand(1,4) //back - new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/jima, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, WEAR_IN_BACK) //0.66 + new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/phosphorus/upp, WEAR_IN_BACK) //1.33 + new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/phosphorus/upp, WEAR_IN_BACK) //2 + new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/phosphorus/upp, WEAR_IN_BACK) //2.66 + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) //3.33 + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) //4 + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_BACK) //5 //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR) //head @@ -824,7 +814,14 @@ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer, WEAR_J_STORE) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY/shrapnel, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73, WEAR_WAIST) + switch(UPPleadsidearm) + if(1 to 2) // 50% + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73, WEAR_WAIST) + if(3) //25% + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92, WEAR_WAIST) + if(4) //25% + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/revolver, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) @@ -962,23 +959,17 @@ //back new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/upp, WEAR_FACE) //head new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret, WEAR_HEAD) //uniform - var/obj/item/clothing/under/marine/veteran/UPP/mp/M = new() - var/obj/item/clothing/accessory/storage/webbing/W = new() - M.attach_accessory(new_human, W) - new_human.equip_to_slot_or_del(M, WEAR_BODY) - for(var/i in 1 to W.hold.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP/mp, WEAR_BODY) //jacket new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/mp, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/revolver, WEAR_J_STORE) //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/UPP/full, WEAR_WAIST) //limbs @@ -995,7 +986,7 @@ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/mp, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("UL6 camouflaged jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/mp, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("UL4 camouflaged jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/mp, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -1003,7 +994,11 @@ list("HELMET (CHOOSE 1)", 0, null, null, null), list("Armored Beret", 0, /obj/item/clothing/head/uppcap/beret, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("UM7 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP/heavy, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), + + list("ARMOR (CHOOSE 1)", 0, null, null, null), + list("UL4 camouflaged jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/mp, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), @@ -1118,7 +1113,6 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK) //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR) @@ -1130,14 +1124,15 @@ M.attach_accessory(new_human, W) new_human.equip_to_slot_or_del(M, WEAR_BODY) for(var/i in 1 to W.hold.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/heap, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_ACCESSORY) + //jacket new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/officer, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer/leader, WEAR_J_STORE) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) @@ -1163,15 +1158,15 @@ list("HELMET (CHOOSE 1)", 0, null, null, null), list("Armored Beret", 0, /obj/item/clothing/head/uppcap/beret, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("UM7 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP/heavy, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), list("ARMOR (CHOOSE 1)", 0, null, null, null), - list("UL6 officers jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/officer, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), - list("UM5B Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("UL4 officer jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/officer, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("Type 47 Pistol Holster Rig NY", 0, /obj/item/storage/belt/gun/type47/NY, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Type 73 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/t73, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -1278,7 +1273,6 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK) //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR) @@ -1290,14 +1284,15 @@ M.attach_accessory(new_human, W) new_human.equip_to_slot_or_del(M, WEAR_BODY) for(var/i in 1 to W.hold.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/heap, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_ACCESSORY) + //jacket new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/officer, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer/leader, WEAR_J_STORE) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY/shrapnel, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) @@ -1316,7 +1311,6 @@ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("UL6 officers jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/officer, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -1324,11 +1318,15 @@ list("HELMET (CHOOSE 1)", 0, null, null, null), list("Armored Beret", 0, /obj/item/clothing/head/uppcap/beret, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("UM7 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP/heavy, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), + + list("ARMOR (CHOOSE 1)", 0, null, null, null), + list("UL4 officer jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/officer, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("Type 47 Pistol Holster Rig NY", 0, /obj/item/storage/belt/gun/type47/NY/shrapnel, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Type 73 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/t73, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -1428,6 +1426,7 @@ rank = JOB_UPP_MAY_OFFICER role_comm_title = "May." paygrade = "UO3" + skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/major/load_gear(mob/living/carbon/human/new_human) //back @@ -1435,7 +1434,6 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK) //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR) @@ -1447,14 +1445,15 @@ M.attach_accessory(new_human, W) new_human.equip_to_slot_or_del(M, WEAR_BODY) for(var/i in 1 to W.hold.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/heap, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_ACCESSORY) + //jacket new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/kapitan, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer/leader, WEAR_J_STORE) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/mateba/general/impact, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) @@ -1473,19 +1472,22 @@ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("UL6 officers jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/officer, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Combat Pack", 0, /obj/item/storage/backpack/lightpack/upp, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("HELMET (CHOOSE 1)", 0, null, null, null), - list("Armored Peaked Cap", 0, /obj/item/clothing/head/uppcap/peaked, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("UM7 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP/heavy, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Peaked Cap", 0, /obj/item/clothing/head/uppcap/peaked, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), + + list("ARMOR (CHOOSE 1)", 0, null, null, null), + list("UL4 senior officer jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/kapitan, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("Type 47 Pistol Holster Rig NY", 0, /obj/item/storage/belt/gun/type47/NY/shrapnel, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Type 74 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/t73/leader, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -1593,7 +1595,6 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK) //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR) @@ -1605,14 +1606,15 @@ M.attach_accessory(new_human, W) new_human.equip_to_slot_or_del(M, WEAR_BODY) for(var/i in 1 to W.hold.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/heap, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_ACCESSORY) + //jacket - new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/officer, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/kapitan, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer/leader, WEAR_J_STORE) //waist - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/mateba/general/impact, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) @@ -1631,19 +1633,22 @@ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("UL6 officers jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/officer, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Combat Pack", 0, /obj/item/storage/backpack/lightpack/upp, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("HELMET (CHOOSE 1)", 0, null, null, null), - list("Armored Peaked Cap", 0, /obj/item/clothing/head/uppcap/peaked, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - list("UM7 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP/heavy, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Peaked Cap", 0, /obj/item/clothing/head/uppcap/peaked, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), + list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED), + + list("ARMOR (CHOOSE 1)", 0, null, null, null), + list("UL4 senior officer jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/kapitan, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("Type 47 Pistol Holster Rig NY", 0, /obj/item/storage/belt/gun/type47/NY/shrapnel, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Type 74 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/t73/leader, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -1742,10 +1747,10 @@ /datum/equipment_preset/upp/sapper/survivor/load_gear(mob/living/carbon/human/new_human) //back new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/upp, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/nagant, WEAR_IN_BACK) //1 - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/upp, WEAR_IN_BACK) //1.3 - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/upp, WEAR_IN_BACK) //1.6 - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/upp, WEAR_IN_BACK) //2 + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/np92, WEAR_IN_BACK) //1 + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK) //1.3 + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK) //1.6 + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK) //2 new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK) //3 new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) //4 //face @@ -1845,19 +1850,19 @@ var/obj/item/clothing/accessory/storage/black_vest/tool_webbing/W = new() UPP.attach_accessory(new_human, W) new_human.equip_to_slot_or_del(UPP, WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/jacket, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/support, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/bottle/tricordrazine, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/skorpion/upp/medic, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/bizon/upp, WEAR_J_STORE) //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //póckets - var/obj/item/storage/pouch/magazine/pistol/large/ppouch = new() + var/obj/item/storage/pouch/magazine/large/ppouch = new() new_human.equip_to_slot_or_del(ppouch, WEAR_R_STORE) for(var/i = 1 to ppouch.storage_slots) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/skorpion, WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/bizon, WEAR_IN_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical, WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE) @@ -2112,8 +2117,10 @@ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/kdo, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/commando, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/PK9/tranq, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92/suppressed, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) @@ -2131,7 +2138,7 @@ new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) - spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71/heap, new_human, 0, 8) + spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 8) /datum/equipment_preset/upp/commando/get_antag_clothing_equipment() return list( @@ -2152,7 +2159,7 @@ list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/PK9/tranq, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("NPZ92 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/np92/suppressed, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -2233,6 +2240,8 @@ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/kdo/medic, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP/medic, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/commando, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) @@ -2260,7 +2269,7 @@ new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) - spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71/heap, new_human, 0, 5) + spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 5) /datum/equipment_preset/upp/commando/medic/get_antag_clothing_equipment() return list( @@ -2401,6 +2410,8 @@ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/kdo/command, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/commando, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) @@ -2408,7 +2419,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/PK9/tranq, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92/suppressed, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/phosphorus/upp, WEAR_IN_BACK) @@ -2422,7 +2433,7 @@ new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/handcuffs, WEAR_IN_BACK) - spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71/heap, new_human, 0, 7) + spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 7) /datum/equipment_preset/upp/commando/leader/get_antag_clothing_equipment() return list( @@ -2443,7 +2454,7 @@ list("BELT (CHOOSE 1)", 0, null, null, null), list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/PK9/tranq, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("NPZ92 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/type47/np92/suppressed, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), @@ -2554,7 +2565,7 @@ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/cct(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(new_human), WEAR_HANDS) - new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/PK9(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/revolver(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/tool/weldpack(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_L_STORE) @@ -2576,7 +2587,9 @@ list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), - list("Korovin PK-9 Pistol", 0, /obj/item/weapon/gun/pistol/c99/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), + list("Type 73 Pistol", 0, /obj/item/weapon/gun/pistol/t73, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_RECOMMENDED), + list("NP92 Pistol", 0, /obj/item/weapon/gun/pistol/np92, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), + list("ZHNK-72 Revolver", 0, /obj/item/weapon/gun/revolver/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR), 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_REGULAR), @@ -2667,9 +2680,9 @@ new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator, 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/roller/surgical, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/np92, WEAR_IN_BACK) //targeting unarmed medical personal is not a war crime in aliens(primarily because, off memory, warcrimes aren't really a thing, although this definately is bad manners), and the playerbase is HRP in this concern!(if you don't get the joke, the players regularly execute unarmed doctors in hvh events. :D) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK) //face new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR) if(new_human.disabilities & NEARSIGHTED) @@ -2685,12 +2698,15 @@ new_human.equip_to_slot_or_del(UPP, WEAR_BODY) //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_BELT) //limbs new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //póckets - new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium, WEAR_R_STORE) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical, WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_L_STORE) @@ -2705,6 +2721,7 @@ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Medic Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index 77f7665ce5b7..80520eb05e9a 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -167,9 +167,9 @@ //Otherwise, if you spawn the spy next to other people //they will see messages for them putting guns and explosives into their backpack... new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/c99/upp/tranq(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/c99/tranq(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/c99/tranq(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/np92/suppressed/tranq(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92/tranq(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92/tranq(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/handcuffs(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/chameleon(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE) @@ -205,7 +205,7 @@ if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1)) back_item = /obj/item/storage/backpack/security - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/highcom(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/provost(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp/provost/enforcer(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) @@ -247,7 +247,7 @@ if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1)) back_item = /obj/item/storage/backpack/security - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/highcom(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/provost(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp/provost/tml(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) @@ -291,7 +291,7 @@ if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1)) back_item = /obj/item/storage/backpack/security - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/highcom(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/provost(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp/provost/advisor(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) @@ -325,7 +325,7 @@ if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1)) back_item = /obj/item/storage/backpack/security - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/highcom(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/provost(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp/provost/inspector(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) diff --git a/code/modules/gear_presets/uscm_medical.dm b/code/modules/gear_presets/uscm_medical.dm index 080911951b54..47d5ee19c9b4 100644 --- a/code/modules/gear_presets/uscm_medical.dm +++ b/code/modules/gear_presets/uscm_medical.dm @@ -173,9 +173,9 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(new_human), WEAR_FEET) if(new_human.disabilities & NEARSIGHTED) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/prescription(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/science/prescription(new_human), WEAR_EYES) else - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/science(new_human), WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/researcher(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/paper/research_notes/bad(new_human), WEAR_IN_JACKET) diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index f3129acb23d2..5b546b0c941c 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -31,7 +31,6 @@ idtype = /obj/item/card/id/silver/cl access = list( ACCESS_WY_GENERAL, - ACCESS_ILLEGAL_PIRATE, ACCESS_MARINE_COMMAND, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_MEDBAY, @@ -106,7 +105,6 @@ flags = EQUIPMENT_PRESET_START_OF_ROUND access = list( - ACCESS_ILLEGAL_PIRATE, ACCESS_MARINE_COMMAND, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_MEDBAY, diff --git a/code/modules/gear_presets/yautja.dm b/code/modules/gear_presets/yautja.dm index 21656e62eb7c..27eac7215ff3 100644 --- a/code/modules/gear_presets/yautja.dm +++ b/code/modules/gear_presets/yautja.dm @@ -28,6 +28,7 @@ return //No vanity items for Yautja! /datum/equipment_preset/yautja/load_gear(mob/living/carbon/human/new_human, client/mob_client) + var/using_legacy = "None" var/armor_number = 1 var/boot_number = 1 var/mask_number = 1 @@ -42,6 +43,7 @@ if(!mob_client) mob_client = new_human.client if(mob_client?.prefs) + using_legacy = mob_client.prefs.predator_use_legacy armor_number = mob_client.prefs.predator_armor_type boot_number = mob_client.prefs.predator_boot_type mask_number = mob_client.prefs.predator_mask_type @@ -62,8 +64,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/medicomp/full(new_human), WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/yautja/hunter/knife(new_human, boot_number, greave_material), WEAR_FEET) - new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/yautja/hunter(new_human, armor_number, armor_material), WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/yautja/hunter(new_human, mask_number, mask_material), WEAR_FACE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/yautja/hunter(new_human, armor_number, armor_material, using_legacy), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/yautja/hunter(new_human, mask_number, mask_material, using_legacy), WEAR_FACE) var/cape_path = GLOB.all_yautja_capes[cape_type] if(ispath(cape_path)) diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm index 9549b8fa59c1..463ce752308a 100644 --- a/code/modules/hydroponics/hydro_tray.dm +++ b/code/modules/hydroponics/hydro_tray.dm @@ -148,7 +148,7 @@ if (PF) PF.flags_can_pass_all = PASS_OVER|PASS_AROUND|PASS_TYPE_CRAWLER -/obj/structure/machinery/portable_atmospherics/hydroponics/bullet_act(obj/item/projectile/Proj) +/obj/structure/machinery/portable_atmospherics/hydroponics/bullet_act(obj/projectile/Proj) //Don't act on seeds like dionaea that shouldn't change. if(seed && seed.immutable > 0) @@ -225,13 +225,8 @@ var/turf/T = loc // Handle light requirements. - var/area/A = T.loc - if(A) - var/light_available - if(A.lighting_use_dynamic) - light_available = max(0,min(10,T.lighting_lumcount)-5) - else - light_available = 5 + if(T) + var/light_available = T.get_lumcount(0, 10) if(abs(light_available - seed.ideal_light) > seed.light_tolerance) plant_health -= healthmod @@ -427,10 +422,10 @@ // Update bioluminescence. if(seed) if(seed.biolum) - SetLuminosity(round(seed.potency/10)) + set_light(round(seed.potency/10)) return - SetLuminosity(0) + set_light(0) return // If a weed growth is sufficient, this proc is called. @@ -539,8 +534,7 @@ // Bookkeeping. check_level_sanity() - force_update = 1 - process() + return @@ -675,10 +669,7 @@ var/area/A = T.loc var/light_available if(A) - if(A.lighting_use_dynamic) - light_available = max(0,min(10,T.lighting_lumcount)-5) - else - light_available = 5 + light_available = max(0,min(10,T.dynamic_lumcount)-5) info += "The tray's sensor suite is reporting a light level of [light_available] lumens.\n" return info diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 90e1b7ac5351..2aff95eb1fcc 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -608,7 +608,7 @@ var/global/list/gene_tag_masks = list() // Gene obfuscation for delicious tria product.desc += " On second thought, something about this one looks strange." if(biolum) - product.SetLuminosity(biolum) + product.set_light(biolum) //Handle spawning in living, mobile products (like dionaea). if(istype(product,/mob/living)) diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm index 3745848ea254..14091a1d29bb 100644 --- a/code/modules/hydroponics/vines.dm +++ b/code/modules/hydroponics/vines.dm @@ -168,10 +168,10 @@ // Update bioluminescence. if(seed.biolum) - SetLuminosity(1+round(seed.potency/10)) + set_light(1+round(seed.potency/10)) return else - SetLuminosity(0) + set_light(0) // Update flower/product overlay. overlays.Cut() @@ -252,11 +252,7 @@ var/area/A = T.loc if(A) - var/light_available - if(A.lighting_use_dynamic) - light_available = max(0,min(10,T.lighting_lumcount)-5) - else - light_available = 5 + var/light_available = max(0,min(10,T.dynamic_lumcount)-5) if(abs(light_available - seed.ideal_light) > seed.light_tolerance) die() return diff --git a/code/modules/lighting/_LIGHTING_README.MD b/code/modules/lighting/_LIGHTING_README.MD new file mode 100644 index 000000000000..a7e7166e6b8d --- /dev/null +++ b/code/modules/lighting/_LIGHTING_README.MD @@ -0,0 +1,75 @@ +# The Lighting Systems +## Introduction + +Hello reader, and welcome to the coders guide to lighting. TGMC uses three different lighting systems: Static Lighting, Movable Lighting and Hybrid Lighting +These all have their pros and cons, and are explained later in this file. +For now we will look at the frameworks we have pertaining to lighting. + +```dm +//Our vars: +//The "intensity" of our light to determine how much it actually lights up +var/light_power +// The range of our light, aka how many turfs are actually lit up +var/light_range +//the color of our light +var/light_color +///whether the light is actually on or not, use /atom/proc/turn_on() to set this +var/light_on +``` + +Additionally, we have SSlighting, the lighting subsystem which handles lighting updates for Static and Hybrid lighting. +This subsystems processes enqueued lighting object, corner and source updates, as well as taking enqueued hybrid lighting updates. +You shouldnt really be touching this as it primarily just stops too many updates from happening at once. + +## The Lighting systems +As mentioned previously,lighting is split into three seperate systems who's functionality, benefits and downsides will be discussed below + +Seperate from these systems we also have a system to update the base lighting of an area, we do this using "Base lighting" + +```dm +/area/proc/set_base_lighting(new_base_lighting_color = -1, new_alpha = -1) +``` +Use this to set areas as required to luminosity. This is expensive-ish to apply/update but is very cheap to maintain. It also enables area specific light intensity and color changes. + +### Static Lighting +Static lighting consists of a single, static_lighting_source light source which gets all turfs in view, then tells their /datum/static_lighting_objects to update themselves. These lighting objects manage two things: lighting corners, and an underlay. The lighting corners hold data for the edges of turfs next to darkness to allow a smooth transition from dark to light, and the actual lighting is done using an underlay which is layered over the darkness layer in order to create light. Color is changed using a color matrix. +The advantage of this system, is that it is cheap, as long as it does not need to actively update opacity changes or a moving light target. +This system can also be used for as large lights as you want. +The disadvantage however is that updating this type of light, such as when it moves is relatively expensive, and colors are not always the prettiest. Additionally, lighting corners are known to be a large source of RAM usage and thus you should only load lighting objects in areas hat it is needed using /area/var/static_lighting. +Thus this should be your go to choice for large, frequent, immobile lights. + +To update lights using this system use +```dm +/atom/proc/set_light(l_range, l_power, l_color, mask_type) +``` +Note that the use of mask_type only is applicable to Hybrid lights. + +### Movable lighting +Movable lighting is extremely simple and cheap as it requires no updates. This is done by replacing a large amount of updating objects with one single, large vis_contents overlay, which we apply and manage through a component (/datum/component/overlay_lighting). This means that it will move smoothly when the owner moves and requires no updating, but also means that rendering issues might occur, where the overlay will seemingly "pop in" to existence as it suddenly renders when someone walks around a corner or into the 1/2-tile render buffer around the edges of the viewport. +Thus this should be your go to ideal cheap light for small and mobile lights (NOT turfs or anchored objects!). This light also typically has more saturated colors than static lighting. + +Note that this lighting type utilises special update procs from the other two lighting types, specifically +```dm +//update light variables +/atom/movable/proc/set_light_range_power_color(range, power, color) + set_light_range(range) + set_light_power(power) + set_light_color(color) + +//turn the light on and off without changing any variables +/atom/proc/set_light_on(new_value) +``` + +### Hybrid lighting +Hybrid lighting is, as the name implies, a hybrid of the two above systems. It still needs to update when the owner moves, or something in view changes like static lighting does, but uses overlays to hide areas using shadows. As a result, this has similar if not better performance to Static lighting, but has a higher drain on player GPU and thus you should ideally avoid lagging players that play on terrible computers too much. This means that you should use this lighting in decently sized lights that act as centerpieces for a scene (i.e. a fire, supermatter, etc.) since it combines the best of static and movable lighting at a clientside performance cost. +As a rule of thumb most items will be fine using this except for light fixtures, as lag mostly seems to crop up from multiple large lighting sources. +Using lights for turf based fires and large floodlights is thus fine, but be careful with frquesnt use. +It functions by fetching all nearby blockers, then calculating triangles behind these blocked areas which it then masks with overlays. +These overlays then render as an alpha mask blocking the light from appearing. +This system also supports non-round lights, such as light cones, rotating lights, and shimmering lights through the use of +```dm +var/mask_type +``` +which determines which type of icon we are going to use as the base when drawing this lights (/atom/movable/lighting_mask/flicker for shimmering lights as an example). + +Actual updates however are handled through the same procs as Static lighting, and the mask_type argument on set_light() allows you to change the mask type that is being used on the fly. diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm new file mode 100644 index 000000000000..ca9b5c7ff900 --- /dev/null +++ b/code/modules/lighting/emissive_blocker.dm @@ -0,0 +1,37 @@ +/** + * Internal atom that copies an appearance on to the blocker plane + * + * Copies an appearance vis render_target and render_source on to the emissive blocking plane. + * This means that the atom in question will block any emissive sprites. + * This should only be used internally. If you are directly creating more of these, you're + * almost guaranteed to be doing something wrong. + */ +/atom/movable/emissive_blocker + name = "emissive blocker" + plane = EMISSIVE_PLANE + layer = FLOAT_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + //Why? + //render_targets copy the transform of the target as well, but vis_contents also applies the transform + //to what's in it. Applying RESET_TRANSFORM here makes vis_contents not apply the transform. + //Since only render_target handles transform we don't get any applied transform "stacking" + appearance_flags = EMISSIVE_APPEARANCE_FLAGS + +/atom/movable/emissive_blocker/Initialize(mapload, source) + . = ..() + verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage? + + render_source = source + color = GLOB.em_block_color + + +/atom/movable/emissive_blocker/ex_act(severity) + return FALSE + +/atom/movable/emissive_blocker/onTransitZ() + return + +//Prevents people from moving these after creation, because they shouldn't be. +/atom/movable/emissive_blocker/forceMove(atom/destination, no_tp=FALSE, harderforce = FALSE) + if(harderforce) + return ..() diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm new file mode 100644 index 000000000000..2b6a1409f38a --- /dev/null +++ b/code/modules/lighting/lighting_area.dm @@ -0,0 +1,59 @@ +/area + luminosity = 1 + ///The mutable appearance we underlay to show light + var/mutable_appearance/lighting_effect = null + ///Whether this area has a currently active base lighting, bool + var/area_has_base_lighting = FALSE + ///alpha 0-255 of lighting_effect and thus baselighting intensity + var/base_lighting_alpha = 0 + ///The colour of the light acting on this area + var/base_lighting_color = COLOR_WHITE + +/area/proc/set_base_lighting(new_base_lighting_color = -1, new_alpha = -1) + if(base_lighting_alpha == new_alpha && base_lighting_color == new_base_lighting_color) + return FALSE + if(new_alpha != -1) + base_lighting_alpha = new_alpha + if(new_base_lighting_color != -1) + base_lighting_color = new_base_lighting_color + update_base_lighting() + return TRUE + +/area/vv_edit_var(var_name, var_value) + switch(var_name) + if("base_lighting_color") + set_base_lighting(new_base_lighting_color = var_value) + return TRUE + if("base_lighting_alpha") + set_base_lighting(new_alpha = var_value) + return TRUE + return ..() + +/area/proc/update_base_lighting() + if(!area_has_base_lighting && (!base_lighting_alpha || !base_lighting_color)) + return + + if(!area_has_base_lighting) + add_base_lighting() + return + remove_base_lighting() + if(base_lighting_alpha && base_lighting_color) + add_base_lighting() + +/area/proc/remove_base_lighting() + for(var/turf/T in src) + T.overlays -= lighting_effect + QDEL_NULL(lighting_effect) + area_has_base_lighting = FALSE + +/area/proc/add_base_lighting() + lighting_effect = mutable_appearance('icons/effects/alphacolors.dmi', "white") + lighting_effect.plane = LIGHTING_PLANE + lighting_effect.layer = LIGHTING_PRIMARY_LAYER + lighting_effect.blend_mode = BLEND_ADD + lighting_effect.alpha = base_lighting_alpha + lighting_effect.color = base_lighting_color + for(var/turf/T in src) + T.overlays += lighting_effect + T.luminosity = 1 + area_has_base_lighting = TRUE diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm new file mode 100644 index 000000000000..2abe8c598032 --- /dev/null +++ b/code/modules/lighting/lighting_atom.dm @@ -0,0 +1,178 @@ + +// The proc you should always use to set the light of this atom. +// Nonesensical value for l_color default, so we can detect if it gets set to null. +#define NONSENSICAL_VALUE -99999 +/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE, mask_type = null) + if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE) + l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players. + + if(l_power != null) + light_power = l_power + + if(l_range != null) + light_range = l_range + light_on = (light_range>0) ? TRUE : FALSE + + if(l_color != NONSENSICAL_VALUE) + light_color = l_color + + if(mask_type != null) + light_mask_type = mask_type + + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color) + + update_light() + +/atom/proc/fade_light(new_colour, time) + light_color = new_colour + if(light?.our_mask) + animate(light.our_mask, color = new_colour, time = time) + +/// Will update the light (duh).Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... +/atom/proc/update_light() + set waitfor = FALSE + + if(QDELETED(src)) + return + if(light_system == STATIC_LIGHT) + static_update_light() + return + + if((!light_power || !light_range) && light) // We won't emit light anyways, destroy the light source. + QDEL_NULL(light) + return + if(light && light_mask_type && (light_mask_type != light.mask_type)) + QDEL_NULL(light) + if(!light) // Update the light or create it if it does not exist. + light = new /datum/dynamic_light_source(src, light_mask_type) + return + light.set_light(light_range, light_power, light_color) + light.update_position() + + +/** + * Updates the atom's opacity value. + * + * This exists to act as a hook for associated behavior. + * It notifies (potentially) affected light sources so they can update (if needed). + */ +/atom/proc/set_opacity(new_opacity) + if(new_opacity == opacity) + return + SEND_SIGNAL(src, COMSIG_ATOM_SET_OPACITY, new_opacity) + . = opacity + + opacity = new_opacity + +/atom/movable/set_opacity(new_opacity) + . = ..() + if(isnull(.) || !isturf(loc)) + return + + if(opacity) + AddElement(/datum/element/light_blocking) + else + RemoveElement(/datum/element/light_blocking) + + +/turf/set_opacity(new_opacity) + . = ..() + if(isnull(.)) + return + recalculate_directional_opacity() + +/atom/vv_edit_var(var_name, var_value) + switch(var_name) + if("light_range") + if(light_system != MOVABLE_LIGHT) + set_light(l_range = var_value) + else + set_light_range(var_value) + datum_flags |= DF_VAR_EDITED + return TRUE + + if("light_power") + if(light_system != MOVABLE_LIGHT) + set_light(l_power = var_value) + else + set_light_power(var_value) + datum_flags |= DF_VAR_EDITED + return TRUE + + if("light_color") + if(light_system != MOVABLE_LIGHT) + set_light(l_color = var_value) + else + set_light_color(var_value) + datum_flags |= DF_VAR_EDITED + return TRUE + return ..() + + +/atom/proc/flash_lighting_fx( + _range = FLASH_LIGHT_RANGE, + _power = FLASH_LIGHT_POWER, + _color = LIGHT_COLOR_WHITE, + _duration = FLASH_LIGHT_DURATION, + _reset_lighting = TRUE, + _flash_times = 1) + new /obj/effect/light_flash(get_turf(src), _range, _power, _color, _duration, _flash_times) + + +/obj/effect/light_flash/Initialize(mapload, _range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _flash_times = 1) + light_range = _range + light_power = _power + light_color = _color + . = ..() + do_flashes(_flash_times, _duration) + +/obj/effect/light_flash/proc/do_flashes(_flash_times, _duration) + set waitfor = FALSE + for(var/i in 1 to _flash_times) + //Something bad happened + if(!(light?.our_mask)) + break + light.our_mask.alpha = 255 + animate(light.our_mask, time = _duration, easing = SINE_EASING, alpha = 0, flags = ANIMATION_END_NOW) + sleep(_duration) //this is extremely short so it's ok to sleep + qdel(src) + +/atom/proc/set_light_range(new_range) + if(new_range == light_range) + return + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_RANGE, new_range) + . = light_range + light_range = new_range + + +/atom/proc/set_light_power(new_power) + if(new_power == light_power) + return + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_POWER, new_power) + . = light_power + light_power = new_power + + +/atom/proc/set_light_color(new_color) + if(new_color == light_color) + return + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_COLOR, new_color) + . = light_color + light_color = new_color + + +/atom/proc/set_light_on(new_value) + if(new_value == light_on) + return + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_ON, new_value) + . = light_on + light_on = new_value + + +/// Setter for the light flags of this atom. +/atom/proc/set_light_flags(new_value) + if(new_value == light_flags) + return + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_FLAGS, new_value) + . = light_flags + light_flags = new_value diff --git a/code/modules/lighting/lighting_mask/dynamic_lighting_source.dm b/code/modules/lighting/lighting_mask/dynamic_lighting_source.dm new file mode 100644 index 000000000000..c0bf02daae48 --- /dev/null +++ b/code/modules/lighting/lighting_mask/dynamic_lighting_source.dm @@ -0,0 +1,103 @@ +// This is where the fun begins. +// These are the main datums that emit light. + +/datum/dynamic_light_source + ///source atom that we belong to + var/atom/source_atom + ///The atom that the source atom is contained inside + var/atom/movable/contained_atom + ///our last loc + var/atom/cached_loc + //the turf where cached loc was + var/turf/source_turf + ///the turf the contained atom appears to be covering + var/turf/pixel_turf + /// Intensity of the emitter light. + var/light_power = 0 + /// The range of the emitted light. + var/light_range = 0 + /// The colour of the light, string, decomposed by PARSE_LIGHT_COLOR() + var/light_color = NONSENSICAL_VALUE + + /// Whether we have applied our light yet or not. + var/applied = FALSE + + ///typepath for the mask type we are using + var/mask_type + ///reference to the mask holder effect + var/obj/effect/lighting_mask_holder/mask_holder + ///reference to the mask contained within the mask_holder objects vis_contents + var/atom/movable/lighting_mask/our_mask + +/datum/dynamic_light_source/New(atom/movable/owner, mask_type = /atom/movable/lighting_mask) + source_atom = owner // Set our new owner. + LAZYADD(source_atom.hybrid_light_sources, src) + + //Find the atom that contains us + find_containing_atom() + + source_turf = get_turf(source_atom) + + src.mask_type = mask_type + mask_holder = new(source_turf) + our_mask = new mask_type + mask_holder.assign_mask(our_mask) + our_mask.attached_atom = owner + + //Set light vars + set_light(owner.light_range, owner.light_power, owner.light_color) + + //Calculate shadows + our_mask.queue_mask_update() + + //Set direction + our_mask.rotate_mask_on_holder_turn(contained_atom.dir) + RegisterSignal(our_mask, COMSIG_ATOM_DIR_CHANGE, TYPE_PROC_REF(/atom/movable/lighting_mask, rotate_mask_on_holder_turn)) + +/datum/dynamic_light_source/Destroy(force) + //Remove references to ourself. + LAZYREMOVE(source_atom?.hybrid_light_sources, src) + LAZYREMOVE(contained_atom?.hybrid_light_sources, src) + QDEL_NULL(mask_holder) + our_mask = null//deletion handled on holder + return ..() + +///Updates containing atom +/datum/dynamic_light_source/proc/find_containing_atom() + //Remove ourselves from the old containing atoms light sources + if(contained_atom && contained_atom != source_atom) + LAZYREMOVE(contained_atom.hybrid_light_sources, src) + //Find our new container + if(isturf(source_atom) || isarea(source_atom)) + contained_atom = source_atom + return + contained_atom = source_atom.loc + for(var/sanity in 1 to 20) + if(!contained_atom) + //Welcome to nullspace my friend. + contained_atom = source_atom + return + if(isturf(contained_atom.loc)) + break + contained_atom = contained_atom.loc + //Add ourselves to their light sources + if(contained_atom != source_atom) + LAZYADD(contained_atom.hybrid_light_sources, src) + +///Update light if changed. +/datum/dynamic_light_source/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE) + if(!our_mask) + return + if(l_range && l_range != light_range) + light_range = l_range + our_mask.set_radius(l_range) + if(l_power && l_power != light_power) + light_power = l_power + our_mask.set_intensity(l_power) + if(l_color != NONSENSICAL_VALUE && l_color != light_color) + light_color = l_color + our_mask.set_color(l_color) + +/datum/dynamic_light_source/proc/update_position() + mask_holder.forceMove(get_turf(source_atom)) + find_containing_atom() diff --git a/code/modules/lighting/lighting_mask/lighting_mask.dm b/code/modules/lighting/lighting_mask/lighting_mask.dm new file mode 100644 index 000000000000..bf824033adfb --- /dev/null +++ b/code/modules/lighting/lighting_mask/lighting_mask.dm @@ -0,0 +1,153 @@ +///Lighting mask sprite radius in tiles +#define LIGHTING_MASK_RADIUS 4 +///Lighting mask sprite diameter in pixels +#define LIGHTING_MASK_SPRITE_SIZE LIGHTING_MASK_RADIUS * 64 + +/atom/movable/lighting_mask + name = "" + icon = LIGHTING_ICON_BIG + icon_state = "light_big" + + anchored = TRUE + plane = LIGHTING_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = LIGHTING_SECONDARY_LAYER + invisibility = INVISIBILITY_LIGHTING + blend_mode = BLEND_ADD + appearance_flags = KEEP_TOGETHER|RESET_TRANSFORM + + ///The current angle the item is pointing at + var/current_angle = 0 + + ///The radius of illumination of the mask + var/radius = 0 + + ///The atom that we are attached to, does not need hard del protection as we are deleted with it + var/atom/attached_atom + + ///Reference to the holder /obj/effect + var/obj/effect/lighting_mask_holder/mask_holder + + ///Prevents us from registering for update twice before SSlighting init + var/awaiting_update = FALSE + ///Set to TRUE if you want the light to rotate with the owner + var/is_directional = FALSE + +/atom/movable/lighting_mask/Initialize(mapload, ...) + . = ..() + add_filter("pixel_smoother", 3, gauss_blur_filter(2)) + add_filter("shadow_alpha_masking", 4, alpha_mask_filter(render_source = SHADOW_RENDER_TARGET, flags = MASK_INVERSE)) + +/atom/movable/lighting_mask/Destroy() + mask_holder = null + attached_atom = null + return ..() + +///Sets the radius of the mask, and updates everything that needs to be updated +/atom/movable/lighting_mask/proc/set_radius(new_radius, transform_time = 0) + //Update our matrix + var/matrix/new_size_matrix = get_matrix(new_radius) + apply_matrix(new_size_matrix, transform_time) + radius = new_radius + //then recalculate and redraw + queue_mask_update() + +///if you want the matrix to grow or shrink, you can do that using this proc when applyng it +/atom/movable/lighting_mask/proc/apply_matrix(matrix/to_apply, transform_time = 0) + if(transform_time) + animate(src, transform = to_apply, time = transform_time) + else + transform = to_apply + +///Creates a matrix for the lighting mak to use +/atom/movable/lighting_mask/proc/get_matrix(radius = 1) + var/matrix/new_size_matrix = new() + //Scale + // - Scale to the appropriate radius + new_size_matrix.Scale(radius / LIGHTING_MASK_RADIUS) + //Translate + // - Center the overlay image + // - Ok so apparently translate is affected by the scale we already did huh. + // ^ Future me here, its because it works as translate then scale since its backwards. + // ^ ^ Future future me here, it totally shouldnt since the translation component of a matrix is independant to the scale component. + new_size_matrix.Translate(-128 + 16) + //Adjust for pixel offsets + var/invert_offsets = attached_atom.dir & (NORTH | EAST) + var/left_or_right = attached_atom.dir & (EAST | WEST) + var/offset_x = (left_or_right ? attached_atom.light_pixel_y : attached_atom.light_pixel_x) * (invert_offsets ? -1 : 1) + var/offset_y = (left_or_right ? attached_atom.light_pixel_x : attached_atom.light_pixel_y) * (invert_offsets ? -1 : 1) + new_size_matrix.Translate(offset_x, offset_y) + if(is_directional) + //Rotate + // - Rotate (Directional lights) + new_size_matrix.Turn(current_angle) + return new_size_matrix + +///Rotates the light source to angle degrees. +/atom/movable/lighting_mask/proc/rotate(angle = 0) + //Converting our transform is pretty simple. + var/matrix/rotated_matrix = matrix() + rotated_matrix.Turn(angle - current_angle) + rotated_matrix *= transform + //Overlays cannot be edited while applied, meaning their transform cannot be changed. + //Disconnect the shadows from the overlay, apply the transform and then reapply them as an overlay. + //Oh also since the matrix is really weird standard rotation matrices wont work here. + overlays.Cut() + //Disconnect from parent matrix, become a global position + for(var/mutable_appearance/shadow as anything in shadows) //Mutable appearances are children of icon + shadow.transform *= transform + shadow.transform /= rotated_matrix + //Apply our matrix + transform = rotated_matrix + overlays += shadows + + //Now we are facing this direction + current_angle = angle + +///Setter proc for colors +/atom/movable/lighting_mask/proc/set_color(colour = "#ffffff") + color = colour + +///Setter proc for the intensity of the mask +/atom/movable/lighting_mask/proc/set_intensity(intensity = 1) + if(intensity >= 0) + alpha = ALPHA_TO_INTENSITY(intensity) + blend_mode = BLEND_ADD + else + alpha = ALPHA_TO_INTENSITY(-intensity) + blend_mode = BLEND_SUBTRACT + +///The holder atom turned, spins the mask if it's needed +/atom/movable/lighting_mask/proc/rotate_mask_on_holder_turn(new_direction) + SIGNAL_HANDLER + rotate(dir2angle(new_direction) - 180) + +///Flickering lighting mask +/atom/movable/lighting_mask/flicker + icon_state = "light_flicker" + +///Conical Light mask +/atom/movable/lighting_mask/conical + icon_state = "light_conical" + is_directional = TRUE + +///Rotating Light mask +/atom/movable/lighting_mask/rotating + icon_state = "light_rotating-1" + +/atom/movable/lighting_mask/rotating/Initialize(mapload, ...) + . = ..() + icon_state = "light_rotating-[rand(1, 3)]" + +///rotating light mask, but only pointing in one direction +/atom/movable/lighting_mask/rotating_conical + icon_state = "light_conical_rotating" + +/atom/movable/lighting_mask/ex_act(severity, target) + return + +/atom/movable/lighting_mask/fire_act(exposed_temperature, exposed_volume) + return + +#undef LIGHTING_MASK_SPRITE_SIZE +#undef LIGHTING_MASK_RADIUS diff --git a/code/modules/lighting/lighting_mask/lighting_mask_holder.dm b/code/modules/lighting/lighting_mask/lighting_mask_holder.dm new file mode 100644 index 000000000000..750a16fa1bfb --- /dev/null +++ b/code/modules/lighting/lighting_mask/lighting_mask_holder.dm @@ -0,0 +1,22 @@ +///Holder for lighting mask, this is done for ensuing correct render as a viscontents +/obj/effect/lighting_mask_holder + name = "" + anchored = TRUE + appearance_flags = NONE //Removes TILE_BOUND meaning that the lighting mask will be visible even if the source turf is not. + glide_size = INFINITY //prevent shadow jitter + ///The movable mask this holder is holding in its vis contents + var/atom/movable/lighting_mask/held_mask + +/obj/effect/lighting_mask_holder/proc/assign_mask(atom/movable/lighting_mask/mask) + vis_contents += mask + held_mask = mask + mask.mask_holder = src + +/obj/effect/lighting_mask_holder/Destroy(force) + vis_contents -= held_mask + QDEL_NULL(held_mask) + return ..() + +/obj/effect/lighting_mask_holder/Moved(atom/OldLoc, Dir) + . = ..() + held_mask?.queue_mask_update()//held mask can be null when it is deleted diff --git a/code/modules/lighting/lighting_mask/shadow_calculator.dm b/code/modules/lighting/lighting_mask/shadow_calculator.dm new file mode 100644 index 000000000000..42f98b47e789 --- /dev/null +++ b/code/modules/lighting/lighting_mask/shadow_calculator.dm @@ -0,0 +1,686 @@ +//Lighting texture scales in world units (divide by 32) +//256 = 8,4,2 +//1024 = 32,16,8 +#define LIGHTING_SHADOW_TEX_SIZE 8 + +///Eyeball number for radius based offsets do not touch +#define RADIUS_BASED_OFFSET 3.5 + +///Inserts a coord list into a grouped list +#define COORD_LIST_ADD(listtoadd, x, y) \ + if(islist(listtoadd["[x]"])) { \ + var/list/_L = listtoadd["[x]"]; \ + BINARY_INSERT_NUM(y, _L); \ + } else { \ + listtoadd["[x]"] = list(y);\ + } + +#ifdef SHADOW_DEBUG +///Color coded atom debug, note will break when theres planetside lgihting +#define DEBUG_HIGHLIGHT(x, y, colour) \ + do { \ + var/turf/T = locate(x, y, 3); \ + if(T) { \ + T.color = colour; \ + }\ + } while (FALSE) + +//For debugging use when we want to know if a turf is being affected multiple times +//#define DEBUG_HIGHLIGHT(x, y, colour) do{var/turf/T=locate(x,y,2);if(T){switch(T.color){if("#ff0000"){T.color = "#00ff00"}if("#00ff00"){T.color="#0000ff"}else{T.color="#ff0000"}}}}while(0) +#define DO_SOMETHING_IF_DEBUGGING_SHADOWS(something) something +#else +#define DEBUG_HIGHLIGHT(x, y, colour) +#define DO_SOMETHING_IF_DEBUGGING_SHADOWS(something) +#endif + +/atom/movable/lighting_mask + ///Turfs that are being affected by this mask, this is for the sake of luminosity + var/list/turf/affecting_turfs + ///list of mutable appearance shadows + var/list/mutable_appearance/shadows + var/times_calculated = 0 + + //Please dont change these + var/calculated_position_x + var/calculated_position_y + +/atom/movable/lighting_mask/Destroy() + //Make sure we werent destroyed in init + SSlighting.mask_queue -= src + //Remove from affecting turfs + if(affecting_turfs) + for(var/turf/thing as anything in affecting_turfs) + var/area/A = thing.loc + LAZYREMOVE(thing.hybrid_lights_affecting, src) + if(!A.base_lighting_alpha) + thing.luminosity -= 1 + affecting_turfs = null + //Cut the shadows. Since they are overlays they will be deleted when cut from overlays. + LAZYCLEARLIST(shadows) + return ..() + +/atom/movable/lighting_mask/proc/link_turf_to_light(turf/T) + LAZYOR(affecting_turfs, T) + LAZYOR(T.hybrid_lights_affecting, src) + +/atom/movable/lighting_mask/proc/unlink_turf_from_light(turf/T) + LAZYREMOVE(affecting_turfs, T) + LAZYREMOVE(T.hybrid_lights_affecting, src) + +///Enqueues the mask in the queue properly +/atom/movable/lighting_mask/proc/queue_mask_update() + SSlighting.mask_queue |= src + awaiting_update = TRUE + +/** + * Returns a list of matrices corresponding to the matrices that should be applied to triangles of + * coordinates (0,0),(1,0),(0,1) to create a triangcalculate_shadows_matricesle that respresents the shadows + * takes in the old turf to smoothly animate shadow movement + */ +/atom/movable/lighting_mask/proc/calculate_lighting_shadows() + //Check to make sure lighting is actually started + //If not count the amount of duplicate requests created. + if(!SSlighting.started) + if(awaiting_update) + SSlighting.duplicate_shadow_updates_in_init++ + return + queue_mask_update() + return + awaiting_update = FALSE + //we moved to nullspace meanwhile dont bother + if(!attached_atom.loc) + return + + //Incremement the global counter for shadow calculations + SSlighting.total_shadow_calculations ++ + + //Ceiling the range since we need it in integer form + var/range = CEILING(radius, 1) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/timer = TICK_USAGE) + + //Work out our position + //Calculate shadow origin offset + var/invert_offsets = attached_atom.dir & (NORTH | EAST) + var/left_or_right = attached_atom.dir & (EAST | WEST) + var/offset_x = (left_or_right ? attached_atom.light_pixel_y : attached_atom.light_pixel_x) * (invert_offsets ? -1 : 1) + var/offset_y = (left_or_right ? attached_atom.light_pixel_x : attached_atom.light_pixel_y) * (invert_offsets ? -1 : 1) + + //Get the origin points + var/turf/our_turf = get_turf(attached_atom) //The mask is in nullspace, so we need the source turf of the container + + //Account for pixel shifting and light offset + calculated_position_x = our_turf.x + ((offset_x) / world.icon_size) + calculated_position_y = our_turf.y + ((offset_y) / world.icon_size) + + //Remove the old shadows + overlays.Cut() + + + //Reset the list + if(islist(affecting_turfs)) + for(var/turf/T as anything in affecting_turfs) + LAZYREMOVE(T?.hybrid_lights_affecting, src) + //The turf is no longer affected by any lights, make it non-luminous. + var/area/A = T.loc + if(T?.luminosity && !A.base_lighting_alpha) + T.luminosity -= 1 + + //Clear the list + LAZYCLEARLIST(affecting_turfs) + LAZYCLEARLIST(shadows) + + //Optimise grouping by storing as + // Key : x (AS A STRING BECAUSE BYOND DOESNT ALLOW FOR INT KEY DICTIONARIES) + // Value: List(y values) + var/list/opaque_atoms_in_view = list() + + //Rebuild the list + var/is_on_closed_turf = istype(our_turf, /turf/closed) + for(var/turf/thing in dview(range, get_turf(attached_atom))) //most expensive part of shadow code is this dview and group_atoms + link_turf_to_light(thing) + //The turf is now affected by our light, make it luminous + thing.luminosity += 1 + //Dont consider shadows about our turf. + if(!is_on_closed_turf) + if(thing == our_turf) + continue + if(thing.directional_opacity) + //At this point we no longer care about + //the atom itself, only the position values + COORD_LIST_ADD(opaque_atoms_in_view, thing.x, thing.y) + DEBUG_HIGHLIGHT(thing.x, thing.y, "#0000FF") + + //We are too small to consider shadows on, luminsoty has been considered at least. + if(radius < 2) + return + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("[TICK_USAGE_TO_MS(timer)]ms to process view([range], src).")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/temp_timer = TICK_USAGE) + + //Group atoms together for optimisation + var/list/grouped_atoms = group_atoms(opaque_atoms_in_view) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("[TICK_USAGE_TO_MS(temp_timer)]ms to process group_atoms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/total_coordgroup_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/total_cornergroup_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/triangle_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/culling_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/triangle_to_matrix_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/matrix_division_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/MA_new_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/MA_vars_time = 0) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/overlays_add_time = 0) + + var/list/overlays_to_add = list() + for(var/group in grouped_atoms) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + var/list/coordgroup = calculate_corners_in_group(group) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(total_coordgroup_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + //This is where the lines are made + var/list/cornergroup = get_corners_from_coords(coordgroup) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(total_cornergroup_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + var/list/culledlinegroup = cull_blocked_in_group(cornergroup, opaque_atoms_in_view) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(culling_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + if(!LAZYLEN(culledlinegroup)) + continue + + var/list/triangles = calculate_triangle_vertices(culledlinegroup) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(triangle_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + for(var/triangle in triangles) + var/matrix/triangle_matrix = triangle_to_matrix(triangle) + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(triangle_to_matrix_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + triangle_matrix /= transform + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(matrix_division_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + var/mutable_appearance/shadow = new() + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(MA_new_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + shadow.icon = LIGHTING_ICON_BIG + shadow.icon_state = "triangle" + shadow.color = "#000" + shadow.transform = triangle_matrix + shadow.render_target = SHADOW_RENDER_TARGET + shadow.blend_mode = BLEND_OVERLAY + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(MA_vars_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + LAZYADD(shadows, shadow) + overlays_to_add += shadow + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(overlays_add_time += TICK_USAGE_TO_MS(temp_timer)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(temp_timer = TICK_USAGE) + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(var/overlay_apply_time = TICK_USAGE) + + overlays += overlays_to_add //batch appearance generation for free lag(tm) + + DO_SOMETHING_IF_DEBUGGING_SHADOWS(overlay_apply_time = TICK_USAGE_TO_MS(overlay_apply_time)) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("total_coordgroup_time: [total_coordgroup_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("total_cornergroup_time: [total_cornergroup_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("triangle_time calculation: [triangle_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("triangle_to_matrix_time: [triangle_to_matrix_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("Culling Time: [culling_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("matrix_division_time: [matrix_division_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("MA_new_time: [MA_new_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("MA_vars_time: [MA_vars_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("overlays_add_time: [overlays_add_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("overlay_apply_time: [overlay_apply_time]ms")) + DO_SOMETHING_IF_DEBUGGING_SHADOWS(log_game("[TICK_USAGE_TO_MS(timer)]ms to process total.")) + + +/** + * Converts a triangle into a matrix that can be applied to a standardized triangle + * to make it represent the points. + */ +/atom/movable/lighting_mask/proc/triangle_to_matrix(list/triangle) + //We need the world position raw, if we use the calculated position then the pixel values will cancel. + var/turf/our_turf = get_turf(attached_atom) + var/ourx = our_turf.x + var/oury = our_turf.y + + var/originx = triangle[1][1] - ourx //~Simultaneous Variable: U + var/originy = triangle[1][2] - oury //~Simultaneous Variable: V + //Get points translating the first point to (0, 0) + var/translatedPoint2x = triangle[2][1] - ourx //Simultaneous Variable: W + var/translatedPoint2y = triangle[2][2] - oury //Simultaneous Variable: X + var/translatedPoint3x = triangle[3][1] - ourx //Simultaneous Variable: Y + var/translatedPoint3y = triangle[3][2] - oury //Simultaneous Variable: Z + //message_admins("Point 1: ([originx], [originy])") + //message_admins("Point 2: ([translatedPoint2x], [translatedPoint2y])") + //message_admins("Point 3: ([translatedPoint3x], [translatedPoint3y])") + //Assumption that is incorrect + //Triangle points are + // (-4, -4) + // (-4, 4) + // ( 4, -4) + //Would be much easier if it was (0, 0) instead of (-4, -4) but since we have 6 inputs and 6 unknowns + //we can solve the values of the matrix pretty easilly simultaneously. + //In fact since variables U,W,Y,A,B,C are separate to V,X,Z,D,E,F its easy since its 2 identical tri-variable simultaneous equations. + //By solving the equations simultaneously we get these results: + //a = (y-u)/8 + var/a = (translatedPoint3x - originx) / LIGHTING_SHADOW_TEX_SIZE + //b = (w-u)/ 8 + var/b = (translatedPoint2x - originx) / LIGHTING_SHADOW_TEX_SIZE + //c = (y+w)/2 + var/c = (translatedPoint3x + translatedPoint2x) / 2 + //d = (z-v)/8 + var/d = (translatedPoint3y - originy) / LIGHTING_SHADOW_TEX_SIZE + //e = (x-v)/8 + var/e = (translatedPoint2y - originy) / LIGHTING_SHADOW_TEX_SIZE + //f = (z+x)/2 + var/f = (translatedPoint3y + translatedPoint2y) / 2 + //Matrix time g + //a,b,d and e can be used to define the shape, C and F can be used for translation god matrices are so beautiful + //Completely random offset that I didnt derive, I just trialled and errored for about 4 hours until it randomly worked + //var/radius_based_offset = radius * 3 + RADIUS_BASED_OFFSET <-- for 1024x1024 lights DO NOT USE 1024x1024 SHADOWS UNLESS YOU ARE PLAYING WITH RTX200000 OR SOMETHING + var/radius_based_offset = RADIUS_BASED_OFFSET + var/matrix/M = matrix(a, b, (c * 32) - ((radius_based_offset) * 32), d, e, (f * 32) - ((radius_based_offset) * 32)) + //log_game("[M.a], [M.d], 0") + //log_game("[M.b], [M.e], 0") + //log_game("[M.c], [M.f], 1") + return M + +/** + * Basically takes the 2-4 corners, extends them and then generates triangle coordinates representing shadows + * Input: list(list(list(x, y), list(x, y))) + * Layer 1: Lines + * Layer 2: Vertex + * Layer 3: X/Y value + * OUTPUT: The same thing but with 3 lists embedded rather than 2 because they are triangles not lines now. + */ +/atom/movable/lighting_mask/proc/calculate_triangle_vertices(list/cornergroup) + var/shadow_radius = max(radius + 1, 3) + //Get the origin poin's + var/ourx = calculated_position_x + var/oury = calculated_position_y + //The output + . = list() + //Every line has 2 triangles innit + for(var/list/line as anything in cornergroup) + //Get the corner vertices + var/vertex1 = line[1] + var/vertex2 = line[2] + //Extend them and get end vertices + //Calculate vertex 3 position + var/delta_x = vertex1[1] - ourx + var/delta_y = vertex1[2] - oury + var/vertex3 = extend_line_to_radius(delta_x, delta_y, shadow_radius, ourx, oury) + var/vertex3side = (vertex3[1] - ourx) == -shadow_radius ? WEST : (vertex3[1] - ourx) == shadow_radius ? EAST : (vertex3[2] - oury) == shadow_radius ? NORTH : SOUTH + + //For vertex 4 + delta_x = vertex2[1] - ourx + delta_y = vertex2[2] - oury + var/vertex4 = extend_line_to_radius(delta_x, delta_y, shadow_radius, ourx, oury) + var/vertex4side = (vertex4[1] - ourx) == -shadow_radius ? WEST : (vertex4[1] - ourx) == shadow_radius ? EAST : (vertex4[2] - oury) == shadow_radius ? NORTH : SOUTH + + //If vertex3 is not on the same border as vertex 4 then we need more triangles to fill in the space. + if(vertex3side != vertex4side) + var/eitherNorth = (vertex3side == NORTH || vertex4side == NORTH) + var/eitherEast = (vertex3side == EAST || vertex4side == EAST) + var/eitherSouth = (vertex3side == SOUTH || vertex4side == SOUTH) + var/eitherWest = (vertex3side == WEST || vertex4side == WEST) + if(eitherNorth && eitherEast) + //Add a vertex top right + var/vertex5 = list(shadow_radius + ourx, shadow_radius + oury) + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + else if(eitherNorth && eitherWest) + //Add a vertex top left + var/vertex5 = list(-shadow_radius + ourx, shadow_radius + oury) + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + else if(eitherNorth && eitherSouth) //BLOCKER IS A | SHAPE + //If vertex3 is to the right of the center, both vertices are to the right. + if(vertex3[1] > ourx) + //New vertexes are on the right + var/vertex5 = list(ourx + shadow_radius, oury + shadow_radius) + var/vertex6 = list(ourx + shadow_radius, oury - shadow_radius) + //If vertex 4 is greater than 3 then triangles link as 4,5,6 and 3,4,6 + if(vertex4[2] > vertex3[2]) + var/triangle3 = list(vertex3, vertex5, vertex6) + . += list(triangle3) + var/triangle4 = list(vertex3, vertex4, vertex5) + . += list(triangle4) + else + //Vertex 3 is greater than 4, so triangles link as 3,5,6 and 3,4,6 + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + var/triangle4 = list(vertex4, vertex5, vertex6) + . += list(triangle4) + else + //New vertexes are on the left + var/vertex5 = list(ourx - shadow_radius, oury + shadow_radius) + var/vertex6 = list(ourx - shadow_radius, oury - shadow_radius) + //If vertex 4 is higher than 3 then triangles link as 4,5,6 and 3,4,6 + if(vertex4[2] > vertex3[2]) + var/triangle3 = list(vertex3, vertex5, vertex6) + . += list(triangle3) + var/triangle4 = list(vertex3, vertex4, vertex5) + . += list(triangle4) + else + //Vertex 3 is greater than 4, so triangles link as 3,5,6 and 3,4,6 + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + var/triangle4 = list(vertex4, vertex5, vertex6) + . += list(triangle4) + else if(eitherEast && eitherSouth) + //Add a vertex bottom right + var/vertex5 = list(shadow_radius + ourx, -shadow_radius + oury) + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + else if(eitherEast && eitherWest) //BLOCKER IS A --- SHAPE + //If vertex3 is above the center, then pointers are along the top + if(vertex3[2] > oury) + //New vertexes are on the right + var/vertex5 = list(ourx + shadow_radius, oury + shadow_radius) + var/vertex6 = list(ourx - shadow_radius, oury + shadow_radius) + //If vertex 4 is greater than 3 then triangles link as 4,5,6 and 3,4,6 + if(vertex4[1] > vertex3[1]) + var/triangle3 = list(vertex3, vertex5, vertex6) + . += list(triangle3) + var/triangle4 = list(vertex3, vertex4, vertex5) + . += list(triangle4) + else + //Vertex 3 is greater than 4, so triangles link as 3,5,6 and 3,4,6 + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + var/triangle4 = list(vertex4, vertex5, vertex6) + . += list(triangle4) + else + //New vertexes are on the bottom + var/vertex5 = list(ourx + shadow_radius, oury - shadow_radius) + var/vertex6 = list(ourx - shadow_radius, oury - shadow_radius) + //If vertex 4 is higher than 3 then triangles link as 4,5,6 and 3,4,6 + if(vertex4[1] > vertex3[1]) + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + var/triangle4 = list(vertex3, vertex5, vertex6) + . += list(triangle4) + else + //Vertex 3 is greater than 4, so triangles link as 3,5,6 and 3,4,6 + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + var/triangle4 = list(vertex4, vertex5, vertex6) + . += list(triangle4) + else if(eitherSouth && eitherWest) + //Bottom left + var/vertex5 = list(-shadow_radius + ourx, -shadow_radius + oury) + var/triangle3 = list(vertex3, vertex4, vertex5) + . += list(triangle3) + else + //bug + stack_trace("Major error: vertex in a bad position (North: [eitherNorth], East: [eitherEast], South: [eitherSouth], West: [eitherWest])") + + //Generate triangles + var/triangle1 = list(vertex1, vertex2, vertex3) + var/triangle2 = list(vertex2, vertex3, vertex4) + . += list(triangle1) + . += list(triangle2) + +///Takes in the list of lines and sight blockers and returns only the lines that are not blocked +/atom/movable/lighting_mask/proc/cull_blocked_in_group(list/lines, list/sight_blockers) + . = list() + for(var/list/line in lines) + var/vertex1 = line[1] + var/vertex2 = line[2] + var/list/lines_to_add = list() + if(vertex1[1] == vertex2[1]) + //Vertical line. + //Requires a block to the left and right all the way from the bottom to the top + var/left = vertex1[1] - 0.5 + var/right = vertex1[1] + 0.5 + var/bottom = min(vertex1[2], vertex2[2]) + 0.5 + var/top = max(vertex1[2], vertex2[2]) - 0.5 + var/list/current_bottom_vertex = list(vertex1[1], bottom - 0.5) + var/list/current_top_vertex = list(vertex1[1], bottom - 0.5) + for(var/i in bottom to top) + var/list/left_list = sight_blockers["[left]"] + var/isLeftBlocked = left_list?.Find(i) ? TRUE : FALSE + var/list/right_list = sight_blockers["[right]"] + var/isRightBlocked = right_list?.Find(i) ? TRUE : FALSE + if(isLeftBlocked == isRightBlocked) + if(current_bottom_vertex[2] != current_top_vertex[2]) + lines_to_add += list(list(current_bottom_vertex, current_top_vertex)) + current_bottom_vertex = list(vertex1[1], i + 0.5) + current_top_vertex = list(vertex1[1], i + 0.5) + if(current_bottom_vertex[2] != current_top_vertex[2]) + lines_to_add += list(list(current_bottom_vertex, current_top_vertex)) + else + //Horizontal line + //Requires a block above and below for every position from left to right + var/left = min(vertex1[1], vertex2[1]) + 0.5 + var/right = max(vertex1[1], vertex2[1]) - 0.5 + var/top = vertex1[2] + 0.5 + var/bottom = vertex1[2] - 0.5 + var/list/current_left_vertex = list(left - 0.5, vertex1[2]) + var/list/current_right_vertex = list(left - 0.5, vertex1[2]) + for(var/i in left to right) + var/list/check_list = sight_blockers["[i]"] + var/isAboveBlocked = check_list?.Find(top) ? TRUE : FALSE + var/isBelowBlocked = check_list?.Find(bottom) ? TRUE : FALSE + if(isAboveBlocked == isBelowBlocked) + if(current_left_vertex[1] != current_right_vertex[1]) + lines_to_add += list(list(current_left_vertex, current_right_vertex)) + current_left_vertex = list(i + 0.5, vertex1[2]) + current_right_vertex = list(i + 0.5, vertex1[2]) + if(current_left_vertex[1] != current_right_vertex[1]) + lines_to_add += list(list(current_left_vertex, current_right_vertex)) + . += lines_to_add + +/** + * Converts the corners into the 3 (or 2) valid points + * For example if a wall is top right of the source, the bottom left wall corner + * can be removed otherwise the wall itself will be in the shadow. + * Input: list(list(x1, y1), list(x2, y2)) + * Output: list(list(list(x, y), list(x, y))) <-- 2 coordinates that form a line + */ +/atom/movable/lighting_mask/proc/get_corners_from_coords(list/coordgroup) + //Get the raw numbers + var/xlow = coordgroup[1][1] + var/ylow = coordgroup[1][2] + var/xhigh = coordgroup[2][1] + var/yhigh = coordgroup[2][2] + + var/ourx = calculated_position_x + var/oury = calculated_position_y + + //The source is above the point (Bottom Quad) + if(oury > yhigh) + //Bottom Right + if(ourx < xlow) + return list( + list(list(xlow, ylow), list(xhigh, ylow)), + list(list(xhigh, ylow), list(xhigh, yhigh)), + ) + //Bottom Left + else if(ourx > xhigh) + return list( + list(list(xlow, yhigh), list(xlow, ylow)), + list(list(xlow, ylow), list(xhigh, ylow)), + ) + //Bottom Middle + else + return list( + list(list(xlow, yhigh), list(xlow, ylow)), + list(list(xlow, ylow), list(xhigh, ylow)), + list(list(xhigh, ylow), list(xhigh, yhigh)) + ) + //The source is below the point (Top quad) + else if(oury < ylow) + //Top Right + if(ourx < xlow) + return list( + list(list(xlow, yhigh), list(xhigh, yhigh)), + list(list(xhigh, yhigh), list(xhigh, ylow)), + ) + //Top Left + else if(ourx > xhigh) + return list( + list(list(xlow, ylow), list(xlow, yhigh)), + list(list(xlow, yhigh), list(xhigh, yhigh)), + ) + //Top Middle + else + return list( + list(list(xlow, ylow), list(xlow, yhigh)), + list(list(xlow, yhigh), list(xhigh, yhigh)), + list(list(xhigh, yhigh), list(xhigh, ylow)) + ) + //the source is between the group Middle something + else + //Middle Right + if(ourx < xlow) + return list( + list(list(xlow, yhigh), list(xhigh, yhigh)), + list(list(xhigh, yhigh), list(xhigh, ylow)), + list(list(xhigh, ylow), list(xlow, ylow)) + ) + //Middle Left + else if(ourx > xhigh) + return list( + list(list(xhigh, ylow), list(xlow, ylow)), + list(list(xlow, ylow), list(xlow, yhigh)), + list(list(xlow, yhigh), list(xhigh, yhigh)) + ) + //Middle Middle (Why?????????) + else + return list( + list(list(xhigh, ylow), list(xlow, ylow)), + list(list(xlow, ylow), list(xlow, yhigh)), + list(list(xlow, yhigh), list(xhigh, yhigh)), + list(list(xlow, yhigh), list(xhigh, ylow)) + ) + +//Calculates the coordinates of the corner +//Takes a list of blocks and calculates the bottom left corner and the top right corner. +//Input: Group list(list(list(x,y), list(x,y)), list(list(x, y))) +//Output: Coordinates list(list(left, bottom), list(right, top)) +/atom/movable/lighting_mask/proc/calculate_corners_in_group(list/group) + if(length(group) == 0) + CRASH("Calculate_corners_in_group called on a group of length 0. Critical error.") + if(length(group) == 1) + var/x = group[1][1] + var/y = group[1][2] + return list( + list(x - 0.5, y - 0.5), + list(x + 0.5, y + 0.5) + ) + //Group is multiple length, find top left and bottom right + var/first = group[1] + var/second = group[2] + var/group_direction = NORTH + if(first[1] != second[1]) + group_direction = EAST +#ifdef SHADOW_DEBUG6 + else if(first[2] != second[2]) + message_admins("Major error, group is not 1xN or Nx1") +#endif + var/lowest = INFINITY + var/highest = 0 + for(var/vector in group) + var/value_to_comp = vector[1] + if(group_direction == NORTH) + value_to_comp = vector[2] + lowest = min(lowest, value_to_comp) + highest = max(highest, value_to_comp) + //done ez + if(group_direction == NORTH) + return list( + list(first[1] - 0.5, lowest - 0.5), + list(first[1] + 0.5, highest + 0.5) + ) + else + return list( + list(lowest - 0.5, first[2] - 0.5), + list(highest + 0.5, first[2] + 0.5) + ) + +///Groups things into vertical and horizontal lines. +///Input: All atoms ungrouped list(atom1, atom2, atom3) +///Output: List(List(Group), list(group2), ... , list(groupN)) +///Output: List(List(atom1, atom2), list(atom3, atom4...), ... , list(atom)) +/atom/movable/lighting_mask/proc/group_atoms(list/ungrouped_things) + . = list() + //Ungrouped things comes in as + // Key: X + // Value = list(y values) + //This makes sorting vertically easy, however sorting horizontally is harder + //While grouping elements vertically, we can put them into a new list with + // Key: Y + // Value = list(x values) + //to make it much easier. + var/list/horizontal_atoms = list() + //================================================= + //Vertical sorting (X locked) + for(var/x_key in ungrouped_things) + var/list/y_components = ungrouped_things[x_key] + var/pointer = y_components[1] + var/list/group = list(list(text2num(x_key), y_components[1])) + for(var/i in 2 to length(y_components)) + var/next = y_components[i] + if(next != pointer + 1) + if(length(group) == 1) + //Add the element in group to horizontal + COORD_LIST_ADD(horizontal_atoms, pointer, text2num(x_key)) + DEBUG_HIGHLIGHT(text2num(x_key), pointer, "#FFFF00") + else + //Add the group to the output + . += list(group) + group = list() + group += list(list(text2num(x_key), next)) + DEBUG_HIGHLIGHT(text2num(x_key), next, "#FF0000") + pointer = next + if(length(group) == 1) + //Add the element in group to horizontal + COORD_LIST_ADD(horizontal_atoms, pointer, text2num(x_key)) + DEBUG_HIGHLIGHT(text2num(x_key), pointer, "#FFFF00") + else + //Add the group to the output + . += list(group) + //================================================= + //Horizontal sorting (Y locked) + for(var/y_key in horizontal_atoms) + var/list/x_components = horizontal_atoms[y_key] + var/pointer = x_components[1] + var/list/group = list(list(x_components[1], text2num(y_key))) + for(var/i in 2 to length(x_components)) + var/next = x_components[i] + if(next != pointer + 1) + . += list(group) + group = list() + group += list(list(next, text2num(y_key))) + DEBUG_HIGHLIGHT(next, text2num(y_key), "#00FF00") + pointer = next + . += list(group) + +///gets a line from a x and y, to the offset x and y of length radius +/proc/extend_line_to_radius(delta_x, delta_y, radius, offset_x, offset_y) + if(abs(delta_x) < abs(delta_y)) + //top or bottom + var/proportion = radius / abs(delta_y) + return list(delta_x * proportion + offset_x, delta_y * proportion + offset_y) + else + var/proportion = radius / abs(delta_x) + return list(delta_x * proportion + offset_x, delta_y * proportion + offset_y) + +#undef LIGHTING_SHADOW_TEX_SIZE +#undef COORD_LIST_ADD +#undef DEBUG_HIGHLIGHT +#undef DO_SOMETHING_IF_DEBUGGING_SHADOWS diff --git a/code/modules/lighting/lighting_static/static_lighting_area.dm b/code/modules/lighting/lighting_static/static_lighting_area.dm new file mode 100644 index 000000000000..2e95c77e9ecd --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_area.dm @@ -0,0 +1,12 @@ +/area + ///Whether this area allows static lighting and thus loads the lighting objects + var/static_lighting = TRUE + +//Non static lighting areas. +//Any lighting area that wont support static lights. +//These areas will NOT have corners generated. + +/area/space + static_lighting = FALSE + base_lighting_alpha = 255 + diff --git a/code/modules/lighting/lighting_static/static_lighting_atom.dm b/code/modules/lighting/lighting_static/static_lighting_atom.dm new file mode 100644 index 000000000000..0f7be52b351f --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_atom.dm @@ -0,0 +1,25 @@ + +/atom + ///The light source, datum. Dont fuck with this directly + var/tmp/datum/static_light_source/static_light + ///Static light sources currently attached to this atom, this includes ones owned by atoms inside this atom + var/tmp/list/static_light_sources + +///Pretty simple, just updates static lights on this atom +/atom/proc/static_update_light() + set waitfor = FALSE + if (QDELETED(src)) + return + + if (!light_power || !light_range) // We won't emit light anyways, destroy the light source. + QDEL_NULL(static_light) + else + if(!ismovableatom(loc)) // We choose what atom should be the top atom of the light here. + . = src + else + . = loc + + if(static_light) // Update the light or create it if it does not exist. + static_light.update(.) + else + static_light = new/datum/static_light_source(src, .) diff --git a/code/modules/lighting/lighting_static/static_lighting_corner.dm b/code/modules/lighting/lighting_static/static_lighting_corner.dm new file mode 100644 index 000000000000..4f026e05e864 --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_corner.dm @@ -0,0 +1,176 @@ +// Because we can control each corner of every lighting object. +// And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't). +// For the record: these should never ever ever be deleted, even if the turf doesn't have dynamic lighting. + +/datum/static_lighting_corner + var/list/datum/static_light_source/affecting // Light sources affecting us. + + var/x = 0 + var/y = 0 + + var/turf/master_NE + var/turf/master_SE + var/turf/master_SW + var/turf/master_NW + + var/lum_r = 0 + var/lum_g = 0 + var/lum_b = 0 + + //true color values, guaranteed to be between 0 and 1 + var/cache_r = LIGHTING_SOFT_THRESHOLD + var/cache_g = LIGHTING_SOFT_THRESHOLD + var/cache_b = LIGHTING_SOFT_THRESHOLD + + ///the maximum of lum_r, lum_g, and lum_b. if this is > 1 then the three cached color values are divided by this + var/largest_color_luminosity = 0 + + ///whether we are to be added to SSlighting's corners_queue list for an update + var/needs_update = FALSE + +/datum/static_lighting_corner/New(turf/new_turf, diagonal) + . = ..() + save_master(new_turf, turn(diagonal, 180)) + + var/vertical = diagonal & ~(diagonal - 1) // The horizontal directions (4 and 8) are bigger than the vertical ones (1 and 2), so we can reliably say the lsb is the horizontal direction. + var/horizontal = diagonal & ~vertical // Now that we know the horizontal one we can get the vertical one. + + x = new_turf.x + (horizontal == EAST ? 0.5 : -0.5) + y = new_turf.y + (vertical == NORTH ? 0.5 : -0.5) + + // My initial plan was to make this loop through a list of all the dirs (horizontal, vertical, diagonal). + // Issue being that the only way I could think of doing it was very messy, slow and honestly overengineered. + // So we'll have this hardcode instead. + var/turf/new_master_turf + + // Diagonal one is easy. + new_master_turf = get_step(new_turf, diagonal) + if(new_master_turf) // In case we're on the map's border. + save_master(new_master_turf, diagonal) + + // Now the horizontal one. + new_master_turf = get_step(new_turf, horizontal) + if(new_master_turf) // Ditto. + save_master(new_master_turf, ((new_master_turf.x > x) ? EAST : WEST) | ((new_master_turf.y > y) ? NORTH : SOUTH)) // Get the dir based on coordinates. + + // And finally the vertical one. + new_master_turf = get_step(new_turf, vertical) + if (new_master_turf) + save_master(new_master_turf, ((new_master_turf.x > x) ? EAST : WEST) | ((new_master_turf.y > y) ? NORTH : SOUTH)) // Get the dir based on coordinates. + +/datum/static_lighting_corner/proc/save_master(turf/master, dir) + switch (dir) + if (NORTHEAST) + master_NE = master + master.lighting_corner_SW = src + if (SOUTHEAST) + master_SE = master + master.lighting_corner_NW = src + if (SOUTHWEST) + master_SW = master + master.lighting_corner_NE = src + if (NORTHWEST) + master_NW = master + master.lighting_corner_SE = src + +/datum/static_lighting_corner/proc/self_destruct_if_idle() + if (!LAZYLEN(affecting)) + qdel(src, force = TRUE) + +/datum/static_lighting_corner/proc/vis_update() + for (var/datum/static_light_source/light_source as anything in affecting) + light_source.vis_update() + +/datum/static_lighting_corner/proc/full_update() + for (var/datum/static_light_source/light_source as anything in affecting) + light_source.recalc_corner(src) + +// God that was a mess, now to do the rest of the corner code! Hooray! +/datum/static_lighting_corner/proc/update_lumcount(delta_r, delta_g, delta_b) + + if(!(delta_r || delta_g || delta_b)) // 0 is falsey ok + return + + lum_r += delta_r + lum_g += delta_g + lum_b += delta_b + + if(!needs_update) + needs_update = TRUE + SSlighting.corners_queue += src + +/datum/static_lighting_corner/proc/update_objects() + // Cache these values a head of time so 4 individual lighting objects don't all calculate them individually. + var/lum_r = src.lum_r + var/lum_g = src.lum_g + var/lum_b = src.lum_b + var/largest_color_luminosity = max(lum_r, lum_g, lum_b) // Scale it so one of them is the strongest lum, if it is above 1. + . = 1 // factor + if (largest_color_luminosity > 1) + . = 1 / largest_color_luminosity + + #if LIGHTING_SOFT_THRESHOLD != 0 + else if (largest_color_luminosity < LIGHTING_SOFT_THRESHOLD) + . = 0 // 0 means soft lighting. + + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + #else + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) + #endif + + src.largest_color_luminosity = round(largest_color_luminosity, LIGHTING_ROUND_VALUE) + + var/datum/static_lighting_object/lighting_object = master_NE?.static_lighting_object + if (lighting_object && !lighting_object.needs_update) + lighting_object.needs_update = TRUE + SSlighting.objects_queue += lighting_object + + lighting_object = master_SE?.static_lighting_object + if (lighting_object && !lighting_object.needs_update) + lighting_object.needs_update = TRUE + SSlighting.objects_queue += lighting_object + + lighting_object = master_SW?.static_lighting_object + if (lighting_object && !lighting_object.needs_update) + lighting_object.needs_update = TRUE + SSlighting.objects_queue += lighting_object + + lighting_object = master_NW?.static_lighting_object + if (lighting_object && !lighting_object.needs_update) + lighting_object.needs_update = TRUE + SSlighting.objects_queue += lighting_object + + self_destruct_if_idle() + + +/datum/static_lighting_corner/dummy/New() + return + + +/datum/static_lighting_corner/Destroy(force) + if (!force) + return QDEL_HINT_LETMELIVE + + for(var/datum/static_light_source/light_source as anything in affecting) + LAZYREMOVE(light_source.effect_str, src) + affecting = null + + if(master_NE) + master_NE.lighting_corner_SW = null + master_NE.lighting_corners_initialised = FALSE + if(master_SE) + master_SE.lighting_corner_NW = null + master_SE.lighting_corners_initialised = FALSE + if(master_SW) + master_SW.lighting_corner_NE = null + master_SW.lighting_corners_initialised = FALSE + if(master_NW) + master_NW.lighting_corner_SE = null + master_NW.lighting_corners_initialised = FALSE + if(needs_update) + SSlighting.corners_queue -= src + return ..() diff --git a/code/modules/lighting/lighting_static/static_lighting_object.dm b/code/modules/lighting/lighting_static/static_lighting_object.dm new file mode 100644 index 000000000000..a3e6c5054bee --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_object.dm @@ -0,0 +1,115 @@ +/datum/static_lighting_object + ///the underlay we are currently applying to our turf to apply light + var/mutable_appearance/current_underlay + + ///whether we are already in the SSlighting.objects_queue list + var/needs_update = FALSE + + ///the turf that our light is applied to + var/turf/affected_turf + +/datum/static_lighting_object/New(turf/source) + if(!isturf(source)) + qdel(src, force=TRUE) + stack_trace("a lighting object was assigned to [source], a non turf! ") + return + ..() + + current_underlay = mutable_appearance(LIGHTING_ICON, "transparent", source.z, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) + + affected_turf = source + if (affected_turf.static_lighting_object) + qdel(affected_turf.static_lighting_object, force = TRUE) + stack_trace("a lighting object was assigned to a turf that already had a lighting object!") + + affected_turf.static_lighting_object = src + affected_turf.luminosity = 0 + + needs_update = TRUE + SSlighting.objects_queue += src + +/datum/static_lighting_object/Destroy(force) + if (!force) + return QDEL_HINT_LETMELIVE + SSlighting.objects_queue -= src + if (isturf(affected_turf)) + affected_turf.static_lighting_object = null + affected_turf.luminosity = 1 + affected_turf.underlays -= current_underlay + affected_turf = null + return ..() + +/datum/static_lighting_object/proc/update() + + // To the future coder who sees this and thinks + // "Why didn't he just use a loop?" + // Well my man, it's because the loop performed like shit. + // And there's no way to improve it because + // without a loop you can make the list all at once which is the fastest you're gonna get. + // Oh it's also shorter line wise. + // Including with these comments. + + var/static/datum/static_lighting_corner/dummy/dummy_lighting_corner = new + + var/datum/static_lighting_corner/red_corner = affected_turf.lighting_corner_SW || dummy_lighting_corner + var/datum/static_lighting_corner/green_corner = affected_turf.lighting_corner_SE || dummy_lighting_corner + var/datum/static_lighting_corner/blue_corner = affected_turf.lighting_corner_NW || dummy_lighting_corner + var/datum/static_lighting_corner/alpha_corner = affected_turf.lighting_corner_NE || dummy_lighting_corner + + var/max = max(red_corner.largest_color_luminosity, green_corner.largest_color_luminosity, blue_corner.largest_color_luminosity, alpha_corner.largest_color_luminosity) + + var/rr = red_corner.cache_r + var/rg = red_corner.cache_g + var/rb = red_corner.cache_b + + var/gr = green_corner.cache_r + var/gg = green_corner.cache_g + var/gb = green_corner.cache_b + + var/br = blue_corner.cache_r + var/bg = blue_corner.cache_g + var/bb = blue_corner.cache_b + + var/ar = alpha_corner.cache_r + var/ag = alpha_corner.cache_g + var/ab = alpha_corner.cache_b + + #if LIGHTING_SOFT_THRESHOLD != 0 + var/set_luminosity = max > LIGHTING_SOFT_THRESHOLD + #else + // Because of floating points�?, it won't even be a flat 0. + // This number is mostly arbitrary. + var/set_luminosity = max > 1e-6 + #endif + + if((rr & gr & br & ar) && (rg + gg + bg + ag + rb + gb + bb + ab == 8)) + //anything that passes the first case is very likely to pass the second, and addition is a little faster in this case + affected_turf.underlays -= current_underlay + current_underlay.icon_state = "transparent" + current_underlay.color = null + affected_turf.underlays += current_underlay + else if(!set_luminosity) + affected_turf.underlays -= current_underlay + current_underlay.icon_state = "dark" + current_underlay.color = null + affected_turf.underlays += current_underlay + else + affected_turf.underlays -= current_underlay + current_underlay.icon_state = null + current_underlay.color = list( + rr, rg, rb, 00, + gr, gg, gb, 00, + br, bg, bb, 00, + ar, ag, ab, 00, + 00, 00, 00, 01 + ) + + affected_turf.underlays += current_underlay + + var/area/A = affected_turf.loc + //We are luminous + if(set_luminosity) + affected_turf.luminosity = set_luminosity + //We are not lit by static light OR dynamic light. + else if(!LAZYLEN(affected_turf.hybrid_lights_affecting) && !A.base_lighting_alpha) + affected_turf.luminosity = 0 diff --git a/code/modules/lighting/lighting_static/static_lighting_setup.dm b/code/modules/lighting/lighting_static/static_lighting_setup.dm new file mode 100644 index 000000000000..6e1641585b91 --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_setup.dm @@ -0,0 +1,10 @@ +/proc/create_all_lighting_objects() + for(var/area/A in world) + + if(!A.static_lighting) + continue + + for(var/turf/T in A) + new/datum/static_lighting_object(T) + CHECK_TICK + CHECK_TICK diff --git a/code/modules/lighting/lighting_static/static_lighting_source.dm b/code/modules/lighting/lighting_static/static_lighting_source.dm new file mode 100644 index 000000000000..e650a432fc63 --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_source.dm @@ -0,0 +1,277 @@ +// This is where the fun begins. +// These are the main datums that emit light. + +/datum/static_light_source + ///The atom we're emitting light from (for example a mob if we're from a flashlight that's being held). + var/atom/top_atom + ///The atom that we belong to. + var/atom/source_atom + + ///The turf under the source atom. + var/turf/source_turf + ///The turf the top_atom appears to over. + var/turf/pixel_turf + ///Intensity of the emitter light. + var/light_power + /// The range of the emitted light. + var/light_range + /// The colour of the light, string, decomposed by parse_light_color() + var/light_color + // Variables for keeping track of the colour. + var/lum_r + var/lum_g + var/lum_b + + // The lumcount values used to apply the light. + var/tmp/applied_lum_r + var/tmp/applied_lum_g + var/tmp/applied_lum_b + + /// List used to store how much we're affecting corners. + var/list/datum/static_lighting_corner/effect_str + + /// Whether we have applied our light yet or not. + var/applied = FALSE + + /// whether we are to be added to SSlighting's static_sources_queue list for an update + var/needs_update = LIGHTING_NO_UPDATE + +// Thanks to Lohikar for flinging this tiny bit of code at me, increasing my brain cell count from 1 to 2 in the process. +// This macro will only offset up to 1 tile, but anything with a greater offset is an outlier and probably should handle its own lighting offsets. +// Anything pixelshifted 16px or more will be considered on the next tile. +#define GET_APPROXIMATE_PIXEL_DIR(PX, PY) ((!(PX) ? 0 : ((PX >= 16 ? EAST : (PX <= -16 ? WEST : 0)))) | (!PY ? 0 : (PY >= 16 ? NORTH : (PY <= -16 ? SOUTH : 0)))) +#define UPDATE_APPROXIMATE_PIXEL_TURF var/_mask = GET_APPROXIMATE_PIXEL_DIR(top_atom.pixel_x, top_atom.pixel_y); pixel_turf = _mask ? (get_step(source_turf, _mask) || source_turf) : source_turf + +/datum/static_light_source/New(atom/owner, atom/top) + source_atom = owner // Set our new owner. + LAZYADD(source_atom.static_light_sources, src) + top_atom = top + if (top_atom != source_atom) + LAZYADD(top_atom.static_light_sources, src) + + source_turf = top_atom + UPDATE_APPROXIMATE_PIXEL_TURF + + light_power = source_atom.light_power + light_range = source_atom.light_range + light_color = source_atom.light_color + + PARSE_LIGHT_COLOR(src) + + update() + +/datum/static_light_source/Destroy(force) + remove_lum() + if (source_atom) + LAZYREMOVE(source_atom.static_light_sources, src) + + if (top_atom) + LAZYREMOVE(top_atom.static_light_sources, src) + + if (needs_update) + SSlighting.static_sources_queue -= src + return ..() + +#define EFFECT_UPDATE(level) \ + if (needs_update == LIGHTING_NO_UPDATE) \ + SSlighting.static_sources_queue += src; \ + if (needs_update < level) \ + needs_update = level; \ + + +/// This proc will cause the light source to update the top atom, and add itself to the update queue. +/datum/static_light_source/proc/update(atom/new_top_atom) + // This top atom is different. + if (new_top_atom && new_top_atom != top_atom) + if(top_atom != source_atom && top_atom.static_light_sources) // Remove ourselves from the light sources of that top atom. + LAZYREMOVE(top_atom.static_light_sources, src) + + top_atom = new_top_atom + + if (top_atom != source_atom) + LAZYADD(top_atom.static_light_sources, src) // Add ourselves to the light sources of our new top atom. + + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) + +/// Will force an update without checking if it's actually needed. +/datum/static_light_source/proc/force_update() + EFFECT_UPDATE(LIGHTING_FORCE_UPDATE) + +/// Will cause the light source to recalculate turfs that were removed or added to visibility only. +/datum/static_light_source/proc/vis_update() + EFFECT_UPDATE(LIGHTING_VIS_UPDATE) + +// Macro that applies light to a new corner. +// It is a macro in the interest of speed, yet not having to copy paste it. +// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. +// As such this all gets counted as a single line. +// The braces and semicolons are there to be able to do this on a single line. + +//Original lighting falloff calculation. This looks the best out of the three. However, this is also the most expensive. +//#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) + +//Cubic lighting falloff. This has the *exact* same range as the original lighting falloff calculation, down to the exact decimal, but it looks a little unnatural due to the harsher falloff and how it's generally brighter across the board. +//#define LUM_FALLOFF(C, T) (1 - CLAMP01((((C.x - T.x) * (C.x - T.x)) + ((C.y - T.y) * (C.y - T.y)) + LIGHTING_HEIGHT) / max(1, light_range*light_range))) + +//Linear lighting falloff. This resembles the original lighting falloff calculation the best, but results in lights having a slightly larger range, which is most noticable with large light sources. This also results in lights being diamond-shaped, fuck. This looks the darkest out of the three due to how lights are brighter closer to the source compared to the original falloff algorithm. This falloff method also does not at all take into account lighting height, as it acts as a flat reduction to light range with this method. +//#define LUM_FALLOFF(C, T) (1 - CLAMP01(((abs(C.x - T.x) + abs(C.y - T.y))) / max(1, light_range+1))) + +//Linear lighting falloff but with an octagonal shape in place of a diamond shape. Lummox JR please add pointer support. +#define GET_LUM_DIST(DISTX, DISTY) (DISTX + DISTY + abs(DISTX - DISTY)*0.4) +#define LUM_FALLOFF(C, T) (1 - CLAMP01(max(GET_LUM_DIST(abs(C.x - T.x), abs(C.y - T.y)),LIGHTING_HEIGHT) / max(1, light_range+1))) + +#define APPLY_CORNER(C) \ + . = LUM_FALLOFF(C, pixel_turf); \ + . *= light_power; \ + var/OLD = effect_str[C]; \ + C.update_lumcount \ + ( \ + (. * lum_r) - (OLD * applied_lum_r), \ + (. * lum_g) - (OLD * applied_lum_g), \ + (. * lum_b) - (OLD * applied_lum_b) \ + ); + +#define REMOVE_CORNER(C) \ + . = -effect_str[C]; \ + C.update_lumcount \ + ( \ + . * applied_lum_r, \ + . * applied_lum_g, \ + . * applied_lum_b \ + ); + +/// This is the define used to calculate falloff. +/datum/static_light_source/proc/remove_lum() + applied = FALSE + for(var/datum/static_lighting_corner/corner as anything in effect_str) + REMOVE_CORNER(corner) + LAZYREMOVE(corner.affecting, src) + + effect_str = null + +/datum/static_light_source/proc/recalc_corner(datum/static_lighting_corner/corner) + LAZYINITLIST(effect_str) + if (effect_str[corner]) // Already have one. + REMOVE_CORNER(corner) + effect_str[corner] = 0 + + APPLY_CORNER(corner) + effect_str[corner] = . + +/datum/static_light_source/proc/update_corners() + var/update = FALSE + var/atom/source_atom = src.source_atom + + if (QDELETED(source_atom)) + qdel(src) + return + + if (source_atom.light_power != light_power) + light_power = source_atom.light_power + update = TRUE + + if (source_atom.light_range != light_range) + light_range = source_atom.light_range + update = TRUE + + if (!top_atom) + top_atom = source_atom + update = TRUE + + if (!light_range || !light_power) + qdel(src) + return + + if (isturf(top_atom)) + if (source_turf != top_atom) + source_turf = top_atom + UPDATE_APPROXIMATE_PIXEL_TURF + update = TRUE + else if (top_atom.loc != source_turf) + source_turf = top_atom.loc + UPDATE_APPROXIMATE_PIXEL_TURF + update = TRUE + else + var/pixel_loc = get_turf_pixel(top_atom) + if (pixel_loc != pixel_turf) + pixel_turf = pixel_loc + update = TRUE + + if (!isturf(source_turf)) + if (applied) + remove_lum() + return + + if (light_range && light_power && !applied) + update = TRUE + + if (source_atom.light_color != light_color) + light_color = source_atom.light_color + PARSE_LIGHT_COLOR(src) + update = TRUE + + else if (applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) + update = TRUE + + if (update) + needs_update = LIGHTING_CHECK_UPDATE + applied = TRUE + else if (needs_update == LIGHTING_CHECK_UPDATE) + return //nothing's changed + + var/list/datum/static_lighting_corner/corners = list() + var/list/turf/turfs = list() + if (source_turf) + var/oldlum = source_turf.luminosity + source_turf.luminosity = CEILING(light_range, 1) + for(var/turf/T in view(CEILING(light_range, 1), source_turf)) + if(!IS_OPAQUE_TURF(T)) + if (!T.lighting_corners_initialised) + T.static_generate_missing_corners() + corners[T.lighting_corner_NE] = 0 + corners[T.lighting_corner_SE] = 0 + corners[T.lighting_corner_SW] = 0 + corners[T.lighting_corner_NW] = 0 + turfs += T + source_turf.luminosity = oldlum + + var/list/datum/static_lighting_corner/new_corners = (corners - effect_str) + LAZYINITLIST(effect_str) + if (needs_update == LIGHTING_VIS_UPDATE) + for (var/datum/static_lighting_corner/corner as anything in new_corners) + APPLY_CORNER(corner) + if (. != 0) + LAZYADD(corner.affecting, src) + effect_str[corner] = . + else + for (var/datum/static_lighting_corner/corner as anything in new_corners) + APPLY_CORNER(corner) + if (. != 0) + LAZYADD(corner.affecting, src) + effect_str[corner] = . + + for (var/datum/static_lighting_corner/corner as anything in corners - new_corners) // Existing corners + APPLY_CORNER(corner) + if (. != 0) + effect_str[corner] = . + else + LAZYREMOVE(corner.affecting, src) + effect_str -= corner + + var/list/datum/static_lighting_corner/gone_corners = effect_str - corners + for (var/datum/static_lighting_corner/corner as anything in gone_corners) + REMOVE_CORNER(corner) + LAZYREMOVE(corner.affecting, src) + effect_str -= gone_corners + + applied_lum_r = lum_r + applied_lum_g = lum_g + applied_lum_b = lum_b + + UNSETEMPTY(effect_str) + +#undef EFFECT_UPDATE +#undef LUM_FALLOFF +#undef GET_LUM_DIST +#undef REMOVE_CORNER +#undef APPLY_CORNER diff --git a/code/modules/lighting/lighting_static/static_lighting_turf.dm b/code/modules/lighting/lighting_static/static_lighting_turf.dm new file mode 100644 index 000000000000..2fe918fa88bb --- /dev/null +++ b/code/modules/lighting/lighting_static/static_lighting_turf.dm @@ -0,0 +1,61 @@ +/turf + var/tmp/lighting_corners_initialised = FALSE + var/tmp/datum/static_lighting_object/static_lighting_object + + ///Lighting Corner datums. + var/tmp/datum/static_lighting_corner/lighting_corner_NE + var/tmp/datum/static_lighting_corner/lighting_corner_SE + var/tmp/datum/static_lighting_corner/lighting_corner_SW + var/tmp/datum/static_lighting_corner/lighting_corner_NW + +/turf/proc/static_lighting_clear_overlay() + if (static_lighting_object) + qdel(static_lighting_object, TRUE) + +/// Builds a lighting object for us, but only if our area is dynamic. +/turf/proc/static_lighting_build_overlay(area/our_area = loc) + if(static_lighting_object) + qdel(static_lighting_object, force=TRUE) //Shitty fix for lighting objects persisting after death + + new/datum/static_lighting_object(src) + + + +// Returns a boolean whether the turf is on soft lighting. +// Soft lighting being the threshold at which point the overlay considers +// itself as too dark to allow sight and see_in_dark becomes useful. +// So basically if this returns true the tile is unlit black. +/turf/proc/static_is_softly_lit() + if (!static_lighting_object) + return FALSE + + return !(luminosity || dynamic_lumcount) + +/turf/proc/change_area(area/old_area, area/new_area) + if(SSlighting.initialized) + if (new_area.static_lighting != old_area.static_lighting) + if (new_area.static_lighting) + static_lighting_build_overlay(new_area) + else + static_lighting_clear_overlay() + //Inherit overlay of new area + if(old_area.lighting_effect) + overlays -= old_area.lighting_effect + if(new_area.lighting_effect) + overlays += new_area.lighting_effect + +/turf/proc/static_generate_missing_corners() + if (!lighting_corner_NE) + lighting_corner_NE = new/datum/static_lighting_corner(src, NORTH|EAST) + + if (!lighting_corner_SE) + lighting_corner_SE = new/datum/static_lighting_corner(src, SOUTH|EAST) + + if (!lighting_corner_SW) + lighting_corner_SW = new/datum/static_lighting_corner(src, SOUTH|WEST) + + if (!lighting_corner_NW) + lighting_corner_NW = new/datum/static_lighting_corner(src, NORTH|WEST) + + lighting_corners_initialised = TRUE + diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm new file mode 100644 index 000000000000..c1fb288e9dd2 --- /dev/null +++ b/code/modules/lighting/lighting_turf.dm @@ -0,0 +1,94 @@ +///Estimates the light power based on the alpha of the light and the range. +///Assumes a linear fallout at (0, alpha/255) to (range, 0) +///Used for lightig mask lumcount calculations +#define LIGHT_POWER_ESTIMATION(alpha, range, distance) max((alpha * (range - distance)) / (255 * range), 0) + +/turf + ///hybrid lights affecting this turf + var/tmp/list/atom/movable/lighting_mask/hybrid_lights_affecting + +/turf/Destroy(force) + if(hybrid_lights_affecting) + for(var/atom/movable/lighting_mask/mask as anything in hybrid_lights_affecting) + LAZYREMOVE(mask.affecting_turfs, src) + hybrid_lights_affecting.Cut() + return ..() + +/// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. +/turf/proc/reconsider_lights() + //Consider static lights + lighting_corner_NE?.vis_update() + lighting_corner_SE?.vis_update() + lighting_corner_SW?.vis_update() + lighting_corner_NW?.vis_update() + + //consider dynamic lights + for(var/atom/movable/lighting_mask/mask as anything in hybrid_lights_affecting) + mask.queue_mask_update() + +// Used to get a scaled lumcount. +/turf/proc/get_lumcount(minlum = 0, maxlum = 1) + var/totallums = 0 + if (static_lighting_object) + var/datum/static_lighting_corner/L + L = lighting_corner_NE + if (L) + totallums += L.lum_r + L.lum_b + L.lum_g + L = lighting_corner_SE + if (L) + totallums += L.lum_r + L.lum_b + L.lum_g + L = lighting_corner_SW + if (L) + totallums += L.lum_r + L.lum_b + L.lum_g + L = lighting_corner_NW + if (L) + totallums += L.lum_r + L.lum_b + L.lum_g + + totallums /= 12 // 4 corners, each with 3 channels, get the average. + + totallums = (totallums - minlum) / (maxlum - minlum) + + totallums = CLAMP01(totallums) + else + totallums = 1 + + for(var/atom/movable/lighting_mask/mask as anything in hybrid_lights_affecting) + if(mask.blend_mode == BLEND_ADD) + totallums += LIGHT_POWER_ESTIMATION(mask.alpha, mask.radius, get_dist(src, get_turf(mask.attached_atom))) + else + totallums -= LIGHT_POWER_ESTIMATION(mask.alpha, mask.radius, get_dist(src, get_turf(mask.attached_atom))) + return clamp(totallums, 0.0, 1.0) + +///Proc to add movable sources of opacity on the turf and let it handle lighting code. +/turf/proc/add_opacity_source(atom/movable/new_source) + LAZYADD(opacity_sources, new_source) + if(opacity) + return + recalculate_directional_opacity() + + +///Proc to remove movable sources of opacity on the turf and let it handle lighting code. +/turf/proc/remove_opacity_source(atom/movable/old_source) + LAZYREMOVE(opacity_sources, old_source) + if(opacity) //Still opaque, no need to worry on updating. + return + recalculate_directional_opacity() + + +///Calculate on which directions this turfs block view. +/turf/proc/recalculate_directional_opacity() + . = directional_opacity + if(opacity) + directional_opacity = ALL_CARDINALS + if(. != directional_opacity) + reconsider_lights() + return + directional_opacity = NONE + for(var/atom/movable/opacity_source as anything in opacity_sources) + if(opacity_source.flags_atom & ON_BORDER) + directional_opacity |= opacity_source.dir + else //If fulltile and opaque, then the whole tile blocks view, no need to continue checking. + directional_opacity = ALL_CARDINALS + break + if(. != directional_opacity && (. == ALL_CARDINALS || directional_opacity == ALL_CARDINALS)) + reconsider_lights() //The lighting system only cares whether the tile is fully concealed from all directions or not. diff --git a/code/modules/maptext_alerts/screen_alerts.dm b/code/modules/maptext_alerts/screen_alerts.dm index e96b436bde21..6d251080e87b 100644 --- a/code/modules/maptext_alerts/screen_alerts.dm +++ b/code/modules/maptext_alerts/screen_alerts.dm @@ -116,3 +116,133 @@ if(LAZYLEN(player.screen_texts)) player.screen_texts[1].play_to_client() // Theres more? +/** + * Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already + * category is a text string. Each mob may only have one alert per category; the previous one will be replaced + * path is a type path of the actual alert type to throw + * severity is an optional number that will be placed at the end of the icon_state for this alert + * For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2" + * new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay. + * Clicks are forwarded to master + * Override makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations. + */ +/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE) + if(!category || QDELETED(src)) + return + + var/atom/movable/screen/alert/thealert + if(alerts[category]) + thealert = alerts[category] + if(thealert.override_alerts) + return FALSE + if(new_master && new_master != thealert.master) + WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [thealert.master]") + + clear_alert(category) + return .() + else if(thealert.type != type) + clear_alert(category) + return .() + else if(!severity || severity == thealert.severity) + if(thealert.timeout) + clear_alert(category) + return .() + else //no need to update + return FALSE + else + thealert = new type() + thealert.override_alerts = override + if(override) + thealert.timeout = null + thealert.owner = src + + if(new_master) + var/old_layer = new_master.layer + var/old_plane = new_master.plane + new_master.layer = FLOAT_LAYER + new_master.plane = FLOAT_PLANE + thealert.overlays += new_master + new_master.layer = old_layer + new_master.plane = old_plane + thealert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts() + thealert.master = new_master + else + thealert.icon_state = "[initial(thealert.icon_state)][severity]" + thealert.severity = severity + + alerts[category] = thealert + if(client && hud_used) + hud_used.reorganize_alerts() + thealert.transform = matrix(32, 6, MATRIX_TRANSLATE) + animate(thealert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + + if(thealert.timeout) + addtimer(CALLBACK(src, PROC_REF(alert_timeout), thealert, category), thealert.timeout) + thealert.timeout = world.time + thealert.timeout - world.tick_lag + return thealert + +/mob/proc/alert_timeout(atom/movable/screen/alert/alert, category) + if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout) + clear_alert(category) + +// Proc to clear an existing alert. +/mob/proc/clear_alert(category, clear_override = FALSE) + var/atom/movable/screen/alert/alert = alerts[category] + if(!alert) + return FALSE + if(alert.override_alerts && !clear_override) + return FALSE + + alerts -= category + if(client && hud_used) + hud_used.reorganize_alerts() + client.screen -= alert + qdel(alert) + +/atom/movable/screen/alert + icon = 'icons/mob/screen_alert.dmi' + icon_state = "default" + name = "Alert" + desc = "Something seems to have gone wrong with this alert, so report this bug please" + mouse_opacity = MOUSE_OPACITY_ICON + /// If set to a number, this alert will clear itself after that many deciseconds + var/timeout = 0 + var/severity = 0 + var/alerttooltipstyle = "" + /// If it is overriding other alerts of the same type + var/override_alerts = FALSE + /// Alert owner + var/mob/owner + +/atom/movable/screen/alert/MouseEntered(location,control,params) + . = ..() + if(!QDELETED(src)) + openToolTip(usr, src, params, title = name, content = desc, theme = alerttooltipstyle) + +/atom/movable/screen/alert/notify_action + name = "Notification" + desc = "A new notification. You can enter it." + icon_state = "template" + timeout = 15 SECONDS + var/atom/target = null + var/action = NOTIFY_JUMP + +/atom/movable/screen/alert/notify_action/Click() + var/mob/dead/observer/ghost_user = usr + if(!istype(ghost_user) || usr != owner) + return + if(!ghost_user.client) + return + if(!target) + return + switch(action) + if(NOTIFY_ATTACK) + target.attack_ghost(ghost_user) + if(NOTIFY_JUMP) + var/turf/gotten_turf = get_turf(target) + if(gotten_turf) + ghost_user.forceMove(gotten_turf) + if(NOTIFY_ORBIT) + ghost_user.ManualFollow(target) + if(NOTIFY_JOIN_XENO) + ghost_user.join_as_alien() diff --git a/code/modules/mob/camera/imaginary_friend.dm b/code/modules/mob/camera/imaginary_friend.dm index a78de70a7e15..3d6d5d5a0aa2 100644 --- a/code/modules/mob/camera/imaginary_friend.dm +++ b/code/modules/mob/camera/imaginary_friend.dm @@ -168,10 +168,10 @@ hud = huds[MOB_HUD_FACTION_CLF] if(hud_choice in current_huds) - hud.remove_hud_from(src) + hud.remove_hud_from(src, src) current_huds -= hud_choice else - hud.add_hud_to(src) + hud.add_hud_to(src, src) current_huds += hud_choice /mob/camera/imaginary_friend/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language, ignore_spam = FALSE, forced) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ee36d25fc687..21a992693aa8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -85,6 +85,7 @@ life_kills_total = body.life_kills_total //kills also copy over appearance = body.appearance + underlays.Cut() base_transform = matrix(body.base_transform) body.alter_ghost(src) apply_transform(matrix()) @@ -255,6 +256,10 @@ A.JumpToCoord(x, y, z) if(href_list["joinresponseteam"]) JoinResponseTeam() + if(href_list["claim_freed"]) + handle_joining_as_freed_mob(locate(href_list["claim_freed"])) + if(href_list["join_xeno"]) + join_as_alien() /mob/dead/observer/proc/set_huds_from_prefs() if(!client || !client.prefs) @@ -267,28 +272,28 @@ switch(i) if("Medical HUD") H = huds[MOB_HUD_MEDICAL_OBSERVER] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Security HUD") H = huds[MOB_HUD_SECURITY_ADVANCED] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Squad HUD") H = huds[MOB_HUD_FACTION_OBSERVER] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Xeno Status HUD") H = huds[MOB_HUD_XENO_STATUS] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Faction UPP HUD") H = huds[MOB_HUD_FACTION_UPP] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Faction Wey-Yu HUD") H = huds[MOB_HUD_FACTION_WY] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Faction TWE HUD") H = huds[MOB_HUD_FACTION_TWE] - H.add_hud_to(src) + H.add_hud_to(src, src) if("Faction CLF HUD") H = huds[MOB_HUD_FACTION_CLF] - H.add_hud_to(src) + H.add_hud_to(src, src) see_invisible = INVISIBILITY_OBSERVER @@ -558,7 +563,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/mob/living/carbon/human/original_human = mind.original - if(!original_human.check_tod() || !original_human.is_revivable() || !can_reenter_corpse) + if((original_human.stat == DEAD && !original_human.check_tod() || !original_human.is_revivable()) || !can_reenter_corpse) view_health_scan(target) return @@ -906,19 +911,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return var/mob/living/L = freed_mob_choices[choice] - if(!L || !(WEAKREF(L) in GLOB.freed_mob_list)) + + 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(L)) + if(!istype(freed_mob)) return - if(QDELETED(L) || L.client) - GLOB.freed_mob_list -= WEAKREF(L) + if(QDELETED(freed_mob) || freed_mob.client) + GLOB.freed_mob_list -= WEAKREF(freed_mob) to_chat(src, SPAN_WARNING("Something went wrong.")) return - GLOB.freed_mob_list -= WEAKREF(L) - M.mind.transfer_to(L, TRUE) + GLOB.freed_mob_list -= WEAKREF(freed_mob) + mind.transfer_to(freed_mob, TRUE) /mob/dead/verb/join_as_hellhound() set category = "Ghost.Join" diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index a6062276bd8e..ab3ce823c68e 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -12,8 +12,9 @@ if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < max_blood) + if(blood_volume < max_blood && nutrition >= 1) blood_volume += 0.1 // regenerate blood VERY slowly + nutrition -= 0.25 else if(blood_volume > max_blood) blood_volume -= 0.1 // The reverse in case we've gotten too much blood in our body if(blood_volume > limit_blood) @@ -43,12 +44,6 @@ if(oxyloss < maximum_oxyloss) oxyloss += round(max(additional_oxyloss, 0)) - //Bloodloss effects on nutrition - if(nutrition >= 300) - nutrition -= 10 - else if(nutrition >= 200) - nutrition -= 3 - switch(b_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(1)) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 3896cd1f9ded..19810893694a 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -104,7 +104,7 @@ delayer_armour.can_camo = FALSE //fuck you to_chat(delayer, SPAN_WARNING("Your [delayer_armour]'s camo system breaks!")) //tell the ghosts - announce_dchat("There is only one person left: [last_living_human.real_name].", last_living_human) + notify_ghosts(header = "Last Human", message = "There is only one person left: [last_living_human.real_name]!", source = last_living_human, action = NOTIFY_ORBIT) var/death_message = species.death_message if(HAS_TRAIT(src, TRAIT_HARDCORE)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index aa0cbba74a5a..6e99ca1e5a15 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -512,25 +512,30 @@ //Helper procedure. Called by /mob/living/carbon/human/get_examine_text() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. -/proc/hasHUD(mob/M, hudtype) - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if (issynth(H)) +/proc/hasHUD(mob/passed_mob, hudtype) + if(istype(passed_mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/passed_human = passed_mob + if (issynth(passed_human)) return 1 switch(hudtype) if("security") - //only MPs can use the security HUD glasses's functionalities - if(skillcheck(H, SKILL_POLICE, SKILL_POLICE_SKILLED)) - return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud) + if(skillcheck(passed_human, SKILL_POLICE, SKILL_POLICE_SKILLED)) + var/datum/mob_hud/sec_hud = huds[MOB_HUD_SECURITY_ADVANCED] + if(locate(passed_mob) in sec_hud.hudusers) + return TRUE if("medical") - if(skillcheck(H, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) - return istype(H.glasses, /obj/item/clothing/glasses/hud/health) + if(skillcheck(passed_human, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) + var/datum/mob_hud/med_hud = huds[MOB_HUD_MEDICAL_ADVANCED] + if(locate(passed_mob) in med_hud.hudusers) + return TRUE if("squadleader") - return H.mind && H.assigned_squad && H.assigned_squad.squad_leader == H && H.get_type_in_ears(/obj/item/device/radio/headset/almayer/marine) + var/datum/mob_hud/faction_hud = huds[MOB_HUD_FACTION_USCM] + if(passed_human.mind && passed_human.assigned_squad && passed_human.assigned_squad.squad_leader == passed_human && locate(passed_mob) in faction_hud.hudusers) + return TRUE else return 0 - else if(isrobot(M)) - var/mob/living/silicon/robot/R = M + else if(isrobot(passed_mob)) + var/mob/living/silicon/robot/R = passed_mob switch(hudtype) if("security") return istype(R.module_state_1, /obj/item/robot/sight/hud/sec) || istype(R.module_state_2, /obj/item/robot/sight/hud/sec) || istype(R.module_state_3, /obj/item/robot/sight/hud/sec) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0d67e7cafd74..c9092ed479b9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1388,12 +1388,15 @@ sight &= ~BLIND // Never have blind on by default lighting_alpha = default_lighting_alpha - sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS|SEE_BLACKNESS) see_in_dark = species.darksight sight |= species.flags_sight if(glasses) process_glasses(glasses) + if(!(sight & SEE_TURFS) && !(sight & SEE_MOBS) && !(sight & SEE_OBJS)) + sight |= SEE_BLACKNESS + SEND_SIGNAL(src, COMSIG_HUMAN_POST_UPDATE_SIGHT) sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 35097a8e5c79..805b3d7e1744 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -155,7 +155,7 @@ return held_weapon.afterattack(target,src) var/disarm_chance = rand(1, 100) - var/attacker_skill_level = attacking_mob.skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max + var/attacker_skill_level = skills && attacking_mob.skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max var/defender_skill_level = skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max disarm_chance -= 5 * attacker_skill_level disarm_chance += 5 * defender_skill_level diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 989ee52fa63c..4416ba74fda3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,4 +1,5 @@ /mob/living/carbon/human + light_system = MOVABLE_LIGHT //Hair color and style var/r_hair = 0 var/g_hair = 0 @@ -161,6 +162,12 @@ ///list of weakrefs of recently dropped objects var/list/remembered_dropped_objects = list() + /// associated list of body part zone -> currently active limb key + var/list/icon_render_keys = list() + + /// static associated list of limb key -> image to avoid unnecessary overlay generation + var/static/list/icon_render_image_cache = list() + /client/var/cached_human_playtime /client/proc/get_total_human_playtime(skip_cache = FALSE) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index e6a0db99637d..7f36df8ceae2 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -268,15 +268,14 @@ var/goes_out = 0 if(armor) if(istype(wear_suit, /obj/item/clothing/suit/storage/marine)) - var/obj/item/clothing/suit/storage/marine/S = wear_suit - if(S.turn_off_light(src)) + if(wear_suit.turn_light(src, toggle_on = FALSE)) light_off++ for(var/obj/item/clothing/head/helmet/marine/H in contents) for(var/obj/item/attachable/flashlight/FL in H.pockets) if(FL.activate_attachment(H, src, TRUE)) light_off++ for(var/obj/item/clothing/head/hardhat/headlamp in contents) - if(headlamp.turn_off_light(src)) + if(headlamp.turn_light(src, toggle_on = FALSE)) light_off++ if(guns) for(var/obj/item/weapon/gun/G in contents) diff --git a/code/modules/mob/living/carbon/human/powers/human_powers.dm b/code/modules/mob/living/carbon/human/powers/human_powers.dm index 1c8c011f7c71..10b13225b314 100644 --- a/code/modules/mob/living/carbon/human/powers/human_powers.dm +++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm @@ -240,9 +240,9 @@ if(synthetic_HUD_toggled[chosen_HUD]) synthetic_HUD_toggled[chosen_HUD] = FALSE - H.remove_hud_from(src) + H.remove_hud_from(src, src) to_chat(src, SPAN_INFO("[hud_choice] Disabled")) else synthetic_HUD_toggled[chosen_HUD] = TRUE - H.add_hud_to(src) + H.add_hud_to(src, src) to_chat(src, SPAN_INFO("[hud_choice] Enabled")) diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm index bfd3c74eb57b..38b7e935268d 100644 --- a/code/modules/mob/living/carbon/human/species/synthetic.dm +++ b/code/modules/mob/living/carbon/human/species/synthetic.dm @@ -44,6 +44,7 @@ inherent_verbs = list( /mob/living/carbon/human/synthetic/proc/toggle_HUD, + /mob/living/carbon/human/proc/toggle_inherent_nightvison, ) /datum/species/synthetic/handle_post_spawn(mob/living/carbon/human/H) @@ -88,9 +89,6 @@ knock_down_reduction = 3.5 stun_reduction = 3.5 - inherent_verbs = list( - /mob/living/carbon/human/proc/toggle_inherent_nightvison, - ) /datum/species/synthetic/colonial/colonial_gen_two name = SYNTH_COLONY_GEN_TWO diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm index 07fe8f5e1255..5fa928a67f36 100644 --- a/code/modules/mob/living/carbon/human/species/zombie.dm +++ b/code/modules/mob/living/carbon/human/species/zombie.dm @@ -68,7 +68,7 @@ D.stage = 5 var/datum/mob_hud/Hu = huds[MOB_HUD_MEDICAL_OBSERVER] - Hu.add_hud_to(zombie) + Hu.add_hud_to(zombie, zombie) return ..() @@ -77,7 +77,7 @@ ..() remove_from_revive(zombie) var/datum/mob_hud/Hu = huds[MOB_HUD_MEDICAL_OBSERVER] - Hu.remove_hud_from(zombie) + Hu.remove_hud_from(zombie, zombie) /datum/species/zombie/handle_unique_behavior(mob/living/carbon/human/zombie) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6ee249a6333e..5fa8b577e8c2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -73,14 +73,14 @@ There are several things that need to be remembered: */ +/mob/living/carbon/human/apply_overlay(cache_index) + var/image/images = overlays_standing[cache_index] + if(!images) + return -/mob/living/carbon/human/apply_overlay(cache_index) - var/image/I = overlays_standing[cache_index] - if(I) - I.appearance_flags |= RESET_COLOR - SEND_SIGNAL(src, COMSIG_HUMAN_OVERLAY_APPLIED, cache_index, I) - overlays += I + SEND_SIGNAL(src, COMSIG_HUMAN_OVERLAY_APPLIED, cache_index, images) + overlays += images /mob/living/carbon/human/remove_overlay(cache_index) if(overlays_standing[cache_index]) @@ -132,10 +132,32 @@ There are several things that need to be remembered: //BASE MOB SPRITE /mob/living/carbon/human/proc/update_body() appearance_flags |= KEEP_TOGETHER // sanity - vis_contents.Cut() - for(var/obj/limb/part in limbs) - vis_contents += part - part.update_icon(TRUE) + + update_damage_overlays() + + var/list/needs_update = list() + for(var/obj/limb/part as anything in limbs) + part.update_limb() + + var/old_key = icon_render_keys?[part.icon_name] + icon_render_keys[part.icon_name] = part.get_limb_icon_key() + if(icon_render_keys[part.icon_name] == old_key) + continue + + needs_update += part + + var/list/new_limbs = list() + for(var/obj/limb/part as anything in limbs) + if(part in needs_update) + var/bodypart_icon = part.get_limb_icon() + new_limbs += bodypart_icon + icon_render_image_cache[icon_render_keys[part.icon_name]] = bodypart_icon + else + new_limbs += icon_render_image_cache[icon_render_keys[part.icon_name]] + + remove_overlay(BODYPARTS_LAYER) + overlays_standing[BODYPARTS_LAYER] = new_limbs + apply_overlay(BODYPARTS_LAYER) if(species.flags & HAS_UNDERWEAR) //Underwear @@ -154,6 +176,21 @@ There are several things that need to be remembered: overlays_standing[UNDERSHIRT_LAYER] = undershirt_icon apply_overlay(UNDERSHIRT_LAYER) +/// Recalculates and reapplies damage overlays to every limb +/mob/living/carbon/human/proc/update_damage_overlays() + remove_overlay(DAMAGE_LAYER) + + var/list/damage_overlays = list() + for(var/obj/limb/part as anything in limbs) + if(part.status & LIMB_DESTROYED) + continue + + damage_overlays += part.get_damage_overlays() + + overlays_standing[DAMAGE_LAYER] = damage_overlays + + apply_overlay(DAMAGE_LAYER) + /mob/living/carbon/human/proc/remove_underwear() // :flushed: - geeves remove_overlay(UNDERSHIRT_LAYER) remove_overlay(UNDERWEAR_LAYER) @@ -701,17 +738,22 @@ Applied by gun suicide and high impact bullet executions, removed by rejuvenate, /mob/living/carbon/human/update_fire() remove_overlay(FIRE_LAYER) if(!on_fire) + set_light_on(FALSE) return var/image/I switch(fire_stacks) if(1 to 14) I = image("icon"='icons/mob/humans/onmob/OnFire.dmi', "icon_state"="Standing_weak", "layer"= -FIRE_LAYER) + set_light_range(2) if(15 to INFINITY) I = image("icon"='icons/mob/humans/onmob/OnFire.dmi', "icon_state"="Standing_medium", "layer"= -FIRE_LAYER) + set_light_range(3) else return I.appearance_flags |= RESET_COLOR|RESET_ALPHA I.color = fire_reagent.burncolor + set_light_color(fire_reagent.burncolor) + set_light_on(TRUE) overlays_standing[FIRE_LAYER] = I apply_overlay(FIRE_LAYER) @@ -734,7 +776,6 @@ Applied by gun suicide and high impact bullet executions, removed by rejuvenate, //Human Overlays Indexes///////// #undef MUTANTRACE_LAYER -#undef DAMAGE_LAYER #undef UNIFORM_LAYER #undef TAIL_LAYER #undef ID_LAYER diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 6365d4247476..3fba527fb0d7 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -95,7 +95,7 @@ //now mobs var/speech_bubble_test = say_test(message) - var/image/speech_bubble = image('icons/mob/hud/talk.dmi',src,"h[speech_bubble_test]") + var/image/speech_bubble = image('icons/mob/effects/talk.dmi',src,"[bubble_icon][speech_bubble_test]") speech_bubble.appearance_flags = NO_CLIENT_COLOR|KEEP_APART|RESET_COLOR var/not_dead_speaker = (stat != DEAD) diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm index 4ce266f70596..2a3ff577a245 100644 --- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm +++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm @@ -14,9 +14,12 @@ var/flags_embryo = FALSE // Used in /ciphering/predator property /// The ckey of any player hugger that made this embryo var/hugger_ckey + /// The total time the person is hugged divided by stages until burst + var/per_stage_hugged_time = 90 //Set in Initialize due to config /obj/item/alien_embryo/Initialize(mapload, ...) . = ..() + per_stage_hugged_time = CONFIG_GET(number/embryo_burst_timer) / 5 if(istype(loc, /mob/living)) affected_mob = loc affected_mob.status_flags |= XENO_HOST @@ -76,8 +79,6 @@ /obj/item/alien_embryo/proc/process_growth(delta_time) var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] - /// The total time the person is hugged divided by stages until burst - var/per_stage_hugged_time = CONFIG_GET(number/embryo_burst_timer) / 5 //Low temperature seriously hampers larva growth (as in, way below livable), so does stasis if(!hive.hardcore) // Cannot progress if the hive has entered hardcore mode. if(affected_mob.in_stasis || affected_mob.bodytemperature < 170) @@ -273,14 +274,8 @@ // Inform observers to grab some popcorn if it isnt nested if(!HAS_TRAIT(affected_mob, TRAIT_NESTED)) var/area/burst_area = get_area(src) - if(burst_area) - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob] at \the [burst_area]! [OBSERVER_JMP(observer, affected_mob)]")) - to_chat(src, SPAN_DEADSAY("A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob] at \the [burst_area]!")) - else - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob]! [OBSERVER_JMP(observer, affected_mob)]")) - to_chat(src, SPAN_DEADSAY("A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob]!")) + var/area_text = burst_area ? " at [burst_area]" : "" + notify_ghosts(header = "Burst Imminent", message = "A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob][area_text]!", source = affected_mob) stage = 7 // Begin the autoburst countdown diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm index bc86ea40361c..65ae240e201d 100644 --- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm @@ -159,7 +159,7 @@ return die() -/obj/item/clothing/mask/facehugger/bullet_act(obj/item/projectile/P) +/obj/item/clothing/mask/facehugger/bullet_act(obj/projectile/P) ..() var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & (AMMO_XENO)) @@ -284,12 +284,10 @@ var/area/hug_area = get_area(src) var/name = hugger ? "[hugger]" : "\a [src]" if(hug_area) - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("[human] has been facehugged by [name] at \the [hug_area] [OBSERVER_JMP(observer, human)]")) + notify_ghosts(header = "Hugged", message = "[human] has been hugged by [name] at [hug_area]!", source = human, action = NOTIFY_ORBIT) to_chat(src, SPAN_DEADSAY("[human] has been facehugged by [name] at \the [hug_area]")) else - for(var/mob/dead/observer/observer as anything in GLOB.observer_list) - to_chat(observer, SPAN_DEADSAY("[human] has been facehugged by [name] [OBSERVER_JMP(observer, human)]")) + notify_ghosts(header = "Hugged", message = "[human] has been hugged by [name]!", source = human, action = NOTIFY_ORBIT) to_chat(src, SPAN_DEADSAY("[human] has been facehugged by [name]")) if(hug_area) xeno_message(SPAN_XENOMINORWARNING("You sense that [name] has facehugged a host at \the [hug_area]!"), 1, hivenumber) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 37b0aa037cd1..fa9036bd8305 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -21,16 +21,17 @@ if(M && istype(M) && !M.stat && M.client && (!hivenumber || M.hivenumber == hivenumber)) //Only living and connected xenos to_chat(M, SPAN_XENODANGER(" [message]")) -//Sends a maptext alert to our currently selected squad. Does not make sound. +//Sends a maptext alert to xenos. /proc/xeno_maptext(text = "", title_text = "", hivenumber = XENO_HIVE_NORMAL) if(text == "" || !hivenumber) return //Logic if(SSticker.mode && SSticker.mode.xenomorphs.len) //Send to only xenos in our gamemode list. This is faster than scanning all mobs - for(var/datum/mind/L in SSticker.mode.xenomorphs) - var/mob/living/carbon/M = L.current - if(M && istype(M) && !M.stat && M.client && M.ally_of_hivenumber(hivenumber)) //Only living and connected xenos - M.play_screen_text("[title_text]
" + text, /atom/movable/screen/text/screen_text/command_order, "#b491c8") + for(var/datum/mind/living in SSticker.mode.xenomorphs) + var/mob/living/carbon/xenomorph/xeno = living.current + if(istype(xeno) && !xeno.stat && xeno.client && xeno.hivenumber == hivenumber) //Only living and connected xenos + playsound_client(xeno.client, 'sound/voice/alien_distantroar_3.ogg', xeno.loc, 25, FALSE) + xeno.play_screen_text("[title_text]
" + text, /atom/movable/screen/text/screen_text/command_order, "#b491c8") /proc/xeno_message_all(message = null, size = 3) xeno_message(message, size) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index cc0c12bd1cc8..368dded9c17e 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -52,6 +52,7 @@ icon_size = 48 black_market_value = KILL_MENDOZA dead_black_market_value = 50 + light_system = MOVABLE_LIGHT var/obj/item/clothing/suit/wear_suit = null var/obj/item/clothing/head/head = null var/obj/item/r_store = null @@ -755,9 +756,6 @@ /mob/living/carbon/xenomorph/start_pulling(atom/movable/AM, lunge, no_msg) - if(next_move >= world.time) - return FALSE - if(SEND_SIGNAL(AM, COMSIG_MOVABLE_XENO_START_PULLING, src) & COMPONENT_ALLOW_PULL) return do_pull(AM, lunge, no_msg) @@ -813,7 +811,7 @@ //and display them add_to_all_mob_huds() var/datum/mob_hud/MH = huds[MOB_HUD_XENO_INFECTION] - MH.add_hud_to(src) + MH.add_hud_to(src, src) /mob/living/carbon/xenomorph/check_improved_pointing() @@ -1073,6 +1071,7 @@ . = ..() if (.) UnregisterSignal(src, COMSIG_XENO_PRE_HEAL) + handle_luminosity() /mob/living/carbon/xenomorph/proc/cancel_heal() SIGNAL_HANDLER @@ -1089,7 +1088,7 @@ handle_ghost_message() /mob/living/carbon/xenomorph/proc/handle_ghost_message() - announce_dchat("[src] ([mutation_type] [caste_type]) has ghosted and their body is up for grabs!", src) + notify_ghosts("[src] ([mutation_type] [caste_type]) has ghosted and their body is up for grabs!", source = src) /mob/living/carbon/xenomorph/larva/handle_ghost_message() if(locate(/obj/effect/alien/resin/special/pylon/core) in range(2, get_turf(src))) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm index dff6c82efbf8..6748b662b118 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm @@ -298,7 +298,7 @@ xeno.visible_message(SPAN_XENOWARNING("The [xeno] fires a blast of acid at [target]!"), SPAN_XENOWARNING("You fire a blast of acid at [target]!")) var/turf/target_turf = locate(target.x, target.y, target.z) - var/obj/item/projectile/proj = new(xeno.loc, create_cause_data("acid shotgun", xeno)) + var/obj/projectile/proj = new(xeno.loc, create_cause_data("acid shotgun", xeno)) var/datum/ammo/ammoDatum = new ammo_type() proj.generate_bullet(ammoDatum) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index a9cffb196cb3..7a8151d8aa02 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -778,7 +778,7 @@ SPAN_XENOWARNING("You spit a [xeno.ammo.name] at [atom]!") ) playsound(xeno.loc, sound_to_play, 25, 1) - var/obj/item/projectile/proj = new (current_turf, create_cause_data(xeno.ammo.name, xeno)) + var/obj/projectile/proj = new (current_turf, create_cause_data(xeno.ammo.name, xeno)) proj.generate_bullet(xeno.ammo) proj.permutated += xeno proj.def_zone = xeno.get_limbzone_target() 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 70666e83bc74..3975a229bbc1 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 @@ -218,7 +218,7 @@ stabbing_xeno.visible_message(SPAN_XENODANGER("\The [stabbing_xeno] uncoils and wildly throws out its tail!"), SPAN_XENODANGER("You uncoil your tail wildly in front of you!")) - var/obj/item/projectile/hook_projectile = new /obj/item/projectile(stabbing_xeno.loc, create_cause_data(initial(stabbing_xeno.caste_type), stabbing_xeno)) + var/obj/projectile/hook_projectile = new /obj/projectile(stabbing_xeno.loc, create_cause_data(initial(stabbing_xeno.caste_type), stabbing_xeno)) var/datum/ammo/ammoDatum = GLOB.ammo_list[/datum/ammo/xeno/oppressor_tail] diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm index 9107a9670048..cd4533eabc83 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm @@ -521,7 +521,7 @@ X.visible_message(SPAN_XENOWARNING("The [X] fires their spikes at [A]!"), SPAN_XENOWARNING("You fire your spikes at [A]!")) var/turf/target = locate(A.x, A.y, A.z) - var/obj/item/projectile/P = new /obj/item/projectile(X.loc, create_cause_data(initial(X.caste_type), X)) + var/obj/projectile/P = new /obj/projectile(X.loc, create_cause_data(initial(X.caste_type), X)) var/datum/ammo/ammoDatum = GLOB.ammo_list[ammo_type] 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 64e4b73cfbd2..708334d31a96 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 @@ -15,7 +15,7 @@ X.visible_message(SPAN_XENOWARNING("[X] fires a burst of bone chips at [A]!"), SPAN_XENOWARNING("You fire a burst of bone chips at [A]!")) var/turf/target = locate(A.x, A.y, A.z) - var/obj/item/projectile/P = new /obj/item/projectile(X.loc, create_cause_data(initial(X.caste_type), X)) + var/obj/projectile/P = new /obj/projectile(X.loc, create_cause_data(initial(X.caste_type), X)) var/datum/ammo/ammoDatum = GLOB.ammo_list[ammo_type] @@ -146,30 +146,30 @@ /datum/action/xeno_action/activable/acider_for_the_hive/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner + var/mob/living/carbon/xenomorph/xeno = owner - if(!istype(X)) + if(!istype(xeno)) return - if(!isturf(X.loc)) - to_chat(X, SPAN_XENOWARNING("It is too cramped in here to activate this!")) + if(!isturf(xeno.loc)) + to_chat(xeno, SPAN_XENOWARNING("It is too cramped in here to activate this!")) return - var/area/xeno_area = get_area(X) + var/area/xeno_area = get_area(xeno) if(xeno_area.flags_area & AREA_CONTAINMENT) - to_chat(X, SPAN_XENOWARNING("You can't activate this here!")) + to_chat(xeno, SPAN_XENOWARNING("You can't activate this here!")) return - if(!X.check_state()) + if(!xeno.check_state()) return if(!action_cooldown_check()) return - if(X.mutation_type != RUNNER_ACIDER) + if(xeno.mutation_type != RUNNER_ACIDER) return - var/datum/behavior_delegate/runner_acider/BD = X.behavior_delegate + var/datum/behavior_delegate/runner_acider/BD = xeno.behavior_delegate if(!istype(BD)) return @@ -178,19 +178,22 @@ return if(BD.acid_amount < minimal_acid) - to_chat(X, SPAN_XENOWARNING("Not enough acid built up for an explosion.")) + to_chat(xeno, SPAN_XENOWARNING("Not enough acid built up for an explosion.")) return - to_chat(X, SPAN_XENOWARNING("Your stomach starts turning and twisting, getting ready to compress the built up acid.")) - X.color = "#22FF22" - X.SetLuminosity(3) + notify_ghosts(header = "For the Hive!", message = "[xeno] is going to explode for the Hive!", source = xeno, action = NOTIFY_ORBIT) + + to_chat(xeno, SPAN_XENOWARNING("Your stomach starts turning and twisting, getting ready to compress the built up acid.")) + xeno.color = "#22FF22" + xeno.set_light_color("#22FF22") + xeno.set_light_range(3) BD.caboom_trigger = TRUE BD.caboom_left = BD.caboom_timer BD.caboom_last_proc = 0 - X.set_effect(BD.caboom_timer*2, SUPERSLOW) + xeno.set_effect(BD.caboom_timer*2, SUPERSLOW) - X.say(";FOR THE HIVE!!!") + xeno.say(";FOR THE HIVE!!!") return ..() /datum/action/xeno_action/activable/acider_for_the_hive/proc/cancel_ability() @@ -204,7 +207,7 @@ behavior.caboom_trigger = FALSE xeno.color = null - xeno.SetLuminosity(0) + xeno.set_light_range(0) behavior.modify_acid(-behavior.max_acid / 4) // Done this way rather than setting to 0 in case something else slowed us diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/sentinel/sentinel_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/sentinel/sentinel_powers.dm index 58384a01a3fa..b058756d3ef8 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/sentinel/sentinel_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/sentinel/sentinel_powers.dm @@ -21,7 +21,7 @@ playsound(xeno.loc, sound_to_play, 25, 1) xeno.ammo = GLOB.ammo_list[/datum/ammo/xeno/toxin] - var/obj/item/projectile/projectile = new /obj/item/projectile(current_turf, create_cause_data(initial(xeno.caste_type), xeno)) + var/obj/projectile/projectile = new /obj/projectile(current_turf, create_cause_data(initial(xeno.caste_type), xeno)) projectile.generate_bullet(xeno.ammo) projectile.permutated += xeno projectile.def_zone = xeno.get_limbzone_target() @@ -56,7 +56,7 @@ playsound(xeno.loc, sound_to_play, 25, 1) xeno.ammo = GLOB.ammo_list[/datum/ammo/xeno/toxin/shotgun] - var/obj/item/projectile/projectile = new /obj/item/projectile(current_turf, create_cause_data(initial(xeno.caste_type), xeno)) + var/obj/projectile/projectile = new /obj/projectile(current_turf, create_cause_data(initial(xeno.caste_type), xeno)) projectile.generate_bullet(xeno.ammo) projectile.permutated += xeno projectile.def_zone = xeno.get_limbzone_target() diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 8e64afa3f733..25f6108c14f6 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -851,7 +851,7 @@ playsound(src, "glassbreak", 70, 1) damaged = TRUE if(is_lit) - SetLuminosity(0) + set_light(0) update_icon() else playsound(loc, 'sound/effects/Glasshit.ogg', 25, 1) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index 8a7425e2071a..b83b33e2eee5 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -391,6 +391,7 @@ . = ..() if(!is_admin_level(z))//so admins can safely spawn Queens in Thunderdome for tests. xeno_message(SPAN_XENOANNOUNCE("A new Queen has risen to lead the Hive! Rejoice!"),3,hivenumber) + notify_ghosts(header = "New Queen", message = "A new Queen has risen.", source = src, action = NOTIFY_ORBIT) playsound(loc, 'sound/voice/alien_queen_command.ogg', 75, 0) set_resin_build_order(GLOB.resin_build_order_drone) for(var/datum/action/xeno_action/action in actions) diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index 56f9460f5c71..d81413b68651 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -14,7 +14,7 @@ if(SSticker?.mode?.hardcore) ghostize() - SetLuminosity(0) + set_light_range(0) if(pulledby) pulledby.stop_pulling() @@ -61,6 +61,7 @@ message_alien_candidates(players_with_xeno_pref, dequeued = count) if(hive && hive.living_xeno_queen == src) + notify_ghosts(header = "Queen Death", message = "The Queen has been slain!", source = src, action = NOTIFY_ORBIT) xeno_message(SPAN_XENOANNOUNCE("A sudden tremor ripples through the hive... the Queen has been slain! Vengeance!"),3, hivenumber) hive.slashing_allowed = XENO_SLASH_ALLOWED hive.set_living_xeno_queen(null) @@ -129,7 +130,7 @@ // Tell the xeno she is the last one. if(X.client) to_chat(X, SPAN_XENOANNOUNCE("Your carapace rattles with dread. You are all that remains of the hive!")) - announce_dchat("There is only one Xenomorph left: [X.name].", X) + notify_ghosts(header = "Last Xenomorph", message = "There is only one Xenomorph left: [X.name].", source = X, action = NOTIFY_ORBIT) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_XENO_DEATH, src, gibbed) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index 6f9a667642e3..65839e9c8caf 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -201,7 +201,8 @@ blinded = TRUE set_stat(UNCONSCIOUS) else - blinded = FALSE + if(!interference)//If their connection to hivemind is affected, their vision should be too. + blinded = FALSE set_stat(CONSCIOUS) if(regular_update && halloss > 0) if(resting) @@ -544,7 +545,11 @@ Make sure their actual health updates immediately.*/ new_luminosity += caste.caste_luminosity if(on_fire) new_luminosity += min(fire_stacks, 5) - SetLuminosity(new_luminosity) // light up xenos + set_light_range(new_luminosity) // light up xenos + if(new_luminosity) + set_light_on(TRUE) + else + set_light_on(FALSE) /mob/living/carbon/xenomorph/handle_stunned() if(stunned) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm index 7e5773e5aec5..e85a9f2c1700 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm @@ -24,7 +24,6 @@ var/mob/living/carbon/xenomorph/carrier/carrier = mutator_set.xeno if(!istype(carrier)) return FALSE - carrier.mutation_type = CARRIER_EGGSAC carrier.plasma_types = list(PLASMA_EGG) carrier.phero_modifier += XENO_PHERO_MOD_LARGE // praetorian level pheremones carrier.plasmapool_modifier = 1.2 @@ -37,6 +36,7 @@ carrier.huggers_cur = 0 carrier.huggers_max = 0 carrier.update_hugger_overlays() + carrier.mutation_type = CARRIER_EGGSAC carrier.update_eggsac_overlays() carrier.eggs_max = 12 carrier.egg_planting_range = 2 diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm index c2bf91edde6e..1de164fccc85 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -351,11 +351,17 @@ var/hugger_timelock = 15 MINUTES /// How many huggers can the hive support var/playable_hugger_limit = 0 + /// Minimum number of huggers available at any hive size + var/playable_hugger_minimum = 2 + /// This number divides the total xenos counted for slots to give the max number of facehuggers + var/playable_hugger_max_divisor = 4 /// How many lesser drones the hive can support var/lesser_drone_limit = 0 /// Slots available for lesser drones will never go below this number - var/lesser_drone_minimum = 3 + var/lesser_drone_minimum = 2 + /// This number divides the total xenos counted for slots to give the max number of lesser drones + var/playable_lesser_drones_max_divisor = 3 var/datum/tacmap/xeno/tacmap var/minimap_type = MINIMAP_FLAG_XENO @@ -1035,7 +1041,12 @@ return TRUE /datum/hive_status/proc/update_hugger_limit() - playable_hugger_limit = 2 + Ceiling(totalXenos.len / 4) + var/countable_xeno_iterator = 0 + for(var/mob/living/carbon/xenomorph/cycled_xeno as anything in totalXenos) + if(cycled_xeno.counts_for_slots) + countable_xeno_iterator++ + + playable_hugger_limit = max(Floor(countable_xeno_iterator / playable_hugger_max_divisor), playable_hugger_minimum) /datum/hive_status/proc/can_spawn_as_hugger(mob/dead/observer/user) if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) @@ -1086,9 +1097,14 @@ hugger.timeofdeath = user.timeofdeath // Keep old death time /datum/hive_status/proc/update_lesser_drone_limit() - lesser_drone_limit = lesser_drone_minimum + Ceiling(length(totalXenos) / 3) + var/countable_xeno_iterator = 0 + for(var/mob/living/carbon/xenomorph/cycled_xeno as anything in totalXenos) + if(cycled_xeno.counts_for_slots) + countable_xeno_iterator++ + + lesser_drone_limit = max(Floor(countable_xeno_iterator / playable_lesser_drones_max_divisor), lesser_drone_minimum) -/datum/hive_status/proc/can_spawn_as_lesser_drone(mob/dead/observer/user) +/datum/hive_status/proc/can_spawn_as_lesser_drone(mob/dead/observer/user, obj/effect/alien/resin/special/pylon/spawning_pylon) if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) return FALSE @@ -1109,8 +1125,8 @@ to_chat(user, SPAN_WARNING("The selected hive does not have a Queen!")) return FALSE - if(!living_xeno_queen.ovipositor && !SSticker.mode.is_in_endgame) - to_chat(user, SPAN_WARNING("The selected hive does not have a Queen on Ovipositor!")) + if(spawning_pylon.lesser_drone_spawns < 1) + to_chat(user, SPAN_WARNING("The selected core or pylon does not have enough power for a lesser drone!")) return FALSE update_lesser_drone_limit() @@ -1120,9 +1136,6 @@ if(islesserdrone(mob)) current_lesser_drone_count++ - if(tgui_alert(user, "Are you sure you want to become a lesser drone?", "Confirmation", list("Yes", "No")) != "Yes") - return FALSE - if(lesser_drone_limit <= current_lesser_drone_count) to_chat(user, SPAN_WARNING("[GLOB.hive_datum[hivenumber]] cannot support more lesser drones! Limit: [current_lesser_drone_count]/[lesser_drone_limit]")) return FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm index 583d26de3ee5..94218b224e2d 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm @@ -83,9 +83,9 @@ var/datum/mob_hud/H = huds[MOB_HUD_XENO_STATUS] if (xeno_mobhud) - H.remove_hud_from(usr) + H.remove_hud_from(usr, usr) else - H.add_hud_to(usr) + H.add_hud_to(usr, usr) xeno_mobhud = !xeno_mobhud @@ -96,9 +96,9 @@ var/datum/mob_hud/H = huds[MOB_HUD_XENO_HOSTILE] if (xeno_hostile_hud) - H.remove_hud_from(usr) + H.remove_hud_from(usr, usr) else - H.add_hud_to(usr) + H.add_hud_to(usr, usr) xeno_hostile_hud = !xeno_hostile_hud diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d74003cde331..fa33af97275e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -148,7 +148,6 @@ on_fire = FALSE fire_stacks = 0 update_fire() - SetLuminosity(0) return TRUE return FALSE diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e5934f4fa13b..45eb43c91773 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -22,6 +22,8 @@ var/list/department_radio_keys = list( ":o" = RADIO_CHANNEL_COLONY, ".o" = RADIO_CHANNEL_COLONY, "#o" = RADIO_CHANNEL_PMC_CCT, ":z" = RADIO_CHANNEL_HIGHCOM, ".z" = RADIO_CHANNEL_HIGHCOM, "#z" = RADIO_CHANNEL_PMC_CMD, ":k" = SQUAD_SOF, ".k" = SQUAD_SOF, "#k" = RADIO_CHANNEL_WY_WO, + ":q" = RADIO_CHANNEL_ROYAL_MARINE, ".q" = RADIO_CHANNEL_ROYAL_MARINE, + ":r" = RADIO_CHANNEL_PROVOST, ".r" = RADIO_CHANNEL_PROVOST, "#r" = RADIO_CHANNEL_PROVOST, ":I" = RADIO_CHANNEL_INTERCOM, ".I" = RADIO_CHANNEL_INTERCOM, "#I" = RADIO_CHANNEL_INTERCOM, ":H" = RADIO_CHANNEL_DEPARTMENT, ".H" = RADIO_CHANNEL_DEPARTMENT, "#H" = RADIO_CHANNEL_DEPARTMENT, @@ -45,6 +47,8 @@ var/list/department_radio_keys = list( ":O" = RADIO_CHANNEL_COLONY, ".O" = RADIO_CHANNEL_COLONY, "#O" = RADIO_CHANNEL_PMC_CCT, ":Z" = RADIO_CHANNEL_HIGHCOM, ".Z" = RADIO_CHANNEL_HIGHCOM, "#Z" = RADIO_CHANNEL_PMC_CMD, ":K" = SQUAD_SOF, ".K" = SQUAD_SOF, "#K" = RADIO_CHANNEL_WY_WO, + ":Q" = RADIO_CHANNEL_ROYAL_MARINE, ".Q" = RADIO_CHANNEL_ROYAL_MARINE, + ":R" = RADIO_CHANNEL_PROVOST, ".R" = RADIO_CHANNEL_PROVOST, "#R" = RADIO_CHANNEL_PROVOST, ) /proc/channel_to_prefix(channel) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 49dc25bd57ea..18d6ece8e238 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -355,13 +355,13 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/reset_view(atom/A) if(camera) - camera.SetLuminosity(0) + camera.set_light(0) if(istype(A,/obj/structure/machinery/camera)) camera = A ..() if(istype(A,/obj/structure/machinery/camera)) - if(camera_light_on) A.SetLuminosity(AI_CAMERA_LUMINOSITY) - else A.SetLuminosity(0) + if(camera_light_on) A.set_light(AI_CAMERA_LUMINOSITY) + else A.set_light(0) /mob/living/silicon/ai/proc/switchCamera(obj/structure/machinery/camera/C) @@ -539,7 +539,7 @@ var/list/ai_verbs_default = list( to_chat(src, "Camera lights [camera_light_on ? "activated" : "deactivated"].") if(!camera_light_on) if(camera) - camera.SetLuminosity(0) + camera.set_light(0) camera = null else lightNearbyCamera() @@ -554,20 +554,20 @@ var/list/ai_verbs_default = list( if(src.camera) var/obj/structure/machinery/camera/camera = near_range_camera(src.eyeobj) if(camera && src.camera != camera) - src.camera.SetLuminosity(0) + src.camera.set_light(0) if(!camera.light_disabled) src.camera = camera - src.camera.SetLuminosity(AI_CAMERA_LUMINOSITY) + src.camera.set_light(AI_CAMERA_LUMINOSITY) else src.camera = null else if(isnull(camera)) - src.camera.SetLuminosity(0) + src.camera.set_light(0) src.camera = null else var/obj/structure/machinery/camera/camera = near_range_camera(src.eyeobj) if(camera && !camera.light_disabled) src.camera = camera - src.camera.SetLuminosity(AI_CAMERA_LUMINOSITY) + src.camera.set_light(AI_CAMERA_LUMINOSITY) camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds. diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm index 162bc4acc45e..a7109f491740 100644 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm @@ -29,12 +29,12 @@ . = ..() // STRUCTURES -/obj/structure/Destroy() +/obj/structure/Destroy(force) if(z && SSatoms.initialized != INITIALIZATION_INSSATOMS) cameranet.updateVisibility(src) . = ..() -/obj/structure/Initialize() +/obj/structure/Initialize(mapload, ...) . = ..() if(z && SSatoms.initialized != INITIALIZATION_INSSATOMS) cameranet.updateVisibility(src) @@ -97,7 +97,7 @@ if(can_use()) cameranet.addCamera(src) else - SetLuminosity(0) + set_light(0) cameranet.removeCamera(src) /obj/structure/machinery/camera/Initialize() diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 070ec202803e..5b190143f5bc 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -47,7 +47,7 @@ forceMove(T.loc) if (istype(loc, /area)) //stage = 4 - if (!loc.master.power_equip && !istype(src.loc,/obj/item)) + if (!loc.power_equip && !istype(src.loc,/obj/item)) //stage = 5 blind = 1 @@ -95,7 +95,7 @@ src.see_in_dark = 0 src.see_invisible = SEE_INVISIBLE_LIVING - if (((!loc.master.power_equip) || istype(T, /turf/open/space)) && !istype(src.loc,/obj/item)) + if (((!loc.power_equip) || istype(T, /turf/open/space)) && !istype(src.loc,/obj/item)) if (src:aiRestorePowerRoutine==0) src:aiRestorePowerRoutine = 1 @@ -106,7 +106,7 @@ spawn(20) to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.") sleep(50) - if (loc.master.power_equip) + if (loc.power_equip) if (!istype(T, /turf/open/space)) to_chat(src, "Alert cancelled. Power has been restored without our assistance.") src:aiRestorePowerRoutine = 0 @@ -133,18 +133,17 @@ var/PRP //like ERP with the code, at least this stuff is no more 4x sametext for (PRP=1, PRP<=4, PRP++) var/area/AIarea = get_area(src) - for(var/area/A in AIarea.master.related) - for (var/obj/structure/machinery/power/apc/APC in A) - if (!(APC.stat & BROKEN)) - theAPC = APC - break + for (var/obj/structure/machinery/power/apc/APC in AIarea) + if (!(APC.stat & BROKEN)) + theAPC = APC + break if (!theAPC) switch(PRP) if (1) to_chat(src, "Unable to locate APC!") else to_chat(src, "Lost connection with the APC!") src:aiRestorePowerRoutine = 2 return - if (loc.master.power_equip) + if (loc.power_equip) if (!istype(T, /turf/open/space)) to_chat(src, "Alert cancelled. Power has been restored without our assistance.") src:aiRestorePowerRoutine = 0 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index e623b499a686..21ddaf76b33c 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -56,7 +56,7 @@ src.has_power = 0 if(lights_on) // Light is on but there is no power! lights_on = 0 - SetLuminosity(0) + set_light(0) /mob/living/silicon/robot/handle_regular_status_updates(regular_update = TRUE) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7edcb7d4fede..4ad29179daec 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -337,9 +337,9 @@ var/list/robot_verbs_default = list( lights_on = !lights_on to_chat(usr, "You [lights_on ? "enable" : "disable"] your integrated light.") if(lights_on) - SetLuminosity(integrated_light_power) // 1.5x luminosity of flashlight + set_light(integrated_light_power) // 1.5x luminosity of flashlight else - SetLuminosity(0) + set_light(0) /mob/living/silicon/robot/verb/self_diagnosis_verb() set category = "Robot Commands" @@ -408,7 +408,7 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/is_mob_restrained() return 0 -/mob/living/silicon/robot/bullet_act(obj/item/projectile/Proj) +/mob/living/silicon/robot/bullet_act(obj/projectile/Proj) ..(Proj) if(prob(75) && Proj.damage > 0) spark_system.start() return 2 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 2910da65cb79..b0f08acc33fa 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -160,11 +160,11 @@ if(HUD_toggled[HUD_nbr]) HUD_toggled[HUD_nbr] = 0 - H.remove_hud_from(src) + H.remove_hud_from(src, src) to_chat(src, SPAN_NOTICE(" [hud_choice] Disabled")) else HUD_toggled[HUD_nbr] = 1 - H.add_hud_to(src) + H.add_hud_to(src, src) to_chat(src, SPAN_NOTICE(" [hud_choice] Enabled")) /mob/living/silicon/verb/pose() diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 3bebedfc12c8..ffe85017bb28 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -122,7 +122,7 @@ else wound_icon_carrier.icon_state = "[caste_name]_walk_[health_threshold]" -/mob/living/simple_animal/hostile/alien/bullet_act(obj/item/projectile/P) +/mob/living/simple_animal/hostile/alien/bullet_act(obj/projectile/P) . = ..() if(P.damage) var/splatter_dir = get_dir(P.starting, loc)//loc is the xeno getting hit, P.starting is the turf of where the projectile got spawned @@ -187,8 +187,8 @@ // melee_damage_lower = 15 // melee_damage_upper = 15 // ranged = 1 -// projectiletype = /obj/item/projectile/neurotox +// projectiletype = /obj/projectile/neurotox // projectilesound = 'sound/weapons/pierce.ogg' -/obj/item/projectile/neurotox +/obj/projectile/neurotox damage = 30 icon_state = "toxin" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 9266e67db495..3d37f8ea57c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -20,7 +20,7 @@ health = 300 maxHealth = 300 speed = 8 - projectiletype = /obj/item/projectile/beam/drone + projectiletype = /obj/projectile/beam/drone projectilesound = 'sound/weapons/Laser3.ogg' destroy_surroundings = 0 var/datum/effect_system/ion_trail_follow/ion_trail @@ -52,7 +52,7 @@ /mob/living/simple_animal/hostile/retaliate/malf_drone/Initialize() . = ..() if(prob(5)) - projectiletype = /obj/item/projectile/beam/pulse/drone + projectiletype = /obj/projectile/beam/pulse/drone projectilesound = 'sound/weapons/pulse2.ogg' ion_trail = new ion_trail.set_up(src) @@ -215,8 +215,8 @@ return ..() -/obj/item/projectile/beam/drone +/obj/projectile/beam/drone damage = 15 -/obj/item/projectile/beam/pulse/drone +/obj/projectile/beam/pulse/drone damage = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 9d13ae92bd1c..1394ec113e6b 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -40,7 +40,7 @@ corpse = /obj/effect/landmark/corpsespawner/russian/ranged weapon1 = /obj/item/weapon/gun/pistol ranged = 1 - projectiletype = /obj/item/projectile + projectiletype = /obj/projectile projectilesound = 'sound/weapons/Gunshot.ogg' casingtype = null @@ -84,7 +84,7 @@ /mob/living/simple_animal/hostile/UPP/ranged //weapon1 = /obj/item/weapon/gun/projectile/mateba ranged = 1 - projectiletype = /obj/item/projectile + projectiletype = /obj/projectile projectilesound = 'sound/weapons/Gunshot.ogg' casingtype = null diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 36dd6402f9b0..0f15bd1d8f7b 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -254,7 +254,7 @@ return //Bullets -/mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/Proj) +/mob/living/simple_animal/parrot/bullet_act(obj/projectile/Proj) ..() if(!stat && !client) if(parrot_state == PARROT_PERCH) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 06df71427e4f..4dfa0644aa21 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -327,7 +327,6 @@ if (exterior_lighting) exterior_lighting.alpha = min(GLOB.minimum_exterior_lighting_alpha, lighting_alpha) - //puts the item "W" into an appropriate slot in a human's inventory //returns 0 if it cannot, 1 if successful /mob/proc/equip_to_appropriate_slot(obj/item/W, ignore_delay = 1, list/slot_equipment_priority = DEFAULT_SLOT_PRIORITY) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index b469052104fd..3e765e167ec1 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -271,6 +271,9 @@ /// User is thinking in character. Used to revert to thinking state after stop_typing var/thinking_IC = FALSE + // contains /atom/movable/screen/alert only + var/list/alerts = list() + /mob/vv_get_dropdown() . = ..() VV_DROPDOWN_OPTION(VV_HK_EXPLODE, "Trigger Explosion") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 74085a3b960c..efd05f15c269 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -528,3 +528,69 @@ var/global/list/limb_types_by_name = list( /mob/proc/get_paygrade() return + + +/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, enter_text = null, atom/source = null, mutable_appearance/alert_overlay = null, action = NOTIFY_JUMP, flashwindow = FALSE, ignore_mapload = TRUE, ignore_key, header = null, notify_volume = 100, extra_large = FALSE) //Easy notification of ghosts. + if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load + return + for(var/mob/dead/observer/ghost as anything in GLOB.observer_list) + if(!ghost.client) + continue + ghost.notify_ghost(message, ghost_sound, enter_link, enter_text, source, alert_overlay, action, flashwindow, ignore_mapload, ignore_key, header, notify_volume, extra_large) + +/mob/dead/observer/proc/notify_ghost(message, ghost_sound, enter_link, enter_text, atom/source, mutable_appearance/alert_overlay, action = NOTIFY_JUMP, flashwindow = FALSE, ignore_mapload = TRUE, ignore_key, header, notify_volume = 100, extra_large = FALSE) //Easy notification of a single ghosts. + if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load + return + if(!client) + return + var/track_link + if (source && action == NOTIFY_ORBIT) + track_link = " (Follow)" + if (source && action == NOTIFY_JUMP) + var/turf/T = get_turf(source) + track_link = " (Jump)" + var/full_enter_link + if (enter_link) + full_enter_link = "[(enter_text) ? "[enter_text]" : "(Claim)"]" + to_chat(src, "[(extra_large) ? "

" : ""][SPAN_DEADSAY("[message][(enter_link) ? " [full_enter_link]" : ""][track_link]")][(extra_large) ? "

" : ""]") + if(ghost_sound) + SEND_SOUND(src, sound(ghost_sound, volume = notify_volume, channel = SOUND_CHANNEL_NOTIFY)) + if(flashwindow) + window_flash(client) + + if(!source) + return + + var/atom/movable/screen/alert/notify_action/screen_alert = throw_alert("[REF(source)]_notify_action", /atom/movable/screen/alert/notify_action) + if(!screen_alert) + return + if (header) + screen_alert.name = header + screen_alert.desc = message + screen_alert.action = action + screen_alert.target = source + if(!alert_overlay) + alert_overlay = new(source) + var/icon/source_icon = icon(source.icon) + var/iheight = source_icon.Height() + var/iwidth = source_icon.Width() + var/higher_power = (iheight > iwidth) ? iheight : iwidth + 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.layer = FLOAT_LAYER + alert_overlay.plane = FLOAT_PLANE + + screen_alert.overlays += alert_overlay + +/mob/proc/reset_lighting_alpha() + SIGNAL_HANDLER + + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sync_lighting_plane_alpha() + diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 9f88f0f9d611..5da499dabc52 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -228,6 +228,7 @@ new_player_panel() /mob/new_player/proc/AttemptLateSpawn(rank) + var/datum/job/player_rank = RoleAuthority.roles_for_mode[rank] if (src != usr) return if(SSticker.current_state != GAME_STATE_PLAYING) @@ -236,7 +237,7 @@ if(!enter_allowed) to_chat(usr, SPAN_WARNING("There is an administrative lock on entering the game! (The dropship likely crashed into the Almayer. This should take at most 20 minutes.)")) return - if(!RoleAuthority.assign_role(src, RoleAuthority.roles_for_mode[rank], 1)) + if(!RoleAuthority.assign_role(src, player_rank, 1)) to_chat(src, alert("[rank] is not available. Please try another.")) return @@ -244,16 +245,16 @@ close_spawn_windows() var/mob/living/carbon/human/character = create_character(TRUE) //creates the human and transfers vars and mind - RoleAuthority.equip_role(character, RoleAuthority.roles_for_mode[rank], late_join = TRUE) + RoleAuthority.equip_role(character, player_rank, late_join = TRUE) EquipCustomItems(character) - if(security_level > SEC_LEVEL_BLUE || EvacuationAuthority.evac_status) + if((security_level > SEC_LEVEL_BLUE || EvacuationAuthority.evac_status) && player_rank.gets_emergency_kit) to_chat(character, SPAN_HIGHDANGER("As you stagger out of hypersleep, the sleep bay blares: '[EvacuationAuthority.evac_status ? "VESSEL UNDERGOING EVACUATION PROCEDURES, SELF DEFENSE KIT PROVIDED" : "VESSEL IN HEIGHTENED ALERT STATUS, SELF DEFENSE KIT PROVIDED"]'.")) character.put_in_hands(new /obj/item/storage/box/kit/cryo_self_defense(character.loc)) GLOB.data_core.manifest_inject(character) SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - SSticker.mode.latejoin_tally += RoleAuthority.calculate_role_weight(RoleAuthority.roles_for_mode[rank]) + SSticker.mode.latejoin_tally += RoleAuthority.calculate_role_weight(player_rank) for(var/datum/squad/sq in RoleAuthority.squads) if(sq) diff --git a/code/modules/mob/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/new_player/sprite_accessories/undershirt.dm index cc2281f5e848..39f0e3ddd173 100644 --- a/code/modules/mob/new_player/sprite_accessories/undershirt.dm +++ b/code/modules/mob/new_player/sprite_accessories/undershirt.dm @@ -32,15 +32,16 @@ GLOBAL_LIST_INIT_TYPED(undershirt_f, /datum/sprite_accessory/undershirt, setup_u /datum/sprite_accessory/undershirt/proc/get_image(mob_gender) var/selected_icon_state = icon_state if(camo_conforming) - switch(SSmapping.configs[GROUND_MAP].map_name) // maploader TODO: json - if(MAP_PRISON_STATION, MAP_PRISON_STATION_V3, MAP_LV522_CHANCES_CLAIM) + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("classic") selected_icon_state = "c_" + selected_icon_state - if(MAP_LV_624, MAP_RUNTIME, MAP_NEW_VARADERO) + if("jungle") selected_icon_state = "j_" + selected_icon_state - if(MAP_WHISKEY_OUTPOST, MAP_DESERT_DAM, MAP_BIG_RED, MAP_KUTJEVO) + if("desert") selected_icon_state = "d_" + selected_icon_state - if(MAP_CORSAT, MAP_SOROKYNE_STRATA, MAP_ICE_COLONY, MAP_ICE_COLONY_V3) + if("snow") selected_icon_state = "s_" + selected_icon_state + if(gender == PLURAL) selected_icon_state += mob_gender == MALE ? "_m" : "_f" return image(icon, selected_icon_state) diff --git a/code/modules/mob/new_player/sprite_accessories/underwear.dm b/code/modules/mob/new_player/sprite_accessories/underwear.dm index a558b9459d25..200f3f2f67f7 100644 --- a/code/modules/mob/new_player/sprite_accessories/underwear.dm +++ b/code/modules/mob/new_player/sprite_accessories/underwear.dm @@ -32,14 +32,14 @@ GLOBAL_LIST_INIT_TYPED(underwear_f, /datum/sprite_accessory/underwear, setup_und /datum/sprite_accessory/underwear/proc/get_image(mob_gender) var/selected_icon_state = icon_state if(camo_conforming) - switch(SSmapping.configs[GROUND_MAP].map_name) // maploader TODO: json - if(MAP_PRISON_STATION, MAP_PRISON_STATION_V3, MAP_LV522_CHANCES_CLAIM) + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("classic") selected_icon_state = "c_" + selected_icon_state - if(MAP_LV_624, MAP_RUNTIME, MAP_NEW_VARADERO) + if("jungle") selected_icon_state = "j_" + selected_icon_state - if(MAP_WHISKEY_OUTPOST, MAP_DESERT_DAM, MAP_BIG_RED, MAP_KUTJEVO) + if("desert") selected_icon_state = "d_" + selected_icon_state - if(MAP_CORSAT, MAP_SOROKYNE_STRATA, MAP_ICE_COLONY, MAP_ICE_COLONY_V3) + if("snow") selected_icon_state = "s_" + selected_icon_state if(gender == PLURAL) selected_icon_state += mob_gender == MALE ? "_m" : "_f" diff --git a/code/modules/movement/movement.dm b/code/modules/movement/movement.dm index ee2a184518a0..da0c76cba9d5 100644 --- a/code/modules/movement/movement.dm +++ b/code/modules/movement/movement.dm @@ -92,12 +92,12 @@ /atom/movable/proc/Moved(atom/oldloc, direction, Forced = FALSE) SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, oldloc, direction, Forced) - if (isturf(loc)) - if (opacity) - oldloc.UpdateAffectingLights() - else - if (light) - light.changed() + for(var/datum/dynamic_light_source/light as anything in hybrid_light_sources) + light.source_atom.update_light() + if(!isturf(loc)) + light.find_containing_atom() + for(var/datum/static_light_source/L as anything in static_light_sources) // Cycle through the light sources on this atom and tell them to update. + L.source_atom.static_update_light() return TRUE /atom/movable/proc/forceMove(atom/destination) diff --git a/code/modules/nightmare/nmtasks/mapscheduler.dm b/code/modules/nightmare/nmtasks/mapscheduler.dm index 2a8279e13608..34ceecafb876 100644 --- a/code/modules/nightmare/nmtasks/mapscheduler.dm +++ b/code/modules/nightmare/nmtasks/mapscheduler.dm @@ -28,8 +28,6 @@ for(var/turf/T as anything in tainted) var/area/A = T.loc - if(!A?.lighting_use_dynamic) + if(!A?.area_has_base_lighting) continue - T.cached_lumcount = -1 // Invalidate lumcount to force update here - T.lighting_changed = TRUE - SSlighting.changed_turfs += T + T.update_light() diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm index 7d0261d971b9..58d0a4780681 100644 --- a/code/modules/organs/limbs.dm +++ b/code/modules/organs/limbs.dm @@ -71,6 +71,19 @@ var/status = LIMB_ORGANIC var/processing = FALSE + /// ethnicity of the owner, used for limb appearance, set in [/obj/limb/proc/update_limb()] + var/ethnicity = "western" + + /// body type of the owner, used for limb appearance, set in [/obj/limb/proc/update_limb()] + var/body_type = "mesomorphic" + + /// species of the owner, used for limb appearance, set in [/obj/limb/proc/update_limb()] + var/datum/species/species + + /// defines which sprite the limb should use if dimorphic, set in [/obj/limb/proc/update_limb()] + var/limb_gender = MALE + + /obj/limb/Initialize(mapload, obj/limb/P, mob/mob_owner) . = ..() if(P) @@ -81,12 +94,10 @@ if(mob_owner) owner = mob_owner - wound_overlay = image('icons/mob/humans/dam_human.dmi', "grayscale_0") - wound_overlay.blend_mode = BLEND_INSET_OVERLAY + wound_overlay = image('icons/mob/humans/dam_human.dmi', "grayscale_0", -DAMAGE_LAYER) wound_overlay.color = owner?.species.blood_color - burn_overlay = image('icons/mob/humans/dam_human.dmi', "burn_0") - burn_overlay.blend_mode = BLEND_INSET_OVERLAY + burn_overlay = image('icons/mob/humans/dam_human.dmi', "burn_0", -DAMAGE_LAYER) if(owner) forceMove(owner) @@ -361,7 +372,7 @@ SEND_SIGNAL(src, COMSIG_LIMB_TAKEN_DAMAGE, is_ff, previous_brute, previous_burn) owner.updatehealth() - update_icon() + owner.update_damage_overlays() start_processing() ///Special delimbs for different limbs @@ -651,7 +662,7 @@ This function completely restores a damaged organ to perfect condition. // sync the organ's damage with its wounds update_damages() - update_icon() + owner.update_damage_overlays() if(wound_disappeared) owner.update_med_icon() remove_wound_bleeding() @@ -670,74 +681,66 @@ This function completely restores a damaged organ to perfect condition. number_wounds += W.amount -/obj/limb/update_icon(forced = FALSE) - if(parent && parent.status & LIMB_DESTROYED) - overlays.Cut() - icon_state = "" - return +/// updates the various internal variables of the limb from the owner +/obj/limb/proc/update_limb() + SHOULD_CALL_PARENT(TRUE) - if(status & LIMB_DESTROYED) - if(forced) - overlays.Cut() - if(has_stump_icon && !(status & LIMB_AMPUTATED)) - icon = 'icons/mob/humans/dam_human.dmi' - icon_state = "stump_[icon_name]_bone" - var/image/blood_overlay = new('icons/mob/humans/dam_human.dmi', "stump_[icon_name]_blood") - blood_overlay.color = owner.species.blood_color - overlays += blood_overlay - else - icon_state = "" - return + var/datum/ethnicity/owner_ethnicity = GLOB.ethnicities_list[owner?.ethnicity] - var/race_icon = owner.species.icobase + if(owner_ethnicity) + ethnicity = owner_ethnicity.icon_name + else + ethnicity = "western" - if ((status & LIMB_ROBOT) && !(owner.species && owner.species.flags & IS_SYNTHETIC)) - overlays.Cut() - icon = 'icons/mob/robotic.dmi' - icon_state = "[icon_name]" - return + var/datum/body_type/owner_body_type = GLOB.body_types_list[owner?.body_type] - var/datum/ethnicity/E = GLOB.ethnicities_list[owner.ethnicity] - var/datum/body_type/B = GLOB.body_types_list[owner.body_type] + if(owner_body_type) + body_type = owner_body_type.icon_name + else + body_type = "mesomorphic" - var/e_icon - var/b_icon + if(isspeciesyautja(owner)) + ethnicity = owner.ethnicity + body_type = owner.body_type - if (!E) - e_icon = "western" - else - e_icon = E.icon_name + species = owner?.species ? owner.species : GLOB.all_species[SPECIES_HUMAN] + limb_gender = owner?.gender ? owner.gender : FEMALE - if (!B) - b_icon = "mesomorphic" - else - b_icon = B.icon_name +/// generates a list of overlays that should be applied to the owner +/obj/limb/proc/get_limb_icon() + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) - if(isspeciesyautja(owner)) - e_icon = owner.ethnicity - b_icon = owner.body_type + . = list() - icon = race_icon - icon_state = "[get_limb_icon_name(owner.species, b_icon, owner.gender, icon_name, e_icon)]" - wound_overlay.color = owner.species.blood_color + if(parent?.status & LIMB_DESTROYED) + return - var/n_is = damage_state_text() - if (forced || n_is != damage_state) - overlays.Cut() - damage_state = n_is - update_overlays() + if(status & LIMB_DESTROYED) + if(has_stump_icon && !(status & LIMB_AMPUTATED)) + . += image('icons/mob/humans/dam_human.dmi', "stump_[icon_name]_blood", -DAMAGE_LAYER) + return + var/image/limb = image(layer = -BODYPARTS_LAYER) -/obj/limb/proc/update_overlays() - var/brutestate = copytext(damage_state, 1, 2) - var/burnstate = copytext(damage_state, 2) - if(brutestate != "0") - wound_overlay.icon_state = "grayscale_[brutestate]" - overlays += wound_overlay + if ((status & LIMB_ROBOT) && !(owner.species && owner.species.flags & IS_SYNTHETIC)) + limb.icon = 'icons/mob/robotic.dmi' + limb.icon_state = "[icon_name]" + . += limb + return - if(burnstate != "0") - burn_overlay.icon_state = "burn_[burnstate]" - overlays += burn_overlay + limb.icon = species.icobase + limb.icon_state = "[get_limb_icon_name(species, body_type, limb_gender, icon_name, ethnicity)]" + + . += limb + + return + +/// generates a key for the purpose of caching the icon to avoid duplicate generations +/obj/limb/proc/get_limb_icon_key() + SHOULD_CALL_PARENT(TRUE) + + return "[species.name]-[body_type]-[limb_gender]-[icon_name]-[ethnicity]-[status]" // new damage icon system // returns just the brute/burn damage code @@ -774,7 +777,7 @@ This function completely restores a damaged organ to perfect condition. //Recursive setting of self and all child organs to amputated /obj/limb/proc/setAmputatedTree() status |= LIMB_AMPUTATED - update_icon(TRUE) + owner.update_body() for(var/obj/limb/O as anything in children) O.setAmputatedTree() @@ -1140,7 +1143,7 @@ treat_grafted var tells it to apply to grafted but unsalved wounds, for burn kit for(var/obj/limb/T as anything in children) T.robotize(uncalibrated = uncalibrated, synth_skin = synth_skin) - update_icon(TRUE) + owner.update_body(TRUE) /obj/limb/proc/calibrate_prosthesis() status &= ~LIMB_UNCALIBRATED_PROSTHETIC @@ -1243,6 +1246,20 @@ treat_grafted var tells it to apply to grafted but unsalved wounds, for burn kit owner.incision_depths[name] = SURGERY_DEPTH_SURFACE owner.active_surgeries[name] = null +/obj/limb/proc/get_damage_overlays() + . = list() + + damage_state = damage_state_text() + var/brutestate = copytext(damage_state, 1, 2) + if(brutestate != "0") + wound_overlay.icon_state = "grayscale_[icon_name]_[brutestate]" + . += wound_overlay + + var/burnstate = copytext(damage_state, 2) + if(burnstate != "0") + burn_overlay.icon_state = "burn_[icon_name]_[burnstate]" + . += wound_overlay + /* LIMB TYPES */ @@ -1389,17 +1406,36 @@ treat_grafted var tells it to apply to grafted but unsalved wounds, for burn kit bandage_icon_amount = 4 var/disfigured = 0 //whether the head is disfigured. -///Specifically, damage overlays. Severed limb gore effects are applied elsewhere. -/obj/limb/head/update_overlays() - ..() + var/eyes_r + var/eyes_g + var/eyes_b + + var/lip_style + +/obj/limb/head/update_limb() + . = ..() + + eyes_r = owner.r_eyes + eyes_g = owner.g_eyes + eyes_b = owner.b_eyes - var/image/eyes = new/image('icons/mob/humans/onmob/human_face.dmi', owner.species.eyes) + lip_style = owner.lip_style + +/obj/limb/head/get_limb_icon() + . = ..() + + var/image/eyes = image('icons/mob/humans/onmob/human_face.dmi', species.eyes, layer = -BODYPARTS_LAYER) eyes.color = list(null, null, null, null, rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes)) - overlays += eyes + . += eyes + + if(lip_style && (species && species.flags & HAS_LIPS)) + var/image/lips = image('icons/mob/humans/onmob/human_face.dmi', "paint_[lip_style]", layer = -BODYPARTS_LAYER) + . += lips + +/obj/limb/head/get_limb_icon_key() + . = ..() - if(owner.lip_style && (owner.species && owner.species.flags & HAS_LIPS)) - var/icon/lips = new /icon('icons/mob/humans/onmob/human_face.dmi', "paint_[owner.lip_style]") - overlays += lips + return "[.]-[eyes_r]-[eyes_g]-[eyes_b]-[lip_style]" /obj/limb/head/take_damage(brute, burn, sharp, edge, used_weapon = null,\ list/forbidden_limbs = list(), no_limb_loss,\ diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 2178e2d53f5c..dd37ac5a8af1 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -250,10 +250,14 @@ /datum/internal_organ/brain/process(delta_time) ..() + if(owner.chem_effect_flags & CHEM_EFFECT_ORGAN_STASIS) + return + if(organ_status >= ORGAN_BRUISED && prob(5 * delta_time)) var/dir_choice = pick(list(NORTH, SOUTH, EAST, WEST)) owner.drop_held_items() - owner.Move(get_step(get_turf(owner), dir_choice)) + if(!owner.buckled && owner.stat == CONSCIOUS) + owner.Move(get_step(get_turf(owner), dir_choice)) to_chat(owner, SPAN_DANGER("Your mind wanders and goes blank for a moment...")) if(organ_status >= ORGAN_BROKEN && prob(5 * delta_time)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e7a160095705..fc3f213fff35 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list( if(building == 0) init() else - area = loc.loc:master + area = get_area(src) opened = APC_COVER_OPEN operating = 0 name = "\improper [area.name] APC" @@ -1314,11 +1314,10 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list( if(cell && cell.charge >= 20) cell.use(20) spawn(0) - for(var/area/A in area.related) - for(var/obj/structure/machinery/light/L in A) - L.on = 1 - L.broken() - sleep(1) + for(var/obj/structure/machinery/light/L in area) + L.on = 1 + L.broken() + sleep(1) /obj/structure/machinery/power/apc/Destroy() area.power_light = 0 @@ -1359,7 +1358,7 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list( /obj/structure/machinery/power/apc/antag cell_type = /obj/item/cell/apc - req_one_access = list(ACCESS_ILLEGAL_PIRATE) + req_one_access = list(ACCESS_ILLEGAL_PIRATE, ACCESS_UPP_GENERAL, ACCESS_CLF_GENERAL) //------Almayer APCs ------// diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 094cdf5ac9ac..8f138d2c905f 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -143,6 +143,7 @@ idle_power_usage = 2 active_power_usage = 20 power_channel = POWER_CHANNEL_LIGHT //Lights are calc'd via area so they dont need to be in the machine list + light_system = STATIC_LIGHT var/on = 0 // 1 if on, 0 if off var/on_gs = 0 var/brightness = 8 // luminosity when on, also used in power calculation @@ -272,7 +273,6 @@ if(A) on = 0 // A.update_lights() - SetLuminosity(0) . = ..() /obj/structure/machinery/light/proc/is_broken() @@ -296,7 +296,6 @@ // update the icon_state and luminosity of the light depending on its state /obj/structure/machinery/light/proc/update(trigger = 1) - SSlighting.lights_current.Add(light) update_icon() if(on) if(luminosity != brightness) @@ -312,13 +311,13 @@ status = LIGHT_BURNED icon_state = "[base_state]-burned" on = 0 - SetLuminosity(0) + set_light(0) else update_use_power(USE_POWER_ACTIVE) - SetLuminosity(brightness) + set_light(brightness) else update_use_power(USE_POWER_NONE) - SetLuminosity(0) + set_light(0) if(on != on_gs) on_gs = on @@ -441,8 +440,8 @@ /obj/structure/machinery/light/proc/has_power() var/area/A = src.loc.loc if(!src.needs_power) - return A.master.lightswitch - return A.master.lightswitch && A.master.power_light + return A.lightswitch + return A.lightswitch && A.power_light /obj/structure/machinery/light/proc/flicker(amount = rand(10, 20)) if(flickering) return @@ -592,9 +591,8 @@ /obj/structure/machinery/light/power_change() spawn(10) if(loc) - var/area/A = src.loc.loc - A = A.master - if(!src.needs_power) + var/area/A = get_area(src) + if(!needs_power || A.unlimited_power) seton(A.lightswitch) return seton(A.lightswitch && A.power_light) @@ -605,7 +603,7 @@ if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C broken() -/obj/structure/machinery/light/bullet_act(obj/item/projectile/P) +/obj/structure/machinery/light/bullet_act(obj/projectile/P) src.bullet_ping(P) if(P.ammo.damage_type == BRUTE) if(P.damage > 10) @@ -776,7 +774,7 @@ /obj/structure/machinery/landinglight/proc/turn_off() icon_state = initial(icon_state) - SetLuminosity(0) + set_light(0) /obj/structure/machinery/landinglight/ds1 id = "USS Almayer Dropship 1" // ID for landing zone @@ -786,42 +784,42 @@ /obj/structure/machinery/landinglight/proc/turn_on() icon_state = initial(icon_state) + "0" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds1/delayone/turn_on() icon_state = initial(icon_state) + "1" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds1/delaytwo/turn_on() icon_state = initial(icon_state) + "2" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds1/delaythree/turn_on() icon_state = initial(icon_state) + "3" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds2/delayone/turn_on() icon_state = initial(icon_state) + "1" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds2/delaytwo/turn_on() icon_state = initial(icon_state) + "2" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds2/delaythree/turn_on() icon_state = initial(icon_state) + "3" - SetLuminosity(2) + set_light(2) /obj/structure/machinery/landinglight/ds1/spoke icon_state = "lz_spoke_light" /obj/structure/machinery/landinglight/ds1/spoke/turn_on() icon_state = initial(icon_state) + "1" - SetLuminosity(3) + set_light(3) /obj/structure/machinery/landinglight/ds2/spoke icon_state = "lz_spoke_light" /obj/structure/machinery/landinglight/ds2/spoke/turn_on() icon_state = initial(icon_state) + "1" - SetLuminosity(3) + set_light(3) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index ac3daee900ab..bee3e0aac8c2 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -51,21 +51,21 @@ // return 1 var/area/A = src.loc.loc // make sure it's in an area - if(!A || !isarea(A) || !A.master) + if(!A || !isarea(A)) return 0 // if not, then not powered if(chan == -1) chan = power_channel - return A.master.powered(chan) // return power status of the area + return A.powered(chan) // return power status of the area // increment the power usage stats for an area /obj/structure/machinery/proc/use_power(amount, chan = POWER_CHANNEL_ONEOFF, autocalled = 0) // defaults to one-off power charge, not constant power change var/area/A = get_area(src) // make sure it's in an area - if(!A || !isarea(A) || !A.master) + if(!A || !isarea(A)) return - A.master.use_power(amount, chan) + A.use_power(amount, chan) if(!autocalled) - log_power_update_request(A.master, src) + log_power_update_request(A, src) return 1 //The master_area optional argument can be used to save on a lot of processing if the master area is already known. This is mainly intended for when this proc is called by the master controller. @@ -274,10 +274,9 @@ return null /area/proc/get_apc() - for(var/area/RA in src.related) - var/obj/structure/machinery/power/apc/FINDME = locate() in RA - if (FINDME) - return FINDME + var/obj/structure/machinery/power/apc/FINDME = locate() in src + if (FINDME) + return FINDME //Determines how strong could be shock, deals damage to mob, uses power. diff --git a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm index 69179a209f8b..831923415453 100644 --- a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm @@ -18,10 +18,6 @@ //---------------------GENERAL PROCS -/obj/item/ammo_box/Destroy() - SetLuminosity(0) - . = ..() - /obj/item/ammo_box/attack_self(mob/living/user) ..() if(burning) @@ -45,14 +41,14 @@ /obj/item/ammo_box/proc/deploy_ammo_box(mob/user, turf/T) user.drop_held_item() - + //---------------------FIRE HANDLING PROCS /obj/item/ammo_box/flamer_fire_act(severity, datum/cause_data/flame_cause_data) if(burning) return burning = TRUE - SetLuminosity(3) + set_light(3) apply_fire_overlay() addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 5 SECONDS) @@ -239,11 +235,11 @@ if(host_box) host_box.apply_fire_overlay(will_explode) - host_box.SetLuminosity(3) + host_box.set_light(3) host_box.visible_message(SPAN_WARNING(shown_message)) else apply_fire_overlay(will_explode) - SetLuminosity(3) + set_light(3) visible_message(SPAN_WARNING(shown_message)) /obj/item/ammo_box/magazine/apply_fire_overlay(will_explode = FALSE) @@ -424,7 +420,7 @@ visible_message(SPAN_WARNING("\The [src] catches on fire!")) apply_fire_overlay(will_explode) - SetLuminosity(3) + set_light(3) /obj/item/ammo_box/rounds/apply_fire_overlay(will_explode = FALSE) //original fire overlay is made for standard mag boxes, so they don't need additional offsetting diff --git a/code/modules/projectiles/ammo_boxes/box_structures.dm b/code/modules/projectiles/ammo_boxes/box_structures.dm index 9169706aec4a..cb119e1a2190 100644 --- a/code/modules/projectiles/ammo_boxes/box_structures.dm +++ b/code/modules/projectiles/ammo_boxes/box_structures.dm @@ -18,7 +18,6 @@ //---------------------GENERAL PROCS /obj/structure/magazine_box/Destroy() - SetLuminosity(0) if(item_box) qdel(item_box) item_box = null diff --git a/code/modules/projectiles/ammo_boxes/grenade_packets.dm b/code/modules/projectiles/ammo_boxes/grenade_packets.dm index a0d16b621eb3..83c222a0a128 100644 --- a/code/modules/projectiles/ammo_boxes/grenade_packets.dm +++ b/code/modules/projectiles/ammo_boxes/grenade_packets.dm @@ -126,3 +126,15 @@ var/list/grenade_packets = list( desc = "It contains three M74 airburst smoke grenades. This end towards the enemy." icon_state = "agms_packet" content_type = /obj/item/explosive/grenade/smokebomb/airburst + +/obj/item/storage/box/packet/rmc/he + name = "\improper R2175/A HEDP grenade packet" + desc = "It contains three R2175/A HEDP grenades. Handle with care." + icon_state = "hedp_packet" + content_type = /obj/item/explosive/grenade/high_explosive/rmc + +/obj/item/storage/box/packet/rmc/incin + name = "\improper R2175/B HIDP grenade packet" + desc = "It contains three R2175/B HIDP grenades. Handle with care." + icon_state = "hidp_packet" + content_type = /obj/item/explosive/grenade/incendiary/rmc diff --git a/code/modules/projectiles/ammo_boxes/misc_boxes.dm b/code/modules/projectiles/ammo_boxes/misc_boxes.dm index e6a80537130b..d09a69e5bb50 100644 --- a/code/modules/projectiles/ammo_boxes/misc_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/misc_boxes.dm @@ -34,11 +34,11 @@ /obj/item/ammo_box/magazine/misc/handle_side_effects(obj/structure/magazine_box/host_box) if(host_box) host_box.apply_fire_overlay() - host_box.SetLuminosity(3) + host_box.set_light(3) host_box.visible_message(SPAN_WARNING("\The [src] catches on fire!")) else apply_fire_overlay() - SetLuminosity(3) + set_light(3) visible_message(SPAN_WARNING("\The [src] catches on fire!")) /obj/item/ammo_box/magazine/misc/apply_fire_overlay(will_explode = FALSE) @@ -117,11 +117,11 @@ if(host_box) host_box.apply_fire_overlay() - host_box.SetLuminosity(3) + host_box.set_light(3) host_box.visible_message(SPAN_WARNING(shown_message)) else apply_fire_overlay() - SetLuminosity(3) + set_light(3) visible_message(SPAN_WARNING(shown_message)) //for flare box, instead of actually exploding, we throw out a flare at random direction diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm index d09c7ad7bb26..449ce574eb2c 100644 --- a/code/modules/projectiles/ammo_datums.dm +++ b/code/modules/projectiles/ammo_datums.dm @@ -59,7 +59,7 @@ /datum/ammo/New() set_bullet_traits() -/datum/ammo/proc/on_bullet_generation(obj/item/projectile/generated_projectile, mob/bullet_generator) //NOT used on New(), applied to the projectiles. +/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 @@ -69,40 +69,40 @@ /datum/ammo/can_vv_modify() return FALSE -/datum/ammo/proc/do_at_half_range(obj/item/projectile/P) +/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/item/projectile/P) +/datum/ammo/proc/do_at_max_range(obj/projectile/P) SHOULD_NOT_SLEEP(TRUE) return -/datum/ammo/proc/on_shield_block(mob/M, obj/item/projectile/P) //Does it do something special when shield blocked? Ie. a flare or grenade that still blows up. +/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/item/projectile/P) //Special effects when hitting dense turfs. +/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/item/projectile/P, mob/user) //Special effects when hitting mobs. +/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/item/projectile/P, mob/living/user, obj/item/weapon/gun/fired_from) +/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/item/projectile/P) //Special effects when hitting objects. +/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/item/projectile/P) //Special effects when passing near something. Range of things that triggers it is controlled by other ammo flags. +/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/item/projectile/fired_projectile, max_range = 2) +/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) @@ -115,7 +115,7 @@ knockback_effects(living_mob, fired_projectile) slam_back(living_mob, fired_projectile) -/datum/ammo/proc/slam_back(mob/living/living_mob, obj/item/projectile/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. @@ -128,7 +128,7 @@ 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/item/projectile/fired_projectile) +/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 @@ -138,7 +138,7 @@ else living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) -/datum/ammo/proc/pushback(mob/target_mob, obj/item/projectile/fired_projectile, max_range = 2) +/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 @@ -148,7 +148,7 @@ 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/item/projectile/P, damage_type = BRUTE, range = 1, damage_div = 2, show_message = SHOW_MESSAGE_VISIBLE) //damage_div says how much we divide damage +/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) @@ -174,7 +174,7 @@ else P.play_hit_effect(M) -/datum/ammo/proc/fire_bonus_projectiles(obj/item/projectile/original_P) +/datum/ammo/proc/fire_bonus_projectiles(obj/projectile/original_P) set waitfor = 0 var/turf/curloc = get_turf(original_P.shot_from) @@ -183,7 +183,7 @@ 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/item/projectile/P = new /obj/item/projectile(curloc, original_P.weapon_cause_data) + 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) @@ -227,7 +227,7 @@ 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/item/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) +/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)) @@ -247,7 +247,7 @@ return COMPONENT_CANCEL_AMMO_POINT_BLANK -/datum/ammo/bullet/proc/attempt_battlefield_execution(datum/ammo/firing_ammo, mob/living/carbon/human/execution_target, obj/item/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) +/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!"), @@ -348,16 +348,16 @@ var/acid_per_hit = 10 var/organic_damage_mult = 3 -/datum/ammo/bullet/pistol/ap/toxin/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -410,11 +410,18 @@ 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/item/projectile/P) +/datum/ammo/bullet/pistol/heavy/super/highimpact/on_hit_mob(mob/M, obj/projectile/P) knockback(M, P, 4) /datum/ammo/bullet/pistol/deagle @@ -472,16 +479,16 @@ var/acid_per_hit = 10 var/organic_damage_mult = 3 -/datum/ammo/bullet/pistol/squash/toxin/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -530,7 +537,7 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) -/datum/ammo/bullet/pistol/mankey/on_hit_mob(mob/M,obj/item/projectile/P) +/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) @@ -573,7 +580,7 @@ penetration = ARMOR_PENETRATION_TIER_4 accuracy = HIT_ACCURACY_TIER_3 -/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/projectile/P) knockback(M, P, 4) /datum/ammo/bullet/revolver/incendiary @@ -591,16 +598,16 @@ var/acid_per_hit = 10 var/organic_damage_mult = 3 -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -617,42 +624,43 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) )) -/datum/ammo/bullet/revolver/nagant - name = "nagant revolver bullet" - headshot_state = HEADSHOT_OVERLAY_LIGHT //Smaller bullet. - damage = 40 +/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/nagant/shrapnel +/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/nagant/shrapnel_bits + bonus_projectiles_type = /datum/ammo/bullet/revolver/upp/shrapnel_bits max_range = 6 - damage = 25 // + TIER_4 * 3 + damage = 40 // + TIER_4 * 3 damage_falloff = DAMAGE_FALLOFF_TIER_7 - penetration = ARMOR_PENETRATION_TIER_6 + penetration = ARMOR_PENETRATION_TIER_8 bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 shrapnel_chance = 100 - shrapnel_type = /obj/item/shard/shrapnel/nagant - //roughly 35 or so damage + 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/nagant/shrapnel/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/bullet/revolver/upp/shrapnel/on_hit_mob(mob/M, obj/projectile/P) pushback(M, P, 1) -/datum/ammo/bullet/revolver/nagant/shrapnel_bits +/datum/ammo/bullet/revolver/upp/shrapnel_bits name = "small shrapnel" icon_state = "shrapnelshot_bit" max_range = 6 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_1 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_4 scatter = SCATTER_AMOUNT_TIER_1 bonus_projectiles_amount = 0 - shrapnel_type = /obj/item/shard/shrapnel/nagant/bits + shrapnel_type = /obj/item/shard/shrapnel/upp/bits /datum/ammo/bullet/revolver/small name = "small revolver bullet" @@ -693,7 +701,7 @@ ..() RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) -/datum/ammo/bullet/revolver/mateba/highimpact/on_hit_mob(mob/M, obj/item/projectile/P) +/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 @@ -704,15 +712,15 @@ 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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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) @@ -770,16 +778,16 @@ var/acid_per_hit = 5 var/organic_damage_mult = 3 -/datum/ammo/bullet/smg/ap/toxin/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -862,6 +870,15 @@ 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 @@ -887,7 +904,7 @@ damage = 30 var/holo_stacks = 10 -/datum/ammo/bullet/rifle/holo_target/on_hit_mob(mob/M, obj/item/projectile/P) +/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) @@ -905,13 +922,13 @@ shell_speed = AMMO_SPEED_TIER_4 damage_falloff = DAMAGE_FALLOFF_TIER_9 -/datum/ammo/bullet/rifle/explosive/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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) @@ -927,16 +944,16 @@ var/acid_per_hit = 7 var/organic_damage_mult = 3 -/datum/ammo/bullet/rifle/ap/toxin/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -1032,10 +1049,10 @@ penetration = ARMOR_PENETRATION_TIER_10 shell_speed = AMMO_SPEED_TIER_6 -/datum/ammo/bullet/rifle/m4ra/impact/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/fired_projectile) +/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!")) @@ -1057,21 +1074,21 @@ /datum/ammo/bullet/rifle/type71 name = "heavy rifle bullet" - damage = 35 - penetration = ARMOR_PENETRATION_TIER_2 + damage = 55 + penetration = ARMOR_PENETRATION_TIER_3 /datum/ammo/bullet/rifle/type71/ap name = "heavy armor-piercing rifle bullet" - damage = 20 + 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 = 50 - penetration = ARMOR_PENETRATION_TIER_8 + damage = 65 + penetration = ARMOR_PENETRATION_TIER_10 /* //====== @@ -1093,10 +1110,10 @@ damage_armor_punch = 2 handful_state = "slug_shell" -/datum/ammo/bullet/shotgun/slug/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/fired_projectile) +/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!")) @@ -1126,7 +1143,7 @@ shell_speed = AMMO_SPEED_TIER_3 handful_state = "beanbag_slug" -/datum/ammo/bullet/shotgun/beanbag/on_hit_mob(mob/M, obj/item/projectile/P) +/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 @@ -1151,14 +1168,14 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) -/datum/ammo/bullet/shotgun/incendiary/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/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/item/projectile/P) +/datum/ammo/bullet/shotgun/incendiary/on_hit_turf(turf/T,obj/projectile/P) burst(get_turf(T),P,damage_type) @@ -1225,7 +1242,7 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) -/datum/ammo/bullet/shotgun/buckshot/on_hit_mob(mob/M,obj/item/projectile/P) +/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. @@ -1273,7 +1290,7 @@ damage_armor_punch = 0 pen_armor_punch = 0 -/datum/ammo/bullet/shotgun/heavy/buckshot/on_hit_mob(mob/M,obj/item/projectile/P) +/datum/ammo/bullet/shotgun/heavy/buckshot/on_hit_mob(mob/M,obj/projectile/P) knockback(M,P) /datum/ammo/bullet/shotgun/heavy/buckshot/spread @@ -1317,10 +1334,10 @@ penetration = ARMOR_PENETRATION_TIER_6 damage_armor_punch = 2 -/datum/ammo/bullet/shotgun/heavy/slug/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/fired_projectile) +/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!")) @@ -1349,7 +1366,7 @@ accuracy = HIT_ACCURACY_TIER_2 shell_speed = AMMO_SPEED_TIER_2 -/datum/ammo/bullet/shotgun/heavy/beanbag/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/bullet/shotgun/heavy/beanbag/on_hit_mob(mob/M, obj/projectile/P) if(!M || M == P.firer) return if(ishuman(M)) @@ -1398,7 +1415,7 @@ 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/item/projectile/P) +/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. @@ -1422,7 +1439,7 @@ step(M, get_dir(P.firer, M)) -/datum/ammo/bullet/shotgun/twobore/knockback_effects(mob/living/living_mob, obj/item/projectile/fired_projectile) +/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!")) @@ -1456,7 +1473,7 @@ accuracy = HIT_ACCURACY_TIER_1 handful_state = "tracking_lever_action_bullet" -/datum/ammo/bullet/lever_action/tracker/on_hit_mob(mob/M, obj/item/projectile/P, mob/user) +/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"].")) @@ -1525,7 +1542,7 @@ shell_speed = AMMO_SPEED_TIER_6 damage_falloff = 0 -/datum/ammo/bullet/sniper/on_hit_mob(mob/M,obj/item/projectile/P) +/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) @@ -1547,7 +1564,7 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) -/datum/ammo/bullet/sniper/incendiary/on_hit_mob(mob/M,obj/item/projectile/P) +/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 @@ -1570,7 +1587,7 @@ 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/item/projectile/P) +/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 @@ -1585,7 +1602,7 @@ 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/item/projectile/P) +/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 @@ -1595,10 +1612,15 @@ damage = 42 penetration = ARMOR_PENETRATION_TIER_6 -/datum/ammo/bullet/sniper/crude/on_hit_mob(mob/M, obj/item/projectile/P) +/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" @@ -1607,7 +1629,7 @@ damage = 125 shell_speed = AMMO_SPEED_TIER_6 -/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/M,obj/item/projectile/P) +/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 @@ -1621,6 +1643,24 @@ // 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" @@ -1635,7 +1675,7 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) )) -/datum/ammo/bullet/sniper/elite/on_hit_mob(mob/M,obj/item/projectile/P) +/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 @@ -1667,20 +1707,20 @@ max_range = 32 shell_speed = AMMO_SPEED_TIER_6 -/datum/ammo/bullet/tank/flak/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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) @@ -1699,23 +1739,23 @@ max_range = 12 shell_speed = AMMO_SPEED_TIER_5 -/datum/ammo/bullet/tank/dualcannon/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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) @@ -1765,6 +1805,26 @@ 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" @@ -1816,7 +1876,7 @@ accurate_range = 10 damage = 50 penetration = ARMOR_PENETRATION_TIER_6 - accuracy = HIT_ACCURACY_TIER_9 + HIT_ACCURACY_TIER_5 // 75 accuracy + accuracy = -HIT_ACCURACY_TIER_2 // 75 accuracy shell_speed = AMMO_SPEED_TIER_2 max_range = 15 effective_range_max = 7 @@ -1865,6 +1925,18 @@ 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 @@ -1895,24 +1967,24 @@ smoke = null . = ..() -/datum/ammo/rocket/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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() @@ -1929,7 +2001,7 @@ damage = 10 penetration= ARMOR_PENETRATION_TIER_10 -/datum/ammo/rocket/ap/on_hit_mob(mob/M, obj/item/projectile/P) +/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) @@ -1940,14 +2012,14 @@ smoke.set_up(1, T) smoke.start() -/datum/ammo/rocket/ap/on_hit_obj(obj/O, obj/item/projectile/P) +/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/item/projectile/P) +/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) @@ -1968,7 +2040,7 @@ smoke.set_up(1, T) smoke.start() -/datum/ammo/rocket/ap/do_at_max_range(obj/item/projectile/P) +/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) @@ -1996,7 +2068,7 @@ shrapnel_chance = 5 shrapnel_type = /obj/item/large_shrapnel/at_rocket_dud -/datum/ammo/rocket/ap/anti_tank/on_hit_obj(obj/O, obj/item/projectile/P) +/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 @@ -2022,19 +2094,19 @@ damage = 25 shell_speed = AMMO_SPEED_TIER_3 -/datum/ammo/rocket/ltb/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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) @@ -2067,16 +2139,52 @@ landingSmoke.start() landingSmoke = null -/datum/ammo/rocket/wp/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -2087,26 +2195,26 @@ max_range = 32 shell_speed = AMMO_SPEED_TIER_3 -/datum/ammo/rocket/wp/quad/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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) @@ -2118,16 +2226,16 @@ smoke.set_up(1, get_turf(A)) smoke.start() -/datum/ammo/rocket/custom/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/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/item/projectile/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/item/projectile/P) +/datum/ammo/rocket/custom/do_at_max_range(obj/projectile/P) prime(null, P) /* @@ -2166,7 +2274,7 @@ shell_speed = AMMO_SPEED_TIER_1 // Slightly faster hit_effect_color = "#FFFF00" -/datum/ammo/energy/taser/on_hit_mob(mob/M, obj/item/projectile/P) +/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 @@ -2185,7 +2293,7 @@ stamina_damage = 25 //why not shell_speed = AMMO_SPEED_TIER_3 -/datum/ammo/energy/rxfm_eva/on_hit_mob(mob/living/M, obj/item/projectile/P) +/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() @@ -2235,7 +2343,7 @@ icon_state = "shrapnel_plasma" damage_type = BURN -/datum/ammo/bullet/shrapnel/plasma/on_hit_mob(mob/hit_mob, obj/item/projectile/hit_projectile) +/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 @@ -2263,7 +2371,7 @@ damage = 0 flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST -/datum/ammo/energy/yautja/caster/bolt/stun/on_hit_mob(mob/M, obj/item/projectile/P) +/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)) @@ -2296,13 +2404,13 @@ var/vehicle_slowdown_time = 5 SECONDS -/datum/ammo/energy/yautja/caster/sphere/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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 @@ -2312,7 +2420,7 @@ 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/item/projectile/P) +/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) @@ -2326,19 +2434,19 @@ var/stun_range = 4 // Big var/stun_time = 6 -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/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/item/projectile/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/item/projectile/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/item/projectile/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 @@ -2454,7 +2562,7 @@ M.apply_effect(0.7, WEAKEN) M.visible_message(SPAN_DANGER("[M] falls prone.")) -/datum/ammo/xeno/toxin/on_hit_mob(mob/M,obj/item/projectile/P) +/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) @@ -2478,7 +2586,7 @@ accuracy = HIT_ACCURACY_TIER_5*2 max_range = 6 - 1 -/datum/ammo/xeno/toxin/queen/on_hit_mob(mob/M,obj/item/projectile/P) +/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 @@ -2503,7 +2611,7 @@ bonus_projectiles_amount = 0 -/*proc/neuro_flak(turf/T, obj/item/projectile/P, datum/callback/CB, power, insta_neuro, radius) +/*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 @@ -2527,13 +2635,13 @@ spit_cost = 50 flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST -/datum/ammo/xeno/toxin/burst/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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 @@ -2548,16 +2656,16 @@ accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 max_range = 32 -/datum/ammo/xeno/sticky/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/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/item/projectile/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/item/projectile/P) +/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) @@ -2590,10 +2698,10 @@ penetration = ARMOR_PENETRATION_TIER_2 shell_speed = AMMO_SPEED_TIER_3 -/datum/ammo/xeno/acid/on_shield_block(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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) @@ -2606,7 +2714,7 @@ damage = 30 max_range = 6 -/datum/ammo/xeno/acid/spatter/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/xeno/acid/spatter/on_hit_mob(mob/M, obj/projectile/P) . = ..() if(. == FALSE) return @@ -2638,7 +2746,7 @@ apply_delegate = FALSE -/datum/ammo/xeno/acid/prae_nade/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/xeno/acid/prae_nade/on_hit_mob(mob/M, obj/projectile/P) if (!ishuman(M)) return @@ -2668,16 +2776,16 @@ shell_speed = AMMO_SPEED_TIER_1 scatter = SCATTER_AMOUNT_TIER_10 -/datum/ammo/xeno/prae_skillshot/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/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/item/projectile/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/item/projectile/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) @@ -2729,7 +2837,7 @@ smoke_system = null . = ..() -/datum/ammo/xeno/boiler_gas/on_hit_mob(mob/moob, obj/item/projectile/proj) +/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) @@ -2742,22 +2850,22 @@ 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/item/projectile/proj) +/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/item/projectile/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/item/projectile/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/item/projectile/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/item/projectile/proj) +/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)) @@ -2776,10 +2884,10 @@ smokerange = 3 -/datum/ammo/xeno/boiler_gas/acid/set_xeno_smoke(obj/item/projectile/proj) +/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/item/projectile/proj) +/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) @@ -2807,7 +2915,7 @@ shrapnel_type = /obj/item/shard/shrapnel/bone_chips shrapnel_chance = 60 -/datum/ammo/xeno/bone_chips/on_hit_mob(mob/M, obj/item/projectile/P) +/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) @@ -2837,7 +2945,7 @@ damage = 10 shrapnel_chance = 0 -/datum/ammo/xeno/bone_chips/spread/runner/on_hit_mob(mob/M, obj/item/projectile/P) +/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) @@ -2858,12 +2966,12 @@ max_range = 4 accuracy = HIT_ACCURACY_TIER_MAX -/datum/ammo/xeno/oppressor_tail/on_bullet_generation(obj/item/projectile/generated_projectile, mob/bullet_generator) +/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/item/projectile/fired_proj) +/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 @@ -2904,7 +3012,7 @@ shell_speed = AMMO_SPEED_TIER_2 shrapnel_chance = 5 -/datum/ammo/bullet/shrapnel/on_hit_obj(obj/O, obj/item/projectile/P) +/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) @@ -2929,7 +3037,7 @@ 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/item/projectile/P) +/datum/ammo/bullet/shrapnel/hornet_rounds/on_hit_mob(mob/M, obj/projectile/P) . = ..() M.AddComponent(/datum/component/bonus_damage_stack, 10, world.time) @@ -3015,7 +3123,7 @@ shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 accuracy = HIT_ACCURACY_TIER_MAX -/datum/ammo/bullet/shrapnel/jagged/on_hit_mob(mob/M, obj/item/projectile/P) +/datum/ammo/bullet/shrapnel/jagged/on_hit_mob(mob/M, obj/projectile/P) if(isxeno(M)) M.apply_effect(0.4, SLOW) @@ -3027,7 +3135,8 @@ /datum/ammo/bullet/shrapnel/gau //for the GAU to have a impact bullet instead of firecrackers name = "30mm Multi-Purpose shell" - damage = 115 //More damaging, but 2x less shells and low AP + 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 @@ -3036,7 +3145,7 @@ /datum/ammo/bullet/shrapnel/gau/at name = "30mm Anti-Tank shell" - damage = 80 //Standard AP vs standard. (more AP for less damage) + 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 /* @@ -3077,16 +3186,16 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) -/datum/ammo/flamethrower/on_hit_mob(mob/M, obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/datum/ammo/flamethrower/do_at_max_range(obj/projectile/P) drop_flame(get_turf(P), P.weapon_cause_data) /datum/ammo/flamethrower/tank_flamer @@ -3157,22 +3266,22 @@ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) )) -/datum/ammo/flare/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P, mob/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/item/projectile/fired_projectile, mob/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) @@ -3186,7 +3295,7 @@ 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/item/projectile/fired_projectile, mob/firer) +/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)) @@ -3224,7 +3333,7 @@ if(istype(target_organ)) target_organ.embed(new can_type) -/datum/ammo/souto/on_hit_mob(mob/M, obj/item/projectile/P) +/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. @@ -3245,25 +3354,25 @@ 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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/projectile/P) +/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/item/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 @@ -3278,19 +3387,19 @@ accuracy = HIT_ACCURACY_TIER_3 max_range = 6 -/datum/ammo/grenade_container/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/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/item/projectile/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/item/projectile/P) +/datum/ammo/grenade_container/do_at_max_range(obj/projectile/P) drop_nade(P) -/datum/ammo/grenade_container/proc/drop_nade(obj/item/projectile/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]!")) @@ -3317,16 +3426,16 @@ accuracy = HIT_ACCURACY_TIER_3 max_range = 6 -/datum/ammo/hugger_container/on_hit_mob(mob/M,obj/item/projectile/P) +/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/item/projectile/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/item/projectile/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/item/projectile/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) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 257edd9a7720..7d5d51a05eb4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -25,6 +25,7 @@ ) flags_atom = FPRINT|CONDUCT flags_item = TWOHANDED + light_system = DIRECTIONAL_LIGHT var/accepted_ammo = list() ///Determines what kind of bullet is created when the gun is unloaded - used to match rounds to magazines. Set automatically when reloading. @@ -53,7 +54,7 @@ Ammo will be replaced on New() for things that do not use mags.**/ var/datum/ammo/ammo = null ///What is currently in the chamber. Most guns will want something in the chamber upon creation. - var/obj/item/projectile/in_chamber = null + var/obj/projectile/in_chamber = null /*Ammo mags may or may not be internal, though the difference is a few additional variables. If they are not internal, don't call on those unique vars. This is done for quicker pathing. Just keep in mind most mags aren't internal, though some are. This is also the default magazine path loaded into a projectile weapon for reverse lookups on New(). Leave this null to do your own thing.*/ @@ -228,6 +229,8 @@ VAR_PROTECTED/start_semiauto = TRUE /// If this gun should spawn with automatic fire. Protected due to it never needing to be edited. VAR_PROTECTED/start_automatic = FALSE + /// The type of projectile that this gun should shoot + var/projectile_type = /obj/projectile /// The multiplier for how much slower this should fire in automatic mode. 1 is normal, 1.2 is 20% slower, 2 is 100% slower, etc. Protected due to it never needing to be edited. VAR_PROTECTED/autofire_slow_mult = 1 @@ -294,9 +297,6 @@ var/obj/item/attachable/potential_attachment = attachments[slot] if(!potential_attachment) continue - loc.SetLuminosity(0, FALSE, src) - else - SetLuminosity(0) attachments = null attachable_overlays = null QDEL_NULL(active_attachable) @@ -508,16 +508,19 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w if(slot in list(WEAR_L_HAND, WEAR_R_HAND)) set_gun_user(user) + if(HAS_TRAIT_FROM_ONLY(src, TRAIT_GUN_LIGHT_DEACTIVATED, user)) + force_light(on = TRUE) + REMOVE_TRAIT(src, TRAIT_GUN_LIGHT_DEACTIVATED, user) else set_gun_user(null) + force_light(on = FALSE) + ADD_TRAIT(src, TRAIT_GUN_LIGHT_DEACTIVATED, user) return ..() /obj/item/weapon/gun/dropped(mob/user) . = ..() - disconnect_light_from_mob(user) - var/delay_left = (last_fired + fire_delay + additional_fire_group_delay) - world.time if(fire_delay_group && delay_left > 0) for(var/group in fire_delay_group) @@ -951,7 +954,7 @@ and you're good to go. if(active_attachable.current_rounds > 0) //If it's still got ammo and stuff. active_attachable.current_rounds-- - var/obj/item/projectile/bullet = create_bullet(active_attachable.ammo, initial(name)) + var/obj/projectile/bullet = create_bullet(active_attachable.ammo, initial(name)) // For now, only bullet traits from the attachment itself will apply to its projectiles for(var/entry in active_attachable.traits_to_give_attached) var/list/L @@ -971,7 +974,7 @@ and you're good to go. else return ready_in_chamber()//We're not using the active attachable, we must use the active mag if there is one. -/obj/item/weapon/gun/proc/apply_traits(obj/item/projectile/P) +/obj/item/weapon/gun/proc/apply_traits(obj/projectile/P) // Apply bullet traits from gun for(var/entry in traits_to_give) var/list/L @@ -1018,7 +1021,7 @@ and you're good to go. if(isliving(loc)) var/mob/M = loc weapon_source_mob = M - var/obj/item/projectile/P = new /obj/item/projectile(src, create_cause_data(bullet_source, weapon_source_mob)) + var/obj/projectile/P = new projectile_type(src, create_cause_data(bullet_source, weapon_source_mob)) P.generate_bullet(chambered, 0, NO_FLAGS) return P @@ -1052,14 +1055,14 @@ and you're good to go. return in_chamber //Returns the projectile if it's actually successful. -/obj/item/weapon/gun/proc/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/proc/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) if(active_attachable) //Attachables don't chamber rounds, so we want to delete it right away. qdel(projectile_to_fire) //Getting rid of it. Attachables only use ammo after the cycle is over. if(refund) active_attachable.current_rounds++ //Refund the bullet. return 1 -/obj/item/weapon/gun/proc/clear_jam(obj/item/projectile/projectile_to_fire, mob/user as mob) //Guns jamming, great. +/obj/item/weapon/gun/proc/clear_jam(obj/projectile/projectile_to_fire, mob/user as mob) //Guns jamming, great. flags_gun_features &= ~GUN_BURST_FIRING // Also want to turn off bursting, in case that was on. It probably was. delete_bullet(projectile_to_fire, 1) //We're going to clear up anything inside if we need to. //If it's a regular bullet, we're just going to keep it chambered. @@ -1138,7 +1141,7 @@ and you're good to go. return TRUE //The gun should return the bullet that it already loaded from the end cycle of the last Fire(). - var/obj/item/projectile/projectile_to_fire = load_into_chamber(user) //Load a bullet in or check for existing one. + var/obj/projectile/projectile_to_fire = load_into_chamber(user) //Load a bullet in or check for existing one. if(!projectile_to_fire) //If there is nothing to fire, click. click_empty(user) flags_gun_features &= ~GUN_BURST_FIRING @@ -1199,7 +1202,7 @@ and you're good to go. //This is where the projectile leaves the barrel and deals with projectile code only. //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv in_chamber = null // It's not in the gun anymore - INVOKE_ASYNC(projectile_to_fire, TYPE_PROC_REF(/obj/item/projectile, fire_at), target, user, src, projectile_to_fire?.ammo?.max_range, bullet_velocity, original_target) + INVOKE_ASYNC(projectile_to_fire, TYPE_PROC_REF(/obj/projectile, fire_at), target, user, src, projectile_to_fire?.ammo?.max_range, bullet_velocity, original_target) projectile_to_fire = null // Important: firing might have made projectile collide early and ALREADY have deleted it. We clear it too. //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1267,7 +1270,7 @@ and you're good to go. if(active_attachable && !(active_attachable.flags_attach_features & ATTACH_PROJECTILE)) active_attachable.activate_attachment(src, null, TRUE)//We're not firing off a nade into our mouth. - var/obj/item/projectile/projectile_to_fire = load_into_chamber(user) + var/obj/projectile/projectile_to_fire = load_into_chamber(user) if(projectile_to_fire) //We actually have a projectile, let's move on. user.visible_message(SPAN_WARNING("[user] pulls the trigger!")) var/actual_sound @@ -1367,7 +1370,7 @@ and you're good to go. if(QDELETED(attacked_mob)) //Target deceased. break - var/obj/item/projectile/projectile_to_fire = load_into_chamber(user) + var/obj/projectile/projectile_to_fire = load_into_chamber(user) if(!projectile_to_fire) click_empty(user) break @@ -1398,9 +1401,9 @@ and you're good to go. simulate_recoil(1, user) if(projectile_to_fire.ammo.bonus_projectiles_amount) - var/obj/item/projectile/BP + var/obj/projectile/BP for(var/i in 1 to projectile_to_fire.ammo.bonus_projectiles_amount) - BP = new /obj/item/projectile(attacked_mob.loc, create_cause_data(initial(name), user)) + BP = new /obj/projectile(attacked_mob.loc, create_cause_data(initial(name), user)) BP.generate_bullet(GLOB.ammo_list[projectile_to_fire.ammo.bonus_projectiles_type], 0, NO_FLAGS) BP.accuracy = round(BP.accuracy * projectile_to_fire.accuracy/initial(projectile_to_fire.accuracy)) //Modifies accuracy of pellets per fire_bonus_projectiles. BP.damage *= damage_buff @@ -1512,8 +1515,12 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed if(flags_gun_features & GUN_TRIGGER_SAFETY) to_chat(user, SPAN_WARNING("The safety is on!")) return - - if((flags_gun_features & GUN_WIELDED_FIRING_ONLY) && !(flags_item & WIELDED)) //If we're not holding the weapon with both hands when we should. + if(active_attachable) + if(active_attachable.flags_attach_features & ATTACH_PROJECTILE) + if(!(active_attachable.flags_attach_features & ATTACH_WIELD_OVERRIDE) && !(flags_item & WIELDED)) + to_chat(user, SPAN_WARNING("You must wield [src] to fire [active_attachable]!")) + return + if((flags_gun_features & GUN_WIELDED_FIRING_ONLY) && !(flags_item & WIELDED) && !active_attachable) //If we're not holding the weapon with both hands when we should. to_chat(user, SPAN_WARNING("You need a more secure grip to fire this weapon!")) return @@ -1567,7 +1574,7 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed to_chat(user, SPAN_DANGER("[current_mag.current_rounds][chambered ? "+1" : ""] / [current_mag.max_rounds] ROUNDS REMAINING")) //This proc applies some bonus effects to the shot/makes the message when a bullet is actually fired. -/obj/item/weapon/gun/proc/apply_bullet_effects(obj/item/projectile/projectile_to_fire, mob/user, reflex = 0, dual_wield = 0) +/obj/item/weapon/gun/proc/apply_bullet_effects(obj/projectile/projectile_to_fire, mob/user, reflex = 0, dual_wield = 0) var/actual_sound = fire_sound if(isnull(fire_sound)) actual_sound = pick(fire_sounds) @@ -1644,7 +1651,7 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed return 1 -/obj/item/weapon/gun/proc/simulate_scatter(obj/item/projectile/projectile_to_fire, atom/target, turf/curloc, turf/targloc, mob/user, bullets_fired = 1) +/obj/item/weapon/gun/proc/simulate_scatter(obj/projectile/projectile_to_fire, atom/target, turf/curloc, turf/targloc, mob/user, bullets_fired = 1) var/fire_angle = Get_Angle(curloc, targloc) var/total_scatter_angle = projectile_to_fire.scatter @@ -1725,9 +1732,11 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed if(!istype(user) || !istype(user.loc,/turf)) return - if(user.luminosity <= muzzle_flash_lum) - user.SetLuminosity(muzzle_flash_lum, FALSE, src) - addtimer(CALLBACK(user, TYPE_PROC_REF(/atom, SetLuminosity), 0, FALSE, src), 10) + var/prev_light = light_range + if(!light_on && (light_range <= muzzle_flash_lum)) + set_light_range(muzzle_flash_lum) + set_light_on(TRUE) + addtimer(CALLBACK(src, PROC_REF(reset_light_range), prev_light), 0.5 SECONDS) var/image_layer = (user && user.dir == SOUTH) ? MOB_LAYER+0.1 : MOB_LAYER-0.1 var/offset = 5 @@ -1739,6 +1748,13 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed I.transform = rotate I.flick_overlay(user, 3) +/// called by a timer to remove the light range from muzzle flash +/obj/item/weapon/gun/proc/reset_light_range(lightrange) + set_light_range(lightrange) + if(lightrange <= 0) + set_light_on(FALSE) + + /obj/item/weapon/gun/attack_alien(mob/living/carbon/xenomorph/xeno) ..() var/slashed_light = FALSE @@ -1902,8 +1918,14 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed target = src.target if(!user) user = gun_user + if(!target || !user) + return NONE return Fire(target, user, params, reflex, dual_wield) /// Setter proc for fa_firing /obj/item/weapon/gun/proc/set_auto_firing(auto = FALSE) fa_firing = auto + +/// Getter for gun_user +/obj/item/weapon/gun/proc/get_gun_user() + return gun_user diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index eb0e53986f9d..698ea8ef5957 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -331,6 +331,17 @@ Defined in conflicts.dm of the #defines folder. attach_icon = "co2_bayonet_a" var/filled = FALSE +/obj/item/attachable/bayonet/rmc + name = "\improper L5 bayonet" + desc = "The standard-issue bayonet of the RMC, the L5 is balanced to also function as an effective throwing knife." + icon_state = "upp_bayonet" // PLACEHOLDER PLEASE REPLACE + item_state = "combat_knife" + attach_icon = "upp_bayonet_a" // PLACEHOLDER PLEASE REPLACE + throwforce = MELEE_FORCE_TIER_10 //doubled by throwspeed to 100 + throw_speed = SPEED_REALLY_FAST + throw_range = 7 + pry_delay = 1 SECONDS + /obj/item/attachable/bayonet/co2/update_icon() icon_state = "co2_knife[filled ? "-f" : ""]" attach_icon = "co2_bayonet[filled ? "-f" : ""]_a" @@ -437,6 +448,39 @@ Defined in conflicts.dm of the #defines folder. accuracy_mod = HIT_ACCURACY_MULT_TIER_1 scatter_mod = -SCATTER_AMOUNT_TIER_8 +/obj/item/attachable/f90_dmr_barrel + name = "f90 barrel" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon_state = "aug_dmr_barrel_a" + attach_icon = "aug_dmr_barrel_a" + slot = "muzzle" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 //Integrated attachment for visuals, stats handled on main gun. + size_mod = 0 + +/obj/item/attachable/f90_shotgun_barrel + name = "f90 barrel" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon_state = "aug_mkey_barrel_a" + attach_icon = "aug_mkey_barrel_a" + slot = "muzzle" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 //Integrated attachment for visuals, stats handled on main gun. + size_mod = 0 + +/obj/item/attachable/l56a2_smartgun + name = "l56a2 barrel" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon_state = "magsg_barrel_a" + attach_icon = "magsg_barrel_a" + slot = "muzzle" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 //Integrated attachment for visuals, stats handled on main gun. + size_mod = 0 + /obj/item/attachable/sniperbarrel name = "sniper barrel" icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi' @@ -451,6 +495,11 @@ Defined in conflicts.dm of the #defines folder. accuracy_mod = HIT_ACCURACY_MULT_TIER_3 scatter_mod = -SCATTER_AMOUNT_TIER_8 +/obj/item/attachable/sniperbarrel/vulture + name = "\improper M707 barrel" + icon_state = "vulture_barrel" + hud_offset_mod = -1 + /obj/item/attachable/m60barrel name = "M60 barrel" icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi' @@ -594,7 +643,7 @@ Defined in conflicts.dm of the #defines folder. icon = 'icons/obj/items/weapons/guns/attachments/rail.dmi' icon_state = "flashlight" attach_icon = "flashlight_a" - light_mod = 7 + light_mod = 5 slot = "rail" matter = list("metal" = 50,"glass" = 20) flags_attach_features = ATTACH_REMOVABLE|ATTACH_ACTIVATION @@ -604,8 +653,8 @@ Defined in conflicts.dm of the #defines folder. var/original_state = "flashlight" var/original_attach = "flashlight_a" - var/activated = FALSE - var/helm_mounted_light_mod = 5 + var/helm_mounted_light_power = 2 + var/helm_mounted_light_range = 3 var/datum/action/item_action/activation var/obj/item/attached_item @@ -636,7 +685,7 @@ Defined in conflicts.dm of the #defines folder. SIGNAL_HANDLER if(!attached_item) return - if(activated) + if(light_on) icon_state = original_state attach_icon = original_attach activate_attachment(attached_item, attached_item.loc, TRUE) @@ -652,33 +701,54 @@ Defined in conflicts.dm of the #defines folder. activate_attachment(attached_item, owner) /obj/item/attachable/flashlight/activate_attachment(obj/item/weapon/gun/G, mob/living/user, turn_off) - if(istype(G, /obj/item/clothing/head/helmet/marine)) - var/atom/movable/light_source = user - . = (turn_off && activated) - if(turn_off || activated) - if(activated) + turn_light(user, turn_off ? !turn_off : !light_on) + +/obj/item/attachable/flashlight/turn_light(mob/user, toggle_on, cooldown, sparks, forced, light_again) + . = ..() + if(. != CHECKS_PASSED) + return + + if(istype(attached_item, /obj/item/clothing/head/helmet/marine)) + if(!toggle_on || light_on) + if(light_on) playsound(user, deactivation_sound, 15, 1) icon_state = original_state attach_icon = original_attach - activated = FALSE + light_on = FALSE else playsound(user, activation_sound, 15, 1) icon_state += "-on" attach_icon += "-on" - activated = TRUE + light_on = TRUE attached_item.update_icon() - light_source.SetLuminosity(helm_mounted_light_mod * activated, FALSE, G) - attached_item.SetLuminosity(helm_mounted_light_mod * activated, FALSE, G) + attached_item.set_light_range(helm_mounted_light_range) + attached_item.set_light_power(helm_mounted_light_power) + attached_item.set_light_on(light_on) activation.update_button_icon() return - if(turn_off && !(G.flags_gun_features & GUN_FLASHLIGHT_ON)) - return FALSE - var/flashlight_on = (G.flags_gun_features & GUN_FLASHLIGHT_ON) ? 0 : 1 - var/atom/movable/light_source = ismob(G.loc) ? G.loc : G - light_source.SetLuminosity(light_mod * flashlight_on, FALSE, G) - G.flags_gun_features ^= GUN_FLASHLIGHT_ON - if(G.flags_gun_features & GUN_FLASHLIGHT_ON) + if(!isgun(loc)) + return + + var/obj/item/weapon/gun/attached_gun = loc + + if(toggle_on && !light_on) + attached_gun.set_light_range(attached_gun.light_range + light_mod) + attached_gun.set_light_power(attached_gun.light_power + (light_mod * 0.5)) + if(!(attached_gun.flags_gun_features & GUN_FLASHLIGHT_ON)) + attached_gun.set_light_on(TRUE) + light_on = TRUE + attached_gun.flags_gun_features |= GUN_FLASHLIGHT_ON + + if(!toggle_on && light_on) + attached_gun.set_light_range(attached_gun.light_range - light_mod) + attached_gun.set_light_power(attached_gun.light_power - (light_mod * 0.5)) + if(attached_gun.flags_gun_features & GUN_FLASHLIGHT_ON) + attached_gun.set_light_on(FALSE) + light_on = FALSE + attached_gun.flags_gun_features &= ~GUN_FLASHLIGHT_ON + + if(attached_gun.flags_gun_features & GUN_FLASHLIGHT_ON) icon_state += "-on" attach_icon += "-on" playsound(user, deactivation_sound, 15, 1) @@ -686,17 +756,14 @@ Defined in conflicts.dm of the #defines folder. icon_state = original_state attach_icon = original_attach playsound(user, activation_sound, 15, 1) - G.update_attachable(slot) + attached_gun.update_attachable(slot) - for(var/X in G.actions) + for(var/X in attached_gun.actions) var/datum/action/A = X if(A.target == src) A.update_button_icon() return TRUE - - - /obj/item/attachable/flashlight/attackby(obj/item/I, mob/user) if(HAS_TRAIT(I, TRAIT_TOOL_SCREWDRIVER)) to_chat(user, SPAN_NOTICE("You strip the rail flashlight of its mount, converting it to a normal flashlight.")) @@ -812,12 +879,12 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/magnetic_harness/lever_sling/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection) . = ..() var/new_attach_icon - switch(SSmapping.configs[GROUND_MAP].map_name) // maploader TODO: json - if(MAP_ICE_COLONY, MAP_ICE_COLONY_V3, MAP_CORSAT, MAP_SOROKYNE_STRATA) + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("snow") attach_icon = new_attach_icon ? new_attach_icon : "s_" + attach_icon - if(MAP_WHISKEY_OUTPOST, MAP_DESERT_DAM, MAP_BIG_RED, MAP_KUTJEVO) + if("desert") attach_icon = new_attach_icon ? new_attach_icon : "d_" + attach_icon - if(MAP_PRISON_STATION, MAP_PRISON_STATION_V3, MAP_LV522_CHANCES_CLAIM) + if("classic") attach_icon = new_attach_icon ? new_attach_icon : "c_" + attach_icon /obj/item/attachable/scope @@ -974,6 +1041,9 @@ Defined in conflicts.dm of the #defines folder. //other variable zoom scopes +/obj/item/attachable/scope/variable_zoom/integrated + name = "variable zoom scope" + /obj/item/attachable/scope/variable_zoom/slavic icon_state = "slavicscope" attach_icon = "slavicscope" @@ -1022,6 +1092,9 @@ Defined in conflicts.dm of the #defines folder. wield_delay_mod = 0 dynamic_aim_slowdown = SLOWDOWN_ADS_MINISCOPE_DYNAMIC +/obj/item/attachable/scope/mini/f90 + dynamic_aim_slowdown = SLOWDOWN_ADS_NONE + /obj/item/attachable/scope/mini/flaregun/New() ..() delay_mod = 0 @@ -1104,7 +1177,474 @@ Defined in conflicts.dm of the #defines folder. attach_icon = "slavicscope" desc = "Oppa! How did you get this off glorious Stalin weapon? Blyat, put back on and do job tovarish. Yankee is not shoot self no?" +/obj/item/attachable/vulture_scope // not a subtype of scope because it uses basically none of the scope's features + name = "\improper M707 \"Vulture\" scope" + icon = 'icons/obj/items/weapons/guns/attachments/rail.dmi' + icon_state = "vulture_scope" + attach_icon = "vulture_scope" + desc = "A powerful yet obtrusive sight for the M707 anti-materiel rifle." // Can't be seen normally, anyway + slot = "rail" + aim_speed_mod = SLOWDOWN_ADS_SCOPE //Extra slowdown when wielded + wield_delay_mod = WIELD_DELAY_FAST + flags_attach_features = ATTACH_REMOVABLE|ATTACH_ACTIVATION + attachment_action_type = /datum/action/item_action/toggle + /// Weakref to the user of the scope + var/datum/weakref/scope_user + /// If the scope is currently in use + var/scoping = FALSE + /// How far out the player should see by default + var/start_scope_range = 12 + /// The bare minimum distance the scope can be from the player + var/min_scope_range = 12 + /// The maximum distance the scope can be from the player + var/max_scope_range = 25 + /// How far in the perpendicular axis the scope can move in either direction + var/perpendicular_scope_range = 7 + /// How far in each direction the scope should see. Default human view size is 7 + var/scope_viewsize = 7 + /// The current X position of the scope within the sniper's view box. 0 is center + var/scope_offset_x = 0 + /// The current Y position of the scope within the sniper's view box. 0 is center + var/scope_offset_y = 0 + /// How far in any given direction the scope can drift + var/scope_drift_max = 2 + /// The current X coord position of the scope camera + var/scope_x = 0 + /// The current Y coord position of the scope camera + var/scope_y = 0 + /// Ref to the scope screen element + var/atom/movable/screen/vulture_scope/scope_element + /// If the gun should experience scope drift + var/scope_drift = TRUE + /// % chance for the scope to drift on process with a spotter using their scope + var/spotted_drift_chance = 33 + /// % chance for the scope to drift on process without a spotter using their scope + var/unspotted_drift_chance = 100 + /// If the scope should use do_afters for adjusting and moving the sight + var/slow_use = TRUE + /// Cooldown for interacting with the scope's adjustment or position + COOLDOWN_DECLARE(scope_interact_cd) + /// If the user is currently holding their breath + var/holding_breath = FALSE + /// Cooldown for after holding your breath + COOLDOWN_DECLARE(hold_breath_cd) + /// How long you can hold your breath for + var/breath_time = 4 SECONDS + /// How long the cooldown for holding your breath is, only starts after breath_time finishes + var/breath_cooldown_time = 12 SECONDS + /// The initial dir of the scope user when scoping in + var/scope_user_initial_dir + /// How much to increase darkness view by + var/darkness_view = 12 + /// If there is currently a spotter using the linked spotting scope + var/spotter_spotting = FALSE + +/obj/item/attachable/vulture_scope/Initialize(mapload, ...) + . = ..() + START_PROCESSING(SSobj, src) + select_gamemode_skin(type) + +/obj/item/attachable/vulture_scope/Destroy() + STOP_PROCESSING(SSobj, src) + on_unscope() + QDEL_NULL(scope_element) + return ..() + +/obj/item/attachable/vulture_scope/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "VultureScope", name) + ui.open() + +/obj/item/attachable/vulture_scope/ui_state(mob/user) + return GLOB.not_incapacitated_state + +/obj/item/attachable/vulture_scope/ui_data(mob/user) + var/list/data = list() + data["offset_x"] = scope_offset_x + data["offset_y"] = scope_offset_y + data["valid_offset_dirs"] = get_offset_dirs() + data["scope_cooldown"] = !COOLDOWN_FINISHED(src, scope_interact_cd) + data["valid_adjust_dirs"] = get_adjust_dirs() + data["breath_cooldown"] = !COOLDOWN_FINISHED(src, hold_breath_cd) + data["breath_recharge"] = get_breath_recharge() + data["spotter_spotting"] = spotter_spotting + data["current_scope_drift"] = get_scope_drift_chance() + data["time_to_fire_remaining"] = 1 - (get_time_to_fire() / FIRE_DELAY_TIER_VULTURE) + return data + +/obj/item/attachable/vulture_scope/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("adjust_dir") + var/direction = params["offset_dir"] + if(!(direction in alldirs) || !scoping || !scope_user) + return + + var/mob/scoper = scope_user.resolve() + if(slow_use) + if(!COOLDOWN_FINISHED(src, scope_interact_cd)) + return + to_chat(scoper, SPAN_NOTICE("You begin adjusting [src]...")) + COOLDOWN_START(src, scope_interact_cd, 0.5 SECONDS) + if(!do_after(scoper, 0.5 SECONDS)) + return + + adjust_offset(direction) + . = TRUE + + if("adjust_position") + var/direction = params["position_dir"] + if(!(direction in alldirs) || !scoping || !scope_user) + return + + var/mob/scoper = scope_user.resolve() + if(slow_use) + if(!COOLDOWN_FINISHED(src, scope_interact_cd)) + return + + to_chat(scoper, SPAN_NOTICE("You begin moving [src]...")) + COOLDOWN_START(src, scope_interact_cd, 1 SECONDS) + if(!do_after(scoper, 1 SECONDS)) + return + + adjust_position(direction) + . = TRUE + + if("hold_breath") + if(!COOLDOWN_FINISHED(src, hold_breath_cd) || holding_breath) + return + + hold_breath() + . = TRUE + +/obj/item/attachable/vulture_scope/process() + if(scope_element && prob(get_scope_drift_chance())) //every 6 seconds when unspotted, on average + scope_drift() + +/// Returns a number between 0 and 100 for the chance of the scope drifting on process() +/obj/item/attachable/vulture_scope/proc/get_scope_drift_chance() + if(!scope_drift || holding_breath) + return 0 + + if(spotter_spotting) + return spotted_drift_chance + + else + return unspotted_drift_chance + +/// Returns how many deciseconds until the gun is able to fire again +/obj/item/attachable/vulture_scope/proc/get_time_to_fire() + if(!istype(loc, /obj/item/weapon/gun/boltaction/vulture)) + return 0 + + var/obj/item/weapon/gun/boltaction/vulture/rifle = loc + if(!rifle.last_fired) + return 0 + + return (rifle.last_fired + rifle.get_fire_delay()) - world.time + +/obj/item/attachable/vulture_scope/activate_attachment(obj/item/weapon/gun/gun, mob/living/carbon/user, turn_off) + if(turn_off || scoping) + on_unscope() + return TRUE + + if(!scoping) + if(!(gun.flags_item & WIELDED)) + to_chat(user, SPAN_WARNING("You must hold [gun] with two hands to use [src].")) + return FALSE + + if(!HAS_TRAIT(gun, TRAIT_GUN_BIPODDED)) + to_chat(user, SPAN_WARNING("You must have a deployed bipod to use [src].")) + return FALSE + + on_scope() + return TRUE + +/obj/item/attachable/vulture_scope/proc/get_offset_dirs() + var/list/possible_dirs = alldirs.Copy() + if(scope_offset_x >= scope_drift_max) + possible_dirs -= list(NORTHEAST, EAST, SOUTHEAST) + else if(scope_offset_x <= -scope_drift_max) + possible_dirs -= list(NORTHWEST, WEST, SOUTHWEST) + + if(scope_offset_y >= scope_drift_max) + possible_dirs -= list(NORTHWEST, NORTH, NORTHEAST) + else if(scope_offset_y <= -scope_drift_max) + possible_dirs -= list(SOUTHWEST, SOUTH, SOUTHEAST) + + return possible_dirs + +/// Gets a list of valid directions to be able to adjust the reticle in +/obj/item/attachable/vulture_scope/proc/get_adjust_dirs() + if(!scoping) + return list() + var/list/possible_dirs = alldirs.Copy() + var/turf/current_turf = get_turf(src) + var/turf/scope_tile = locate(scope_x, scope_y, current_turf.z) + var/mob/scoper = scope_user.resolve() + if(!scoper) + return list() + + var/user_dir = scoper.dir + var/distance = get_dist(current_turf, scope_tile) + if(distance >= max_scope_range) + possible_dirs -= get_related_directions(user_dir) + + else if(distance <= min_scope_range) + possible_dirs -= get_related_directions(REVERSE_DIR(user_dir)) + + if((user_dir == EAST) || (user_dir == WEST)) + if(scope_y - current_turf.y >= perpendicular_scope_range) + possible_dirs -= get_related_directions(NORTH) + + else if(current_turf.y - scope_y >= perpendicular_scope_range) + possible_dirs -= get_related_directions(SOUTH) + + else + if(scope_x - current_turf.x >= perpendicular_scope_range) + possible_dirs -= get_related_directions(EAST) + + else if(current_turf.x - scope_x >= perpendicular_scope_range) + possible_dirs -= get_related_directions(WEST) + + return possible_dirs + +/// Adjusts the position of the reticle by a tile in a given direction +/obj/item/attachable/vulture_scope/proc/adjust_offset(direction = NORTH) + var/old_x = scope_offset_x + var/old_y = scope_offset_y + if((direction == NORTHEAST) || (direction == EAST) || (direction == SOUTHEAST)) + scope_offset_x = min(scope_offset_x + 1, scope_drift_max) + else if((direction == NORTHWEST) || (direction == WEST) || (direction == SOUTHWEST)) + scope_offset_x = max(scope_offset_x - 1, -scope_drift_max) + + if((direction == NORTHWEST) || (direction == NORTH) || (direction == NORTHEAST)) + scope_offset_y = min(scope_offset_y + 1, scope_drift_max) + else if((direction == SOUTHWEST) || (direction == SOUTH) || (direction == SOUTHEAST)) + scope_offset_y = max(scope_offset_y - 1, -scope_drift_max) + + recalculate_scope_offset(old_x, old_y) + +/// Adjusts the position of the scope by a tile in a given direction +/obj/item/attachable/vulture_scope/proc/adjust_position(direction = NORTH) + var/perpendicular_axis = "x" + var/mob/user = scope_user.resolve() + var/turf/user_turf = get_turf(user) + if((user.dir == EAST) || (user.dir == WEST)) + perpendicular_axis = "y" + + if((direction == NORTHEAST) || (direction == EAST) || (direction == SOUTHEAST)) + scope_x++ + scope_x = user_turf.x + axis_math(user, perpendicular_axis, "x", direction) + else if((direction == NORTHWEST) || (direction == WEST) || (direction == SOUTHWEST)) + scope_x-- + scope_x = user_turf.x + axis_math(user, perpendicular_axis, "x", direction) + if((direction == NORTHWEST) || (direction == NORTH) || (direction == NORTHEAST)) + scope_y++ + scope_y = user_turf.y + axis_math(user, perpendicular_axis, "y", direction) + else if((direction == SOUTHWEST) || (direction == SOUTH) || (direction == SOUTHEAST)) + scope_y-- + scope_y = user_turf.y + axis_math(user, perpendicular_axis, "y", direction) + + SEND_SIGNAL(src, COMSIG_VULTURE_SCOPE_MOVED) + + recalculate_scope_pos() + +/// Figures out which direction the scope should move based on user direction and their input +/obj/item/attachable/vulture_scope/proc/axis_math(mob/user, perpendicular_axis = "x", modifying_axis = "x", direction = NORTH) + var/turf/user_turf = get_turf(user) + var/inverse = FALSE + if((user.dir == SOUTH) || (user.dir == WEST)) + inverse = TRUE + var/user_offset + if(modifying_axis == "x") + user_offset = scope_x - user_turf.x + + else + user_offset = scope_y - user_turf.y + + if(perpendicular_axis == modifying_axis) + return clamp(user_offset, -perpendicular_scope_range, perpendicular_scope_range) + + else + return clamp(abs(user_offset), min_scope_range, max_scope_range) * (inverse ? -1 : 1) + +/// Recalculates where the reticle should be inside the scope +/obj/item/attachable/vulture_scope/proc/recalculate_scope_offset(old_x = 0, old_y = 0) + var/mob/scoper = scope_user.resolve() + if(!scoper.client) + return + var/x_to_set = (scope_offset_x >= 0 ? "+" : "") + "[scope_offset_x]" + var/y_to_set = (scope_offset_y >= 0 ? "+" : "") + "[scope_offset_y]" + scope_element.screen_loc = "CENTER[x_to_set],CENTER[y_to_set]" + +/// Recalculates where the scope should be in relation to the user +/obj/item/attachable/vulture_scope/proc/recalculate_scope_pos() + if(!scope_user) + return + var/turf/current_turf = get_turf(src) + var/x_off = scope_x - current_turf.x + var/y_off = scope_y - current_turf.y + var/pixels_per_tile = 32 + var/mob/scoper = scope_user.resolve() + if(!scoper.client) + return + + if(scoping) + scoper.client.pixel_x = x_off * pixels_per_tile + scoper.client.pixel_y = y_off * pixels_per_tile + else + scoper.client.pixel_x = 0 + scoper.client.pixel_y = 0 + +/// Handler for when the user begins scoping +/obj/item/attachable/vulture_scope/proc/on_scope() + var/turf/gun_turf = get_turf(src) + scope_x = gun_turf.x + scope_y = gun_turf.y + scope_offset_x = 0 + scope_offset_y = 0 + holding_breath = FALSE + + if(!isgun(loc)) + return + + var/obj/item/weapon/gun/gun = loc + var/mob/living/gun_user = gun.get_gun_user() + if(!gun_user) + return + + switch(gun_user.dir) + if(NORTH) + scope_y += start_scope_range + if(EAST) + scope_x += start_scope_range + if(SOUTH) + scope_y -= start_scope_range + if(WEST) + scope_x -= start_scope_range + + scope_user = WEAKREF(gun_user) + scope_user_initial_dir = gun_user.dir + scoping = TRUE + recalculate_scope_pos() + gun_user.overlay_fullscreen("vulture", /atom/movable/screen/fullscreen/vulture) + scope_element = new(src) + gun_user.client.screen += scope_element + gun_user.see_in_dark += darkness_view + gun_user.lighting_alpha = 127 + gun_user.sync_lighting_plane_alpha() + RegisterSignal(gun, list( + COMSIG_ITEM_DROPPED, + COMSIG_ITEM_UNWIELD, + ), PROC_REF(on_unscope)) + RegisterSignal(gun_user, COMSIG_MOB_UNDEPLOYED_BIPOD, PROC_REF(on_unscope)) + RegisterSignal(gun_user, COMSIG_MOB_MOVE_OR_LOOK, PROC_REF(on_mob_move_look)) + RegisterSignal(gun_user.client, COMSIG_PARENT_QDELETING, PROC_REF(on_unscope)) + +/// Handler for when the scope is deleted, dropped, etc. +/obj/item/attachable/vulture_scope/proc/on_unscope() + SIGNAL_HANDLER + if(!scope_user) + return + + var/mob/scoper = scope_user.resolve() + if(isgun(loc)) + UnregisterSignal(loc, list( + COMSIG_ITEM_DROPPED, + COMSIG_ITEM_UNWIELD, + )) + UnregisterSignal(scoper, list(COMSIG_MOB_UNDEPLOYED_BIPOD, COMSIG_MOB_MOVE_OR_LOOK)) + UnregisterSignal(scoper.client, COMSIG_PARENT_QDELETING) + stop_holding_breath() + scope_user_initial_dir = null + scoper.clear_fullscreen("vulture") + scoper.client.screen -= scope_element + scoper.see_in_dark -= darkness_view + scoper.lighting_alpha = 127 + scoper.sync_lighting_plane_alpha() + QDEL_NULL(scope_element) + recalculate_scope_pos() + scope_user = null + scoping = FALSE + if(scoper.client) + scoper.client.pixel_x = 0 + scoper.client.pixel_y = 0 + +/// Handler for if the mob moves or changes look direction +/obj/item/attachable/vulture_scope/proc/on_mob_move_look(mob/living/mover, actually_moving, direction, specific_direction) + SIGNAL_HANDLER + + if(actually_moving || (mover.dir != scope_user_initial_dir)) + on_unscope() + +/// Causes the scope to drift in a random direction by 1 tile +/obj/item/attachable/vulture_scope/proc/scope_drift(forced_dir) + var/dir_picked + if(!forced_dir) + dir_picked = pick(get_offset_dirs()) + else + dir_picked = forced_dir + + adjust_offset(dir_picked) + +/// Returns the turf that the sniper scope + reticle is currently focused on +/obj/item/attachable/vulture_scope/proc/get_viewed_turf() + RETURN_TYPE(/turf) + if(!scoping) + return null + var/turf/gun_turf = get_turf(src) + return locate(scope_x + scope_offset_x, scope_y + scope_offset_y, gun_turf.z) + +/// Lets the user start holding their breath, stopping gun sway for a short time +/obj/item/attachable/vulture_scope/proc/hold_breath() + if(!scope_user) + return + + var/mob/scoper = scope_user.resolve() + to_chat(scoper, SPAN_NOTICE("You hold your breath, steadying your scope...")) + holding_breath = TRUE + INVOKE_ASYNC(src, PROC_REF(tick_down_breath_scope)) + addtimer(CALLBACK(src, PROC_REF(stop_holding_breath)), breath_time) + +/// Slowly empties out the crosshair as the user's breath runs out +/obj/item/attachable/vulture_scope/proc/tick_down_breath_scope() + scope_element.icon_state = "vulture_steady_4" + sleep(breath_time * 0.25) + scope_element.icon_state = "vulture_steady_3" + sleep(breath_time * 0.25) + scope_element.icon_state = "vulture_steady_2" + sleep(breath_time * 0.25) + scope_element.icon_state = "vulture_steady_1" + +/// Stops the user from holding their breath, starting the cooldown +/obj/item/attachable/vulture_scope/proc/stop_holding_breath() + if(!scope_user || !holding_breath) + return + + var/mob/scoper = scope_user.resolve() + to_chat(scoper, SPAN_NOTICE("You breathe out, letting your scope sway.")) + holding_breath = FALSE + scope_element.icon_state = "vulture_unsteady" + COOLDOWN_START(src, hold_breath_cd, breath_cooldown_time) + +/// Returns a % of how much time until the user can still their breath again +/obj/item/attachable/vulture_scope/proc/get_breath_recharge() + return 1 - (COOLDOWN_TIMELEFT(src, hold_breath_cd) / breath_cooldown_time) + +/datum/action/item_action/vulture + +/datum/action/item_action/vulture/action_activate() + var/obj/item/weapon/gun/gun_holder = holder_item + var/obj/item/attachable/vulture_scope/scope = gun_holder.attachments["rail"] + if(!istype(scope)) + return + scope.tgui_interact(owner) // ======== Stock attachments ======== // @@ -1250,6 +1790,16 @@ Defined in conflicts.dm of the #defines folder. recoil_unwielded_mod = RECOIL_AMOUNT_TIER_5 scatter_unwielded_mod = SCATTER_AMOUNT_TIER_4 +/obj/item/attachable/stock/vulture + name = "\improper M707 heavy stock" + icon_state = "vulture_stock" + hud_offset_mod = 3 + +/obj/item/attachable/stock/vulture/Initialize(mapload, ...) + . = ..() + select_gamemode_skin(type) + // Doesn't give any stat additions due to the gun already having really good ones, and this is unremovable from the gun itself + /obj/item/attachable/stock/tactical name = "\improper MK221 tactical stock" desc = "A metal stock made for the MK221 tactical shotgun." @@ -1642,15 +2192,14 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/m4ra_barrel/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection) . = ..() var/new_attach_icon - switch(SSmapping.configs[GROUND_MAP].map_name) // maploader TODO: json - if(MAP_ICE_COLONY, MAP_ICE_COLONY_V3, MAP_CORSAT, MAP_SOROKYNE_STRATA) + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("snow") attach_icon = new_attach_icon ? new_attach_icon : "s_" + attach_icon - if(MAP_WHISKEY_OUTPOST, MAP_DESERT_DAM, MAP_BIG_RED, MAP_KUTJEVO) + if("desert") attach_icon = new_attach_icon ? new_attach_icon : "d_" + attach_icon - if(MAP_PRISON_STATION, MAP_PRISON_STATION_V3, MAP_LV522_CHANCES_CLAIM) + if("classic") attach_icon = new_attach_icon ? new_attach_icon : "c_" + attach_icon - /obj/item/attachable/m4ra_barrel_custom name = "custom M4RA barrel" desc = "This isn't supposed to be seperated from the gun, how'd this happen?" @@ -1669,14 +2218,89 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/m4ra_barrel_custom/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection) . = ..() var/new_attach_icon - switch(SSmapping.configs[GROUND_MAP].map_name) // maploader TODO: json - if(MAP_ICE_COLONY, MAP_ICE_COLONY_V3, MAP_CORSAT, MAP_SOROKYNE_STRATA) + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("snow") attach_icon = new_attach_icon ? new_attach_icon : "s_" + attach_icon - if(MAP_WHISKEY_OUTPOST, MAP_DESERT_DAM, MAP_BIG_RED, MAP_KUTJEVO) + if("desert") attach_icon = new_attach_icon ? new_attach_icon : "d_" + attach_icon - if(MAP_PRISON_STATION, MAP_PRISON_STATION_V3, MAP_LV522_CHANCES_CLAIM) + if("classic") attach_icon = new_attach_icon ? new_attach_icon : "c_" + attach_icon +/obj/item/attachable/upp_rpg_breech + name = "HJRA-12 Breech" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi' + icon_state = "hjra_breech" + attach_icon = "hjra_breech" + slot = "stock" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 + size_mod = 0 + +/obj/item/attachable/pkpbarrel + name = "QYJ-72 Barrel" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi' + icon_state = "uppmg_barrel" + attach_icon = "uppmg_barrel" + slot = "muzzle" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 + size_mod = 0 + +/obj/item/attachable/stock/pkpstock + name = "QYJ-72 Stock" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi' + icon_state = "uppmg_stock" + attach_icon = "uppmg_stock" + slot = "stock" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 20 //the thought of a upp spec beating people to death with a pk makes me laugh + size_mod = 0 + +/obj/item/attachable/type88_barrel + name = "Type-88 Barrel" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi' + icon_state = "type88_barrel" + attach_icon = "type88_barrel" + slot = "special" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 + size_mod = 0 + +/obj/item/attachable/type73suppressor + name = "Type 73 Integrated Suppressor" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi' + icon_state = "type73_suppressor" + attach_icon = "type73_suppressor" + slot = "muzzle" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 0 + size_mod = 0 + +/obj/item/attachable/stock/type71 + name = "Type 71 Stock" + desc = "This isn't supposed to be seperated from the gun, how'd this happen?" + icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi' + icon_state = "type71_stock" + attach_icon = "type71_stock" + slot = "stock" + wield_delay_mod = WIELD_DELAY_NONE + flags_attach_features = NO_FLAGS + melee_mod = 15 + size_mod = 0 + +/obj/item/attachable/stock/type71/New() + ..() + /obj/item/attachable/stock/smg name = "submachinegun stock" desc = "A rare ARMAT stock distributed in small numbers to USCM forces. Compatible with the M39, this stock reduces recoil and improves accuracy, but at a reduction to handling and agility. Seemingly a bit more effective in a brawl" @@ -1702,7 +2326,7 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/stock/smg/collapsible name = "submachinegun folding stock" - desc = "A Kirchner brand K2 M39 folding stock, standard issue in the USCM. The stock, when extended, reduces recoil and improves accuracy, but at a reduction to handling and agility. Seemingly a bit more effective in a brawl. This stock can collapse in, removing almost all positive and negative effects, however it slightly increases spread due to weapon being off-balanced by the collapsed stock." + desc = "A Kirchner brand K2 M39 folding stock, standard issue in the USCM. The stock, when extended, reduces recoil and improves accuracy, but at a reduction to handling and agility. Seemingly a bit more effective in a brawl. This stock can collapse in, removing all positive and negative effects." slot = "stock" melee_mod = 10 size_mod = 1 @@ -1735,6 +2359,9 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/stock/smg/collapsible/apply_on_weapon(obj/item/weapon/gun/gun) if(stock_activated) + accuracy_mod = HIT_ACCURACY_MULT_TIER_3 + recoil_mod = -RECOIL_AMOUNT_TIER_4 + scatter_mod = -SCATTER_AMOUNT_TIER_8 scatter_unwielded_mod = SCATTER_AMOUNT_TIER_10 size_mod = 1 aim_speed_mod = CONFIG_GET(number/slowdown_low) @@ -1747,22 +2374,20 @@ Defined in conflicts.dm of the #defines folder. attach_icon = "smgstockc_a" else + accuracy_mod = 0 + recoil_mod = 0 + scatter_mod = 0 scatter_unwielded_mod = 0 size_mod = 0 aim_speed_mod = 0 wield_delay_mod = 0 movement_onehanded_acc_penalty_mod = 0 - accuracy_unwielded_mod = -HIT_ACCURACY_MULT_TIER_1 - recoil_unwielded_mod = RECOIL_AMOUNT_TIER_5 + accuracy_unwielded_mod = 0 + recoil_unwielded_mod = 0 hud_offset_mod = 3 icon_state = "smgstockcc" attach_icon = "smgstockcc_a" - //don't *= -1 on debuffs, you'd actually be making than without stock when it's collapsed. - accuracy_mod *= -1 - recoil_mod *= -1 - scatter_mod *= -1 - gun.recalculate_attachment_bonuses() gun.update_overlays(src, "stock") @@ -2285,7 +2910,7 @@ Defined in conflicts.dm of the #defines folder. var/obj/item/weapon/gun/attached_gun = loc if(!(attached_gun.flags_item & WIELDED)) - to_chat(user, SPAN_WARNING("You must wield \the [attached_gun] to fire \the [src]!")) + to_chat(user, SPAN_WARNING("You must wield [attached_gun] to fire [src]!")) return if(current_rounds > round_usage_per_tile && ..()) @@ -2431,6 +3056,9 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/attached_gun/extinguisher/fire_attachment(atom/target, obj/item/weapon/gun/gun, mob/living/user) if(!internal_extinguisher) return + if(!(gun.flags_item & WIELDED)) + to_chat(user, SPAN_WARNING("You must wield [gun] to fire [src]!")) + return if(..()) return internal_extinguisher.afterattack(target, user) @@ -2491,7 +3119,7 @@ Defined in conflicts.dm of the #defines folder. return if((gun.flags_gun_features & GUN_WIELDED_FIRING_ONLY) && !(gun.flags_item & WIELDED)) - to_chat(user, SPAN_WARNING("You need a more secure grip to fire this weapon!")) + to_chat(user, SPAN_WARNING("You must wield [gun] to fire [src]!")) return if(gun.flags_gun_features & GUN_TRIGGER_SAFETY) @@ -2514,7 +3142,7 @@ Defined in conflicts.dm of the #defines folder. gun.last_fired = world.time gun.current_mag.reagents.remove_reagent(flamer_reagent.id, FLAME_REAGENT_USE_AMOUNT * fuel_per_projectile) - var/obj/item/projectile/P = new(src, create_cause_data(initial(name), user, src)) + var/obj/projectile/P = new(src, create_cause_data(initial(name), user, src)) var/datum/ammo/flamethrower/ammo_datum = new projectile_type ammo_datum.flamer_reagent_type = flamer_reagent.type P.generate_bullet(ammo_datum) @@ -2663,6 +3291,7 @@ Defined in conflicts.dm of the #defines folder. user.apply_effect(2, SLOW) /obj/item/attachable/bipod/proc/undeploy_bipod(obj/item/weapon/gun/G) + REMOVE_TRAIT(G, TRAIT_GUN_BIPODDED, "attached_bipod") bipod_deployed = FALSE accuracy_mod = -HIT_ACCURACY_MULT_TIER_5 scatter_mod = SCATTER_AMOUNT_TIER_9 @@ -2674,6 +3303,7 @@ Defined in conflicts.dm of the #defines folder. var/mob/living/user if(isliving(G.loc)) user = G.loc + SEND_SIGNAL(user, COMSIG_MOB_UNDEPLOYED_BIPOD) UnregisterSignal(user, COMSIG_MOB_MOVE_OR_LOOK) if(G.flags_gun_features & GUN_SUPPORT_PLATFORM) @@ -2697,7 +3327,9 @@ Defined in conflicts.dm of the #defines folder. bipod_deployed = !bipod_deployed if(user) if(bipod_deployed) + ADD_TRAIT(G, TRAIT_GUN_BIPODDED, "attached_bipod") to_chat(user, SPAN_NOTICE("You deploy [src] [support ? "on [support]" : "on the ground"].")) + SEND_SIGNAL(user, COMSIG_MOB_DEPLOYED_BIPOD) playsound(user,'sound/items/m56dauto_rotate.ogg', 55, 1) accuracy_mod = HIT_ACCURACY_MULT_TIER_5 scatter_mod = -SCATTER_AMOUNT_TIER_10 @@ -2759,6 +3391,11 @@ Defined in conflicts.dm of the #defines folder. flags_attach_features = ATTACH_ACTIVATION +/obj/item/attachable/bipod/vulture + name = "heavy bipod" + desc = "A set of rugged telescopic poles to keep a weapon stabilized during firing." + icon_state = "bipod_m60" + attach_icon = "vulture_bipod" /obj/item/attachable/burstfire_assembly name = "burst fire assembly" diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index e86801c9d8c1..6c94973997f5 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -136,20 +136,6 @@ DEFINES in setup.dm, referenced here. else ..() - -/// This function disconnects the luminosity from the mob and back to the gun -/obj/item/weapon/gun/proc/disconnect_light_from_mob(mob/bearer) - if (!(flags_gun_features & GUN_FLASHLIGHT_ON)) - return FALSE - for (var/slot in attachments) - var/obj/item/attachable/attachment = attachments[slot] - if (!attachment || !attachment.light_mod) - continue - bearer.SetLuminosity(0, FALSE, src) - SetLuminosity(attachment.light_mod) - return TRUE - return FALSE - /// This function actually turns the lights on the gun off /obj/item/weapon/gun/proc/turn_off_light(mob/bearer) if (!(flags_gun_features & GUN_FLASHLIGHT_ON)) @@ -165,15 +151,6 @@ DEFINES in setup.dm, referenced here. /obj/item/weapon/gun/pickup(mob/user) ..() - if (flags_gun_features & GUN_FLASHLIGHT_ON) - for (var/slot in attachments) - var/obj/item/attachable/attachment = attachments[slot] - if (!attachment || !attachment.light_mod) - continue - user.SetLuminosity(attachment.light_mod, FALSE, src) - SetLuminosity(0) - break - unwield(user) /obj/item/weapon/gun/proc/wy_allowed_check(mob/living/carbon/human/user) @@ -716,15 +693,15 @@ DEFINES in setup.dm, referenced here. var/old_firemode = gun_firemode gun_firemode_list.len = 0 + if(start_automatic) + gun_firemode_list |= GUN_FIREMODE_AUTOMATIC + if(start_semiauto) gun_firemode_list |= GUN_FIREMODE_SEMIAUTO if(burst_amount > BURST_AMOUNT_TIER_1) gun_firemode_list |= GUN_FIREMODE_BURSTFIRE - if(start_automatic) - gun_firemode_list |= GUN_FIREMODE_AUTOMATIC - if(!length(gun_firemode_list)) CRASH("[src] called setup_firemodes() with an empty gun_firemode_list") @@ -960,3 +937,15 @@ DEFINES in setup.dm, referenced here. if(!istype(target, /atom/movable/screen/click_catcher)) return null return params2turf(modifiers["screen-loc"], get_turf(user), user.client) + +/// If this gun has a relevant flashlight attachable attached, (de)activate it +/obj/item/weapon/gun/proc/force_light(on) + var/obj/item/attachable/flashlight/torch + for(var/slot in attachments) + torch = attachments[slot] + if(istype(torch)) + break + if(!torch) + return FALSE + torch.turn_light(toggle_on = on, forced = TRUE) + return TRUE diff --git a/code/modules/projectiles/guns/boltaction.dm b/code/modules/projectiles/guns/boltaction.dm index a558d3dd7969..69ce3a8de53e 100644 --- a/code/modules/projectiles/guns/boltaction.dm +++ b/code/modules/projectiles/guns/boltaction.dm @@ -33,9 +33,13 @@ aim_slowdown = SLOWDOWN_ADS_RIFLE wield_delay = WIELD_DELAY_NORMAL civilian_usable_override = TRUE + unacidable = TRUE // Like other 1-of-a-kind weapons, it can't be gotten rid of that fast + indestructible = TRUE var/bolted = TRUE // FALSE IS OPEN, TRUE IS CLOSE var/bolt_delay var/recent_cycle //world.time to see when they last bolted it. + /// If this gun should change icon states when the bolt is open + var/has_openbolt_icon = TRUE /obj/item/weapon/gun/boltaction/set_gun_attachment_offsets() attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 17,"rail_x" = 5, "rail_y" = 18, "under_x" = 25, "under_y" = 14, "stock_x" = 18, "stock_y" = 10) @@ -49,7 +53,7 @@ ..() var/new_icon_state = icon_state - if(!bolted) + if(!bolted && has_openbolt_icon) new_icon_state += "_o" icon_state = new_icon_state @@ -111,3 +115,163 @@ SPAN_NOTICE("You load [magazine] into [src]!"), null, 3, CHAT_TYPE_COMBAT_ACTION) if(reload_sound) playsound(user, reload_sound, 25, 1, 5) + + +/obj/item/weapon/gun/boltaction/vulture + name = "\improper M707 \"Vulture\" anti-materiel rifle" + desc = "The M707 is a crude but highly powerful rifle, designed for disabling lightly armored vehicles and hitting targets inside buildings. Its unwieldy scope and caliber necessitates a spotter to be fully effective, suffering severe scope drift without one." + desc_lore = {" + Put into production in 2175 as an economical answer to rising militancy in the Outer Rim, the M707 was derived from jury-rigged anti-materiel rifles that were captured during the Linna 349 campaign. + + The rebels (colloquially known among the USCMC as bug-boys and beebops) had achieved extensive success at Neusheune using the aforementioned rifles to pick off incinerator-wielding marines by detonating their napthal fuel tank in the midst of squad formations, subsequently leading to the USCMC designating users of those rifles as high-priority targets, as well as changes in USCMC patrol tactics. + + Some of the failings and quirks of the beebops' jury-rigged rifle were quickly noticed by vehicle crews early on in the campaign, as in multiple memoirs the crews mention that: "Once the rain starts, that's when you know you've got an ambush." + + The 'pitter-patter' of 'rain' that the crews heard was in fact multiple rifles failing to penetrate through the vehicle's external armor. Once a number of the anti-materiel rifles were examined, it was deemed a high priority to produce a Corps version. In the process, the rifles were designed for a higher calibre then that of the rebel versions, so the M707 would be capable of penetrating the light vehicle armor of their UPP peers in the event of another Dog War or Tientsin."} + + icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi' // overriden with camos + icon_state = "vulture" + item_state = "vulture" + cocked_sound = 'sound/weapons/gun_cocked2.ogg' + fire_sound = 'sound/weapons/gun_vulture_fire.ogg' + open_bolt_sound ='sound/weapons/handling/gun_vulture_bolt_eject.ogg' + close_bolt_sound ='sound/weapons/handling/gun_vulture_bolt_close.ogg' + flags_equip_slot = SLOT_BACK|SLOT_BLOCK_SUIT_STORE + w_class = SIZE_LARGE + force = 5 + flags_gun_features = NONE + gun_category = GUN_CATEGORY_HEAVY + aim_slowdown = SLOWDOWN_ADS_SPECIALIST // Consider SUPERWEAPON, but it's not like you can fire this without being bipodded + wield_delay = WIELD_DELAY_VERY_SLOW + map_specific_decoration = TRUE + current_mag = /obj/item/ammo_magazine/rifle/boltaction/vulture + attachable_allowed = list( + /obj/item/attachable/sniperbarrel/vulture, + /obj/item/attachable/vulture_scope, + /obj/item/attachable/bipod/vulture, + /obj/item/attachable/stock/vulture, + ) + starting_attachment_types = list( + /obj/item/attachable/sniperbarrel/vulture, + /obj/item/attachable/vulture_scope, + /obj/item/attachable/bipod/vulture, + /obj/item/attachable/stock/vulture, + ) + civilian_usable_override = FALSE + projectile_type = /obj/projectile/vulture + actions_types = list( + /datum/action/item_action/vulture, + ) + has_openbolt_icon = FALSE + bolt_delay = 1 SECONDS + /// How far out people can tell the direction of the shot + var/fire_message_range = 25 + /// If the gun should bypass the trait requirement + var/bypass_trait = FALSE + +/obj/item/weapon/gun/boltaction/vulture/update_icon() + ..() + if(!bolted) + overlays += "vulture_bolt_open" + + +/obj/item/weapon/gun/boltaction/vulture/set_gun_config_values() //check that these work + ..() + set_fire_delay(FIRE_DELAY_TIER_VULTURE) + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_7 + accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_10 + scatter = SCATTER_AMOUNT_TIER_10 + burst_scatter_mult = SCATTER_AMOUNT_TIER_6 + scatter_unwielded = SCATTER_AMOUNT_TIER_2 + damage_mult = BASE_BULLET_DAMAGE_MULT + recoil = RECOIL_AMOUNT_TIER_4 + recoil_unwielded = RECOIL_AMOUNT_TIER_2 + damage_falloff_mult = 0 + +/obj/item/weapon/gun/boltaction/vulture/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 19, "rail_x" = 11, "rail_y" = 24, "under_x" = 25, "under_y" = 14, "stock_x" = 11, "stock_y" = 15) + +/obj/item/weapon/gun/boltaction/vulture/able_to_fire(mob/user) + . = ..() + if(!.) + return + + if(!bypass_trait && !HAS_TRAIT(user, TRAIT_VULTURE_USER)) + to_chat(user, SPAN_WARNING("You don't know how to use this!")) + return + +/obj/item/weapon/gun/boltaction/vulture/Fire(atom/target, mob/living/user, params, reflex, dual_wield) + var/obj/item/attachable/vulture_scope/scope = attachments["rail"] + if(istype(scope) && scope.scoping) + var/turf/viewed_turf = scope.get_viewed_turf() + target = viewed_turf + var/mob/living/living_mob = locate(/mob/living) in viewed_turf + if(living_mob) + target = living_mob + + . = ..() + if(!.) + return . + + for(var/mob/current_mob as anything in get_mobs_in_z_level_range(get_turf(user), fire_message_range) - user) + var/relative_dir = get_dir(current_mob, user) + var/final_dir = dir2text(relative_dir) + to_chat(current_mob, SPAN_HIGHDANGER("You hear a massive boom coming from [final_dir ? "the [final_dir]" : "nearby"]!")) + if(current_mob.client) + playsound_client(current_mob.client, 'sound/weapons/gun_vulture_report.ogg', src, 25) + + if(!HAS_TRAIT(src, TRAIT_GUN_BIPODDED)) + fired_without_bipod(user) + else + shake_camera(user, 3, 4) // equivalent to getting hit with a heavy round + + return . + +/// Someone tried to fire this without using a bipod, so we break their arm along with sending them flying backwards +/obj/item/weapon/gun/boltaction/vulture/proc/fired_without_bipod(mob/living/user) + SEND_SIGNAL(src, COMSIG_GUN_VULTURE_FIRED_ONEHAND) + to_chat(user, SPAN_HIGHDANGER("You get flung backwards as you fire [src], breaking your firing arm in the process!")) + user.apply_effect(0.7, WEAKEN) + user.apply_effect(1, SUPERSLOW) + user.apply_effect(2, SLOW) + + if(ishuman(user)) + if(user.hand) + break_arm(user, RIGHT) + else + break_arm(user, LEFT) + + //Either knockback or slam them into an obstacle. + var/direction = REVERSE_DIR(user.dir) + if(direction && !step(user, direction)) + user.animation_attack_on(get_step(user, direction)) + user.visible_message(SPAN_DANGER("[user] slams into an obstacle!"), SPAN_HIGHDANGER("You slam into an obstacle!"), null, 4, CHAT_TYPE_TAKING_HIT) + user.apply_damage(MELEE_FORCE_TIER_2) + + shake_camera(user, 7, 6) // Around 2x worse than getting hit with a heavy round + +/// The code that takes care of breaking a person's firing arm +/obj/item/weapon/gun/boltaction/vulture/proc/break_arm(mob/living/carbon/human/user, arm = LEFT) + var/obj/limb/arm/found_limb + var/obj/limb/hand/found_hand + if(arm == LEFT) + found_limb = locate(/obj/limb/arm/l_arm) in user.limbs + found_hand = locate(/obj/limb/hand/l_hand) in user.limbs + else + found_limb = locate(/obj/limb/arm/r_arm) in user.limbs + found_hand = locate(/obj/limb/hand/r_hand) in user.limbs + + if(!found_limb || !found_hand) + return + found_limb.take_damage((found_limb.status & LIMB_BROKEN) ? rand(25, 30) : rand(10, 15)) + found_hand.take_damage((found_hand.status & LIMB_BROKEN) ? rand(25, 30) : rand(10, 15)) + found_limb.fracture(100) + found_hand.fracture(100) + + for(var/obj/limb/limb as anything in list(found_limb, found_hand)) + if(!(limb.status & LIMB_SPLINTED_INDESTRUCTIBLE) && (limb.status & LIMB_SPLINTED)) //If they have it splinted, the splint won't hold. + limb.status &= ~LIMB_SPLINTED + playsound(user, 'sound/items/splintbreaks.ogg', 20) + to_chat(user, SPAN_DANGER("The splint on your [limb.display_name] comes apart under the recoil!")) + user.pain.apply_pain(PAIN_BONE_BREAK_SPLINTED) + user.update_med_icon() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 5733b01195ff..adca6a7cce6f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -96,7 +96,7 @@ update_icon() return TRUE -/obj/item/weapon/gun/energy/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/energy/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(refund) cell.charge += charge_cost return TRUE diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index ee08fee0f845..13ccd03c3e82 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -404,6 +404,12 @@ GLOBAL_LIST_EMPTY(flamer_particles) icon_state = "dynamic_2" layer = BELOW_OBJ_LAYER + light_system = STATIC_LIGHT + light_on = TRUE + light_range = 3 + light_power = 3 + light_color = "#f88818" + var/firelevel = 12 //Tracks how much "fire" there is. Basically the timer of how long the fire burns var/burnlevel = 10 //Tracks how HOT the fire is. This is basically the heat level of the fire and determines the temperature. @@ -443,6 +449,8 @@ GLOBAL_LIST_EMPTY(flamer_particles) else flame_icon = R.burn_sprite + set_light(l_color = R.burncolor) + if(!GLOB.flamer_particles[R.burncolor]) GLOB.flamer_particles[R.burncolor] = new /particles/flamer_fire(R.burncolor) particles = GLOB.flamer_particles[R.burncolor] @@ -576,7 +584,6 @@ GLOBAL_LIST_EMPTY(flamer_particles) RegisterSignal(SSdcs, COMSIG_GLOB_WEATHER_CHANGE, PROC_REF(update_in_weather_status)) /obj/flamer_fire/Destroy() - SetLuminosity(0) STOP_PROCESSING(SSobj, src) to_call = null tied_reagent = null @@ -668,7 +675,7 @@ GLOBAL_LIST_EMPTY(flamer_particles) flame_level++ //the initial flame burst is 1 level higher for a small time icon_state = "[flame_icon]_[flame_level]" - SetLuminosity(flame_level * 2) + set_light(flame_level * 2) /obj/flamer_fire/proc/un_burst_flame() initial_burst = FALSE @@ -683,12 +690,12 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/damage = burnlevel*delta_time T.flamer_fire_act(damage) - update_flame() - if(!firelevel) qdel(src) return + update_flame() + for(var/atom/thing in loc) thing.handle_flamer_fire(src, damage, delta_time) @@ -703,7 +710,7 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/area/A = get_area(src) if(!A) return - if(SSweather.is_weather_event && locate(A.master) in SSweather.weather_areas) + if(SSweather.is_weather_event && locate(A) in SSweather.weather_areas) weather_smothering_strength = SSweather.weather_event_instance.fire_smothering_strength else weather_smothering_strength = 0 diff --git a/code/modules/projectiles/guns/flare_gun.dm b/code/modules/projectiles/guns/flare_gun.dm new file mode 100644 index 000000000000..407ecdf00066 --- /dev/null +++ b/code/modules/projectiles/guns/flare_gun.dm @@ -0,0 +1,158 @@ +/obj/item/weapon/gun/flare + name = "\improper M82-F flare gun" + desc = "A flare gun issued to JTAC operators to use with flares. Comes with a miniscope. One shot, one... life saved?" + icon_state = "m82f" + item_state = "m82f" + current_mag = /obj/item/ammo_magazine/internal/flare + reload_sound = 'sound/weapons/gun_shotgun_shell_insert.ogg' + fire_sound = 'sound/weapons/gun_flare.ogg' + aim_slowdown = 0 + flags_equip_slot = SLOT_WAIST + wield_delay = WIELD_DELAY_VERY_FAST + movement_onehanded_acc_penalty_mult = MOVEMENT_ACCURACY_PENALTY_MULT_TIER_4 + flags_gun_features = GUN_INTERNAL_MAG|GUN_CAN_POINTBLANK + gun_category = GUN_CATEGORY_HANDGUN + attachable_allowed = list(/obj/item/attachable/scope/mini/flaregun) + + var/last_signal_flare_name + + +/obj/item/weapon/gun/flare/Initialize(mapload, spawn_empty) + . = ..() + if(spawn_empty) + update_icon() + +/obj/item/weapon/gun/flare/handle_starting_attachment() + ..() + var/obj/item/attachable/scope/mini/flaregun/scope = new(src) + scope.hidden = TRUE + scope.flags_attach_features &= ~ATTACH_REMOVABLE + scope.Attach(src) + update_attachables() + + +/obj/item/weapon/gun/flare/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 18,"rail_x" = 12, "rail_y" = 20, "under_x" = 19, "under_y" = 14, "stock_x" = 19, "stock_y" = 14) + +/obj/item/weapon/gun/flare/set_gun_config_values() + ..() + set_fire_delay(FIRE_DELAY_TIER_12) + accuracy_mult = BASE_ACCURACY_MULT + accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_10 + scatter = 0 + recoil = RECOIL_AMOUNT_TIER_4 + recoil_unwielded = RECOIL_AMOUNT_TIER_4 + +/obj/item/weapon/gun/flare/set_bullet_traits() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) + )) + +/obj/item/weapon/gun/flare/reload_into_chamber(mob/user) + . = ..() + to_chat(user, SPAN_WARNING("You pop out [src]'s tube!")) + update_icon() + +/obj/item/weapon/gun/flare/attackby(obj/item/attacking_item, mob/user) + if(istype(attacking_item, /obj/item/device/flashlight/flare)) + var/obj/item/device/flashlight/flare/attacking_flare = attacking_item + if(attacking_flare.on) + to_chat(user, SPAN_WARNING("You can't put a lit flare in [src]!")) + return + if(!attacking_flare.fuel) + to_chat(user, SPAN_WARNING("You can't put a burnt out flare in [src]!")) + return + if(current_mag && current_mag.current_rounds == 0) + ammo = GLOB.ammo_list[attacking_flare.ammo_datum] + playsound(user, reload_sound, 25, 1) + to_chat(user, SPAN_NOTICE("You load [attacking_flare] into [src].")) + current_mag.current_rounds++ + qdel(attacking_flare) + update_icon() + else + to_chat(user, SPAN_WARNING("[src] is already loaded!")) + else + to_chat(user, SPAN_WARNING("That's not a flare!")) + +/obj/item/weapon/gun/flare/unload(mob/user) + if(flags_gun_features & GUN_BURST_FIRING) + return + unload_flare(user) + +/obj/item/weapon/gun/flare/proc/unload_flare(mob/user) + if(!current_mag) + return + if(current_mag.current_rounds) + var/obj/item/device/flashlight/flare/unloaded_flare = new ammo.handful_type(get_turf(src)) + playsound(user, reload_sound, 25, TRUE) + current_mag.current_rounds-- + if(user) + to_chat(user, SPAN_NOTICE("You unload [unloaded_flare] from \the [src].")) + user.put_in_hands(unloaded_flare) + update_icon() + +/obj/item/weapon/gun/flare/unique_action(mob/user) + if(!user || !isturf(user.loc) || !current_mag || !current_mag.current_rounds) + return + + var/turf/flare_turf = user.loc + var/area/flare_area = flare_turf.loc + + if(flare_area.ceiling > CEILING_GLASS) + to_chat(user, SPAN_NOTICE("The roof above you is too dense.")) + return + + if(!istype(ammo, /datum/ammo/flare)) + to_chat(user, SPAN_NOTICE("[src] jams as it is somehow loaded with incorrect ammo!")) + return + + if(user.action_busy) + return + + if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) + return + + if(!current_mag || !current_mag.current_rounds) + return + + current_mag.current_rounds-- + + flare_turf.ceiling_debris() + + var/datum/ammo/flare/explicit_ammo = ammo + + var/obj/item/device/flashlight/flare/fired_flare = new explicit_ammo.flare_type(get_turf(src)) + to_chat(user, SPAN_NOTICE("You fire [fired_flare] into the air!")) + fired_flare.visible_message(SPAN_WARNING("\A [fired_flare] bursts into brilliant light in the sky!")) + fired_flare.invisibility = INVISIBILITY_MAXIMUM + fired_flare.mouse_opacity = FALSE + playsound(user.loc, fire_sound, 50, 1) + + var/obj/effect/flare_light/light_effect = new (fired_flare, fired_flare.light_range, fired_flare.light_power, fired_flare.light_color) + light_effect.RegisterSignal(fired_flare, COMSIG_ATOM_SET_LIGHT_ON, TYPE_PROC_REF(/obj/effect/flare_light, flare_light_change)) + + if(fired_flare.activate_signal(user)) + last_signal_flare_name = fired_flare.name + + update_icon() + +/obj/item/weapon/gun/flare/get_examine_text(mob/user) + . = ..() + if(last_signal_flare_name) + . += SPAN_NOTICE("The last signal flare fired has the designation: [last_signal_flare_name]") + +/obj/effect/flare_light + name = "flare light" + desc = "You are not supposed to see this. Please report it." + icon_state = "" //No sprite + invisibility = INVISIBILITY_MAXIMUM + light_system = STATIC_LIGHT + +/obj/effect/flare_light/Initialize(mapload, light_range, light_power, light_color) + . = ..() + set_light(light_range, light_power, light_color) + +/obj/effect/flare_light/proc/flare_light_change(original_flare, new_light_value) + if(!new_light_value) + qdel(original_flare) + qdel(src) diff --git a/code/modules/projectiles/guns/lever_action.dm b/code/modules/projectiles/guns/lever_action.dm index 73d9330e2a53..81d7dc166cd3 100644 --- a/code/modules/projectiles/guns/lever_action.dm +++ b/code/modules/projectiles/guns/lever_action.dm @@ -495,7 +495,7 @@ their unique feature is that a direct hit will buff your damage and firerate if(!able_to_fire(user) || !target) //checks here since we don't want to fuck up applying the increase return NONE if(floating_penetration && in_chamber) //has to go before actual firing - var/obj/item/projectile/P = in_chamber + var/obj/projectile/P = in_chamber switch(floating_penetration) if(FLOATING_PENETRATION_TIER_1) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen20] @@ -525,7 +525,7 @@ their unique feature is that a direct hit will buff your damage and firerate wield_delay = initial(wield_delay) cur_onehand_chance = initial(cur_onehand_chance) if(in_chamber) - var/obj/item/projectile/P = in_chamber + var/obj/projectile/P = in_chamber P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88] floating_penetration = FLOATING_PENETRATION_TIER_0 //these are init configs and so cannot be initial() diff --git a/code/modules/projectiles/guns/misc.dm b/code/modules/projectiles/guns/misc.dm index 373587ff881a..5503ab03a1da 100644 --- a/code/modules/projectiles/guns/misc.dm +++ b/code/modules/projectiles/guns/misc.dm @@ -4,7 +4,7 @@ /obj/item/weapon/gun/minigun name = "\improper Ol' Painless" desc = "An enormous multi-barreled rotating gatling gun. This thing will no doubt pack a punch." - icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/guns_by_faction/event.dmi' icon_state = "painless" item_state = "painless" @@ -159,6 +159,125 @@ return FALSE +/obj/item/weapon/gun/pkp + name = "\improper QYJ-72 General Purpose Machine Gun" + desc = "The QYJ-72 is the standard GPMG of the Union of Progressive Peoples, chambered in 7.62x54mmR, it fires a hard-hitting cartridge with a high rate of fire. With an extremely large box at 250 rounds, the QJY-72 is designed with suppressing fire and accuracy by volume of fire at its forefront. \nAlt-click it to open the feed cover and allow for reloading." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "qjy72" + item_state = "qjy72" + + fire_sound = 'sound/weapons/gun_mg.ogg' + cocked_sound = 'sound/weapons/gun_m60_cocked.ogg' + current_mag = /obj/item/ammo_magazine/pkp + w_class = SIZE_LARGE + force = 30 //the image of a upp machinegunner beating someone to death with a gpmg makes me laugh + start_semiauto = FALSE + start_automatic = TRUE + flags_gun_features = GUN_WIELDED_FIRING_ONLY|GUN_CAN_POINTBLANK|GUN_AUTO_EJECTOR|GUN_SPECIALIST|GUN_AMMO_COUNTER + gun_category = GUN_CATEGORY_HEAVY + attachable_allowed = list( + /obj/item/attachable/pkpbarrel, + /obj/item/attachable/stock/pkpstock, + ) + var/cover_open = FALSE //if the gun's feed-cover is open or not. + + +/obj/item/weapon/gun/pkp/handle_starting_attachment() + ..() + var/obj/item/attachable/attachie = new /obj/item/attachable/pkpbarrel(src) + attachie.flags_attach_features &= ~ATTACH_REMOVABLE + attachie.Attach(src) + update_attachable(attachie.slot) + + var/obj/item/attachable/pkpstock = new /obj/item/attachable/stock/pkpstock(src) + pkpstock.flags_attach_features &= ~ATTACH_REMOVABLE + pkpstock.Attach(src) + update_attachable(pkpstock.slot) + + //invisible mag harness + var/obj/item/attachable/magnetic_harness/Integrated = new(src) + Integrated.hidden = TRUE + Integrated.flags_attach_features &= ~ATTACH_REMOVABLE + Integrated.Attach(src) + update_attachable(Integrated.slot) + +/obj/item/weapon/gun/pkp/Initialize(mapload, spawn_empty) + . = ..() + if(current_mag && current_mag.current_rounds > 0) + load_into_chamber() + +/obj/item/weapon/gun/pkp/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 34, "muzzle_y" = 18,"rail_x" = 5, "rail_y" = 5, "under_x" = 39, "under_y" = 7, "stock_x" = 10, "stock_y" = 13) + + +/obj/item/weapon/gun/pkp/set_gun_config_values() + ..() + fire_delay = FIRE_DELAY_TIER_10 + burst_amount = BURST_AMOUNT_TIER_6 + burst_delay = FIRE_DELAY_TIER_9 + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 + accuracy_mult_unwielded = BASE_ACCURACY_MULT + fa_max_scatter = SCATTER_AMOUNT_TIER_8 + scatter = SCATTER_AMOUNT_TIER_10 + burst_scatter_mult = SCATTER_AMOUNT_TIER_8 + scatter_unwielded = SCATTER_AMOUNT_TIER_10 + damage_mult = BASE_BULLET_DAMAGE_MULT + recoil = RECOIL_AMOUNT_TIER_5 + empty_sound = 'sound/weapons/gun_empty.ogg' + +/obj/item/weapon/gun/pkp/clicked(mob/user, list/mods) + if(!mods["alt"] || !CAN_PICKUP(user, src)) + return ..() + else + if(!locate(src) in list(user.get_active_hand(), user.get_inactive_hand())) + return TRUE + if(user.get_active_hand() && user.get_inactive_hand()) + to_chat(user, SPAN_WARNING("You can't do that with your hands full!")) + return TRUE + if(!cover_open) + playsound(src.loc, 'sound/handling/smartgun_open.ogg', 50, TRUE, 3) + to_chat(user, SPAN_NOTICE("You open [src]'s feed cover, allowing the belt to be removed.")) + cover_open = TRUE + else + playsound(src.loc, 'sound/handling/smartgun_close.ogg', 50, TRUE, 3) + to_chat(user, SPAN_NOTICE("You close [src]'s feed cover.")) + cover_open = FALSE + update_icon() + return TRUE + +/obj/item/weapon/gun/pkp/replace_magazine(mob/user, obj/item/ammo_magazine/magazine) + if(!cover_open) + to_chat(user, SPAN_WARNING("[src]'s feed cover is closed! You can't put a new belt in! (alt-click to open it)")) + return + return ..() + +/obj/item/weapon/gun/pkp/unload(mob/user, reload_override, drop_override, loc_override) + if(!cover_open) + to_chat(user, SPAN_WARNING("[src]'s feed cover is closed! You can't take out the belt! (alt-click to open it)")) + return + return ..() + +/obj/item/weapon/gun/pkp/update_icon() + . = ..() + if(cover_open) + overlays += "+[base_gun_icon]_cover_open" + else + overlays += "+[base_gun_icon]_cover_closed" + +/obj/item/weapon/gun/pkp/able_to_fire(mob/living/user) + . = ..() + if(.) + if(cover_open) + to_chat(user, SPAN_WARNING("You can't fire [src] with the feed cover open! (alt-click to close)")) + return FALSE + if(!skillcheck(user, SKILL_FIREARMS, SKILL_FIREARMS_TRAINED)) + to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) + return 0 + if(!skillcheck(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && user.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_UPP) + to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) + return 0 + + /obj/effect/syringe_gun_dummy name = "" desc = "" diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm index e2985df6a12a..c17ca5bca739 100644 --- a/code/modules/projectiles/guns/pistols.dm +++ b/code/modules/projectiles/guns/pistols.dm @@ -258,66 +258,132 @@ icon_state = "g_deagle" item_state = "g_deagle" base_gun_icon = "g_deagle" + //------------------------------------------------------- -//MAUSER MERC PISTOL //Inspired by the Makarov, specifically the "PB" version, an integrally silenced Makarov. -//Rebalanced: Now acts like an UPP M4A3. +//NP92 pistol +//Its a makarov + +/obj/item/weapon/gun/pistol/np92 + name = "\improper NP92 pistol" + desc = "The standard issue sidearm of the UPP. The NP92 is a small but powerful sidearm, well-liked by most it is issued to, although some prefer the weapon it was meant to replace, the Type 73. Takes 12 round magazines." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "np92" + item_state = "np92" + fire_sound = "88m4" + current_mag = /obj/item/ammo_magazine/pistol/np92 + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED|GUN_AMMO_COUNTER + attachable_allowed = list( + /obj/item/attachable/suppressor, + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/flashlight, + ) + +/obj/item/weapon/gun/pistol/np92/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 27, "muzzle_y" = 20,"rail_x" = 13, "rail_y" = 22, "under_x" = 21, "under_y" = 18, "stock_x" = 21, "stock_y" = 18) + +/obj/item/weapon/gun/pistol/np92/set_gun_config_values() + ..() + set_fire_delay(FIRE_DELAY_TIER_12) + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_5 + accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_5 + scatter = SCATTER_AMOUNT_TIER_6 + burst_scatter_mult = SCATTER_AMOUNT_TIER_6 + scatter_unwielded = SCATTER_AMOUNT_TIER_6 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_3 -/obj/item/weapon/gun/pistol/c99 - name = "\improper Korovin PK-9 pistol" - desc = "The Korovin PK-9 is a cheap, robust and reliable sidearm, its design is strongly inspired by the classic ancient Makarov pistol. Commonly used by many groups, mostly those worried about cost." +/obj/item/weapon/gun/pistol/np92/suppressed + name = "\improper NPZ92 pistol" + desc = "The NPZ92 is a version of the NP92 that includes an integrated suppressor, issued sparingly to Kommando units." icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' - icon_state = "pk9" - item_state = "pk9" + icon_state = "npz92" + item_state = "npz92" inherent_traits = list(TRAIT_GUN_SILENCED) - fire_sound = 'sound/weapons/gun_c99.ogg' - current_mag = /obj/item/ammo_magazine/pistol/c99 - flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED + fire_sound = "gun_silenced" + current_mag = /obj/item/ammo_magazine/pistol/np92/suppressed + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED|GUN_AMMO_COUNTER + attachable_allowed = list( + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/flashlight, + ) + +/obj/item/weapon/gun/pistol/np92/suppressed/tranq + current_mag = /obj/item/ammo_magazine/pistol/np92/tranq + +//------------------------------------------------------- +//Type 73 pistol +//Its a TT + +/obj/item/weapon/gun/pistol/t73 + name = "\improper Type 73 pistol" + desc = "The Type 73 is the once-standard issue sidearm of the UPP. Replaced by the NP92 in UPP use, it remains popular with veteran UPP troops due to familiarity and extra power. Due to an extremely large amount being produced, they tend to end up in the hands of forces attempting to arm themselves on a budget. Users include the Union of Progressive Peoples, Colonial Liberation Front, and just about any mercenary or pirate group out there." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "tt" + item_state = "tt" + fire_sound = 'sound/weapons/gun_tt.ogg' + current_mag = /obj/item/ammo_magazine/pistol/t73 + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED|GUN_AMMO_COUNTER attachable_allowed = list( /obj/item/attachable/reddot, /obj/item/attachable/reflex, /obj/item/attachable/flashlight, /obj/item/attachable/lasersight, - /obj/item/attachable/burstfire_assembly, + /obj/item/attachable/suppressor, ) -/obj/item/weapon/gun/pistol/c99/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 30, "muzzle_y" = 19,"rail_x" = 10, "rail_y" = 22, "under_x" = 21, "under_y" = 18, "stock_x" = 21, "stock_y" = 18) +/obj/item/weapon/gun/pistol/t73/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 28, "muzzle_y" = 20,"rail_x" = 13, "rail_y" = 22, "under_x" = 22, "under_y" = 15, "stock_x" = 21, "stock_y" = 18) -/obj/item/weapon/gun/pistol/c99/set_gun_config_values() +/obj/item/weapon/gun/pistol/t73/set_gun_config_values() ..() - set_fire_delay(FIRE_DELAY_TIER_12) - accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 - accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 + set_fire_delay(FIRE_DELAY_TIER_11) + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_5 + accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_5 scatter = SCATTER_AMOUNT_TIER_6 burst_scatter_mult = SCATTER_AMOUNT_TIER_6 scatter_unwielded = SCATTER_AMOUNT_TIER_6 - damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_7 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_6 -/obj/item/weapon/gun/pistol/c99/upp - desc = "The Korovin PK-9 is a cheap, robust and reliable sidearm, its design is strongly inspired by the classic ancient Makarov pistol. This version has been refitted for military usage by the UPP." - icon_state = "pk9u" - item_state = "pk9u" -/obj/item/weapon/gun/pistol/c99/upp/tranq - desc = "The Korovin PK-9 is a cheap, robust and reliable sidearm, its design strongly inspired by the classic ancient Makarov pistol. This version contains a customized exterior, an integrated laser and reflex sight, and is noticeably easy to handle." - icon_state = "pk9r" - item_state = "pk9r" - current_mag = /obj/item/ammo_magazine/pistol/c99/tranq - aim_slowdown = 0 - wield_delay = WIELD_DELAY_MIN +/obj/item/weapon/gun/pistol/t73/leader + name = "\improper Type 74 pistol" + desc = "The Type 74 is the designation for a specially modified Type 73 with an integrated laser sight system, multiple lightning cuts to reduce weight in order to allow a higher pressure round to be used with the same recoil sping, and a more comfortable grip. Due to the adoption of the NP92, the Type 74 was produced in limited numbers, because of this it is typically only issued on request to high-ranking officers." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "ttb" + item_state = "ttb" + current_mag = /obj/item/ammo_magazine/pistol/t73_impact + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED|GUN_AMMO_COUNTER + accepted_ammo = list( + /obj/item/ammo_magazine/pistol/t73, + /obj/item/ammo_magazine/pistol/t73_impact, + ) + attachable_allowed = list( + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/flashlight, + /obj/item/attachable/suppressor, + /obj/item/attachable/heavy_barrel, + ) -/obj/item/weapon/gun/pistol/c99/upp/tranq/handle_starting_attachment() +/obj/item/weapon/gun/pistol/t73/leader/handle_starting_attachment() ..() - var/obj/item/attachable/lasersight/LS = new(src) - LS.flags_attach_features &= ~ATTACH_REMOVABLE - LS.Attach(src) - update_attachable(LS.slot) + var/obj/item/attachable/lasersight/TT = new(src) + TT.flags_attach_features &= ~ATTACH_REMOVABLE + TT.hidden = TRUE + TT.Attach(src) + update_attachable(TT.slot) - var/obj/item/attachable/reflex/RX = new(src) - RX.flags_attach_features &= ~ATTACH_REMOVABLE - RX.Attach(src) - update_attachable(RX.slot) +/obj/item/weapon/gun/pistol/t73/leader/set_gun_config_values() + ..() + set_fire_delay(FIRE_DELAY_TIER_11) + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_6 + accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_6 + scatter = SCATTER_AMOUNT_TIER_7 + burst_scatter_mult = SCATTER_AMOUNT_TIER_6 + scatter_unwielded = SCATTER_AMOUNT_TIER_7 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_6 //------------------------------------------------------- //KT-42 //Inspired by the .44 Auto Mag pistol @@ -770,7 +836,7 @@ It is a modified Beretta 93R, and can fire three-round burst or single fire. Whe /obj/item/weapon/gun/pistol/skorpion name = "\improper CZ-81 machine pistol" desc = "A robust, 20th century firearm that's a combination of pistol and submachinegun. Fires .32ACP caliber rounds from a 20-round magazine." - icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi' icon_state = "skorpion" item_state = "skorpion" @@ -798,36 +864,8 @@ It is a modified Beretta 93R, and can fire three-round burst or single fire. Whe ..() set_fire_delay(FIRE_DELAY_TIER_11) fa_scatter_peak = 15 //shots - fa_max_scatter = SCATTER_AMOUNT_TIER_4 - - accuracy_mult = BASE_ACCURACY_MULT - scatter = SCATTER_AMOUNT_TIER_6 - damage_mult = BASE_BULLET_DAMAGE_MULT - -/obj/item/weapon/gun/pistol/skorpion/upp - desc = "A robust, 20th century firearm modernized for the 23rd century. Fires .32ACP caliber rounds from a 20-round magazine." - icon_state = "skorpion_u" - item_state = "skorpion_u" - -/obj/item/weapon/gun/pistol/skorpion/upp/medic - random_spawn_chance = 100 - random_rail_chance = 70 - random_spawn_rail = list( - /obj/item/attachable/reflex, - /obj/item/attachable/flashlight, - ) - random_muzzle_chance = 50 - random_spawn_muzzle = list( - /obj/item/attachable/suppressor, - ) - random_under_chance = 60 - random_spawn_under = list( - /obj/item/attachable/lasersight, - ) - -/obj/item/weapon/gun/pistol/skorpion/set_gun_config_values() - ..() fa_max_scatter = SCATTER_AMOUNT_TIER_5 + accuracy_mult = BASE_ACCURACY_MULT scatter = SCATTER_AMOUNT_TIER_7 damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_2 diff --git a/code/modules/projectiles/guns/revolvers.dm b/code/modules/projectiles/guns/revolvers.dm index 7a8782f34d7d..4eaedf11ef11 100644 --- a/code/modules/projectiles/guns/revolvers.dm +++ b/code/modules/projectiles/guns/revolvers.dm @@ -182,7 +182,7 @@ rotate_cylinder() return 1 -/obj/item/weapon/gun/revolver/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/revolver/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(refund && current_mag) current_mag.current_rounds++ @@ -440,14 +440,20 @@ //------------------------------------------------------- //RUSSIAN REVOLVER //Based on the 7.62mm Russian revolvers. -/obj/item/weapon/gun/revolver/nagant - name = "\improper N-Y 7.62mm revolver" - desc = "The Nagant-Yamasaki 7.62 is an effective killing machine designed by a consortion of shady Not-Americans. It is frequently found in the hands of criminals or mercenaries." +/obj/item/weapon/gun/revolver/upp + name = "\improper ZHNK-72 revolver" + desc = "The ZHNK-72 is a UPP designed revolver. The ZHNK-72 is used by the UPP armed forces in a policing role as well as limited numbers in the hands of SNCOs." icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' - icon_state = "ny762" - item_state = "ny762" + icon_state = "zhnk72" + item_state = "zhnk72" - fire_sound = 'sound/weapons/gun_pistol_medium.ogg' + fire_sound = "gun_pkd" //sounds stolen from bladerunner revolvers bc they arent used and sound awesome + fire_rattle = 'sound/weapons/gun_pkd_fire01_rattle.ogg' + reload_sound = 'sound/weapons/handling/pkd_speed_load.ogg' + cocked_sound = 'sound/weapons/handling/pkd_cock.wav' + unload_sound = 'sound/weapons/handling/pkd_open_chamber.ogg' + chamber_close_sound = 'sound/weapons/handling/pkd_close_chamber.ogg' + hand_reload_sound = 'sound/weapons/gun_revolver_load3.ogg' current_mag = /obj/item/ammo_magazine/internal/revolver/upp force = 8 attachable_allowed = list( @@ -460,23 +466,22 @@ /obj/item/attachable/bayonet/upp, /obj/item/attachable/heavy_barrel, /obj/item/attachable/extended_barrel, - /obj/item/attachable/compensator, /obj/item/attachable/lasersight, // Underbarrel ) -/obj/item/weapon/gun/revolver/nagant/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 28, "muzzle_y" = 21,"rail_x" = 14, "rail_y" = 23, "under_x" = 24, "under_y" = 19, "stock_x" = 24, "stock_y" = 19) +/obj/item/weapon/gun/revolver/upp/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 28, "muzzle_y" = 21,"rail_x" = 14, "rail_y" = 23, "under_x" = 19, "under_y" = 17, "stock_x" = 24, "stock_y" = 19) -/obj/item/weapon/gun/revolver/nagant/set_gun_config_values() +/obj/item/weapon/gun/revolver/upp/set_gun_config_values() ..() set_fire_delay(FIRE_DELAY_TIER_9) accuracy_mult = BASE_ACCURACY_MULT scatter = SCATTER_AMOUNT_TIER_6 - damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_1 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_4 recoil = 0 recoil_unwielded = 0 -/obj/item/weapon/gun/revolver/nagant/shrapnel +/obj/item/weapon/gun/revolver/upp/shrapnel current_mag = /obj/item/ammo_magazine/internal/revolver/upp/shrapnel random_spawn_chance = 100 random_under_chance = 100 diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index 70c1709e9e67..4723ad882368 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -1277,6 +1277,8 @@ item_state = "type71" fire_sound = 'sound/weapons/gun_type71.ogg' + reload_sound = 'sound/weapons/handling/m41_reload.ogg' + unload_sound = 'sound/weapons/handling/m41_unload.ogg' current_mag = /obj/item/ammo_magazine/rifle/type71 wield_delay = WIELD_DELAY_FAST attachable_allowed = list( @@ -1292,10 +1294,8 @@ /obj/item/attachable/extended_barrel, /obj/item/attachable/heavy_barrel, /obj/item/attachable/verticalgrip, // Underbarrel - /obj/item/attachable/angledgrip, /obj/item/attachable/flashlight/grip, /obj/item/attachable/lasersight, - /obj/item/attachable/bipod, /obj/item/attachable/burstfire_assembly, /obj/item/attachable/attached_gun/flamer, /obj/item/attachable/attached_gun/flamer/advanced, @@ -1307,11 +1307,11 @@ start_automatic = TRUE /obj/item/weapon/gun/rifle/type71/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 18,"rail_x" = 18, "rail_y" = 23, "under_x" = 20, "under_y" = 13, "stock_x" = 24, "stock_y" = 13) + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 17,"rail_x" = 10, "rail_y" = 23, "under_x" = 20, "under_y" = 13, "stock_x" = 11, "stock_y" = 13) /obj/item/weapon/gun/rifle/type71/set_gun_config_values() ..() - set_fire_delay(FIRE_DELAY_TIER_11) + set_fire_delay(FIRE_DELAY_TIER_8) set_burst_amount(BURST_AMOUNT_TIER_4) set_burst_delay(FIRE_DELAY_TIER_9) accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 @@ -1319,9 +1319,16 @@ scatter = SCATTER_AMOUNT_TIER_6 burst_scatter_mult = SCATTER_AMOUNT_TIER_10 scatter_unwielded = SCATTER_AMOUNT_TIER_4 - damage_mult = BASE_BULLET_DAMAGE_MULT + damage_mult = BASE_BULLET_DAMAGE_MULT //10~ more damage than m41, as well as higher ap from bullet, slightly higher DPS, 133>137.5 recoil_unwielded = RECOIL_AMOUNT_TIER_3 +/obj/item/weapon/gun/rifle/type71/handle_starting_attachment() + ..() + var/obj/item/attachable/stock/type71/STOCK = new(src) + STOCK.flags_attach_features &= ~ATTACH_REMOVABLE + STOCK.Attach(src) + update_attachable(STOCK.slot) + /obj/item/weapon/gun/rifle/type71/rifleman //add GL random_spawn_chance = 100 @@ -1336,9 +1343,7 @@ ) random_under_chance = 40 random_spawn_under = list( - /obj/item/attachable/lasersight, /obj/item/attachable/verticalgrip, - /obj/item/attachable/angledgrip, ) /obj/item/weapon/gun/rifle/type71/dual @@ -1356,7 +1361,6 @@ random_spawn_under = list( /obj/item/attachable/lasersight, /obj/item/attachable/verticalgrip, - /obj/item/attachable/angledgrip, ) /obj/item/weapon/gun/rifle/type71/sapper @@ -1375,7 +1379,6 @@ ) random_under_chance = 90 random_spawn_under = list( - /obj/item/attachable/lasersight, /obj/item/attachable/attached_gun/extinguisher, ) @@ -1383,10 +1386,17 @@ name = "\improper Type 71-F pulse rifle" desc = " This appears to be a less common variant of the Type 71 with an integrated flamethrower that seems especially powerful." attachable_allowed = list( - /obj/item/attachable/suppressor, + /obj/item/attachable/flashlight, // Rail + /obj/item/attachable/magnetic_harness, + /obj/item/attachable/scope, + /obj/item/attachable/scope/mini, /obj/item/attachable/reddot, /obj/item/attachable/reflex, + /obj/item/attachable/suppressor, // Muzzle + /obj/item/attachable/bayonet, + /obj/item/attachable/bayonet/upp, /obj/item/attachable/extended_barrel, + /obj/item/attachable/heavy_barrel, ) /obj/item/weapon/gun/rifle/type71/flamer/handle_starting_attachment() @@ -1418,16 +1428,35 @@ aim_slowdown = SLOWDOWN_ADS_QUICK //Carbine is more lightweight wield_delay = WIELD_DELAY_VERY_FAST bonus_overlay_x = 2 + force = 20 //integrated melee mod from stock, which doesn't fit on the gun but is still clearly there on the sprite + attachable_allowed = list( + /obj/item/attachable/flashlight, // Rail + /obj/item/attachable/magnetic_harness, + /obj/item/attachable/scope, + /obj/item/attachable/scope/mini, + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/suppressor, // Muzzle + /obj/item/attachable/bayonet, + /obj/item/attachable/bayonet/upp, + /obj/item/attachable/extended_barrel, + /obj/item/attachable/heavy_barrel, + /obj/item/attachable/verticalgrip, // Underbarrel + /obj/item/attachable/burstfire_assembly, + ) random_spawn_muzzle = list() //no default bayonet /obj/item/weapon/gun/rifle/type71/carbine/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 30, "muzzle_y" = 18,"rail_x" = 19, "rail_y" = 22, "under_x" = 21, "under_y" = 14, "stock_x" = 24, "stock_y" = 13) + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 17,"rail_x" = 14, "rail_y" = 23, "under_x" = 25, "under_y" = 14, "stock_x" = 24, "stock_y" = 13) + +/obj/item/weapon/gun/rifle/type71/carbine/handle_starting_attachment() + return //integrated attachment code makes me want to blow my brains out /obj/item/weapon/gun/rifle/type71/carbine/set_gun_config_values() ..() - set_fire_delay(FIRE_DELAY_TIER_11) - damage_mult = BASE_BULLET_DAMAGE_MULT - BULLET_DAMAGE_MULT_TIER_2 + set_fire_delay(FIRE_DELAY_TIER_11)//same fire rate as m41 + damage_mult = BASE_BULLET_DAMAGE_MULT - BULLET_DAMAGE_MULT_TIER_4//same damage as m41 reg bullets probably scatter_unwielded = SCATTER_AMOUNT_TIER_5 recoil_unwielded = RECOIL_AMOUNT_TIER_4 @@ -1444,9 +1473,7 @@ ) random_under_chance = 40 random_spawn_under = list( - /obj/item/attachable/lasersight, /obj/item/attachable/verticalgrip, - /obj/item/attachable/angledgrip, ) /obj/item/weapon/gun/rifle/type71/carbine/commando @@ -1454,12 +1481,13 @@ desc = "A much rarer variant of the Type 71, this version contains an integrated suppressor, integrated scope, and extensive fine-tuning. Many parts have been replaced, filed down, and improved upon. As a result, this variant is rarely seen outside of commando units." icon_state = "type73" item_state = "type73" + + fire_sound = "gun_silenced" wield_delay = 0 //Ends up being .5 seconds due to scope - current_mag = /obj/item/ammo_magazine/rifle/type71/heap + inherent_traits = list(TRAIT_GUN_SILENCED) + current_mag = /obj/item/ammo_magazine/rifle/type71/ap attachable_allowed = list( - /obj/item/attachable/lasersight, /obj/item/attachable/verticalgrip, - /obj/item/attachable/angledgrip, ) random_spawn_chance = 0 random_spawn_rail = list() @@ -1467,24 +1495,23 @@ bonus_overlay_x = 1 bonus_overlay_y = 0 -/obj/item/weapon/gun/rifle/type71/carbine/commando/handle_starting_attachment()//Making the gun have an invisible silencer since it's supposed to have one. +/obj/item/weapon/gun/rifle/type71/carbine/commando/handle_starting_attachment() ..() //suppressor - var/obj/item/attachable/suppressor/S = new(src) - S.hidden = TRUE - S.flags_attach_features &= ~ATTACH_REMOVABLE - S.Attach(src) - update_attachable(S.slot) + var/obj/item/attachable/type73suppressor/suppressor = new(src) + suppressor.flags_attach_features &= ~ATTACH_REMOVABLE + suppressor.Attach(src) + update_attachable(suppressor.slot) //scope - var/obj/item/attachable/scope/mini/F = new(src) - F.hidden = TRUE - F.flags_attach_features &= ~ATTACH_REMOVABLE - F.Attach(src) - update_attachable(F.slot) + var/obj/item/attachable/scope/mini/scope = new(src) + scope.hidden = TRUE + scope.flags_attach_features &= ~ATTACH_REMOVABLE + scope.Attach(src) + update_attachable(scope.slot) /obj/item/weapon/gun/rifle/type71/carbine/commando/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 30, "muzzle_y" = 19,"rail_x" = 10, "rail_y" = 22, "under_x" = 21, "under_y" = 18, "stock_x" = 21, "stock_y" = 18) + attachable_offset = list("muzzle_x" = 35, "muzzle_y" = 17,"rail_x" = 10, "rail_y" = 22, "under_x" = 23, "under_y" = 14, "stock_x" = 21, "stock_y" = 18) /obj/item/weapon/gun/rifle/type71/carbine/commando/set_gun_config_values() @@ -1697,3 +1724,143 @@ ) random_under_chance = 50 random_spawn_under = list(/obj/item/attachable/flashlight/grip) + +//=ROYAL MARINES=\\ + +/obj/item/weapon/gun/rifle/rmc_f90 + name = "\improper F903A1 Rifle" + desc = "The standard issue rifle of the royal marines. Uniquely the royal marines are the only modern military to not use a pulse weapon. Uses 10x24mm caseless ammunition." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/twe_guns.dmi' + icon_state = "aug" + item_state = "aug" + fire_sound = "gun_pulse" + reload_sound = 'sound/weapons/handling/m41_reload.ogg' + unload_sound = 'sound/weapons/handling/m41_unload.ogg' + current_mag = /obj/item/ammo_magazine/rifle/rmc_f90 + flags_equip_slot = NO_FLAGS + attachable_allowed = list( + /obj/item/attachable/suppressor, + /obj/item/attachable/bayonet, + /obj/item/attachable/bayonet/upp, + /obj/item/attachable/bayonet/co2, + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/flashlight, + /obj/item/attachable/extended_barrel, + /obj/item/attachable/heavy_barrel, + /obj/item/attachable/magnetic_harness, + ) + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER + map_specific_decoration = FALSE + aim_slowdown = SLOWDOWN_ADS_QUICK + +/obj/item/weapon/gun/rifle/rmc_f90/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 16,"rail_x" = 15, "rail_y" = 21, "under_x" = 24, "under_y" = 13, "stock_x" = 24, "stock_y" = 13) + + +/obj/item/weapon/gun/rifle/rmc_f90/set_gun_config_values() + ..() + fire_delay = FIRE_DELAY_TIER_8 + burst_amount = BURST_AMOUNT_TIER_3 + burst_delay = FIRE_DELAY_TIER_8 + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 + 2*HIT_ACCURACY_MULT_TIER_1 + accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_7 + scatter = SCATTER_AMOUNT_TIER_8 + burst_scatter_mult = SCATTER_AMOUNT_TIER_10 + scatter_unwielded = SCATTER_AMOUNT_TIER_2 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_2 + recoil_unwielded = RECOIL_AMOUNT_TIER_2 + +/obj/item/weapon/gun/rifle/rmc_f90/a_grip + name = "\improper F903A2 Rifle" + desc = "A non-standard issue rifle of the royal marines the F903A2 is currently being phased into the royal marines as their new mainline rifle but currently only sees use by unit leaders. Uniquely the royal marines are the only modern military to not use a pulse weapon. Uses 10x24mm caseless ammunition." + icon_state = "aug_com" + item_state = "aug_com" + attachable_allowed = list( + /obj/item/attachable/suppressor, + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/extended_barrel, + ) + +/obj/item/weapon/gun/rifle/rmc_f90/a_grip/handle_starting_attachment() + ..() + var/obj/item/attachable/angledgrip/f90_agrip = new(src) + f90_agrip.flags_attach_features &= ~ATTACH_REMOVABLE + f90_agrip.hidden = TRUE + f90_agrip.Attach(src) + update_attachable(f90_agrip.slot) + +/obj/item/weapon/gun/rifle/rmc_f90/scope + name = "\improper F903A1 Marksman Rifle" + desc = "A variation of the F903 rifle used by the royal marines commando. This weapon only accepts the smaller 20 round magazines of 10x24mm." + icon_state = "aug_dmr" + item_state = "aug_dmr" + attachable_allowed = null + current_mag = /obj/item/ammo_magazine/rifle/rmc_f90/marksman + +/obj/item/weapon/gun/rifle/rmc_f90/scope/set_gun_config_values() + ..() + fire_delay = FIRE_DELAY_TIER_7 + burst_amount = 0 + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 + 2*HIT_ACCURACY_MULT_TIER_1 + accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_7 + scatter = SCATTER_AMOUNT_TIER_8 + scatter_unwielded = SCATTER_AMOUNT_TIER_2 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_6 + recoil_unwielded = RECOIL_AMOUNT_TIER_2 + damage_falloff_mult = 0 + +/obj/item/weapon/gun/rifle/rmc_f90/scope/handle_starting_attachment() + ..() + var/obj/item/attachable/scope/mini/f90/f90_scope = new(src) + var/obj/item/attachable/angledgrip/f90_agrip = new(src) + var/obj/item/attachable/f90_dmr_barrel/f90_dmr_barrel = new(src) + f90_scope.flags_attach_features &= ~ATTACH_REMOVABLE + f90_agrip.flags_attach_features &= ~ATTACH_REMOVABLE + f90_dmr_barrel.flags_attach_features &= ~ATTACH_REMOVABLE + f90_scope.hidden = TRUE + f90_agrip.hidden = TRUE + f90_dmr_barrel.hidden = FALSE + f90_agrip.Attach(src) + f90_scope.Attach(src) + f90_dmr_barrel.Attach(src) + update_attachable(f90_agrip.slot) + update_attachable(f90_scope.slot) + update_attachable(f90_dmr_barrel.slot) + +/obj/item/weapon/gun/rifle/rmc_f90/shotgun + name = "\improper F903A1/B 'Breacher' Rifle" + desc = "A variation of the F903 rifle used by the royal marines commando. Modified to be used in one hand with a shield. Uses 10x24mm caseless ammunition." + icon_state = "aug_mkey" + item_state = "aug_mkey" + attachable_allowed = list( + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + ) + +/obj/item/weapon/gun/rifle/rmc_f90/shotgun/set_gun_config_values() + ..() + fire_delay = FIRE_DELAY_TIER_8 + burst_amount = BURST_AMOUNT_TIER_3 + burst_delay = FIRE_DELAY_TIER_8 + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_4 + 2*HIT_ACCURACY_MULT_TIER_1 + accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_2 + scatter = SCATTER_AMOUNT_TIER_8 + burst_scatter_mult = SCATTER_AMOUNT_TIER_10 + scatter_unwielded = SCATTER_AMOUNT_TIER_2 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_2 + recoil_unwielded = RECOIL_OFF + +/obj/item/weapon/gun/rifle/rmc_f90/shotgun/handle_starting_attachment() + ..() + var/obj/item/attachable/attached_gun/shotgun/f90_shotgun = new(src) + var/obj/item/attachable/f90_dmr_barrel/f90_shotgun_barrel = new(src) + f90_shotgun.flags_attach_features &= ~ATTACH_REMOVABLE + f90_shotgun_barrel.flags_attach_features &= ~ATTACH_REMOVABLE + f90_shotgun_barrel.hidden = FALSE + f90_shotgun.hidden = TRUE + f90_shotgun.Attach(src) + f90_shotgun_barrel.Attach(src) + update_attachable(f90_shotgun.slot) + update_attachable(f90_shotgun_barrel.slot) diff --git a/code/modules/projectiles/guns/shotguns.dm b/code/modules/projectiles/guns/shotguns.dm index 3c366df40b57..4237e89f80a3 100644 --- a/code/modules/projectiles/guns/shotguns.dm +++ b/code/modules/projectiles/guns/shotguns.dm @@ -391,7 +391,7 @@ can cause issues with ammo types getting mixed up during the burst. starting_attachment_types = list(/obj/item/attachable/stock/type23) /obj/item/weapon/gun/shotgun/type23/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 31, "muzzle_y" = 19,"rail_x" = 13, "rail_y" = 21, "under_x" = 24, "under_y" = 15, "stock_x" = 1, "stock_y" = 16) + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 19,"rail_x" = 13, "rail_y" = 21, "under_x" = 24, "under_y" = 15, "stock_x" = -1, "stock_y" = 17) /obj/item/weapon/gun/shotgun/type23/set_gun_config_values() ..() @@ -590,7 +590,7 @@ can cause issues with ammo types getting mixed up during the burst. //We can't make a projectile without a mag or active attachable. -/obj/item/weapon/gun/shotgun/double/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/shotgun/double/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) qdel(projectile_to_fire) if(!current_mag) return diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm index 2a88c9766ed8..22f10cafb35b 100644 --- a/code/modules/projectiles/guns/smartgun.dm +++ b/code/modules/projectiles/guns/smartgun.dm @@ -735,3 +735,20 @@ . = ..() . += SPAN_NOTICE("The power indicator reads [power_cell.charge] charge out of [power_cell.maxcharge] total.") + +/obj/item/weapon/gun/smartgun/rmc + name = "\improper L56A2 smartgun" + desc = "The actual firearm in the 2-piece L56A2 Smartgun System. This Variant is used by the Three World Empires Royal Marines Commando units.\nYou may toggle firing restrictions by using a special action.\nAlt-click it to open the feed cover and allow for reloading." + current_mag = /obj/item/ammo_magazine/smartgun/holo_targetting + ammo = /obj/item/ammo_magazine/smartgun/holo_targetting + ammo_primary = /datum/ammo/bullet/smartgun/holo_target //Toggled ammo type + ammo_secondary = /datum/ammo/bullet/smartgun/holo_target/ap ///Toggled ammo type + flags_gun_features = GUN_SPECIALIST|GUN_WIELDED_FIRING_ONLY + icon = 'icons/obj/items/weapons/guns/guns_by_faction/twe_guns.dmi' + icon_state = "magsg" + item_state = "magsg" + starting_attachment_types = list(/obj/item/attachable/l56a2_smartgun) + +/obj/item/weapon/gun/smartgun/rmc/Initialize(mapload, ...) + . = ..() + MD.iff_signal = FACTION_TWE diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index b9c2b9c3514d..89e6594c64e7 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -338,6 +338,89 @@ #undef PPSH_UNJAM_CHANCE +//------------------------------------------------------- +//Type-19, + +/obj/item/weapon/gun/smg/pps43 + name = "\improper Type-19 Submachinegun" //placeholder + desc = "An outdated, but reliable and powerful, submachinegun originating in the Union of Progressive Peoples, it is still in limited service in the UPP but is most often used by paramilitary groups or corporate security forces. It is usually used with a 35 round stick magazine, or a 71 round drum." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "insasu" + item_state = "insasu" + + fire_sound = 'sound/weapons/smg_heavy.ogg' + current_mag = /obj/item/ammo_magazine/smg/pps43 + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER + attachable_allowed = list( + /obj/item/attachable/suppressor, + /obj/item/attachable/reddot, + /obj/item/attachable/reflex, + /obj/item/attachable/flashlight/grip, + /obj/item/attachable/verticalgrip, + /obj/item/attachable/lasersight, + /obj/item/attachable/flashlight, + /obj/item/attachable/extended_barrel, + /obj/item/attachable/magnetic_harness, + ) + +/obj/item/weapon/gun/smg/pps43/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 20,"rail_x" = 20, "rail_y" = 24, "under_x" = 25, "under_y" = 17, "stock_x" = 26, "stock_y" = 15) + +/obj/item/weapon/gun/smg/pps43/set_gun_config_values() + ..() + fire_delay = FIRE_DELAY_TIER_SMG + burst_delay = FIRE_DELAY_TIER_SMG + burst_amount = BURST_AMOUNT_TIER_3 + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_3 + accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_5 + scatter = SCATTER_AMOUNT_TIER_6 + burst_scatter_mult = SCATTER_AMOUNT_TIER_4 + scatter_unwielded = SCATTER_AMOUNT_TIER_4 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_4 + recoil_unwielded = RECOIL_AMOUNT_TIER_5 + +/obj/item/weapon/gun/smg/pps43/extended_mag + current_mag = /obj/item/ammo_magazine/smg/pps43/extended +//------------------------------------------------------- +//Type 64 + +/obj/item/weapon/gun/smg/bizon + name = "\improper Type 64 Submachinegun" + desc = "The standard submachinegun of the UPP, sporting an unusual 64 round helical magazine, it has a high fire-rate, but is unusually accurate. This one has a faux-wood grip, denoting it as civilian use or as an export model." + desc_lore = "The Type 64 finds its way into the hands of more than just UPP soldiers, it has an active life with rebel groups, corporate security forces, mercenaries, less well-armed militaries, and just about everything or everyone in between." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "type64" + item_state = "type64" + + fire_sound = 'sound/weapons/smg_heavy.ogg' + current_mag = /obj/item/ammo_magazine/smg/bizon + flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER + wield_delay = WIELD_DELAY_MIN + aim_slowdown = SLOWDOWN_ADS_QUICK_MINUS + +/obj/item/weapon/gun/smg/bizon/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 20,"rail_x" = 18, "rail_y" = 23, "under_x" = 26, "under_y" = 15, "stock_x" = 26, "stock_y" = 15) + +/obj/item/weapon/gun/smg/bizon/set_gun_config_values() + ..() + fire_delay = FIRE_DELAY_TIER_SMG + burst_delay = FIRE_DELAY_TIER_SMG + burst_amount = BURST_AMOUNT_TIER_4 + accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_5 + accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_3 + scatter = SCATTER_AMOUNT_TIER_9 + burst_scatter_mult = SCATTER_AMOUNT_TIER_8 + scatter_unwielded = SCATTER_AMOUNT_TIER_4 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_3 + recoil_unwielded = RECOIL_AMOUNT_TIER_5 + +/obj/item/weapon/gun/smg/bizon/upp + name = "\improper Type 64 Submachinegun" + desc = "The standard submachinegun of the UPP, sporting an unusual 64 round helical magazine, it has a high fire-rate, but is unusually accurate. This one has a black polymer grip, denoting it as in-use by the UPP military." + desc_lore = "The Type 64 finds its way into the hands of more than just UPP soldiers, it has an active life with rebel groups, corporate security forces, mercenaries, less well-armed militaries, and just about everything or everyone in between." + icon_state = "type64_u" + item_state = "type64" + //------------------------------------------------------- //GENERIC UZI //Based on the uzi submachinegun, of course. diff --git a/code/modules/projectiles/guns/specialist.dm b/code/modules/projectiles/guns/specialist.dm index a73335971ffa..78d1fca2cf24 100644 --- a/code/modules/projectiles/guns/specialist.dm +++ b/code/modules/projectiles/guns/specialist.dm @@ -155,7 +155,7 @@ if(!check_can_use(target, TRUE)) return - var/obj/item/projectile/aimed_proj = sniper_rifle.in_chamber + var/obj/projectile/aimed_proj = sniper_rifle.in_chamber aimed_proj.projectile_flags |= PROJECTILE_BULLSEYE aimed_proj.AddComponent(/datum/component/homing_projectile, target, human) sniper_rifle.Fire(target, human) @@ -183,7 +183,7 @@ to_chat(H, SPAN_WARNING("\The [M] is too close to get a proper shot!")) return FALSE - var/obj/item/projectile/P = sniper_rifle.in_chamber + var/obj/projectile/P = sniper_rifle.in_chamber // TODO: Make the below logic only occur in certain circumstances. Check goggles, maybe? -Kaga if(check_shot_is_blocked(H, M, P)) to_chat(H, SPAN_WARNING("Something is in the way, or you're out of range!")) @@ -195,7 +195,7 @@ COOLDOWN_START(sniper_rifle, aimed_shot_cooldown, sniper_rifle.aimed_shot_cooldown_delay) return TRUE -/datum/action/item_action/specialist/aimed_shot/proc/check_shot_is_blocked(mob/firer, mob/target, obj/item/projectile/P) +/datum/action/item_action/specialist/aimed_shot/proc/check_shot_is_blocked(mob/firer, mob/target, obj/projectile/P) var/list/turf/path = getline2(firer, target, include_from_atom = FALSE) if(!path.len || get_dist(firer, target) > P.ammo.max_range) return TRUE @@ -450,73 +450,56 @@ step(PMC_sniper,turn(PMC_sniper.dir,180)) PMC_sniper.apply_effect(5, WEAKEN) -//SVD //Based on the actual Dragunov DMR rifle. +//Type 88 //Based on the actual Dragunov DMR rifle. /obj/item/weapon/gun/rifle/sniper/svd - name = "\improper SVD Dragunov-033 designated marksman rifle" - desc = "A wannabe replica of an SVD, constructed from a MAR-40 by someone probably illiterate that thought the original SVD was built from an AK pattern. Fires 7.62x54mmR rounds." + name = "\improper Type 88 designated marksman rifle" + desc = "The standard issue DMR of the UPP, the Type 88 is sought after by competitive shooters and terrorists alike for its high degree of accuracy. Typically loaded with armor-piercing 7.62x54mmR rounds in a 12 round magazine." icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' - icon_state = "svd003" - item_state = "svd003" //NEEDS A ONE HANDED STATE + icon_state = "type88" + item_state = "type88" - fire_sound = 'sound/weapons/gun_kt42.ogg' + fire_sound = 'sound/weapons/gun_mg.ogg' current_mag = /obj/item/ammo_magazine/sniper/svd attachable_allowed = list( //Muzzle, /obj/item/attachable/bayonet, /obj/item/attachable/bayonet/upp_replica, /obj/item/attachable/bayonet/upp, - /obj/item/attachable/extended_barrel, - /obj/item/attachable/heavy_barrel, - //Barrel, - /obj/item/attachable/slavicbarrel, - //Rail, - /obj/item/attachable/reddot, - /obj/item/attachable/reflex, - /obj/item/attachable/flashlight, - /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope, - /obj/item/attachable/scope/variable_zoom, - /obj/item/attachable/scope/variable_zoom/slavic, - /obj/item/attachable/scope/mini, - /obj/item/attachable/scope/slavic, //Under, /obj/item/attachable/verticalgrip, - /obj/item/attachable/angledgrip, - /obj/item/attachable/lasersight, /obj/item/attachable/bipod, - //Stock, - /obj/item/attachable/stock/slavic, + //Integrated, + /obj/item/attachable/type88_barrel, ) has_aimed_shot = FALSE - flags_gun_features = GUN_AUTO_EJECTOR|GUN_WIELDED_FIRING_ONLY - starting_attachment_types = list(/obj/item/attachable/scope/variable_zoom/slavic) + flags_gun_features = GUN_AUTO_EJECTOR|GUN_WIELDED_FIRING_ONLY|GUN_AMMO_COUNTER|GUN_CAN_POINTBLANK + starting_attachment_types = list() sniper_beam_type = null skill_locked = FALSE /obj/item/weapon/gun/rifle/sniper/svd/handle_starting_attachment() ..() - var/obj/item/attachable/attachie = new /obj/item/attachable/slavicbarrel(src) + var/obj/item/attachable/attachie = new /obj/item/attachable/type88_barrel(src) attachie.flags_attach_features &= ~ATTACH_REMOVABLE attachie.Attach(src) update_attachable(attachie.slot) - attachie = new /obj/item/attachable/stock/slavic(src) - attachie.flags_attach_features &= ~ATTACH_REMOVABLE - attachie.Attach(src) - update_attachable(attachie.slot) + var/obj/item/attachable/scope/variable_zoom/integrated/type88sight = new(src) + type88sight.flags_attach_features &= ~ATTACH_REMOVABLE + type88sight.hidden = TRUE + type88sight.Attach(src) + update_attachable(type88sight.slot) /obj/item/weapon/gun/rifle/sniper/svd/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 17,"rail_x" = 13, "rail_y" = 19, "under_x" = 24, "under_y" = 13, "stock_x" = 24, "stock_y" = 13) + attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 17,"rail_x" = 13, "rail_y" = 19, "under_x" = 26, "under_y" = 14, "stock_x" = 24, "stock_y" = 13, "special_x" = 39, "special_y" = 18) /obj/item/weapon/gun/rifle/sniper/svd/set_gun_config_values() ..() set_fire_delay(FIRE_DELAY_TIER_6) - set_burst_amount(BURST_AMOUNT_TIER_2) - set_burst_delay(FIRE_DELAY_TIER_11) - accuracy_mult = BASE_ACCURACY_MULT + set_burst_amount(BURST_AMOUNT_TIER_1) + accuracy_mult = BASE_ACCURACY_MULT * 3 scatter = SCATTER_AMOUNT_TIER_8 - burst_scatter_mult = SCATTER_AMOUNT_TIER_6 damage_mult = BASE_BULLET_DAMAGE_MULT recoil = RECOIL_AMOUNT_TIER_5 damage_falloff_mult = 0 @@ -584,7 +567,7 @@ /obj/item/weapon/gun/rifle/m4ra_custom/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 43, "muzzle_y" = 17,"rail_x" = 23, "rail_y" = 21, "under_x" = 30, "under_y" = 11, "stock_x" = 24, "stock_y" = 13, "special_x" = 39, "special_y" = 17) + attachable_offset = list("muzzle_x" = 43, "muzzle_y" = 17,"rail_x" = 23, "rail_y" = 21, "under_x" = 30, "under_y" = 11, "stock_x" = 24, "stock_y" = 13, "special_x" = 37, "special_y" = 16) /obj/item/weapon/gun/rifle/m4ra_custom/set_gun_config_values() ..() @@ -1100,7 +1083,7 @@ /obj/item/weapon/gun/launcher/rocket/reload_into_chamber(mob/user) return TRUE -/obj/item/weapon/gun/launcher/rocket/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0) +/obj/item/weapon/gun/launcher/rocket/delete_bullet(obj/projectile/projectile_to_fire, refund = 0) if(!current_mag) return qdel(projectile_to_fire) @@ -1194,7 +1177,7 @@ current_mag.current_rounds = 0 //Adding in the rocket backblast. The tile behind the specialist gets blasted hard enough to down and slightly wound anyone -/obj/item/weapon/gun/launcher/rocket/apply_bullet_effects(obj/item/projectile/projectile_to_fire, mob/user, i = 1, reflex = 0) +/obj/item/weapon/gun/launcher/rocket/apply_bullet_effects(obj/projectile/projectile_to_fire, mob/user, i = 1, reflex = 0) . = ..() if(!HAS_TRAIT(user, TRAIT_EAR_PROTECTION) && ishuman(user)) var/mob/living/carbon/human/huser = user @@ -1337,141 +1320,51 @@ user.put_in_active_hand(F) //------------------------------------------------------- -//Flare gun. Close enough to a specialist gun? - -/obj/item/weapon/gun/flare - name = "\improper M82-F flare gun" - desc = "A flare gun issued to JTAC operators to use with flares. Comes with a miniscope. One shot, one... life saved?" - icon_state = "m82f" - item_state = "m82f" - current_mag = /obj/item/ammo_magazine/internal/flare - reload_sound = 'sound/weapons/gun_shotgun_shell_insert.ogg' - fire_sound = 'sound/weapons/gun_flare.ogg' - aim_slowdown = 0 - flags_equip_slot = SLOT_WAIST - wield_delay = WIELD_DELAY_VERY_FAST - movement_onehanded_acc_penalty_mult = MOVEMENT_ACCURACY_PENALTY_MULT_TIER_4 - flags_gun_features = GUN_INTERNAL_MAG|GUN_CAN_POINTBLANK - gun_category = GUN_CATEGORY_HANDGUN - attachable_allowed = list(/obj/item/attachable/scope/mini/flaregun) - - var/last_signal_flare_name - - -/obj/item/weapon/gun/flare/Initialize(mapload, spawn_empty) - . = ..() - if(spawn_empty) - update_icon() - -/obj/item/weapon/gun/flare/handle_starting_attachment() - ..() - var/obj/item/attachable/scope/mini/flaregun/S = new(src) - S.hidden = TRUE - S.flags_attach_features &= ~ATTACH_REMOVABLE - S.Attach(src) - update_attachables() - - -/obj/item/weapon/gun/flare/set_gun_attachment_offsets() - attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 18,"rail_x" = 12, "rail_y" = 20, "under_x" = 19, "under_y" = 14, "stock_x" = 19, "stock_y" = 14) - -/obj/item/weapon/gun/flare/set_gun_config_values() - ..() - set_fire_delay(FIRE_DELAY_TIER_12) - accuracy_mult = BASE_ACCURACY_MULT - accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_10 - scatter = 0 - recoil = RECOIL_AMOUNT_TIER_4 - recoil_unwielded = RECOIL_AMOUNT_TIER_4 - -/obj/item/weapon/gun/flare/set_bullet_traits() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) - )) - -/obj/item/weapon/gun/flare/reload_into_chamber(mob/user) - . = ..() - to_chat(user, SPAN_WARNING("You pop out [src]'s tube!")) - update_icon() - -/obj/item/weapon/gun/flare/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/device/flashlight/flare)) - var/obj/item/device/flashlight/flare/F = I - if(F.on) - to_chat(user, SPAN_WARNING("You can't put a lit flare in [src]!")) - return - if(!F.fuel) - to_chat(user, SPAN_WARNING("You can't put a burnt out flare in [src]!")) - return - if(current_mag && current_mag.current_rounds == 0) - ammo = GLOB.ammo_list[F.ammo_datum] - playsound(user, reload_sound, 25, 1) - to_chat(user, SPAN_NOTICE("You load \the [F] into [src].")) - current_mag.current_rounds++ - qdel(I) - update_icon() - else - to_chat(user, SPAN_WARNING("\The [src] is already loaded!")) - else - to_chat(user, SPAN_WARNING("That's not a flare!")) +//UPP Rocket Launcher -/obj/item/weapon/gun/flare/unload(mob/user) - if(flags_gun_features & GUN_BURST_FIRING) - return - unload_flare(user) +/obj/item/weapon/gun/launcher/rocket/upp + name = "\improper HJRA-12 Handheld Anti-Tank Grenade Launcher" + desc = "The HJRA-12 Handheld Anti-Tank Grenade Launcher is the standard Anti-Armor weapon of the UPP. It is designed to be easy to use and to take out or disable armored vehicles." + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + icon_state = "hjra12" + item_state = "hjra12" + skill_locked = FALSE + current_mag = /obj/item/ammo_magazine/rocket/upp/at -/obj/item/weapon/gun/flare/proc/unload_flare(mob/user) - if(!current_mag) - return - if(current_mag.current_rounds) - var/obj/item/device/flashlight/flare/unloaded_flare = new ammo.handful_type(get_turf(src)) - playsound(user, reload_sound, 25, TRUE) - current_mag.current_rounds-- - if(user) - to_chat(user, SPAN_NOTICE("You unload \the [unloaded_flare] from \the [src].")) - user.put_in_hands(unloaded_flare) - update_icon() + attachable_allowed = list(/obj/item/attachable/upp_rpg_breech) -/obj/item/weapon/gun/flare/unique_action(mob/user) - if(!user || !isturf(user.loc) || !current_mag || !current_mag.current_rounds) - return + flags_gun_features = GUN_WIELDED_FIRING_ONLY - var/turf/flare_turf = user.loc - var/area/flare_area = flare_turf.loc + flags_item = TWOHANDED - if(flare_area.ceiling > CEILING_GLASS) - to_chat(user, SPAN_NOTICE("The roof above you is too dense.")) - return +/obj/item/weapon/gun/launcher/rocket/upp/set_gun_attachment_offsets() + attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 18,"rail_x" = 6, "rail_y" = 19, "under_x" = 19, "under_y" = 14, "stock_x" = -6, "stock_y" = 16, "special_x" = 37, "special_y" = 16) - if(!istype(ammo, /datum/ammo/flare)) - to_chat(user, SPAN_NOTICE("\The [src] jams as it is somehow loaded with incorrect ammo!")) - return +/obj/item/weapon/gun/launcher/rocket/upp/handle_starting_attachment() + ..() + var/obj/item/attachable/upp_rpg_breech/S = new(src) + S.flags_attach_features &= ~ATTACH_REMOVABLE + S.Attach(src) + update_attachables() - if(user.action_busy) - return + var/obj/item/attachable/magnetic_harness/Integrated = new(src) + Integrated.hidden = TRUE + Integrated.flags_attach_features &= ~ATTACH_REMOVABLE + Integrated.Attach(src) + update_attachable(Integrated.slot) - if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) +/obj/item/weapon/gun/launcher/rocket/upp/apply_bullet_effects(obj/projectile/projectile_to_fire, mob/user, i = 1, reflex = 0) + . = ..() + if(!HAS_TRAIT(user, TRAIT_EAR_PROTECTION) && ishuman(user)) return - current_mag.current_rounds-- - - flare_turf.ceiling_debris() - - var/datum/ammo/flare/explicit_ammo = ammo - - var/obj/item/device/flashlight/flare/fired_flare = new explicit_ammo.flare_type(get_turf(src)) - to_chat(user, SPAN_NOTICE("You fire \the [fired_flare] into the air!")) - fired_flare.visible_message(SPAN_WARNING("\A [fired_flare] bursts into brilliant light in the sky!")) - fired_flare.invisibility = INVISIBILITY_MAXIMUM - fired_flare.mouse_opacity = FALSE - playsound(user.loc, fire_sound, 50, 1) - - if(fired_flare.activate_signal(user)) - last_signal_flare_name = fired_flare.name - - update_icon() - -/obj/item/weapon/gun/flare/get_examine_text(mob/user) - . = ..() - if(last_signal_flare_name) - . += SPAN_NOTICE("The last signal flare fired has the designation: [last_signal_flare_name]") + var/backblast_loc = get_turf(get_step(user.loc, turn(user.dir, 180))) + smoke.set_up(1, 0, backblast_loc, turn(user.dir, 180)) + smoke.start() + playsound(src, 'sound/weapons/gun_rocketlauncher.ogg', 100, TRUE, 10) + for(var/mob/living/carbon/C in backblast_loc) + if(!C.lying && !HAS_TRAIT(C, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff + C.apply_damage(15, BRUTE) //The shockwave hurts, quite a bit. It can knock unarmored targets unconscious in real life + C.apply_effect(4, STUN) //For good measure + C.apply_effect(6, STUTTER) + C.emote("pain") diff --git a/code/modules/projectiles/homing_projectile_component.dm b/code/modules/projectiles/homing_projectile_component.dm index 92e803de10b1..8fd36fd67f31 100644 --- a/code/modules/projectiles/homing_projectile_component.dm +++ b/code/modules/projectiles/homing_projectile_component.dm @@ -3,7 +3,7 @@ var/atom/homing_target /datum/component/homing_projectile/Initialize(atom/homing_target, mob/shooter) - if(!istype(parent, /obj/item/projectile)) + if(!istype(parent, /obj/projectile)) return COMPONENT_INCOMPATIBLE if(isliving(homing_target)) @@ -13,7 +13,7 @@ if(shooter && ishuman(homing_target)) // Don't track friendlies var/mob/living/carbon/human/human_target = homing_target - var/obj/item/projectile/projectile = parent + var/obj/projectile/projectile = parent if(SEND_SIGNAL(parent, COMSIG_BULLET_CHECK_MOB_SKIPPING, human_target) & COMPONENT_SKIP_MOB\ || projectile.runtime_iff_group && human_target.get_target_lock(projectile.runtime_iff_group)\ ) @@ -33,7 +33,7 @@ return ..() /datum/component/homing_projectile/proc/terminal_retarget() - var/obj/item/projectile/projectile = parent + var/obj/projectile/projectile = parent var/turf/homing_turf = get_turf(homing_target) projectile.speed *= 2 // Double speed to ensure hitting next tick despite eventual movement projectile.retarget(homing_turf, keep_angle = FALSE) diff --git a/code/modules/projectiles/magazines/misc.dm b/code/modules/projectiles/magazines/misc.dm index d224498ebceb..87568c953211 100644 --- a/code/modules/projectiles/magazines/misc.dm +++ b/code/modules/projectiles/magazines/misc.dm @@ -6,7 +6,7 @@ name = "rotating ammo drum (7.62x51mm)" desc = "A huge ammo drum for a huge gun." caliber = "7.62x51mm" - icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/event.dmi' icon_state = "painless" //PLACEHOLDER matter = list("metal" = 10000) @@ -31,6 +31,19 @@ reload_delay = 8 gun_type = /obj/item/weapon/gun/m60 +/obj/item/ammo_magazine/pkp + name = "QYJ-72 ammo box (7.62x54mmR)" + desc = "A 250 round box for the UPP's standard GPMG, the QYJ-72. Chambered in 7.62x54mmR." + caliber = "7.62x54mmR" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "qjy72" + + matter = list("metal" = 10000) + default_ammo = /datum/ammo/bullet/pkp + max_rounds = 250 + reload_delay = 12 + gun_type = /obj/item/weapon/gun/pkp + //rocket launchers /obj/item/ammo_magazine/rifle/grenadespawner diff --git a/code/modules/projectiles/magazines/pistols.dm b/code/modules/projectiles/magazines/pistols.dm index dae86cc813cc..11e6fe9dbfeb 100644 --- a/code/modules/projectiles/magazines/pistols.dm +++ b/code/modules/projectiles/magazines/pistols.dm @@ -192,21 +192,53 @@ ammo_band_color = AMMO_BAND_COLOR_AP //------------------------------------------------------- -//MAUSER MERC PISTOL //Inspired by the Makarov. +//Type 31 pistol. //A makarov -/obj/item/ammo_magazine/pistol/c99 - name = "\improper PK-9 magazine (.380)" +/obj/item/ammo_magazine/pistol/np92 + name = "\improper NP92 magazine (9x18mm Makarov)" default_ammo = /datum/ammo/bullet/pistol - caliber = ".380" + caliber = "9x18mm Makarov" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' - icon_state = "pk-9" - max_rounds = 8 - gun_type = /obj/item/weapon/gun/pistol/c99 + icon_state = "np92mag" + max_rounds = 12 + gun_type = /obj/item/weapon/gun/pistol/np92 + +/obj/item/ammo_magazine/pistol/np92/suppressed + name = "\improper NPZ92 magazine (9x18mm Makarov)" + default_ammo = /datum/ammo/bullet/pistol + caliber = "9x18mm Makarov" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "npz92mag" + max_rounds = 12 -/obj/item/ammo_magazine/pistol/c99/tranq - name = "\improper PK-9 tranquilizer magazine (.380)" +/obj/item/ammo_magazine/pistol/np92/tranq + name = "\improper NPZ92 tranq magazine (9x18mm Makarov)" default_ammo = /datum/ammo/bullet/pistol/tranq - icon_state = "pk-9_tranq" + caliber = "9x18mm Makarov" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "npz92tranqmag" + max_rounds = 12 + +//------------------------------------------------------- +//Type 73 pistol. //A TT + +/obj/item/ammo_magazine/pistol/t73 + name = "\improper Type 73 magazine (7.62x25mm Tokarev)" + default_ammo = /datum/ammo/bullet/pistol/heavy + caliber = "7.62x25mm Tokarev" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "ttmag" + max_rounds = 9 + gun_type = /obj/item/weapon/gun/pistol/t73 + +/obj/item/ammo_magazine/pistol/t73_impact + name = "\improper High Impact Type 74 magazine (7.62x25mm Tokarev)" + default_ammo = /datum/ammo/bullet/pistol/heavy/super/highimpact/upp + caliber = "7.62x25mm Tokarev" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "ttmag_impact" + max_rounds = 9 + gun_type = /obj/item/weapon/gun/pistol/t73/leader //------------------------------------------------------- //KT-42 //Inspired by the .44 Auto Mag pistol @@ -316,7 +348,7 @@ It is a modified Beretta 93R, and can fire three-round burst or single fire. Whe name = "\improper CZ-81 20-round magazine (.32ACP)" desc = "A .32ACP caliber magazine for the CZ-81." caliber = ".32ACP" - icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi' icon_state = "skorpion" //PLACEHOLDER gun_type = /obj/item/weapon/gun/pistol/skorpion max_rounds = 20 diff --git a/code/modules/projectiles/magazines/revolvers.dm b/code/modules/projectiles/magazines/revolvers.dm index c9803fdf5671..07fc75a50fad 100644 --- a/code/modules/projectiles/magazines/revolvers.dm +++ b/code/modules/projectiles/magazines/revolvers.dm @@ -55,18 +55,18 @@ caliber = ".44 sabot" /obj/item/ammo_magazine/revolver/upp - name = "\improper N-Y speed loader (7.62x38mmR)" - default_ammo = /datum/ammo/bullet/revolver/nagant + name = "\improper ZHNK-72 speed loader (7.62x38mmR)" + default_ammo = /datum/ammo/bullet/revolver/upp caliber = "7.62x38mmR" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' - icon_state = "ny762" - gun_type = /obj/item/weapon/gun/revolver/nagant + icon_state = "zhnk72loader" + gun_type = /obj/item/weapon/gun/revolver/upp /obj/item/ammo_magazine/revolver/upp/shrapnel - name = "\improper N-Y shrapnel-shot speed loader (7.62x38mmR)" + name = "\improper ZHNK-72 shrapnel-shot speed loader (7.62x38mmR)" desc = "This speedloader contains seven 'shrapnel-shot' bullets, cheap recycled casings picked up off the ground and refilled with gunpowder and random scrap metal. Acts similarly to flechette." - default_ammo = /datum/ammo/bullet/revolver/nagant/shrapnel - icon_state = "ny762_shrapnel" + default_ammo = /datum/ammo/bullet/revolver/upp/shrapnel + icon_state = "zhnk72loader_shrapnel" /obj/item/ammo_magazine/revolver/small name = "\improper S&W speed loader (.38)" @@ -167,13 +167,13 @@ //RUSSIAN REVOLVER //Based on the 7.62mm Russian revolvers. /obj/item/ammo_magazine/internal/revolver/upp - default_ammo = /datum/ammo/bullet/revolver/nagant + default_ammo = /datum/ammo/bullet/revolver/upp caliber = "7.62x38mmR" max_rounds = 7 - gun_type = /obj/item/weapon/gun/revolver/nagant + gun_type = /obj/item/weapon/gun/revolver/upp /obj/item/ammo_magazine/internal/revolver/upp/shrapnel - default_ammo = /datum/ammo/bullet/revolver/nagant/shrapnel + default_ammo = /datum/ammo/bullet/revolver/upp/shrapnel //------------------------------------------------------- diff --git a/code/modules/projectiles/magazines/rifles.dm b/code/modules/projectiles/magazines/rifles.dm index 57bcd7f0a563..42c79fdab858 100644 --- a/code/modules/projectiles/magazines/rifles.dm +++ b/code/modules/projectiles/magazines/rifles.dm @@ -290,7 +290,9 @@ desc = "A 5.45x39mm high-capacity casket magazine for the Type 71 rifle." caliber = "5.45x39mm" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' - icon_state = "type_71" + icon_state = "type71" + ammo_band_icon = "+type71_band" + ammo_band_icon_empty = "+type71_band_e" default_ammo = /datum/ammo/bullet/rifle/type71 max_rounds = 60 gun_type = /obj/item/weapon/gun/rifle/type71 @@ -298,16 +300,14 @@ /obj/item/ammo_magazine/rifle/type71/ap name = "\improper Type 71 AP magazine (5.45x39mm)" desc = "A 5.45x39mm high-capacity casket magazine containing armor piercing rounds for the Type 71 rifle." - icon_state = "type_71_ap" default_ammo = /datum/ammo/bullet/rifle/type71/ap - bonus_overlay = "type71_ap" + ammo_band_color = AMMO_BAND_COLOR_AP /obj/item/ammo_magazine/rifle/type71/heap name = "\improper Type 71 HEAP magazine (5.45x39mm)" desc = "A 5.45x39mm high-capacity casket magazine containing the standard high explosive armor piercing rounds for the Type 71 rifle." - icon_state = "type_71_heap" default_ammo = /datum/ammo/bullet/rifle/type71/heap - bonus_overlay = "type71_heap" + ammo_band_color = AMMO_BAND_COLOR_HEAP //------------------------------------------------------- //L42A Battle Rifle @@ -445,3 +445,41 @@ max_rounds = 10 gun_type = /obj/item/weapon/gun/boltaction w_class = SIZE_SMALL + +/obj/item/ammo_magazine/rifle/boltaction/vulture + name = "\improper M707 \"Vulture\" magazine (20x102mm)" + desc = "A magazine for the M707 \"Vulture\" anti-matieriel rifle. Contains up to 4 massively oversized rounds." + caliber = "20x102mm" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi' + icon_state = "vulture" + handful_state = "vulture_bullet" + default_ammo = /datum/ammo/bullet/sniper/anti_materiel/vulture + max_rounds = 4 + gun_type = /obj/item/weapon/gun/boltaction/vulture + w_class = SIZE_MEDIUM // maybe small? This shit's >4 inches long mind you + +//=ROYAL MARINES=\\ + +/obj/item/ammo_magazine/rifle/rmc_f90 + name = "\improper F903 magazine (10x24mm)" + desc = "A 10mm assault rifle magazine used by the royal marines." + caliber = "10x24mm" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/twe_ammo.dmi' + icon_state = "aug" + item_state = "aug" + w_class = SIZE_MEDIUM + default_ammo = /datum/ammo/bullet/rifle + max_rounds = 30 + gun_type = /obj/item/weapon/gun/rifle/rmc_f90 + ammo_band_icon = "+m41a_band" + ammo_band_icon_empty = "+m41a_band_e" + +/obj/item/ammo_magazine/rifle/rmc_f90/marksman + name = "\improper F903A1 Marksman magazine (10x24mm)" + desc = "A 10mm armor-piercing assault rifle magazine used by the royal marines." + icon_state = "aug_dmr" + item_state = "aug_dmr" + default_ammo = /datum/ammo/bullet/rifle/ap + gun_type = /obj/item/weapon/gun/rifle/rmc_f90/scope + max_rounds = 20 + ammo_band_color = AMMO_BAND_COLOR_AP diff --git a/code/modules/projectiles/magazines/smgs.dm b/code/modules/projectiles/magazines/smgs.dm index 333d47e19931..b89aee06f6be 100644 --- a/code/modules/projectiles/magazines/smgs.dm +++ b/code/modules/projectiles/magazines/smgs.dm @@ -150,6 +150,44 @@ #undef PPSH_STICK_MAGAZINE_JAM_CHANCE #undef PPSH_DRUM_MAGAZINE_JAM_CHANCE +//------------------------------------------------------- +//Type-19, based on the PPS-43 + +/obj/item/ammo_magazine/smg/pps43 + name = "\improper Type-19 stick magazine (7.62x25mm)" + desc = "A stick magazine for the Type-19 submachinegun." + caliber = "7.62x25mm" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "insasu_stickmag" + bonus_overlay = "insasu_stickmag_overlay" + max_rounds = 35 + gun_type = /obj/item/weapon/gun/smg/pps43 + default_ammo = /datum/ammo/bullet/smg/pps43 + var/bonus_mag_aim_slowdown = 0 + var/bonus_mag_wield_delay = 0 + + +/obj/item/ammo_magazine/smg/pps43/extended + name = "\improper Type-19 drum magazine (7.62x25mm)" + desc = "A drum magazine for the Type-19 submachinegun." + icon_state = "insasu_drum" + bonus_overlay = "insasu_drum_overlay" + max_rounds = 71 + w_class = SIZE_MEDIUM + bonus_mag_aim_slowdown = SLOWDOWN_ADS_QUICK_MINUS + bonus_mag_wield_delay = WIELD_DELAY_VERY_FAST +//------------------------------------------------------- +//Type 64 SMG, based on the PP Bizon. + +/obj/item/ammo_magazine/smg/bizon + name = "\improper Type 64 Helical Magazine (7.62x19mm)" + desc = "A 64 round magazine for the Type 64 submachinegun, the standard SMG of the UPP armed forces." + caliber = "7.62x19mm" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon_state = "type64mag" + max_rounds = 64 + gun_type = /obj/item/weapon/gun/smg/bizon + //------------------------------------------------------- //GENERIC UZI //Based on the uzi submachinegun, of course. diff --git a/code/modules/projectiles/magazines/specialist.dm b/code/modules/projectiles/magazines/specialist.dm index 23b540202c40..821273247f66 100644 --- a/code/modules/projectiles/magazines/specialist.dm +++ b/code/modules/projectiles/magazines/specialist.dm @@ -48,16 +48,16 @@ max_rounds = 6 -//SVD //Based on the actual Dragunov designated marksman rifle. +//Type 88 //Based on the actual Dragunov designated marksman rifle. /obj/item/ammo_magazine/sniper/svd - name = "\improper SVD magazine (7.62x54mmR)" - desc = "A large caliber magazine for the SVD designated marksman rifle." + name = "\improper Type-88 Magazine (7.62x54mmR)" + desc = "A large caliber magazine for the Type-88 designated marksman rifle." caliber = "7.62x54mmR" icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' - icon_state = "svd" - default_ammo = /datum/ammo/bullet/sniper/crude - max_rounds = 10 + icon_state = "type88mag" + default_ammo = /datum/ammo/bullet/sniper/upp + max_rounds = 12 gun_type = /obj/item/weapon/gun/rifle/sniper/svd //M4RA magazines @@ -107,6 +107,12 @@ default_ammo = /datum/ammo/bullet/smartgun/dirty gun_type = /obj/item/weapon/gun/smartgun/dirty +/obj/item/ammo_magazine/smartgun/holo_targetting + name = "holotargetting smartgun drum" + desc = "Holotargetting rounds for use in the royal marines commando L56A2 smartgun." + icon_state = "m56_drum" + default_ammo = /datum/ammo/bullet/smartgun/holo_target + gun_type = /obj/item/weapon/gun/smartgun/rmc //------------------------------------------------------- //Flare gun. Close enough? /obj/item/ammo_magazine/internal/flare @@ -331,3 +337,47 @@ default_ammo = /datum/ammo/rocket/ap/anti_tank gun_type = /obj/item/weapon/gun/launcher/rocket/anti_tank reload_delay = 100 + + +//------------------------------------------------------- +//UPP Rockets + +/obj/item/ammo_magazine/rocket/upp + name = "\improper HJRA-12 High-Explosive Rocket" + desc = "A rocket for the UPP standard-issue HJRA-12 Handheld Anti-Tank Grenade Launcher. This one is a standard High-Explosive rocket for anti-personal or light-vehicle use." + caliber = "88mm" + icon_state = "hjra_explosive" + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + + max_rounds = 1 + default_ammo = /datum/ammo/rocket + gun_type = /obj/item/weapon/gun/launcher/rocket/upp + reload_delay = 85 + +/obj/item/ammo_magazine/rocket/upp/update_icon() + if(current_rounds <= 0) + qdel(src) + else + icon_state = initial(icon_state) + +/obj/item/ammo_magazine/rocket/upp/at + name = "\improper HJRA-12 Anti-Tank Rocket" + desc = "A rocket for the UPP standard-issue HJRA-12 Handheld Anti-Tank Grenade Launcher. This one is a standard Anti-Tank rocket designed to disable or destroy hostile vehicles." + caliber = "88mm" + icon_state = "hjra_tank" + + max_rounds = 1 + default_ammo = /datum/ammo/rocket/ap/anti_tank + gun_type = /obj/item/weapon/gun/launcher/rocket/upp + reload_delay = 85 + +/obj/item/ammo_magazine/rocket/upp/incen + name = "\improper HJRA-12 Extreme-Intensity Incendiary Rocket" + desc = "A rocket for the UPP standard-issue HJRA-12 Handheld Anti-Tank Grenade Launcher. This one is an extreme-intensity incendiary rocket, using an experimental chemical designated R-189 by the UPP, it is designed to melt through fortified positions and bunkers but is most commonly used in an anti-personnal role due to over-issuing and the tempatures after use in its intended role leaving the tempature of the air incompatible with human life." + caliber = "88mm" + icon_state = "hjra_incen" + + max_rounds = 1 + default_ammo = /datum/ammo/rocket/wp/upp + gun_type = /obj/item/weapon/gun/launcher/rocket/upp + reload_delay = 85 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index eccba14a442a..b01203d0f4d8 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -4,7 +4,7 @@ #define DEBUG_XENO_DEFENSE 0 //The actual bullet objects. -/obj/item/projectile +/obj/projectile name = "projectile" icon = 'icons/obj/items/weapons/projectiles.dmi' icon_state = "bullet" @@ -69,15 +69,17 @@ /// 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" + /// How much to make the bullet fall off by accuracy-wise when closer than the ideal range + var/accuracy_range_falloff = 10 -/obj/item/projectile/Initialize(mapload, datum/cause_data/cause_data) +/obj/projectile/Initialize(mapload, datum/cause_data/cause_data) . = ..() path = list() permutated = list() weapon_cause_data = istype(cause_data) ? cause_data : create_cause_data(cause_data) firer = cause_data?.resolve_mob() -/obj/item/projectile/Destroy() +/obj/projectile/Destroy() speed = 0 ammo = null shot_from = null @@ -92,22 +94,22 @@ SSprojectiles.stop_projectile(src) return ..() -/obj/item/projectile/proc/apply_bullet_trait(list/entry) +/obj/projectile/proc/apply_bullet_trait(list/entry) bullet_traits += list(entry.Copy()) // Need to use the proc instead of the wrapper because each entry is a list _AddElement(entry) -/obj/item/projectile/proc/give_bullet_traits(obj/item/projectile/to_give) +/obj/projectile/proc/give_bullet_traits(obj/projectile/to_give) for(var/list/entry in bullet_traits) to_give.apply_bullet_trait(entry.Copy()) -/obj/item/projectile/Collided(atom/movable/AM) +/obj/projectile/Collided(atom/movable/AM) if(AM && !(AM in permutated)) if(scan_a_turf(AM.loc)) SSprojectiles.stop_projectile(src) qdel(src) -/obj/item/projectile/Crossed(atom/movable/AM) +/obj/projectile/Crossed(atom/movable/AM) /* Fun fact: Crossed is called for any contents involving operations. * This notably means, inserting a magazing in a gun Crossed() it with the bullets in the gun. */ if(!loc?.z) @@ -118,10 +120,10 @@ qdel(src) -/obj/item/projectile/ex_act() +/obj/projectile/ex_act() return FALSE //We do not want anything to delete these, simply to make sure that all the bullet references are not runtiming. Otherwise, constantly need to check if the bullet exists. -/obj/item/projectile/proc/generate_bullet(datum/ammo/ammo_datum, bonus_damage = 0, special_flags = 0, mob/bullet_generator) +/obj/projectile/proc/generate_bullet(datum/ammo/ammo_datum, bonus_damage = 0, special_flags = 0, mob/bullet_generator) ammo = ammo_datum name = ammo.name icon = ammo.icon @@ -150,7 +152,7 @@ // Need to use the proc instead of the wrapper because each entry is a list apply_bullet_trait(L) -/obj/item/projectile/proc/calculate_damage() +/obj/projectile/proc/calculate_damage() if(effective_range_min && distance_travelled < effective_range_min) return max(0, damage - round((effective_range_min - distance_travelled) * damage_buildup)) else if(distance_travelled > effective_range_max) @@ -158,7 +160,7 @@ return damage // Target, firer, shot from (i.e. the gun), projectile range, projectile speed, original target (who was aimed at, not where projectile is going towards) -/obj/item/projectile/proc/fire_at(atom/target, atom/F, atom/S, range = 30, speed = 1, atom/original_override) +/obj/projectile/proc/fire_at(atom/target, atom/F, atom/S, range = 30, speed = 1, atom/original_override) SHOULD_NOT_SLEEP(TRUE) original = original || original_override || target if(!loc) @@ -223,7 +225,7 @@ // Finally queue it to Subsystem for further processing SSprojectiles.queue_projectile(src) -/obj/item/projectile/proc/update_angle(turf/source_turf, turf/aim_turf) +/obj/projectile/proc/update_angle(turf/source_turf, turf/aim_turf) p_x = Clamp(p_x, -16, 16) p_y = Clamp(p_y, -16, 16) @@ -250,7 +252,7 @@ rotate.Turn(angle) apply_transform(rotate) -/obj/item/projectile/process(delta_time) +/obj/projectile/process(delta_time) . = PROC_RETURN_SLEEP // Keep going as long as we got speed and time @@ -267,7 +269,7 @@ return FALSE /// Flies the projectile forward one single turf -/obj/item/projectile/proc/fly() +/obj/projectile/proc/fly() SHOULD_NOT_SLEEP(TRUE) PRIVATE_PROC(TRUE) var/turf/current_turf = get_turf(src) @@ -332,14 +334,14 @@ pixel_x = Clamp(dx, -16, 16) pixel_y = Clamp(dy, -16, 16) -/obj/item/projectile/proc/retarget(atom/new_target, keep_angle = FALSE) +/obj/projectile/proc/retarget(atom/new_target, keep_angle = FALSE) var/turf/current_turf = get_turf(src) path = getline2(current_turf, new_target) path.Cut(1, 2) // remove the turf we're already on var/atom/source = keep_angle ? original : current_turf update_angle(source, new_target) -/obj/item/projectile/proc/scan_a_turf(turf/T, proj_dir) +/obj/projectile/proc/scan_a_turf(turf/T, proj_dir) . = TRUE // Sleep safeguard: stop the bullet //Not actually flying? Should not be hitting anything. @@ -400,7 +402,7 @@ return TRUE return FALSE -/obj/item/projectile/proc/handle_object(obj/O) +/obj/projectile/proc/handle_object(obj/O) // If we've already handled this atom, don't do it again if(O in permutated) return FALSE @@ -436,7 +438,7 @@ if(SEND_SIGNAL(src, COMSIG_BULLET_POST_HANDLE_OBJ, O, .) & COMPONENT_BULLET_PASS_THROUGH) return FALSE -/obj/item/projectile/proc/handle_mob(mob/living/L) +/obj/projectile/proc/handle_mob(mob/living/L) // If we've already handled this atom, don't do it again if(SEND_SIGNAL(src, COMSIG_BULLET_PRE_HANDLE_MOB, L, .) & COMPONENT_BULLET_PASS_THROUGH) @@ -525,7 +527,7 @@ //---------------------------------------------------------- -/obj/item/projectile/proc/get_effective_accuracy() +/obj/projectile/proc/get_effective_accuracy() #if DEBUG_HIT_CHANCE to_world(SPAN_DEBUG("Base accuracy is [accuracy]; scatter: [scatter]; distance: [distance_travelled]")) #endif @@ -534,7 +536,7 @@ var/ammo_flags = ammo.flags_ammo_behavior | projectile_override_flags if(distance_travelled <= ammo.accurate_range) if(distance_travelled <= ammo.accurate_range_min) // If bullet stays within max accurate range + random variance - effective_accuracy -= (ammo.accurate_range_min - distance_travelled) * 10 // Snipers have accuracy falloff at closer range before point blank + effective_accuracy -= (ammo.accurate_range_min - distance_travelled) * accuracy_range_falloff // Snipers have accuracy falloff at closer range before point blank else effective_accuracy -= (distance_travelled - ammo.accurate_range) * ((ammo_flags & AMMO_SNIPER) ? 1.5 : 10) // Snipers have a smaller falloff constant due to longer max range @@ -553,7 +555,7 @@ return effective_accuracy //objects use get_projectile_hit_boolean unlike mobs, which use get_projectile_hit_chance -/obj/proc/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/proc/get_projectile_hit_boolean(obj/projectile/P) if(!density) return FALSE @@ -563,7 +565,7 @@ return TRUE //Used by machines and structures to calculate shooting past cover -/obj/proc/calculate_cover_hit_boolean(obj/item/projectile/P, distance = 0, cade_direction_correct = FALSE) +/obj/proc/calculate_cover_hit_boolean(obj/projectile/P, distance = 0, cade_direction_correct = FALSE) if(istype(P.shot_from, /obj/item/hardpoint)) //anything shot from a tank gets a bonus to bypassing cover distance -= 3 @@ -583,7 +585,7 @@ return prob(hitchance) -/obj/structure/machinery/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/machinery/get_projectile_hit_boolean(obj/projectile/P) if(src == P.original && layer > ATMOS_DEVICE_LAYER) //clicking on the object itself hits the object var/hitchance = P.get_effective_accuracy() @@ -622,7 +624,7 @@ return calculate_cover_hit_boolean(P, distance) -/obj/structure/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/get_projectile_hit_boolean(obj/projectile/P) if(src == P.original && layer > ATMOS_DEVICE_LAYER) //clicking on the object itself hits the object var/hitchance = P.get_effective_accuracy() @@ -668,20 +670,20 @@ return calculate_cover_hit_boolean(P, distance, cade_direction_correct) -/obj/item/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/item/get_projectile_hit_boolean(obj/projectile/P) if(P && src == P.original) //clicking on the object itself. Code copied from mob get_projectile_hit_chance var/hitchance = P.get_effective_accuracy() switch(w_class) //smaller items are harder to hit - if(1) + if(SIZE_TINY) hitchance -= 50 - if(2) + if(SIZE_SMALL) hitchance -= 30 - if(3) + if(SIZE_MEDIUM) hitchance -= 20 - if(4) + if(SIZE_LARGE) hitchance -= 10 #if DEBUG_HIT_CHANCE @@ -700,7 +702,7 @@ return TRUE -/obj/vehicle/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/vehicle/get_projectile_hit_boolean(obj/projectile/P) if(src == P.original) //clicking on the object itself hits the object var/hitchance = P.get_effective_accuracy() @@ -721,30 +723,30 @@ return TRUE -/obj/structure/window/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/window/get_projectile_hit_boolean(obj/projectile/P) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & AMMO_ENERGY) return FALSE else if(!(flags_atom & ON_BORDER) || (P.dir & dir) || (P.dir & reverse_direction(dir))) return TRUE -/obj/structure/machinery/door/poddoor/railing/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/machinery/door/poddoor/railing/get_projectile_hit_boolean(obj/projectile/P) return src == P.original -/obj/effect/alien/egg/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/effect/alien/egg/get_projectile_hit_boolean(obj/projectile/P) return src == P.original -/obj/effect/alien/resin/trap/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/effect/alien/resin/trap/get_projectile_hit_boolean(obj/projectile/P) return src == P.original -/obj/item/clothing/mask/facehugger/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/item/clothing/mask/facehugger/get_projectile_hit_boolean(obj/projectile/P) return src == P.original //mobs use get_projectile_hit_chance instead of get_projectile_hit_boolean -/mob/living/proc/get_projectile_hit_chance(obj/item/projectile/P) +/mob/living/proc/get_projectile_hit_chance(obj/projectile/P) if(lying && src != P.original) return FALSE var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags @@ -754,14 +756,15 @@ . = P.get_effective_accuracy() - if(lying && stat) . += 15 //Bonus hit against unconscious people. + if(lying && stat) + . += 15 //Bonus hit against unconscious people. if(isliving(P.firer)) var/mob/living/shooter_living = P.firer if(!can_see(shooter_living,src)) . -= 15 //Can't see the target (Opaque thing between shooter and target) -/mob/living/carbon/human/get_projectile_hit_chance(obj/item/projectile/P) +/mob/living/carbon/human/get_projectile_hit_chance(obj/projectile/P) . = ..() if(.) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags @@ -782,7 +785,7 @@ else return FALSE -/mob/living/carbon/xenomorph/get_projectile_hit_chance(obj/item/projectile/P) +/mob/living/carbon/xenomorph/get_projectile_hit_chance(obj/projectile/P) . = ..() if(.) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags @@ -797,21 +800,24 @@ if(X.hivenumber == hivenumber) return FALSE - if(mob_size >= MOB_SIZE_BIG) . += 10 + if(mob_size == MOB_SIZE_SMALL) + . -= 10 + else if(mob_size >= MOB_SIZE_BIG) + . += 10 if(evasion > 0) . -= evasion -/mob/living/silicon/robot/drone/get_projectile_hit_chance(obj/item/projectile/P) +/mob/living/silicon/robot/drone/get_projectile_hit_chance(obj/projectile/P) return FALSE // just stop them getting hit by projectiles completely -/obj/item/projectile/proc/play_hit_effect(mob/hit_mob) +/obj/projectile/proc/play_hit_effect(mob/hit_mob) if(ammo.sound_hit) playsound(hit_mob, ammo.sound_hit, 50, 1) if(hit_mob.stat != DEAD && !isnull(hit_effect_color)) animation_flash_color(hit_mob, hit_effect_color) -/obj/item/projectile/proc/play_shielded_hit_effect(mob/hit_mob) +/obj/projectile/proc/play_shielded_hit_effect(mob/hit_mob) if(ammo.sound_shield_hit) playsound(hit_mob, ammo.sound_shield_hit, 50, 1) if(hit_mob.stat != DEAD && !isnull(hit_effect_color)) @@ -824,13 +830,13 @@ // \\ //---------------------------------------------------------- -/atom/proc/bullet_act(obj/item/projectile/P) +/atom/proc/bullet_act(obj/projectile/P) return FALSE -/mob/dead/bullet_act(/obj/item/projectile/P) +/mob/dead/bullet_act(/obj/projectile/P) return FALSE -/mob/living/bullet_act(obj/item/projectile/P) +/mob/living/bullet_act(obj/projectile/P) if(!P) return @@ -848,7 +854,7 @@ SEND_SIGNAL(P, COMSIG_BULLET_ACT_LIVING, src, damage, damage) -/mob/living/carbon/human/bullet_act(obj/item/projectile/P) +/mob/living/carbon/human/bullet_act(obj/projectile/P) if(!P) return @@ -961,7 +967,7 @@ SEND_SIGNAL(P, COMSIG_POST_BULLET_ACT_HUMAN, src, damage, damage_result) //Deal with xeno bullets. -/mob/living/carbon/xenomorph/bullet_act(obj/item/projectile/P) +/mob/living/carbon/xenomorph/bullet_act(obj/projectile/P) if(!P || !istype(P)) return @@ -1042,7 +1048,7 @@ return TRUE -/turf/bullet_act(obj/item/projectile/P) +/turf/bullet_act(obj/projectile/P) if(SEND_SIGNAL(src, COMSIG_TURF_BULLET_ACT, P) & COMPONENT_BULLET_ACT_OVERRIDE) return @@ -1066,7 +1072,7 @@ return // walls can get shot and damaged, but bullets (vs energy guns) do much less. -/turf/closed/wall/bullet_act(obj/item/projectile/P) +/turf/closed/wall/bullet_act(obj/projectile/P) . = ..() var/damage = P.damage if(damage < 1) @@ -1086,7 +1092,7 @@ current_bulletholes++ take_damage(damage, P.firer) -/turf/closed/wall/almayer/research/containment/bullet_act(obj/item/projectile/P) +/turf/closed/wall/almayer/research/containment/bullet_act(obj/projectile/P) if(P) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & AMMO_ACIDIC) @@ -1098,17 +1104,17 @@ //Hitting an object. These are too numerous so they're staying in their files. //Why are there special cases listed here? Oh well, whatever. ~N -/obj/bullet_act(obj/item/projectile/P) +/obj/bullet_act(obj/projectile/P) bullet_ping(P) return TRUE -/obj/item/bullet_act(obj/item/projectile/P) +/obj/item/bullet_act(obj/projectile/P) bullet_ping(P) if(P.ammo.damage_type == BRUTE) explosion_throw(P.damage/2, P.dir, 4) return TRUE -/obj/structure/surface/table/bullet_act(obj/item/projectile/P) +/obj/structure/surface/table/bullet_act(obj/projectile/P) bullet_ping(P) health -= round(P.damage/2) if(health < 0) @@ -1126,7 +1132,7 @@ //This is where the bullet bounces off. -/atom/proc/bullet_ping(obj/item/projectile/P, pixel_x_offset = 0, pixel_y_offset = 0) +/atom/proc/bullet_ping(obj/projectile/P, pixel_x_offset = 0, pixel_y_offset = 0) if(!P || !P.ammo.ping) return @@ -1146,7 +1152,7 @@ /// People getting shot by a large amount of bullets in a very short period of time can lag them out, with chat messages being one cause, so a 1s cooldown per hit message is introduced to assuage that /mob/var/shot_cooldown = 0 -/mob/proc/bullet_message(obj/item/projectile/P) +/mob/proc/bullet_message(obj/projectile/P) if(!P) return if(COOLDOWN_FINISHED(src, shot_cooldown)) @@ -1192,6 +1198,31 @@ if(dx == -1 || dx == 1) return TRUE +/obj/projectile/vulture + accuracy_range_falloff = 10 + /// The odds of hitting a xeno in less than your gun's range. Doesn't apply to humans. + var/xeno_shortrange_chance = 10 + +/obj/projectile/vulture/Initialize(mapload, datum/cause_data/cause_data) + . = ..() + RegisterSignal(src, COMSIG_GUN_VULTURE_FIRED_ONEHAND, PROC_REF(on_onehand)) + +/obj/projectile/vulture/handle_mob(mob/living/hit_mob) + if((ammo.accurate_range_min > distance_travelled) && isxeno(hit_mob)) + if(prob(xeno_shortrange_chance)) + return ..() + + permutated |= hit_mob + return + + return ..() + +/// Handler for when the user one-hands the firing gun +/obj/projectile/vulture/proc/on_onehand(datum/source) + SIGNAL_HANDLER + + accuracy = HIT_ACCURACY_TIER_2 // flat 10% chance if you're desperate and try to fire this thing without a bipod + #undef DEBUG_HIT_CHANCE #undef DEBUG_HUMAN_DEFENSE #undef DEBUG_XENO_DEFENSE diff --git a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm index 98896013c6ec..6778bdd3c72b 100644 --- a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm @@ -235,6 +235,7 @@ if(HAS_TRAIT(attacking_object, TRAIT_TOOL_WRENCH)) if(!wrenchable) to_chat(user, "[src] cannot be unwrenched.") + return if(!do_after(user, 2 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 65099aa3e462..7f476cecf2c5 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -481,24 +481,24 @@ description = "Antimicrobial property specifically targeting parasitic pathogens in the body disrupting their growth and potentially killing them." rarity = PROPERTY_UNCOMMON -/datum/chem_property/positive/antiparasitic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - var/mob/living/carbon/human/H = M - for(var/content in H.contents) - var/obj/item/alien_embryo/A = content - if(A && istype(A)) - if(A.counter > 0) - A.counter = A.counter - potency - H.take_limb_damage(0,POTENCY_MULTIPLIER_MEDIUM*potency) +/datum/chem_property/positive/antiparasitic/process(mob/living/current_mob, potency = 1, delta_time) + if(!ishuman(current_mob)) + return + var/mob/living/carbon/human/current_human = current_mob + for(var/content in current_human.contents) + var/obj/item/alien_embryo/embryo = content + if(embryo && istype(embryo)) + if(embryo.counter > 0) + embryo.counter = embryo.counter - potency + current_human.take_limb_damage(0,POTENCY_MULTIPLIER_MEDIUM*potency) else - A.stage-- - if(A.stage <= 0)//if we reach this point, the embryo dies and the occupant takes a nasty amount of acid damage - qdel(A) - H.take_limb_damage(0,rand(20,40)) - H.vomit() + embryo.stage-- + if(embryo.stage <= 0)//if we reach this point, the embryo dies and the occupant takes a nasty amount of acid damage + qdel(embryo) + current_human.take_limb_damage(0,rand(20,40)) + current_human.vomit() else - A.counter = 90 + embryo.counter = embryo.per_stage_hugged_time /datum/chem_property/positive/antiparasitic/process_overdose(mob/living/M, potency = 1) M.apply_damage(potency, TOX) diff --git a/code/modules/reagents/chemistry_reagents/other.dm b/code/modules/reagents/chemistry_reagents/other.dm index a7f0a1143428..45e66c182e6a 100644 --- a/code/modules/reagents/chemistry_reagents/other.dm +++ b/code/modules/reagents/chemistry_reagents/other.dm @@ -788,6 +788,20 @@ PROPERTY_FIRE_PENETRATING = 1 ) +/datum/reagent/napalm/upp + name = "R189" + id = "R189" + description = "A UPP chemical, it burns at an extremely high tempature and is designed to melt directly through fortified positions or bunkers." + color = "#ffe49c" + burncolor = "#ffe49c" + burn_sprite = "dynamic" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_9, + PROPERTY_DURATION = BURN_TIME_TIER_3, + PROPERTY_RADIUS = 6, + PROPERTY_FIRE_PENETRATING = 1, + ) + /datum/reagent/chlorinetrifluoride name = "Chlorine Trifluoride" id = "chlorine trifluoride" diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 11d310123089..c7b3d3e1bae2 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -367,7 +367,7 @@ return /obj/structure/machinery/disposal/deliveryChute/Collided(atom/movable/AM) //Go straight into the chute - if(istype(AM, /obj/item/projectile) || istype(AM, /obj/effect)) return + if(istype(AM, /obj/projectile) || istype(AM, /obj/effect)) return switch(dir) if(NORTH) if(AM.loc.y != src.loc.y+1) return diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index be087444c99e..ba842fb0bfb9 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -7,7 +7,7 @@ //config.alert_desc_blue_downto -/proc/set_security_level(level, no_sound=0, announce=1) +/proc/set_security_level(level, no_sound = FALSE, announce = TRUE, log = ARES_LOG_SECURITY) if(level != security_level) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SECURITY_LEVEL_CHANGED, level) @@ -16,32 +16,32 @@ switch(level) if(SEC_LEVEL_GREEN) if(announce) - ai_announcement("Attention: Security level lowered to GREEN - all clear.", no_sound ? null : 'sound/AI/code_green.ogg', ARES_LOG_SECURITY) + ai_announcement("Attention: Security level lowered to GREEN - all clear.", no_sound ? null : 'sound/AI/code_green.ogg', log) security_level = SEC_LEVEL_GREEN if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) if(announce) - ai_announcement("Attention: Security level elevated to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_elevated.ogg', ARES_LOG_SECURITY) + ai_announcement("Attention: Security level elevated to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_elevated.ogg', log) else if(announce) - ai_announcement("Attention: Security level lowered to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_lowered.ogg', ARES_LOG_SECURITY) + ai_announcement("Attention: Security level lowered to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_lowered.ogg', log) security_level = SEC_LEVEL_BLUE if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) if(announce) - ai_announcement("Attention: Security level elevated to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_elevated.ogg', ARES_LOG_SECURITY) + ai_announcement("Attention: Security level elevated to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_elevated.ogg', log) else if(announce) - ai_announcement("Attention: Security level lowered to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_lowered.ogg', ARES_LOG_SECURITY) + ai_announcement("Attention: Security level lowered to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_lowered.ogg', log) security_level = SEC_LEVEL_RED if(SEC_LEVEL_DELTA) if(announce) var/name = "SELF-DESTRUCT SYSTEMS ACTIVE" var/input = "DANGER, THE EMERGENCY DESTRUCT SYSTEM IS NOW ACTIVATED. PROCEED TO THE SELF-DESTRUCT CHAMBER FOR CONTROL ROD INSERTION." - marine_announcement(input, name, 'sound/AI/selfdestruct_short.ogg', logging = ARES_LOG_SECURITY) + marine_announcement(input, name, 'sound/AI/selfdestruct_short.ogg', logging = log) security_level = SEC_LEVEL_DELTA EvacuationAuthority.enable_self_destruct() diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index a7d988e460e1..26869cfcf448 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -284,23 +284,36 @@ /obj/structure/machinery/computer/shuttle/lifeboat/attack_hand(mob/user) . = ..() - var/obj/docking_port/mobile/lifeboat/lifeboat = SSshuttle.getShuttle(shuttleId) + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = SSshuttle.getShuttle(shuttleId) if(lifeboat.status == LIFEBOAT_LOCKED) - to_chat(user, SPAN_WARNING("\The [src] flickers with error messages.")) + to_chat(user, SPAN_WARNING("[src] flickers with error messages.")) else if(lifeboat.status == LIFEBOAT_INACTIVE) - to_chat(user, SPAN_NOTICE("\The [src]'s screen says \"Awaiting evacuation order\".")) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Awaiting evacuation order\".")) else if(lifeboat.status == LIFEBOAT_ACTIVE) switch(lifeboat.mode) if(SHUTTLE_IDLE) - to_chat(user, SPAN_NOTICE("\The [src]'s screen says \"Awaiting confirmation of the evacuation order\".")) + if(!istype(user, /mob/living/carbon/human)) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Awaiting confirmation of the evacuation order\".")) + return + + var/mob/living/carbon/human/human_user = user + if(!(ACCESS_MARINE_SENIOR in human_user.wear_id?.access)) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Awaiting confirmation of the evacuation order\".")) + return + + if(tgui_alert(user, "Early launch the lifeboat?", "Confirm", list("Yes", "No"), 10 SECONDS) == "Yes") + to_chat(user, SPAN_NOTICE("[src]'s screen blinks and says \"Early launch accepted\".")) + lifeboat.evac_launch() + return + if(SHUTTLE_IGNITING) - to_chat(user, SPAN_NOTICE("\The [src]'s screen says \"Engines firing\".")) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Engines firing\".")) if(SHUTTLE_CALL) - to_chat(user, SPAN_NOTICE("\The [src] has flight information scrolling across the screen. The autopilot is working correctly.")) + to_chat(user, SPAN_NOTICE("[src] has flight information scrolling across the screen. The autopilot is working correctly.")) /obj/structure/machinery/computer/shuttle/lifeboat/attack_alien(mob/living/carbon/xenomorph/xeno) if(xeno.caste && xeno.caste.is_intelligent) - var/obj/docking_port/mobile/lifeboat/lifeboat = SSshuttle.getShuttle(shuttleId) + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = SSshuttle.getShuttle(shuttleId) if(lifeboat.status == LIFEBOAT_LOCKED) to_chat(xeno, SPAN_WARNING("We already wrested away control of this metal bird.")) return XENO_NO_DELAY_ACTION diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 16f96ce3017c..c7a79b9c44ca 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -220,7 +220,7 @@ dropship.control_doors("unlock", "all", TRUE) dropship_control_lost = TRUE door_control_cooldown = addtimer(CALLBACK(src, PROC_REF(remove_door_lock)), SHUTTLE_LOCK_COOLDOWN, TIMER_STOPPABLE) - announce_dchat("[xeno] has locked \the [dropship]", src) + notify_ghosts(header = "Dropship Locked", message = "[xeno] has locked [dropship]!", source = xeno, action = NOTIFY_ORBIT) if(almayer_orbital_cannon) almayer_orbital_cannon.is_disabled = TRUE @@ -272,6 +272,8 @@ 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.") var/mob/living/carbon/xenomorph/xeno = user var/hivenumber = XENO_HIVE_NORMAL @@ -350,6 +352,7 @@ 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)) @@ -366,6 +369,7 @@ update_equipment(is_optimised) if(is_set_flyby) 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.") var/log = "[key_name(user)] launched the dropship [src.shuttleId] on flyby." msg_admin_niche(log) log_interact(user, msg = "[log]") @@ -394,6 +398,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].") var/log = "[key_name(user)] launched the dropship [src.shuttleId] on transport." msg_admin_niche(log) log_interact(user, msg = "[log]") @@ -413,11 +418,13 @@ 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]") @@ -440,6 +447,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].") var/log = "[key_name(user)] has enabled auto pilot on '[shuttle.name]'" message_admins(log) log_interact(user, msg = "[log]") @@ -456,6 +464,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].") 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/shuttle/computers/escape_pod_computer.dm b/code/modules/shuttle/computers/escape_pod_computer.dm index 99a989ab2e9f..1054bf5e90d7 100644 --- a/code/modules/shuttle/computers/escape_pod_computer.dm +++ b/code/modules/shuttle/computers/escape_pod_computer.dm @@ -39,7 +39,7 @@ /obj/structure/machinery/computer/shuttle/escape_pod_panel/ui_data(mob/user) . = list() - var/obj/docking_port/mobile/escape_shuttle/shuttle = SSshuttle.getShuttle(shuttleId) + var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle = SSshuttle.getShuttle(shuttleId) if(pod_state == STATE_IDLE && shuttle.evac_set) pod_state = STATE_READY @@ -63,7 +63,7 @@ if(.) return - var/obj/docking_port/mobile/escape_shuttle/shuttle = SSshuttle.getShuttle(shuttleId) + var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle = SSshuttle.getShuttle(shuttleId) switch(action) if("force_launch") shuttle.evac_launch() @@ -204,7 +204,7 @@ heat_proof = 1 unslashable = TRUE unacidable = TRUE - var/obj/docking_port/mobile/escape_shuttle/linked_shuttle + var/obj/docking_port/mobile/crashable/escape_shuttle/linked_shuttle /obj/structure/machinery/door/airlock/evacuation/Initialize() . = ..() @@ -229,16 +229,16 @@ /obj/structure/machinery/door/airlock/evacuation/attack_alien(mob/living/carbon/xenomorph/xeno) if(!density || unslashable) //doors become slashable after evac is called return FALSE - + if(xeno.claw_type < CLAW_TYPE_SHARP) to_chat(xeno, SPAN_WARNING("[src] is bolted down tight.")) return XENO_NO_DELAY_ACTION - + xeno.animation_attack_on(src) playsound(src, 'sound/effects/metalhit.ogg', 25, 1) take_damage(HEALTH_DOOR / XENO_HITS_TO_DESTROY_BOLTED_DOOR) return XENO_ATTACK_ACTION - + /obj/structure/machinery/door/airlock/evacuation/attack_remote() return FALSE diff --git a/code/modules/shuttle/dropship.dm b/code/modules/shuttle/dropship.dm new file mode 100644 index 000000000000..cbca500f8f71 --- /dev/null +++ b/code/modules/shuttle/dropship.dm @@ -0,0 +1,217 @@ +/obj/structure/shuttle/part + opacity = TRUE + density = TRUE + unslashable = TRUE + unacidable = TRUE + breakable = FALSE + indestructible = TRUE + +/obj/structure/shuttle/part/dropship1 + name = "\improper Alamo" + icon = 'icons/turf/dropship.dmi' + icon_state = "1" + +/obj/structure/shuttle/part/dropship1/ex_act(severity, direction) + return FALSE + +/obj/structure/shuttle/part/dropship1/transparent + opacity = FALSE + +/obj/structure/shuttle/part/dropship1/transparent/nose_top_right + icon_state = "102" + +/obj/structure/shuttle/part/dropship1/transparent/nose_center + icon_state = "101" + +/obj/structure/shuttle/part/dropship1/transparent/nose_top_left + icon_state = "100" + +/obj/structure/shuttle/part/dropship1/nose_front_left + icon_state = "95" + +/obj/structure/shuttle/part/dropship1/nose_front_right + icon_state = "99" + +/obj/structure/shuttle/part/dropship1/transparent/inner_right_weapons + icon_state = "90" + +/obj/structure/shuttle/part/dropship1/transparent/outer_right_weapons + icon_state = "91" + +/obj/structure/shuttle/part/dropship1/transparent/inner_left_weapons + icon_state = "85" + +/obj/structure/shuttle/part/dropship1/transparent/outer_left_weapons + icon_state = "84" + +/obj/structure/shuttle/part/dropship1/transparent/upper_right_wing + icon_state = "74" + +/obj/structure/shuttle/part/dropship1/transparent/middle_right_wing + icon_state = "70" + +/obj/structure/shuttle/part/dropship1/transparent/lower_right_wing + icon_state = "65" + +/obj/structure/shuttle/part/dropship1/transparent/upper_left_wing + icon_state = "71" + +/obj/structure/shuttle/part/dropship1/transparent/middle_left_wing + icon_state = "66" + +/obj/structure/shuttle/part/dropship1/transparent/lower_left_wing + icon_state = "61" + +/obj/structure/shuttle/part/dropship1/lower_left_wall + icon_state = "46" + +/obj/structure/shuttle/part/dropship1/lower_right_wall + icon_state = "49" + +/obj/structure/shuttle/part/dropship1/transparent/engine_left_cap + icon_state = "40" + +/obj/structure/shuttle/part/dropship1/transparent/engine_right_cap + icon_state = "41" + +/obj/structure/shuttle/part/dropship1/transparent/engine_left_exhaust + icon_state = "16" + +/obj/structure/shuttle/part/dropship1/transparent/engine_right_exhaust + icon_state = "17" + +/obj/structure/shuttle/part/dropship1/bottom_left_wall + icon_state = "9" + +/obj/structure/shuttle/part/dropship1/bottom_right_wall + icon_state = "15" + +/obj/structure/shuttle/part/dropship1/left_inner_wing_connector + icon_state = "7" + +/obj/structure/shuttle/part/dropship1/right_inner_wing_connector + icon_state = "8" + +/obj/structure/shuttle/part/dropship1/left_outer_wing_connector + icon_state = "3" + +/obj/structure/shuttle/part/dropship1/right_outer_wing_connector + icon_state = "4" + +/obj/structure/shuttle/part/dropship1/transparent/left_inner_bottom_wing + icon_state = "1" + +/obj/structure/shuttle/part/dropship1/transparent/left_outer_bottom_wing + icon_state = "2" + +/obj/structure/shuttle/part/dropship1/transparent/right_inner_bottom_wing + icon_state = "5" + +/obj/structure/shuttle/part/dropship1/transparent/right_outer_bottom_wing + icon_state = "6" + +/obj/structure/shuttle/part/dropship2 + name = "\improper Normandy" + icon = 'icons/turf/dropship2.dmi' + icon_state = "1" + opacity = TRUE + +/obj/structure/shuttle/part/dropship2/ex_act(severity, direction) + return FALSE + +/obj/structure/shuttle/part/dropship2/transparent + opacity = FALSE + +/obj/structure/shuttle/part/dropship2/transparent/nose_top_right + icon_state = "102" + +/obj/structure/shuttle/part/dropship2/transparent/nose_center + icon_state = "101" + +/obj/structure/shuttle/part/dropship2/transparent/nose_top_left + icon_state = "100" + +/obj/structure/shuttle/part/dropship2/nose_front_left + icon_state = "95" + +/obj/structure/shuttle/part/dropship2/nose_front_right + icon_state = "99" + +/obj/structure/shuttle/part/dropship2/transparent/inner_right_weapons + icon_state = "90" + +/obj/structure/shuttle/part/dropship2/transparent/outer_right_weapons + icon_state = "91" + +/obj/structure/shuttle/part/dropship2/transparent/inner_left_weapons + icon_state = "85" + +/obj/structure/shuttle/part/dropship2/transparent/outer_left_weapons + icon_state = "84" + +/obj/structure/shuttle/part/dropship2/transparent/upper_right_wing + icon_state = "74" + +/obj/structure/shuttle/part/dropship2/transparent/middle_right_wing + icon_state = "70" + +/obj/structure/shuttle/part/dropship2/transparent/lower_right_wing + icon_state = "65" + +/obj/structure/shuttle/part/dropship2/transparent/upper_left_wing + icon_state = "71" + +/obj/structure/shuttle/part/dropship2/transparent/middle_left_wing + icon_state = "66" + +/obj/structure/shuttle/part/dropship2/transparent/lower_left_wing + icon_state = "61" + +/obj/structure/shuttle/part/dropship2/lower_left_wall + icon_state = "46" + +/obj/structure/shuttle/part/dropship2/lower_right_wall + icon_state = "49" + +/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap + icon_state = "40" + +/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap + icon_state = "41" + +/obj/structure/shuttle/part/dropship2/transparent/engine_left_exhaust + icon_state = "16" + +/obj/structure/shuttle/part/dropship2/transparent/engine_right_exhaust + icon_state = "17" + +/obj/structure/shuttle/part/dropship2/bottom_left_wall + icon_state = "9" + +/obj/structure/shuttle/part/dropship2/bottom_right_wall + icon_state = "15" + +/obj/structure/shuttle/part/dropship2/left_inner_wing_connector + icon_state = "7" + +/obj/structure/shuttle/part/dropship2/right_inner_wing_connector + icon_state = "8" + +/obj/structure/shuttle/part/dropship2/left_outer_wing_connector + icon_state = "3" + +/obj/structure/shuttle/part/dropship2/right_outer_wing_connector + icon_state = "4" + +/obj/structure/shuttle/part/dropship2/transparent/left_outer_bottom_wing + icon_state = "1" + +/obj/structure/shuttle/part/dropship2/transparent/left_outer_inner_wing + icon_state = "2" + +/obj/structure/shuttle/part/dropship2/transparent/right_inner_bottom_wing + icon_state = "5" + +/obj/structure/shuttle/part/dropship2/transparent/right_outer_bottom_wing + icon_state = "6" + diff --git a/code/modules/shuttle/dropship_hijack.dm b/code/modules/shuttle/dropship_hijack.dm index ce151c14324c..7796ed0510c8 100644 --- a/code/modules/shuttle/dropship_hijack.dm +++ b/code/modules/shuttle/dropship_hijack.dm @@ -1,5 +1,5 @@ -#define HIJACK_CRASH_SITE_OFFSET_X -5 -#define HIJACK_CRASH_SITE_OFFSET_Y -11 +#define HIJACK_CRASH_SITE_OFFSET_X 0 +#define HIJACK_CRASH_SITE_OFFSET_Y 0 /datum/dropship_hijack var/obj/docking_port/mobile/shuttle @@ -151,7 +151,7 @@ marine_announcement("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT." , "EMERGENCY", 'sound/AI/dropship_emergency.ogg', logging = ARES_LOG_SECURITY) - announce_dchat("The dropship is about to impact [get_area_name(crash_site)]", crash_site) + notify_ghosts(header = "Dropship Collision", message = "The dropship is about to impact [get_area_name(crash_site)]!", source = crash_site, extra_large = TRUE) final_announcement = TRUE playsound_area(get_area(crash_site), 'sound/effects/engine_landing.ogg', 100) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 7bd3bcb5df7c..d834822e884a 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -114,8 +114,8 @@ All ShuttleMove procs go here if (newT.z != oldT.z) onTransitZ(oldT.z, newT.z) - //if(light) // tg lighting - // update_light() + if(light) + update_light() if(rotation) shuttleRotate(rotation) @@ -132,8 +132,7 @@ All ShuttleMove procs go here var/turf/target = get_edge_target_turf(src, move_dir) var/range = throw_force * 10 range = CEILING(rand(range-(range*0.1), range+(range*0.1)), 10)/10 - var/speed = range/5 - safe_throw_at(target, range, speed) //, force = MOVE_FORCE_EXTREMELY_STRONG) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, safe_throw_at), target, range, SPEED_AVERAGE) //=====================================================================// @@ -151,7 +150,7 @@ All ShuttleMove procs go here contents -= oldT underlying_old_area.contents += oldT - //oldT.change_area(src, underlying_old_area) //lighting + oldT.change_area(src, underlying_old_area) //lighting //The old turf has now been given back to the area that turf originaly belonged to var/area/old_dest_area = newT.loc @@ -159,7 +158,7 @@ All ShuttleMove procs go here old_dest_area.contents -= newT contents += newT - //newT.change_area(old_dest_area, src) //lighting + newT.change_area(old_dest_area, src) //lighting return TRUE // Called on areas after everything has been moved diff --git a/code/modules/shuttle/shuttles/crashable/crashable.dm b/code/modules/shuttle/shuttles/crashable/crashable.dm new file mode 100644 index 000000000000..de1c5cc8e4fb --- /dev/null +++ b/code/modules/shuttle/shuttles/crashable/crashable.dm @@ -0,0 +1,179 @@ +/obj/docking_port/mobile/crashable + name = "crashable shuttle" + + /// Whether or not this shuttle is crash landing + var/crash_land = FALSE + /// Whether fires occur aboard the shuttle when crashing + var/fires_on_crash = FALSE + +/obj/docking_port/mobile/crashable/enterTransit() + . = ..() + + if(!crash_land) + return + + notify_ghosts(header = "Crashing shuttle!", message = "[name] has catastrophically failed and is crashing at [get_area(destination)].", source = src) + + for(var/area/shuttle_area as anything in shuttle_areas) + shuttle_area.flags_alarm_state |= ALARM_WARNING_FIRE + shuttle_area.updateicon() + for(var/mob/evac_mob in shuttle_area) + if(evac_mob.client) + playsound_client(evac_mob.client, 'sound/effects/bomb_fall.ogg', vol = 50) + + for(var/turf/found_turf as anything in destination.return_turfs()) + if(istype(found_turf, /turf/closed)) + found_turf.ChangeTurf(/turf/open/floor) + + for(var/mob/current_mob as anything in get_mobs_in_z_level_range(destination.return_center_turf(), 18)) + var/relative_dir = get_dir(current_mob, destination.return_center_turf()) + var/final_dir = dir2text(relative_dir) + to_chat(current_mob, SPAN_HIGHDANGER("You hear something crashing down from above [final_dir ? "to the [final_dir]" : "nearby"]!")) + + if(fires_on_crash) + handle_fires() + + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cell_explosion), destination.return_center_turf(), length(destination.return_turfs()) * 2, 25, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data("crashing shuttle")), 1.5 SECONDS) + +/obj/docking_port/mobile/crashable/on_prearrival() + . = ..() + + if(!crash_land) + return + + movement_force = list("KNOCKDOWN" = 0, "THROW" = 5) + + for(var/area/shuttle_area in shuttle_areas) + for(var/mob/evac_mob in shuttle_area) + shake_camera(evac_mob, 20, 2) + if(evac_mob.client) + playsound_client(evac_mob.client, get_sfx("bigboom"), vol = 50) + +/// Called when the shuttle is launched and checks for crash and creates a crash point +/obj/docking_port/mobile/crashable/proc/evac_launch() + if(!crash_check()) + return + + create_crash_point() + +/// Returns whether or not the shuttle will crash after being sent +/obj/docking_port/mobile/crashable/proc/crash_check() + return FALSE + +/// Sets up a valid crash point, fails after 10 tries +/obj/docking_port/mobile/crashable/proc/create_crash_point() + for(var/i = 1 to 10) + var/list/all_ground_levels = SSmapping.levels_by_trait(ZTRAIT_GROUND) + var/ground_z_level = all_ground_levels[1] + + var/list/area/potential_areas = SSmapping.areas_in_z["[ground_z_level]"] + + var/area/area_picked = pick(potential_areas) + + var/list/potential_turfs = list() + + for(var/turf/turf_in_area in area_picked) + potential_turfs += turf_in_area + + if(!length(potential_turfs)) + continue + + var/turf/turf_picked = pick(potential_turfs) + + var/obj/docking_port/stationary/crashable/temp_crashable_port = new(turf_picked) + temp_crashable_port.width = width + temp_crashable_port.height = height + temp_crashable_port.id = id + + if(!check_crash_point(temp_crashable_port)) + qdel(temp_crashable_port) + continue + + destination = temp_crashable_port + break + + if(destination) + crash_land = TRUE + +/// Checks for anything that may get in the way of a crash, returns FALSE if there is something in the way or is out of bounds +/obj/docking_port/mobile/crashable/proc/check_crash_point(obj/docking_port/stationary/crashable/checked_crashable_port) + for(var/turf/found_turf as anything in checked_crashable_port.return_turfs()) + var/area/found_area = get_area(found_turf) + if(found_area.flags_area & AREA_NOTUNNEL) + return FALSE + + if(!found_area.can_build_special) + return FALSE + + if(istype(found_turf, /turf/closed/wall)) + var/turf/closed/wall/found_closed_turf = found_turf + if(found_closed_turf.hull) + return FALSE + + if(istype(found_turf, /turf/closed/shuttle)) + return FALSE + + for(var/obj/docking_port/stationary/stationary_dock in get_turf(checked_crashable_port)) + if(stationary_dock != checked_crashable_port) + return FALSE + + for(var/obj/docking_port/mobile/cycled_mobile_port as anything in SSshuttle.mobile) + if(cycled_mobile_port == src) + continue + + if(!cycled_mobile_port.destination) + continue + + if(length(checked_crashable_port.return_turfs() & cycled_mobile_port.destination.return_turfs())) + return FALSE + + return TRUE + +/// Forces the shuttle to crash, admin called +/obj/docking_port/mobile/crashable/proc/force_crash() + create_crash_point() + set_mode(SHUTTLE_IGNITING) + on_ignition() + setTimer(ignitionTime) + +/// Sets up and handles fires/explosions on crashing shuttles +/obj/docking_port/mobile/crashable/proc/handle_fires() + var/list/turf/total_turfs = list() + for(var/area/shuttle_area as anything in shuttle_areas) + for(var/turf/cycled_turf in shuttle_area) + total_turfs += cycled_turf + + for(var/i = 1 to (length(total_turfs) / 40)) + var/turf/position = pick(total_turfs) + new /obj/effect/warning/explosive(position, 3 SECONDS) + playsound(position, 'sound/effects/pipe_hissing.ogg', vol = 40) + addtimer(CALLBACK(src, PROC_REF(kablooie), position), 3 SECONDS) + +/// Actually blows up the fire/explosion on crashing shuttles, used for effect delay +/obj/docking_port/mobile/crashable/proc/kablooie(turf/position) + var/new_cause_data = create_cause_data("crashing shuttle fire") + var/list/exploding_types = list(/obj/item/explosive/grenade/high_explosive/bursting_pipe, /obj/item/explosive/grenade/incendiary/bursting_pipe) + for(var/path in exploding_types) + var/obj/item/explosive/grenade/exploder = new path(position) + exploder.cause_data = new_cause_data + exploder.prime() + +/// Handles opening the doors for the specific shuttle type upon arriving at the crash point +/obj/docking_port/mobile/crashable/proc/open_doors() + return + +/obj/docking_port/stationary/crashable + name = "Crashable Dock" + +/obj/docking_port/stationary/crashable/on_arrival(obj/docking_port/mobile/arriving_shuttle) + . = ..() + + if(istype(arriving_shuttle, /obj/docking_port/mobile/crashable)) + var/obj/docking_port/mobile/crashable/crashing_shuttle = arriving_shuttle + crashing_shuttle.open_doors() + + for(var/area/shuttle_area in arriving_shuttle.shuttle_areas) + shuttle_area.remove_base_lighting() + + shuttle_area.flags_alarm_state &= ~ALARM_WARNING_FIRE + shuttle_area.updateicon() diff --git a/code/modules/shuttle/shuttles/escape_shuttle.dm b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm similarity index 56% rename from code/modules/shuttle/shuttles/escape_shuttle.dm rename to code/modules/shuttle/shuttles/crashable/escape_shuttle.dm index daf91034036f..6029d345b6d7 100644 --- a/code/modules/shuttle/shuttles/escape_shuttle.dm +++ b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm @@ -1,4 +1,4 @@ -/obj/docking_port/mobile/escape_shuttle +/obj/docking_port/mobile/crashable/escape_shuttle name = "Escape Pod" id = ESCAPE_SHUTTLE area_type = /area/shuttle/escape_pod @@ -17,10 +17,9 @@ var/datum/door_controller/single/door_handler = new() var/launched = FALSE - var/crash_land = FALSE var/evac_set = FALSE -/obj/docking_port/mobile/escape_shuttle/Initialize(mapload) +/obj/docking_port/mobile/crashable/escape_shuttle/Initialize(mapload) . = ..(mapload) for(var/place in shuttle_areas) for(var/obj/structure/machinery/door/airlock/evacuation/air in place) @@ -30,7 +29,7 @@ air.unacidable = TRUE air.linked_shuttle = src -/obj/docking_port/mobile/escape_shuttle/proc/cancel_evac() +/obj/docking_port/mobile/crashable/escape_shuttle/proc/cancel_evac() door_handler.control_doors("force-unlock") evac_set = FALSE @@ -42,7 +41,7 @@ for(var/obj/structure/machinery/cryopod/evacuation/cryotube in interior_area) cryotube.dock_state = STATE_IDLE -/obj/docking_port/mobile/escape_shuttle/proc/prepare_evac() +/obj/docking_port/mobile/crashable/escape_shuttle/proc/prepare_evac() door_handler.control_doors("force-unlock") evac_set = TRUE for(var/area/interior_area in shuttle_areas) @@ -54,8 +53,9 @@ air.unslashable = FALSE air.unacidable = FALSE +/obj/docking_port/mobile/crashable/escape_shuttle/evac_launch() + . = ..() -/obj/docking_port/mobile/escape_shuttle/proc/evac_launch() if(mode == SHUTTLE_CRASHED) return @@ -86,10 +86,6 @@ door_handler.control_doors("force-unlock") return - destination = null - if(prob((EvacuationAuthority.evac_status >= EVACUATION_STATUS_IN_PROGRESS ? crash_land_chance : early_crash_land_chance))) - create_crash_point() - set_mode(SHUTTLE_IGNITING) on_ignition() setTimer(ignitionTime) @@ -104,128 +100,44 @@ air.indestructible = TRUE air.unacidable = TRUE - -/obj/docking_port/mobile/escape_shuttle/proc/create_crash_point() - for(var/i = 1 to 10) - var/list/all_ground_levels = SSmapping.levels_by_trait(ZTRAIT_GROUND) - var/ground_z_level = all_ground_levels[1] - - var/list/area/potential_areas = SSmapping.areas_in_z["[ground_z_level]"] - - var/area/area_picked = pick(potential_areas) - - var/list/potential_turfs = list() - - for(var/turf/turf_in_area in area_picked) - potential_turfs += turf_in_area - - if(!length(potential_turfs)) - continue - - var/turf/turf_picked = pick(potential_turfs) - - var/obj/docking_port/stationary/escape_pod/crash_land/temp_escape_pod_port = new(turf_picked) - temp_escape_pod_port.width = width - temp_escape_pod_port.height = height - temp_escape_pod_port.id = id - - if(!check_crash_point(temp_escape_pod_port)) - qdel(temp_escape_pod_port) - continue - - destination = temp_escape_pod_port - break - - if(destination) - crash_land = TRUE - -/obj/docking_port/mobile/escape_shuttle/proc/check_crash_point(obj/docking_port/stationary/escape_pod/crash_land/checked_escape_pod_port) - for(var/turf/found_turf as anything in checked_escape_pod_port.return_turfs()) - var/area/found_area = get_area(found_turf) - if(found_area.flags_area & AREA_NOTUNNEL) - return FALSE - - if(!found_area.can_build_special) - return FALSE - - if(istype(found_turf, /turf/closed/wall)) - var/turf/closed/wall/found_closed_turf = found_turf - if(found_closed_turf.hull) - return FALSE - - if(istype(found_turf, /turf/closed/shuttle)) - return FALSE - - return TRUE - -/obj/docking_port/mobile/escape_shuttle/enterTransit() +/obj/docking_port/mobile/crashable/escape_shuttle/crash_check() . = ..() - if(!crash_land) - return - - for(var/area/shuttle_area in shuttle_areas) - shuttle_area.flags_alarm_state |= ALARM_WARNING_FIRE - shuttle_area.updateicon() - for(var/mob/evac_mob in shuttle_area) - if(evac_mob.client) - playsound_client(evac_mob.client, 'sound/effects/bomb_fall.ogg', vol = 50) - - for(var/turf/found_turf as anything in destination.return_turfs()) - if(istype(found_turf, /turf/closed)) - found_turf.ChangeTurf(/turf/open/floor) - - cell_explosion(destination.return_center_turf(), 300, 25, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data("evac pod crash")) + if(prob((EvacuationAuthority.evac_status >= EVACUATION_STATUS_IN_PROGRESS ? crash_land_chance : early_crash_land_chance))) + return TRUE -/obj/docking_port/mobile/escape_shuttle/on_prearrival() +/obj/docking_port/mobile/crashable/escape_shuttle/open_doors() . = ..() - if(!crash_land) - return - - movement_force = list("KNOCKDOWN" = 0, "THROW" = 5) - - for(var/area/shuttle_area in shuttle_areas) - for(var/mob/evac_mob in shuttle_area) - shake_camera(evac_mob, 20, 2) - if(evac_mob.client) - playsound_client(evac_mob.client, get_sfx("bigboom"), vol = 50) - door_handler.control_doors("force-unlock") -/obj/docking_port/mobile/escape_shuttle/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) +/obj/docking_port/mobile/crashable/escape_shuttle/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() playsound(src,'sound/effects/escape_pod_launch.ogg', 50, 1) -/obj/docking_port/mobile/escape_shuttle/proc/force_crash() - create_crash_point() - set_mode(SHUTTLE_IGNITING) - on_ignition() - setTimer(ignitionTime) - -/obj/docking_port/mobile/escape_shuttle/e +/obj/docking_port/mobile/crashable/escape_shuttle/e id = ESCAPE_SHUTTLE_EAST width = 4 height = 5 -/obj/docking_port/mobile/escape_shuttle/cl +/obj/docking_port/mobile/crashable/escape_shuttle/cl id = ESCAPE_SHUTTLE_EAST_CL width = 4 height = 5 early_crash_land_chance = 25 crash_land_chance = 5 -/obj/docking_port/mobile/escape_shuttle/w +/obj/docking_port/mobile/crashable/escape_shuttle/w id = ESCAPE_SHUTTLE_WEST width = 4 height = 5 -/obj/docking_port/mobile/escape_shuttle/n +/obj/docking_port/mobile/crashable/escape_shuttle/n id = ESCAPE_SHUTTLE_NORTH width = 5 height = 4 -/obj/docking_port/mobile/escape_shuttle/s +/obj/docking_port/mobile/crashable/escape_shuttle/s id = ESCAPE_SHUTTLE_SOUTH width = 5 height = 4 @@ -263,23 +175,6 @@ width = 4 height = 5 -/obj/docking_port/stationary/escape_pod/crash_land - name = "Crash Escape Pod Dock" - -/obj/docking_port/stationary/escape_pod/crash_land/on_arrival(obj/docking_port/mobile/arriving_shuttle) - . = ..() - - if(istype(arriving_shuttle, /obj/docking_port/mobile/escape_shuttle)) - var/obj/docking_port/mobile/escape_shuttle/escape_shuttle = arriving_shuttle - escape_shuttle.door_handler.control_doors("force-unlock") - - for(var/area/shuttle_area in arriving_shuttle.shuttle_areas) - shuttle_area.SetDynamicLighting() - shuttle_area.SetLightLevel(0) - - shuttle_area.flags_alarm_state &= ~ALARM_WARNING_FIRE - shuttle_area.updateicon() - /datum/map_template/shuttle/escape_pod_w name = "Escape Pod W" shuttle_id = ESCAPE_SHUTTLE_WEST diff --git a/code/modules/shuttle/lifeboats.dm b/code/modules/shuttle/shuttles/crashable/lifeboats.dm similarity index 82% rename from code/modules/shuttle/lifeboats.dm rename to code/modules/shuttle/shuttles/crashable/lifeboats.dm index 36696441a961..93489ee4a359 100644 --- a/code/modules/shuttle/lifeboats.dm +++ b/code/modules/shuttle/shuttles/crashable/lifeboats.dm @@ -1,7 +1,7 @@ // === MOBILES /// Generic Lifeboat definition -/obj/docking_port/mobile/lifeboat +/obj/docking_port/mobile/crashable/lifeboat name = "lifeboat" area_type = /area/shuttle/lifeboat ignitionTime = 10 SECONDS @@ -12,7 +12,9 @@ var/list/doors = list() var/survivors = 0 -/obj/docking_port/mobile/lifeboat/proc/check_for_survivors() + fires_on_crash = TRUE + +/obj/docking_port/mobile/crashable/lifeboat/proc/check_for_survivors() for(var/mob/living/carbon/human/survived_human as anything in GLOB.alive_human_list) //check for lifeboats survivors var/area/area = get_area(survived_human) if(!survived_human) @@ -25,26 +27,42 @@ to_chat(survived_human, "

[SPAN_CENTERBOLD("You have successfully left the [MAIN_SHIP_NAME]. You may now ghost and observe the rest of the round.")]
") /// Port Aft Lifeboat (bottom-right, doors on its left side) -/obj/docking_port/mobile/lifeboat/port +/obj/docking_port/mobile/crashable/lifeboat/port name = "port-aft lifeboat" id = MOBILE_SHUTTLE_LIFEBOAT_PORT preferred_direction = WEST port_direction = WEST /// Starboard Aft Lifeboat (top-right, doors its right side) -/obj/docking_port/mobile/lifeboat/starboard +/obj/docking_port/mobile/crashable/lifeboat/starboard name = "starboard-aft lifeboat" id = MOBILE_SHUTTLE_LIFEBOAT_STARBOARD preferred_direction = EAST port_direction = EAST -/obj/docking_port/mobile/lifeboat/proc/send_to_infinite_transit() +/obj/docking_port/mobile/crashable/lifeboat/evac_launch() + . = ..() + available = FALSE - destination = null set_mode(SHUTTLE_IGNITING) on_ignition() setTimer(ignitionTime) +/obj/docking_port/mobile/crashable/lifeboat/crash_check() + . = ..() + + if(EvacuationAuthority.evac_status >= EVACUATION_STATUS_IN_PROGRESS) + return FALSE + + if(prob(abs(((world.time - EvacuationAuthority.evac_time) / EVACUATION_AUTOMATIC_DEPARTURE) - 1) * 100)) + return TRUE + +/obj/docking_port/mobile/crashable/lifeboat/open_doors() + . = ..() + + for(var/obj/structure/machinery/door/airlock/multi_tile/door in doors) + INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat, unlock_and_open)) + // === STATIONARIES /// Generic lifeboat dock @@ -54,7 +72,7 @@ height = 7 /obj/docking_port/stationary/lifeboat_dock/on_dock_ignition(departing_shuttle) - var/obj/docking_port/mobile/lifeboat/lifeboat = departing_shuttle + var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = departing_shuttle if(istype(lifeboat)) for(var/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/door in lifeboat.doors) INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat, close_and_lock)) @@ -71,7 +89,7 @@ blastdoor.vacate_premises() /obj/docking_port/stationary/lifeboat_dock/proc/open_dock() - var/obj/docking_port/mobile/lifeboat/docked_shuttle = get_docked() + var/obj/docking_port/mobile/crashable/lifeboat/docked_shuttle = get_docked() if(docked_shuttle) for(var/obj/structure/machinery/door/airlock/multi_tile/door in docked_shuttle.doors) INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat, unlock_and_open)) @@ -81,7 +99,7 @@ addtimer(CALLBACK(blastdoor, TYPE_PROC_REF(/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat, unlock_and_open)), 10) /obj/docking_port/stationary/lifeboat_dock/proc/close_dock() - var/obj/docking_port/mobile/lifeboat/docked_shuttle = get_docked() + var/obj/docking_port/mobile/crashable/lifeboat/docked_shuttle = get_docked() if(docked_shuttle) for(var/obj/structure/machinery/door/airlock/multi_tile/door in docked_shuttle.doors) INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat, close_and_lock)) @@ -125,5 +143,3 @@ /datum/map_template/shuttle/lifeboat_starboard name = "Starboard door lifeboat" shuttle_id = MOBILE_SHUTTLE_LIFEBOAT_STARBOARD - - diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm index 303d4c0494ed..d81484b0343d 100644 --- a/code/modules/shuttle/shuttles/dropship.dm +++ b/code/modules/shuttle/shuttles/dropship.dm @@ -1,6 +1,10 @@ /obj/docking_port/mobile/marine_dropship width = 11 height = 21 + + dwidth = 5 + dheight = 10 + preferred_direction = SOUTH callTime = DROPSHIP_TRANSIT_DURATION rechargeTime = SHUTTLE_RECHARGE @@ -157,7 +161,9 @@ dir = NORTH width = 11 height = 21 - dwidth = 1 + dwidth = 5 + dheight = 10 + var/list/landing_lights = list() var/auto_open = FALSE var/landing_lights_on = FALSE @@ -256,7 +262,6 @@ /obj/docking_port/stationary/marine_dropship/crash_site auto_open = TRUE - dwidth = 1 /obj/docking_port/stationary/marine_dropship/crash_site/on_prearrival(obj/docking_port/mobile/arriving_shuttle) . = ..() diff --git a/code/modules/shuttle/shuttles/ert.dm b/code/modules/shuttle/shuttles/ert.dm index 2868dc4a237b..1760caf3d87c 100644 --- a/code/modules/shuttle/shuttles/ert.dm +++ b/code/modules/shuttle/shuttles/ert.dm @@ -105,6 +105,13 @@ port_direction = NORTH // ERT Shuttle 4 + +/obj/docking_port/mobile/emergency_response/ert4 + name = "TWE Shuttle" + id = MOBILE_SHUTTLE_ID_ERT4 + preferred_direction = SOUTH + port_direction = NORTH + /obj/docking_port/mobile/emergency_response/small name = "Rescue Shuttle" id = MOBILE_SHUTTLE_ID_ERT_SMALL @@ -115,6 +122,7 @@ var/port_door var/starboard_door + /obj/docking_port/mobile/emergency_response/small/Initialize(mapload) . = ..() external_doors = list() @@ -293,6 +301,14 @@ height = 29 roundstart_template = /datum/map_template/shuttle/big_ert +/obj/docking_port/stationary/emergency_response/idle_port6 + name = "Response Station Landing Pad 6" + dir = NORTH + id = ADMIN_LANDING_PAD_5 + width = 17 + height = 29 + roundstart_template = /datum/map_template/shuttle/twe_ert + /datum/map_template/shuttle/response_ert name = "Response Shuttle" shuttle_id = "ert_response_shuttle" @@ -305,6 +321,10 @@ name = "UPP Shuttle" shuttle_id = "ert_upp_shuttle" +/datum/map_template/shuttle/twe_ert + name = "TWE Shuttle" + shuttle_id = "ert_twe_shuttle" + /datum/map_template/shuttle/small_ert name = "Rescue Shuttle" shuttle_id = "ert_small_shuttle_north" diff --git a/code/modules/shuttles/marine_ferry.dm b/code/modules/shuttles/marine_ferry.dm index 17caccde207e..426d90c1457a 100644 --- a/code/modules/shuttles/marine_ferry.dm +++ b/code/modules/shuttles/marine_ferry.dm @@ -102,6 +102,8 @@ 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.") /* diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index ecf1bacf080b..12356754872c 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -293,6 +293,8 @@ 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.") 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) @@ -335,7 +337,7 @@ GLOBAL_LIST_EMPTY(shuttle_controls) ui_interact(usr) -/obj/structure/machinery/computer/shuttle_control/bullet_act(obj/item/projectile/Proj) +/obj/structure/machinery/computer/shuttle_control/bullet_act(obj/projectile/Proj) visible_message("[Proj] ricochets off [src]!") return 0 diff --git a/code/modules/surgery/robolimb_repair.dm b/code/modules/surgery/robolimb_repair.dm index 99c918039a31..f7ec1b483f66 100644 --- a/code/modules/surgery/robolimb_repair.dm +++ b/code/modules/surgery/robolimb_repair.dm @@ -12,6 +12,7 @@ pain_reduction_required = NONE requires_bodypart = TRUE requires_bodypart_type = LIMB_ROBOT + lying_required = FALSE /datum/surgery/prosthetic_recalibration/can_start(mob/user, mob/living/carbon/patient, obj/limb/L, obj/item/tool) if(L.status & LIMB_UNCALIBRATED_PROSTHETIC) diff --git a/code/modules/teleporters/teleporter_console.dm b/code/modules/teleporters/teleporter_console.dm index bdd62f67fdad..b9a3629c881d 100644 --- a/code/modules/teleporters/teleporter_console.dm +++ b/code/modules/teleporters/teleporter_console.dm @@ -166,7 +166,7 @@ ..() -/obj/structure/machinery/computer/teleporter_console/bullet_act(obj/item/projectile/P) +/obj/structure/machinery/computer/teleporter_console/bullet_act(obj/projectile/P) visible_message("[P] doesn't even scratch [src]!") return FALSE diff --git a/code/modules/tents/blockers.dm b/code/modules/tents/blockers.dm index 24765ca2a284..3c02ca326149 100644 --- a/code/modules/tents/blockers.dm +++ b/code/modules/tents/blockers.dm @@ -34,7 +34,7 @@ PF.flags_can_pass_front = NONE PF.flags_can_pass_behind = NONE -/obj/structure/blocker/tent/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/blocker/tent/get_projectile_hit_boolean(obj/projectile/P) . = ..() return FALSE // Always fly through the tent diff --git a/code/modules/tents/deployed_tents.dm b/code/modules/tents/deployed_tents.dm index d55fe6b59879..9ea06e357d9e 100644 --- a/code/modules/tents/deployed_tents.dm +++ b/code/modules/tents/deployed_tents.dm @@ -112,7 +112,7 @@ playsound(src, 'sound/items/paper_ripped.ogg', 25, 1) qdel(src) -/obj/structure/tent/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/tent/get_projectile_hit_boolean(obj/projectile/P) . = ..() return FALSE // Always fly through the tent diff --git a/code/modules/tents/equipment.dm b/code/modules/tents/equipment.dm index f2f9175a240e..0d47c7e3ce62 100644 --- a/code/modules/tents/equipment.dm +++ b/code/modules/tents/equipment.dm @@ -87,7 +87,7 @@ AddComponent(/datum/component/tent_supported_object) update_icon() -/obj/structure/tent_curtain/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/tent_curtain/get_projectile_hit_boolean(obj/projectile/P) return FALSE /obj/structure/tent_curtain/update_icon() diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 46f900eee71e..eb4672b84fc9 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -12,10 +12,13 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) /mob/living/carbon, /obj/effect/node, /obj/item/seeds/cutting, + //lighting singleton + /mob/dview, // These use walkaway() after initialization, which causes false positives /obj/item/explosive/grenade/flashbang/cluster/segment, /obj/item/explosive/grenade/flashbang/cluster_piece, /obj/effect/fake_attacker, + /atom/movable/lighting_mask, //leave it alone ) //This turf existing is an error in and of itself ignore += typesof(/turf/baseturf_skipover) diff --git a/code/modules/vehicles/apc/apc.dm b/code/modules/vehicles/apc/apc.dm index 2d0c823dd638..d71db37074f1 100644 --- a/code/modules/vehicles/apc/apc.dm +++ b/code/modules/vehicles/apc/apc.dm @@ -34,7 +34,6 @@ GLOBAL_LIST_EMPTY(command_apc_list) movement_sound = 'sound/vehicles/tank_driving.ogg' - luminosity = 7 var/gunner_view_buff = 10 hardpoints_allowed = list( diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index ac22c0e79812..40085ad078ea 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -4,11 +4,13 @@ icon = 'icons/obj/vehicles/vehicles.dmi' icon_state = "cargo_engine" on = 0 - luminosity = 5 //Pretty strong because why not powered = 1 locked = 0 charge_use = 15 + light_system = MOVABLE_LIGHT + light_range = 5 + var/car_limit = 3 //how many cars an engine can pull before performance degrades active_engines = 1 var/obj/item/key/cargo_train/key @@ -24,7 +26,7 @@ name = "cargo train trolley" icon = 'icons/obj/vehicles/vehicles.dmi' icon_state = "cargo_trailer" - luminosity = 0 + light_range = 0 anchored = FALSE locked = 0 can_buckle = FALSE @@ -38,6 +40,10 @@ key = new() var/image/I = new(icon = 'icons/obj/vehicles/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs overlays += I + + if(light_range) + set_light_on(TRUE) + turn_off() //so engine verbs are correctly set /obj/vehicle/train/cargo/engine/Move() diff --git a/code/modules/vehicles/hardpoints/hardpoint.dm b/code/modules/vehicles/hardpoints/hardpoint.dm index 2fc49384075b..ee49ebc0ab57 100644 --- a/code/modules/vehicles/hardpoints/hardpoint.dm +++ b/code/modules/vehicles/hardpoints/hardpoint.dm @@ -134,7 +134,7 @@ return /obj/item/hardpoint/proc/generate_bullet(mob/user, turf/origin_turf) - var/obj/item/projectile/P = new(origin_turf, create_cause_data(initial(name), user)) + var/obj/projectile/P = new(origin_turf, create_cause_data(initial(name), user)) P.generate_bullet(new ammo.default_ammo) // Apply bullet traits from gun for(var/entry in traits_to_give) @@ -552,7 +552,7 @@ var/turf/origin_turf = get_turf(src) origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - var/obj/item/projectile/P = generate_bullet(user, origin_turf) + var/obj/projectile/P = generate_bullet(user, origin_turf) SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, user) P.fire_at(A, user, src, P.ammo.max_range, P.ammo.shell_speed) diff --git a/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm b/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm index 23219f551a47..78222cdb3a40 100644 --- a/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm +++ b/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm @@ -1,6 +1,6 @@ /obj/item/ammo_magazine/hardpoint/ltaaap_minigun name = "LTAA-AP Minigun Magazine" - icon = 'icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi' + icon = 'icons/obj/items/weapons/guns/ammo_by_faction/event.dmi' desc = "A primary armament minigun magazine." caliber = "7.62x51mm" //Correlates to miniguns icon_state = "painless" diff --git a/code/modules/vehicles/hardpoints/holder/tank_turret.dm b/code/modules/vehicles/hardpoints/holder/tank_turret.dm index db67dadb132d..27ab6c95404c 100644 --- a/code/modules/vehicles/hardpoints/holder/tank_turret.dm +++ b/code/modules/vehicles/hardpoints/holder/tank_turret.dm @@ -223,7 +223,7 @@ origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) origin_turf = get_step(get_step(origin_turf, owner.dir), owner.dir) //this should get us tile in front of tank to prevent grenade being stuck under us. - var/obj/item/projectile/P = generate_bullet(user, origin_turf) + var/obj/projectile/P = generate_bullet(user, origin_turf) SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, get_dist(origin_turf, A) + 1, P.ammo.shell_speed) ammo.current_rounds-- diff --git a/code/modules/vehicles/hardpoints/primary/flamer.dm b/code/modules/vehicles/hardpoints/primary/flamer.dm index 0b77d3671e05..929842df2307 100644 --- a/code/modules/vehicles/hardpoints/primary/flamer.dm +++ b/code/modules/vehicles/hardpoints/primary/flamer.dm @@ -51,7 +51,7 @@ var/range = get_dist(origin_turf, A) + 1 - var/obj/item/projectile/P = generate_bullet(user, origin_turf) + var/obj/projectile/P = generate_bullet(user, origin_turf) SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, range < P.ammo.max_range ? range : P.ammo.max_range, P.ammo.shell_speed) diff --git a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm index ee18443d7b7e..8151a1ee50c1 100644 --- a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm +++ b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm @@ -56,7 +56,7 @@ if(range > max_range) range = max_range - var/obj/item/projectile/P = generate_bullet(user, origin_turf) + var/obj/projectile/P = generate_bullet(user, origin_turf) SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, P.ammo.max_range, P.ammo.shell_speed) diff --git a/code/modules/vehicles/interior/areas.dm b/code/modules/vehicles/interior/areas.dm index 85ec4a319769..605b32079fcc 100644 --- a/code/modules/vehicles/interior/areas.dm +++ b/code/modules/vehicles/interior/areas.dm @@ -3,6 +3,7 @@ requires_power = 0 unlimited_power = 1 icon = 'icons/turf/areas_interiors.dmi' + base_lighting_alpha = 255 ambience_exterior = 'sound/ambience/vehicle_interior1.ogg' sound_environment = SOUND_ENVIRONMENT_ROOM diff --git a/code/modules/vehicles/interior/interactable/doors.dm b/code/modules/vehicles/interior/interactable/doors.dm index 04f0cf65aaae..12b54bd425e4 100644 --- a/code/modules/vehicles/interior/interactable/doors.dm +++ b/code/modules/vehicles/interior/interactable/doors.dm @@ -14,7 +14,7 @@ // Which entrance to exit through var/entrance_id = null -/obj/structure/interior_exit/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/interior_exit/get_projectile_hit_boolean(obj/projectile/P) return FALSE /obj/structure/interior_exit/attack_hand(mob/M) diff --git a/code/modules/vehicles/interior/interactable/vendors.dm b/code/modules/vehicles/interior/interactable/vendors.dm index 96a6f6b49c0f..6d98bc85e42e 100644 --- a/code/modules/vehicles/interior/interactable/vendors.dm +++ b/code/modules/vehicles/interior/interactable/vendors.dm @@ -48,7 +48,6 @@ /obj/item/reagent_container/hypospray/autoinjector/oxycodone, /obj/item/reagent_container/hypospray/autoinjector/tramadol, /obj/item/reagent_container/hypospray/autoinjector/tricord, - /obj/item/reagent_container/hypospray/autoinjector/emergency, /obj/item/reagent_container/hypospray/autoinjector/skillless, /obj/item/reagent_container/hypospray/autoinjector/skillless/tramadol, diff --git a/code/modules/vehicles/interior/interior_hull.dm b/code/modules/vehicles/interior/interior_hull.dm index 7e049395bdc6..70b4cb8501f1 100644 --- a/code/modules/vehicles/interior/interior_hull.dm +++ b/code/modules/vehicles/interior/interior_hull.dm @@ -18,7 +18,7 @@ unslashable = TRUE indestructible = TRUE -/obj/structure/interior_wall/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/structure/interior_wall/get_projectile_hit_boolean(obj/projectile/P) return FALSE /obj/structure/interior_wall/ex_act() @@ -41,7 +41,7 @@ alpha = 80 -/obj/effect/vehicle_roof/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/effect/vehicle_roof/get_projectile_hit_boolean(obj/projectile/P) return FALSE /obj/effect/vehicle_roof/ex_act() diff --git a/code/modules/vehicles/multitile/multitile.dm b/code/modules/vehicles/multitile/multitile.dm index 7802d9a7edbd..9e4d2c9d297b 100644 --- a/code/modules/vehicles/multitile/multitile.dm +++ b/code/modules/vehicles/multitile/multitile.dm @@ -21,6 +21,14 @@ can_buckle = FALSE + light_system = MOVABLE_LIGHT + light_range = 5 + + var/atom/movable/vehicle_light_holder/lighting_holder + + var/vehicle_light_range = 5 + var/vehicle_light_power = 2 + //Yay! Working cameras in the vehicles at last!! var/obj/structure/machinery/camera/vehicle/camera = null var/obj/structure/machinery/camera/vehicle/camera_int = null @@ -167,6 +175,17 @@ rotate_entrances(angle_to_turn) rotate_bounds(angle_to_turn) + if(bound_width > world.icon_size || bound_height > world.icon_size) + lighting_holder = new(src) + lighting_holder.set_light_range(vehicle_light_range) + lighting_holder.set_light_power(vehicle_light_power) + lighting_holder.set_light_on(vehicle_light_range || vehicle_light_power) + else if(light_range) + set_light_on(TRUE) + + light_pixel_x = -bound_x + light_pixel_y = -bound_y + healthcheck() update_icon() @@ -364,8 +383,8 @@ handle_all_modules_broken() //vehicle is dead, no more lights - if(health <= 0 && luminosity) - SetLuminosity(0) + if(health <= 0 && lighting_holder.light_range) + lighting_holder.set_light_on(FALSE) update_icon() /* @@ -421,3 +440,20 @@ /obj/vehicle/multitile/proc/handle_acidic_environment(atom/A) for(var/obj/item/hardpoint/locomotion/Loco in hardpoints) Loco.handle_acid_damage(A) + +/atom/movable/vehicle_light_holder + light_system = MOVABLE_LIGHT + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/atom/movable/vehicle_light_holder/Initialize(mapload, ...) + . = ..() + + var/atom/attached_to = loc + + forceMove(attached_to.loc) + RegisterSignal(attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(handle_parent_move)) + +/atom/movable/vehicle_light_holder/proc/handle_parent_move(atom/movable/mover, atom/oldloc, direction) + SIGNAL_HANDLER + + forceMove(get_turf(mover)) diff --git a/code/modules/vehicles/multitile/multitile_interaction.dm b/code/modules/vehicles/multitile/multitile_interaction.dm index ca2b5922ecf0..42b141327bd8 100644 --- a/code/modules/vehicles/multitile/multitile_interaction.dm +++ b/code/modules/vehicles/multitile/multitile_interaction.dm @@ -209,7 +209,7 @@ to_chat(user, SPAN_NOTICE("Hull integrity is at [SPAN_HELPFUL(100.0*health/max_hp)]%.")) health = initial(health) - SetLuminosity(initial(luminosity)) + lighting_holder.set_light_range(vehicle_light_range) toggle_cameras_status(TRUE) update_icon() user.visible_message(SPAN_NOTICE("[user] finishes [repair_message] on \the [src]."), SPAN_NOTICE("You finish [repair_message] on \the [src]. Hull integrity is at [SPAN_HELPFUL(100.0*health/max_hp)]%. ")) @@ -283,7 +283,7 @@ //Differentiates between damage types from different bullets //Applies a linear transformation to bullet damage that will generally decrease damage done -/obj/vehicle/multitile/bullet_act(obj/item/projectile/P) +/obj/vehicle/multitile/bullet_act(obj/projectile/P) var/dam_type = "bullet" var/damage = P.damage var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags @@ -295,7 +295,7 @@ if(P.runtime_iff_group && get_target_lock(P.runtime_iff_group)) return - if(ammo_flags & AMMO_ANTISTRUCT) + if(ammo_flags & AMMO_ANTISTRUCT|AMMO_ANTIVEHICLE) // Multiplier based on tank railgun relationship, so might have to reconsider multiplier for AMMO_SIEGE in general damage = round(damage*ANTISTRUCT_DMG_MULT_TANK) if(ammo_flags & AMMO_ACIDIC) diff --git a/code/modules/vehicles/powerloader.dm b/code/modules/vehicles/powerloader.dm index 11beaf597985..6992269c7566 100644 --- a/code/modules/vehicles/powerloader.dm +++ b/code/modules/vehicles/powerloader.dm @@ -6,7 +6,7 @@ layer = POWERLOADER_LAYER //so the top appears above windows and wall mounts anchored = TRUE density = TRUE - luminosity = 5 + light_range = 5 move_delay = 8 buckling_y = 9 health = 200 @@ -338,6 +338,29 @@ opacity = FALSE pixel_x = -18 pixel_y = -5 + health = 100 + +/obj/structure/powerloader_wreckage/attack_alien(mob/living/carbon/xenomorph/attacking_xeno) + if(attacking_xeno.a_intent == INTENT_HELP) + return XENO_NO_DELAY_ACTION + + if(attacking_xeno.mob_size < MOB_SIZE_XENO) + to_chat(attacking_xeno, SPAN_XENOWARNING("You're too small to do any significant damage to this vehicle!")) + return XENO_NO_DELAY_ACTION + + attacking_xeno.animation_attack_on(src) + + attacking_xeno.visible_message(SPAN_DANGER("[attacking_xeno] slashes [src]!"), SPAN_DANGER("You slash [src]!")) + playsound(attacking_xeno, pick('sound/effects/metalhit.ogg', 'sound/weapons/alien_claw_metal1.ogg', 'sound/weapons/alien_claw_metal2.ogg', 'sound/weapons/alien_claw_metal3.ogg'), 25, 1) + + var/damage = (attacking_xeno.melee_vehicle_damage + rand(-5,5)) + + health -= damage + + if(health <= 0) + deconstruct(FALSE) + + return XENO_NONCOMBAT_ACTION /obj/structure/powerloader_wreckage/jd name = "\improper John Deere 4300 Power Loader wreckage" diff --git a/code/modules/vehicles/tank/tank.dm b/code/modules/vehicles/tank/tank.dm index 3ed4e6623ea1..ad69f80cdfb6 100644 --- a/code/modules/vehicles/tank/tank.dm +++ b/code/modules/vehicles/tank/tank.dm @@ -36,7 +36,7 @@ move_momentum_build_factor = 1.8 move_turn_momentum_loss_factor = 0.6 - luminosity = 7 + vehicle_light_range = 7 // Rest (all the guns) is handled by the tank turret hardpoint hardpoints_allowed = list( diff --git a/code/modules/vehicles/van/van.dm b/code/modules/vehicles/van/van.dm index 5e9e467bf56d..fdb2f397bb2e 100644 --- a/code/modules/vehicles/van/van.dm +++ b/code/modules/vehicles/van/van.dm @@ -41,7 +41,7 @@ movement_sound = 'sound/vehicles/tank_driving.ogg' honk_sound = 'sound/vehicles/honk_2_truck.ogg' - luminosity = 8 + vehicle_light_range = 8 move_max_momentum = 3 @@ -218,7 +218,7 @@ /obj/vehicle/multitile/van/proc/reset_overdrive() misc_multipliers["move"] += overdrive_speed_mult -/obj/vehicle/multitile/van/get_projectile_hit_boolean(obj/item/projectile/P) +/obj/vehicle/multitile/van/get_projectile_hit_boolean(obj/projectile/P) if(src == P.original) //clicking on the van itself will hit it. var/hitchance = P.get_effective_accuracy() if(prob(hitchance)) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 0681b7df05ac..5192a6834050 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -5,7 +5,6 @@ density = TRUE anchored = TRUE animate_movement = 1 - luminosity = 2 can_buckle = TRUE // The mobs that are in each position/seat of the vehicle @@ -99,7 +98,7 @@ new /obj/effect/decal/cleanable/blood/oil(src.loc) healthcheck() -/obj/vehicle/bullet_act(obj/item/projectile/P) +/obj/vehicle/bullet_act(obj/projectile/P) var/damage = P.damage health -= damage ..() @@ -166,13 +165,13 @@ if(powered && cell.charge < charge_use) return 0 on = 1 - SetLuminosity(initial(luminosity)) + set_light(initial(light_range)) update_icon() return 1 /obj/vehicle/proc/turn_off() on = 0 - SetLuminosity(0) + set_light(0) update_icon() /obj/vehicle/proc/explode() @@ -262,10 +261,6 @@ . = ..() seats[VEHICLE_DRIVER] = null -/obj/vehicle/Destroy() - SetLuminosity(0) - . = ..() - //------------------------------------------------------- // Stat update procs //------------------------------------------------------- diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 8e1ce4069b10..ab74dc547cfa 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -63,6 +63,7 @@ em {font-style: normal; font-weight: bold;} .echoradio {color: #3EB489;} .cryoradio {color: #4a4740;} .hcradio {color: #318779;} +.pvstradio {color: #9b0612;} .medium { font-size: 2} .big { font-size: 2} diff --git a/colonialmarines.dme b/colonialmarines.dme index 43a250b7b091..5ac3a8e32d66 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1,6 +1,6 @@ -// DM Environment file for colonialmarines.dme. +s// 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. +// New source code should be placed in .dm files: choose File/New --> Code File. // BEGIN_INTERNALS // END_INTERNALS // BEGIN_FILE_DIR @@ -152,6 +152,7 @@ #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\job.dm" #include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\lighting.dm" #include "code\__HELPERS\lists.dm" #include "code\__HELPERS\logging.dm" #include "code\__HELPERS\matrices.dm" @@ -209,7 +210,6 @@ #include "code\_onclick\hud\rendering\plane_master.dm" #include "code\_onclick\hud\rendering\plane_master_controller.dm" #include "code\_onclick\hud\rendering\render_plate.dm" -#include "code\controllers\_DynamicAreaLighting_TG.dm" #include "code\controllers\shuttle_controller.dm" #include "code\controllers\topic.dm" #include "code\controllers\configuration\config_entry.dm" @@ -369,6 +369,7 @@ #include "code\datums\components\id_lock.dm" #include "code\datums\components\label.dm" #include "code\datums\components\orbiter.dm" +#include "code\datums\components\overlay_lighting.dm" #include "code\datums\components\rename.dm" #include "code\datums\components\speed_modifier.dm" #include "code\datums\components\toxin_buildup.dm" @@ -440,6 +441,7 @@ #include "code\datums\elements\_element.dm" #include "code\datums\elements\bloody_feet.dm" #include "code\datums\elements\drop_retrieval.dm" +#include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\mouth_drop_item.dm" #include "code\datums\elements\poor_eyesight_correction.dm" #include "code\datums\elements\suturing.dm" @@ -448,7 +450,8 @@ #include "code\datums\elements\bullet_trait\iff.dm" #include "code\datums\elements\bullet_trait\ignored_range.dm" #include "code\datums\elements\bullet_trait\incendiary.dm" -#include "code\datums\elements\bullet_trait\penetrating.dm" +#include "code\datums\elements\bullet_trait\penetrating\heavy.dm" +#include "code\datums\elements\bullet_trait\penetrating\penetrating.dm" #include "code\datums\elements\traitbound\_traitbound.dm" #include "code\datums\elements\traitbound\crawler.dm" #include "code\datums\elements\traitbound\gun_silenced.dm" @@ -460,6 +463,7 @@ #include "code\datums\emergency_calls\contractor.dm" #include "code\datums\emergency_calls\cryo_marines.dm" #include "code\datums\emergency_calls\cryo_marines_heavy.dm" +#include "code\datums\emergency_calls\cryo_spec.dm" #include "code\datums\emergency_calls\custom.dm" #include "code\datums\emergency_calls\deathsquad.dm" #include "code\datums\emergency_calls\deus_vult.dm" @@ -476,6 +480,7 @@ #include "code\datums\emergency_calls\pmc.dm" #include "code\datums\emergency_calls\provost.dm" #include "code\datums\emergency_calls\riot.dm" +#include "code\datums\emergency_calls\royal_marines.dm" #include "code\datums\emergency_calls\souto.dm" #include "code\datums\emergency_calls\supplies.dm" #include "code\datums\emergency_calls\tank_crew.dm" @@ -509,6 +514,7 @@ #include "code\datums\factions\faction.dm" #include "code\datums\factions\helpers.dm" #include "code\datums\factions\pmc.dm" +#include "code\datums\factions\royalmarinescommando.dm" #include "code\datums\factions\upp.dm" #include "code\datums\factions\uscm.dm" #include "code\datums\helper_datums\getrev.dm" @@ -1018,6 +1024,7 @@ #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\helmet_visors.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\motion_detector.dm" @@ -1034,6 +1041,7 @@ #include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\teleportation.dm" #include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\vulture_spotter.dm" #include "code\game\objects\items\devices\walkman.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" @@ -1205,6 +1213,7 @@ #include "code\game\objects\structures\surface.dm" #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\vulture_spotter.dm" #include "code\game\objects\structures\watercloset.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" @@ -1577,6 +1586,7 @@ #include "code\modules\cm_tech\techs\abstract\transitory.dm" #include "code\modules\cm_tech\techs\marine\tier1\points.dm" #include "code\modules\cm_tech\techs\marine\tier2\orbital_ammo.dm" +#include "code\modules\cm_tech\techs\marine\tier3\cryo_spec.dm" #include "code\modules\cm_tech\techs\marine\tier3\cryorine.dm" #include "code\modules\cm_tech\techs\marine\tier4\nuke.dm" #include "code\modules\cm_tech\trees\marine.dm" @@ -1652,6 +1662,7 @@ #include "code\modules\gear_presets\fun.dm" #include "code\modules\gear_presets\other.dm" #include "code\modules\gear_presets\pmc.dm" +#include "code\modules\gear_presets\royal_marines.dm" #include "code\modules\gear_presets\survivors.dm" #include "code\modules\gear_presets\synths.dm" #include "code\modules\gear_presets\upp.dm" @@ -1686,6 +1697,21 @@ #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\lighting\emissive_blocker.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\lighting\lighting_mask\dynamic_lighting_source.dm" +#include "code\modules\lighting\lighting_mask\lighting_mask.dm" +#include "code\modules\lighting\lighting_mask\lighting_mask_holder.dm" +#include "code\modules\lighting\lighting_mask\shadow_calculator.dm" +#include "code\modules\lighting\lighting_static\static_lighting_area.dm" +#include "code\modules\lighting\lighting_static\static_lighting_atom.dm" +#include "code\modules\lighting\lighting_static\static_lighting_corner.dm" +#include "code\modules\lighting\lighting_static\static_lighting_object.dm" +#include "code\modules\lighting\lighting_static\static_lighting_setup.dm" +#include "code\modules\lighting\lighting_static\static_lighting_source.dm" +#include "code\modules\lighting\lighting_static\static_lighting_turf.dm" #include "code\modules\logging\global_logs.dm" #include "code\modules\logging\log_category.dm" #include "code\modules\logging\log_holder.dm" @@ -2092,6 +2118,7 @@ #include "code\modules\projectiles\ammo_boxes\round_boxes.dm" #include "code\modules\projectiles\guns\boltaction.dm" #include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\flare_gun.dm" #include "code\modules\projectiles\guns\lever_action.dm" #include "code\modules\projectiles\guns\misc.dm" #include "code\modules\projectiles\guns\pistols.dm" @@ -2160,9 +2187,9 @@ #include "code\modules\security_levels\security_levels.dm" #include "code\modules\shuttle\computer.dm" #include "code\modules\shuttle\docking.dm" +#include "code\modules\shuttle\dropship.dm" #include "code\modules\shuttle\dropship_hijack.dm" #include "code\modules\shuttle\helpers.dm" -#include "code\modules\shuttle\lifeboats.dm" #include "code\modules\shuttle\on_move.dm" #include "code\modules\shuttle\ripple.dm" #include "code\modules\shuttle\shuttle.dm" @@ -2173,8 +2200,10 @@ #include "code\modules\shuttle\computers\trijent_elevator_control.dm" #include "code\modules\shuttle\shuttles\dropship.dm" #include "code\modules\shuttle\shuttles\ert.dm" -#include "code\modules\shuttle\shuttles\escape_shuttle.dm" #include "code\modules\shuttle\shuttles\trijent_elevator.dm" +#include "code\modules\shuttle\shuttles\crashable\crashable.dm" +#include "code\modules\shuttle\shuttles\crashable\escape_shuttle.dm" +#include "code\modules\shuttle\shuttles\crashable\lifeboats.dm" #include "code\modules\shuttles\marine_ferry.dm" #include "code\modules\shuttles\monorail_console.dm" #include "code\modules\shuttles\shuttle.dm" diff --git a/html/changelogs/AutoChangeLog-pr-4111.yml b/html/changelogs/AutoChangeLog-pr-4111.yml new file mode 100644 index 000000000000..7d6a5f024ee7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4111.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Finally adds fully functional access request tickets to APOLLO console for entry to AI core." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4208.yml b/html/changelogs/AutoChangeLog-pr-4208.yml new file mode 100644 index 000000000000..f27bd9ca4a91 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4208.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - maptweak: "Adds a couple APOLLO consoles to upper and lower medical. Moves the one outside ARES reception slightly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4225.yml b/html/changelogs/AutoChangeLog-pr-4225.yml new file mode 100644 index 000000000000..dec1d322ec9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4225.yml @@ -0,0 +1,7 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Fixes ARES Security Logs and stops ARES logs recording mob datums instead of names." + - rscadd: "Moves AntiAir records to Security Logs." + - rscadd: "Adds Flight Records to ARES Interface, detailing launches and setting changes. Does not include CAS details." + - code_imp: "Changes ARES log procs from using 'user' to 'user_name' to identify it should be the string rather than mob datum." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4304.yml b/html/changelogs/AutoChangeLog-pr-4304.yml new file mode 100644 index 000000000000..6781eac2c3ac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4304.yml @@ -0,0 +1,4 @@ +author: "cuberound" +delete-after: True +changes: + - balance: "GAU can hit mobs that are on ground now" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4350.yml b/html/changelogs/AutoChangeLog-pr-4350.yml new file mode 100644 index 000000000000..4780d592b9da --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4350.yml @@ -0,0 +1,7 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Adds CN20-X Nerve Gas, an alteration of base CN20 that can affect xenos." + - rscadd: "CN20 and CN20-X are now translucent and do not obstruct vision much." + - admin: "Adds a VV list dropdown to release gas from vents as the manual proc was too clunky." + - rscadd: "Adds nerve gas grenades for CN20 and CN20-X" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4352.yml b/html/changelogs/AutoChangeLog-pr-4352.yml new file mode 100644 index 000000000000..17a65c454e91 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4352.yml @@ -0,0 +1,5 @@ +author: "Morrow" +delete-after: True +changes: + - balance: "Cryorines now cost 6 points. It increases by 6 each purchase." + - balance: "Cryorines now give 5 marines. 1 SL (for the first one only), 1 medic, 1 engi, rest rifleman." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4353.yml b/html/changelogs/AutoChangeLog-pr-4353.yml new file mode 100644 index 000000000000..13aa7a1a9f81 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4353.yml @@ -0,0 +1,6 @@ +author: "Morrow" +delete-after: True +changes: + - balance: "Lowered the xeno endgame start to 55 minutes into the round" + - balance: "Lowered the nuke endgame start to 115 minutes into the round" + - balance: "Lowered the nuke cost to 5 points" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4354.yml b/html/changelogs/AutoChangeLog-pr-4354.yml new file mode 100644 index 000000000000..eaed52c4651c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4354.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - rscadd: "Added cryo specialist tech that can be purchased once for eight points" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4356.yml b/html/changelogs/AutoChangeLog-pr-4356.yml new file mode 100644 index 000000000000..36c53f8811d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4356.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - bugfix: "Fixed repeatable techs not having correct overlays" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4358.yml b/html/changelogs/AutoChangeLog-pr-4358.yml new file mode 100644 index 000000000000..d83bf6aef916 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4358.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - bugfix: "Removed annoying and inaccurate to_chat from join response team menu" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4360.yml b/html/changelogs/AutoChangeLog-pr-4360.yml new file mode 100644 index 000000000000..01a6ceb93414 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4360.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - bugfix: "Firing flares into the air now produces light again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4367.yml b/html/changelogs/AutoChangeLog-pr-4367.yml new file mode 100644 index 000000000000..6493aa6ffc4d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4367.yml @@ -0,0 +1,13 @@ +author: "realforest2001" +delete-after: True +changes: + - code_imp: "Tidied up the TWE presets so they're easier to read." + - rscdel: "Removed duplicate surgical line from all TWE presets." + - rscadd: "Added an MRE box to the TWE MRE carrier preset." + - spellcheck: "Added unique names to the RMC armors." + - bugfix: "Fixed iconstate names being backwards for TWE pointman and SG." + - code_imp: "Removed unnecessary repeated values for TWE armors." + - code_imp: "Tidied the RMC skillsets to be consistent in ordering of skills." + - rscadd: "Added an SG specific skillset for RMCs." + - bugfix: "Fixed duplicate entry for medical training on RMC TL skillset." + - spellcheck: "Renamed default RMC skillset to Royal Marines Commando rather than Royal Marines Commando Rifleman." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4371.yml b/html/changelogs/AutoChangeLog-pr-4371.yml new file mode 100644 index 000000000000..34e18a5e8e4f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4371.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - rscadd: "Powerloader wreckage now can be attacked by xenos" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4372.yml b/html/changelogs/AutoChangeLog-pr-4372.yml new file mode 100644 index 000000000000..e452bf1ee5b0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4372.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - qol: "Recalibrating limbs can now be done with the patient standing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4373.yml b/html/changelogs/AutoChangeLog-pr-4373.yml new file mode 100644 index 000000000000..a2d3ba29c53d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4373.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - rscdel: "Removed the shipside announcement for working joes joining" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4374.yml b/html/changelogs/AutoChangeLog-pr-4374.yml new file mode 100644 index 000000000000..1722b22bbf56 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4374.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - bugfix: "Fixed queens prying open lifeboat double doors" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4381.yml b/html/changelogs/AutoChangeLog-pr-4381.yml new file mode 100644 index 000000000000..fe2c3cca9231 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4381.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Fixes WY access to Almayer Research." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4384.yml b/html/changelogs/AutoChangeLog-pr-4384.yml new file mode 100644 index 000000000000..f1998657fa3a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4384.yml @@ -0,0 +1,4 @@ +author: "Waseemq1235" +delete-after: True +changes: + - admin: "Subtle messages are now much larger." \ No newline at end of file diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml index cab80e30cf19..e8c44d82dbde 100644 --- a/html/changelogs/archive/2023-08.yml +++ b/html/changelogs/archive/2023-08.yml @@ -326,12 +326,10 @@ - balance: M4RA damage buffed by 10% Zonespace27: - balance: The M41A, M41Amk1, m39, m46c (iff off), mar-30/40/60, type 71, laser - uzi, and every SMG now has automatic fire. To compensate for the ability to - re-aim (unlike burst), the guns fire 20% slower while automatic. This does not - apply to already-existing automatic weaponry. + uzi, and every SMG now has automatic fire. - balance: The HPR can now fire in full auto when bipodded. - bugfix: Adding/removing attachments now keeps the current firemode, if possible. - - bugfix: The dualtube and spec sniper now can switch tubes/toggle laser again + - bugfix: The dualtube and spec sniper now can switch tubes/toggle laser again. - bugfix: Fixed a long-standing exploit with bipods and scopes. - bugfix: Fixed guns jamming when shooting UI elements. - bugfix: Fixed a bunch of guns unintentionally having burst. @@ -346,3 +344,159 @@ realforest2001: - rscadd: Added a new lockdown system to research. - rscadd: Added an admin button to interact with above. +2023-08-26: + CapCamIII: + - rscadd: Adds 6(8 if you're pedantic) new guns for the UPP, details for each in + following lines. + - rscadd: Type 19, Replacement for PPsh on colonies and black market. + - rscadd: Type 64, replacement for scorpion, full sized SMG, 2 versions, 1 for upp, + 1 for not upp + - rscadd: HJRA-12, RPG for UPP. + - rscadd: Type 73, pistol for higher ranked UPP troops, UPP COs get a Type 74 which + has high-impact rounds, replaces PK9 in non-UPP use. + - rscadd: NP92, pistol, replaces PK9 in UPP use(mostly), integrally suppressed version + called NPZ92 for UPP Commandos. + - rscadd: QYJ-72, UPP GPMG, replaces minigun with UPP Minigunners + - rscadd: Technically resprites but due to changes closer to replaces N-Y revolver + with ZHNK-72 + - rscadd: Adds a character custom loadout Type 73, 2 mags spare. + - rscadd: UPP helmets now work as ear protection, intended use with HJRA-12 RPG + - rscadd: UPP officers now have regular UM4 helmets instead of UH7 helmets in their + vendors as UH7 looked ugly with their combat gear + - rscdel: Removes the PK9 entirely + - rscdel: Removes tranqs from UPP Commando loadout + - rscdel: Removes HEAP ammo from UPP officers and commandos, replaced with normal + and AP mags when applicable + - balance: UPP jackets no longer have massive armor, in exchange they no longer + slow and in clothing vendors a light version of UPP armor is vendable + - balance: UPP MPs are now armed with a ZHNK-72 belt on their jacket, with an additional + shrapnelshot loader in their belt. + - balance: Rebalances Type 71 damage/firerate/AP to be a sidegrade of M41A, about + equal DPS, higher damage per shot and AP, lower fire rate, carbine is round-about + the exact same as M41A however. + - balance: Fixes UPP support armor, given to medics on their person and officers + in their vendor, lighter version of UPP armor, exchanges protection for speed. + - balance: Seperates SVD bullet damage from crude rifle bullet and buffs it as a + hard-hitting AP bullet. + - balance: Rebalances UPP revolver(now ZHNK-72), much harder hitting and has higher + AP, but rarer, shrapnelshot extremely rare and good. + - balance: Due to ammo changes, SVD no longer has burst. + - balance: Removes ceramic plates from UPP loadouts + - bugfix: UPP Major now has the correct UPP Commander skillset + - bugfix: UPP Commander skillset can BE + - bugfix: Fixes typepath for UPP support/light armor, actually works now. + - spellcheck: Renames SVD to Type 88 + - spellcheck: Renames UPP Minigunner to UPP Machinegunner + - spellcheck: Renames UPP jackets to UL4 all around + - soundadd: Adds firing sounds for Type 73 and SVD/UPP MG + - imageadd: Resprites the SVD, Type 71, and Type 23, all sprites by wei/esselnek + - imageadd: Adds sprites for all above guns, all sprites by wei/esselnek + - maptweak: Changes instances of skorpion to non-upp type 64, also changes instances + of ppsh to type 19 + Diegoflores31: + - balance: Masterkey and underbarrel extinguisher now must be wielded in order to + be used. + - bugfix: Underbarrel extinguisher no longer bypass wielding restrictions on flamers. + Morrow: + - balance: You now lose nutrition when gaining blood rather than losing a ton of + nutrition when you have low effective blood + Morrow, Frans_Feiffer (beautiful sprites): + - rscadd: Added in built HUDs to various helmets + - rscadd: Sensormates used by squads without medical skills have been converted + to buyable helmet optics + realforest2001: + - code_imp: Changed backend for the message of walking into an invisible wall to + reduce duplication. + - rscadd: Telephones can now receive calls from multiple networks. + - rscadd: Adds UPP, CLF and WY prefab phones. + - bugfix: UPP RTO pack is now titled UPP rather than USCM +2023-08-27: + AnuvKH: + - maptweak: Fixed deep ocean around NV monsoon, removed incend ammo. + Diegoflores31: + - bugfix: Glasses with flash protection can no longer be used for welding. + - refactor: Adds defines for negative welding protection. + Morrow: + - bugfix: fixed a bypass to allow ghost scan health when it should not be allowed + cuberound: + - rscadd: UPP SL gets proper bag with mini fire extinguisher three WP grenades , + two snacks and an AP mag + harryob: + - bugfix: whispering no longer uses the old speech bubble +2023-08-29: + CapCamIII: + - bugfix: actually fixes m4ra custom barrel offset + MikeKuwait: + - bugfix: Plants should not grow every time it's sampled + - bugfix: Camera console should now close if you step away from it + - bugfix: teleporting canister pouch to chemical dispenser + Morrow: + - bugfix: Fixed pointblanks + - bugfix: Fixed western medbay door buttons + Steelpoint: + - rscadd: IO's and FTL's can now purchase a 'welding visor' from their vendor. This + visor grants whichever helmet it is attached with the ability to flip a protective + visor that prevents the user's eyes from taking damage while welding. + - balance: The M12 Helmet, normally used by FTL's and USCM Officers, can mount two + visors at once, instead of only one. + TiviPlus, A-lexa, SyncIt21, Azarak, harryob, MorrowWolf, Zonespace: + - rscadd: shadows are now in the game, and light follows you. + Xufysz: + - bugfix: Fixes admin training dummy interaction distance + - bugfix: Fixes the kitchen soda fountain being wrenchable. + realforest2001: + - bugfix: Fixes UPP/CLF access to antag vendors. + - rscadd: Adds faction specific accesses to TWE and UPP representatives. + - rscdel: Removes pirate access from Press and Corp. Liaison. + - bugfix: Areas around LZs (particularly on Sorokyne) are now unweedable as intended. + - code_imp: Moved the Request ERT message to a proc to reduce duplication. + - admin: Added a detail in ERT request to indicate if a RANDOM ERT was granted by + staff already or not. This will not work for manual specific chosen ERTs. +2023-08-30: + Ben10083: + - qol: General Quarters via ARES can now be called regardless of alert level. + Huffie56: + - bugfix: give back marksman ammo to MP's because i remove it in a previous PR by + mistake + JackieEstegado: + - bugfix: Most 'light' vines on LV are no longer invisible. + Morrow: + - rscadd: Added 3 to hypospray transfer amount option + TheGamerdk: + - refactor: Refactors the overwatch console in TGUI +2023-08-31: + Huffie56: + - rscadd: Add roller bed, mini extinguisher and multi-tool to the utility vendor + in small quantity. + - balance: divide by two the number of "ME3 hand welder" in utility vendor. + - bugfix: remove a duplicate item being sell the flashlight. + - bugfix: some clothing items have a minimum of one now. + Morrow: + - rscadd: Allowed lesser drones to spawn at pylons and core. + - rscadd: Created a pool of lesser drones at cores and pylons that regenerate over + time. It takes about 10 seconds to get one more when queen is on ovi and about + 120 seconds when queen is off. + - balance: Lesser drones and facehuggers no longer count towards the lesser drone + count but lesser drones are still capped at 1/3rd of the hive with a minimum + of 3. + - balance: Facehuggers have also been changed to not count lesser drones and themselves + for max calculations. + - bugfix: Fixed dropship hijack offset + QuickLode: + - bugfix: PMC Survivors now can use WY Comms. + Segrain: + - bugfix: CL's lockbox can be properly opened once again. + Steelpoint: + - balance: Large amount of balance changes to UPP survivors on Trijent. New spawn + setup guarantee's you'll get 1 Medic and 1 Engineer. + - balance: UPP survivors now have access to HUD icons for squad roles, and access + to the UPP communications channel if the colony communications is repaired. + - balance: UPP surv SL's and Specialists can now drive vehicles. + - balance: A second, crashed, UPP dropship can be found somewhere on Trijent if + the UPP survivors spawn. It contains extra supplies and stronger firearms. But + requires a detour to find. + Tkdrg, many TG contributors: + - rscadd: dchat notifications now have a better interface + harryob: + - bugfix: vehicles no longer have two lights + - bugfix: vehicles are now properly bright inside diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml new file mode 100644 index 000000000000..750ae67a264e --- /dev/null +++ b/html/changelogs/archive/2023-09.yml @@ -0,0 +1,134 @@ +2023-09-01: + ClairionCM: + - bugfix: Fixes an infinite flare bug + Huffie56: + - refactor: clean dmi file extract sprite hidden inside other sprites direction. + removing sprite change from dmm files. + - bugfix: fix seing decimal in clothing vendor surplus. + - mapadd: adding an an access to the exterior side of each lifeboats. + JackieEstegado: + - qol: Added in-hand activation for machetes, which will cause one to start cutting + vines and grass on the tile directly in-front. + Morrow: + - bugfix: Fixed lesser drone counts on pylons/cores + Private Tristan: + - qol: Researchers now spawn with reagent scanner goggles. + Steelpoint: + - bugfix: UPP survivors no longer have a small chance to accidently spawn with no + armour or external webbing. + - maptweak: Hidden floor safe in LV-624 is now positioned correctly. + harryob: + - rscdel: removed the hallucinating ghost notification +2023-09-02: + BeagleGaming1: + - code_imp: changed camouflage from map definitions to JSON + realforest2001: + - rscadd: Added a Provost radio & channel. + - qol: Changed High Command radio to have most channels off by default. + - rscdel: Removed ignore_z from High Command radios. +2023-09-03: + Katskan: + - balance: Merged vision toggle options between ship and colony synthetic types. + - balance: Removed 15 points from WY experimental tool vendor coin redemption + Morrow: + - bugfix: Fixed most of the camo items being clown gear + realforest2001: + - rscadd: Added a preference for using the old legacy yautja armor, only accessible + to the people who had the special gear. + - bugfix: Fixed the old Yautja Legacy armor selection code. Removed the unique titles + from the legacy gear however. + - imageadd: Changed the Yautja relay beacon sprite to a newer unused sprite. Changed + iconstate name of health scanner for preds from tracker to scanner. + - imageadd: Moved some of the used sprites out of the unused category in pred_gear.dmi. + - imagedel: Deleted old relay beacon sprite, deleted duplicate plasma pistol and + thwei sprites. +2023-09-04: + Morrow: + - bugfix: Peri now works for brain damage + - bugfix: Brain damage movement will no longer occur while buckled and unconscious + Steelpoint: + - spellcheck: Box of donuts order from req is now spelt correctly +2023-09-05: + Ben10083: + - admin: New toggleable flag added to bypass restrictions for Working Joe spawns + as observer (excluding whitelist requirement) + Morrow: + - bugfix: Fixed perma helmet HUDs + Steelpoint: + - rscadd: Synthetic vendors now have the option to vend several helmets and a riot + visor. Including a standard M10 helmet defaulted to non-camo grey. + VileBeggar: + - balance: The M39 foldable stock no longer inflicts debuffs when folded. + Zonespace27: + - bugfix: Working Joes no longer get cryo self defense kits + - bugfix: Cryo self defense kits now have the correct amount of slots +2023-09-06: + Birdtalon: + - bugfix: fixed eggsac carrier strain not updating hugger sprites. + Drathek: + - bugfix: Fixed xeno grab intent + Morrow: + - rscadd: Added a ghost notification for Acid Runner For the Hive! ability. + RenaRenaRe: + - bugfix: Hugger and Lesser Drone ghosts now actually bypass time of death checks + for the larva queue. +2023-09-07: + Morrow: + - bugfix: Fixed a null reference when firing full auto and dropping your weapon + Steelpoint: + - bugfix: ERT UPP Soldiers will now correctly spawn with firearms. + harryob: + - rscadd: guns that have full auto now start on full auto by default +2023-09-09: + BeagleGaming1: + - bugfix: The APS property works correctly again + Morrow: + - bugfix: Clusters turning into pylons expand properly + - rscadd: Added the ability to early launch lifeboats + - rscadd: Added the ability for lifeboats to crash if early launched + - rscdel: Removed alcohol from emergency wall cabinets + - bugfix: Should stop crashing shuttles from landing on each other + Triiodine, Frans, Warfan, SpartanBobby, Twomper, Roboticpotato, Tophat Penguin,forest2001: + - rscadd: Added Royal Marines commando ERT and faction + - rscadd: Updates Riot shield sprite, adds metal shield as well (sprites from trio) + - rscadd: TWE ERT station + - rscadd: F903 Rifle, Royal marines commando armour sets, new smartgun with holotargetting + rounds for royal marines commando + - rscadd: Calico shotgun, pistol and SMG sprites to the codebase made by Triodine + - rscadd: royal marines commando HEDP and HIDP grenades + Zonepace, Thwomper: + - rscadd: Added the M707 "Vulture" anti-materiel rifle. Not currently player-obtainable. + Credit to Tophat and Kaga for the lore description. +2023-09-10: + BeagleGaming1: + - rscdel: Removes emergency autoinjectors from squad medics + - rscdel: Removes skillless variant of the emergency autoinjector, makes default + variant skillless + - balance: Emergency autoinjectors cannot be refilled + - balance: Replaces skillless autoinjectors in marine pouches with standard autoinjectors + Morrow: + - rscadd: Added CAS Fire Mission ghost notification + QuickLode: + - bugfix: Fixes WY comms for survivor WY roles. + Steelpoint: + - maptweak: Fixed broken disposal piping in research resulting in items being dumped + back into research. + - rscadd: A new skill has been added, the 'Overwatch' skill, allows the user to + use the overwatch console. + - rscadd: All USCM Officers can now use overwatch consoles. + TeDGamer: + - balance: Huggers and larvas are slightly harder to hit + - code_imp: Replace some w_class magic numbers with defines + - balance: Reduced M2C accuracy to be more in line with realistic accuracy intent + Warfan1815, AmoryBlaine (Sprites): + - rscadd: Changes donor Biolock's medium medic armour to a light custom paintjob + armour and donor Tristan's reactive scientist armour to a custom marine armour + harryob: + - bugfix: fixes the JMP link in chat + ihatethisengine: + - rscadd: On-screen messages now appear with sound. Radio static for marines, distant + roar for xenos. + - bugfix: shuttles now throw mobs asynchronously and faster + kylerace, lemoninthedark, harry: + - refactor: optimized icon-in-chat code + - bugfix: weird icons on the smoothed walls when examining or alt+clicking diff --git a/icons/effects/alphacolors.dmi b/icons/effects/alphacolors.dmi index 02316fbf64de..6bb903862ca0 100644 Binary files a/icons/effects/alphacolors.dmi and b/icons/effects/alphacolors.dmi differ diff --git a/icons/effects/light_overlays/light_128.dmi b/icons/effects/light_overlays/light_128.dmi new file mode 100644 index 000000000000..22dc0b010870 Binary files /dev/null and b/icons/effects/light_overlays/light_128.dmi differ diff --git a/icons/effects/light_overlays/light_160.dmi b/icons/effects/light_overlays/light_160.dmi new file mode 100644 index 000000000000..26dfa453c516 Binary files /dev/null and b/icons/effects/light_overlays/light_160.dmi differ diff --git a/icons/effects/light_overlays/light_192.dmi b/icons/effects/light_overlays/light_192.dmi new file mode 100644 index 000000000000..aca94ee0caf5 Binary files /dev/null and b/icons/effects/light_overlays/light_192.dmi differ diff --git a/icons/effects/light_overlays/light_224.dmi b/icons/effects/light_overlays/light_224.dmi new file mode 100644 index 000000000000..9fab531d1a69 Binary files /dev/null and b/icons/effects/light_overlays/light_224.dmi differ diff --git a/icons/effects/light_overlays/light_256.dmi b/icons/effects/light_overlays/light_256.dmi new file mode 100644 index 000000000000..701562efcd8f Binary files /dev/null and b/icons/effects/light_overlays/light_256.dmi differ diff --git a/icons/effects/light_overlays/light_288.dmi b/icons/effects/light_overlays/light_288.dmi new file mode 100644 index 000000000000..b6eac180f7aa Binary files /dev/null and b/icons/effects/light_overlays/light_288.dmi differ diff --git a/icons/effects/light_overlays/light_32.dmi b/icons/effects/light_overlays/light_32.dmi new file mode 100644 index 000000000000..5269b1fba36d Binary files /dev/null and b/icons/effects/light_overlays/light_32.dmi differ diff --git a/icons/effects/light_overlays/light_320.dmi b/icons/effects/light_overlays/light_320.dmi new file mode 100644 index 000000000000..bf263c4b29be Binary files /dev/null and b/icons/effects/light_overlays/light_320.dmi differ diff --git a/icons/effects/light_overlays/light_352.dmi b/icons/effects/light_overlays/light_352.dmi new file mode 100644 index 000000000000..f895792da42d Binary files /dev/null and b/icons/effects/light_overlays/light_352.dmi differ diff --git a/icons/effects/light_overlays/light_384.dmi b/icons/effects/light_overlays/light_384.dmi new file mode 100644 index 000000000000..ef2a4c97e047 Binary files /dev/null and b/icons/effects/light_overlays/light_384.dmi differ diff --git a/icons/effects/light_overlays/light_416.dmi b/icons/effects/light_overlays/light_416.dmi new file mode 100644 index 000000000000..6a32ecbda661 Binary files /dev/null and b/icons/effects/light_overlays/light_416.dmi differ diff --git a/icons/effects/light_overlays/light_64.dmi b/icons/effects/light_overlays/light_64.dmi new file mode 100644 index 000000000000..37fc5084abcf Binary files /dev/null and b/icons/effects/light_overlays/light_64.dmi differ diff --git a/icons/effects/light_overlays/light_96.dmi b/icons/effects/light_overlays/light_96.dmi new file mode 100644 index 000000000000..b689a1370163 Binary files /dev/null and b/icons/effects/light_overlays/light_96.dmi differ diff --git a/icons/effects/light_overlays/light_cone.dmi b/icons/effects/light_overlays/light_cone.dmi new file mode 100644 index 000000000000..75f322a93717 Binary files /dev/null and b/icons/effects/light_overlays/light_cone.dmi differ diff --git a/icons/effects/light_overlays/shockwave.dmi b/icons/effects/light_overlays/shockwave.dmi new file mode 100644 index 000000000000..c22acfa1d59e Binary files /dev/null and b/icons/effects/light_overlays/shockwave.dmi differ diff --git a/icons/effects/lighting_object.dmi b/icons/effects/lighting_object.dmi new file mode 100644 index 000000000000..60ca2d313f6c Binary files /dev/null and b/icons/effects/lighting_object.dmi differ diff --git a/icons/effects/lighting_object_big.dmi b/icons/effects/lighting_object_big.dmi new file mode 100644 index 000000000000..d96db059bedb Binary files /dev/null and b/icons/effects/lighting_object_big.dmi differ diff --git a/icons/mob/hud/actions.dmi b/icons/mob/hud/actions.dmi index 9f885c44f50f..9021db895eb7 100644 Binary files a/icons/mob/hud/actions.dmi and b/icons/mob/hud/actions.dmi differ diff --git a/icons/mob/hud/marine_hud.dmi b/icons/mob/hud/marine_hud.dmi index 05390b270254..ed7c65e323d1 100644 Binary files a/icons/mob/hud/marine_hud.dmi and b/icons/mob/hud/marine_hud.dmi differ diff --git a/icons/mob/hud/screen1.dmi b/icons/mob/hud/screen1.dmi index fd4cf8188579..c79f6321a083 100644 Binary files a/icons/mob/hud/screen1.dmi and b/icons/mob/hud/screen1.dmi differ diff --git a/icons/mob/hud/screen1_full.dmi b/icons/mob/hud/screen1_full.dmi index 10eabc7a1659..c61aeaad55ee 100644 Binary files a/icons/mob/hud/screen1_full.dmi and b/icons/mob/hud/screen1_full.dmi differ diff --git a/icons/mob/humans/dam_human.dmi b/icons/mob/humans/dam_human.dmi index 88cbb883db18..ba8a25565693 100644 Binary files a/icons/mob/humans/dam_human.dmi and b/icons/mob/humans/dam_human.dmi differ diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi index 969016a4a4e5..8a51050c03c3 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/belt.dmi b/icons/mob/humans/onmob/belt.dmi index f95ba65ece52..8a10910930dd 100644 Binary files a/icons/mob/humans/onmob/belt.dmi and b/icons/mob/humans/onmob/belt.dmi differ diff --git a/icons/mob/humans/onmob/contained/royal_marines_commando.dmi b/icons/mob/humans/onmob/contained/royal_marines_commando.dmi new file mode 100644 index 000000000000..4e9891fe65e9 Binary files /dev/null and b/icons/mob/humans/onmob/contained/royal_marines_commando.dmi differ diff --git a/icons/mob/humans/onmob/feet.dmi b/icons/mob/humans/onmob/feet.dmi index fd89d22ff856..dbbed31b1e19 100644 Binary files a/icons/mob/humans/onmob/feet.dmi and b/icons/mob/humans/onmob/feet.dmi differ diff --git a/icons/mob/humans/onmob/hands.dmi b/icons/mob/humans/onmob/hands.dmi index c8da787cee04..76dda2e14bf9 100644 Binary files a/icons/mob/humans/onmob/hands.dmi and b/icons/mob/humans/onmob/hands.dmi differ diff --git a/icons/mob/humans/onmob/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi index 099ff7bdb385..745cd2057c74 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/head_1.dmi b/icons/mob/humans/onmob/head_1.dmi index 0fb5700225e3..58a93a89da2c 100644 Binary files a/icons/mob/humans/onmob/head_1.dmi and b/icons/mob/humans/onmob/head_1.dmi differ diff --git a/icons/mob/humans/onmob/helmet_garb.dmi b/icons/mob/humans/onmob/helmet_garb.dmi index 3bb63088783f..325aed72b155 100644 Binary files a/icons/mob/humans/onmob/helmet_garb.dmi and b/icons/mob/humans/onmob/helmet_garb.dmi differ diff --git a/icons/mob/humans/onmob/items_lefthand_1.dmi b/icons/mob/humans/onmob/items_lefthand_1.dmi index d65bcccc02af..3acec8cda0f0 100644 Binary files a/icons/mob/humans/onmob/items_lefthand_1.dmi and b/icons/mob/humans/onmob/items_lefthand_1.dmi differ diff --git a/icons/mob/humans/onmob/items_righthand_1.dmi b/icons/mob/humans/onmob/items_righthand_1.dmi index f9b5350d6a7b..821711fad50b 100644 Binary files a/icons/mob/humans/onmob/items_righthand_1.dmi and b/icons/mob/humans/onmob/items_righthand_1.dmi differ diff --git a/icons/mob/humans/onmob/mask.dmi b/icons/mob/humans/onmob/mask.dmi index ef3ab2d9cc96..badd31ad722c 100644 Binary files a/icons/mob/humans/onmob/mask.dmi and b/icons/mob/humans/onmob/mask.dmi differ diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi index 0065384e2c6c..51553c1fc495 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/mob/humans/onmob/suit_1.dmi b/icons/mob/humans/onmob/suit_1.dmi index 19f2a2f6f68b..8424a9795b91 100644 Binary files a/icons/mob/humans/onmob/suit_1.dmi and b/icons/mob/humans/onmob/suit_1.dmi differ diff --git a/icons/mob/humans/onmob/suit_slot.dmi b/icons/mob/humans/onmob/suit_slot.dmi index df588b9b59ca..9f0e15209fe6 100644 Binary files a/icons/mob/humans/onmob/suit_slot.dmi and b/icons/mob/humans/onmob/suit_slot.dmi differ diff --git a/icons/mob/humans/onmob/ties.dmi b/icons/mob/humans/onmob/ties.dmi index a908aaf71037..d82226002ec8 100644 Binary files a/icons/mob/humans/onmob/ties.dmi and b/icons/mob/humans/onmob/ties.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi new file mode 100644 index 000000000000..af61a47aa885 Binary files /dev/null and b/icons/mob/screen_alert.dmi differ diff --git a/icons/obj/items/clothing/backpacks.dmi b/icons/obj/items/clothing/backpacks.dmi index 26d2c944e9dd..f9c06fca4437 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/belts.dmi b/icons/obj/items/clothing/belts.dmi index e561b5f84548..612b4785d24f 100644 Binary files a/icons/obj/items/clothing/belts.dmi and b/icons/obj/items/clothing/belts.dmi differ diff --git a/icons/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi index 7f798c2cd0bc..66a42bf694ba 100644 Binary files a/icons/obj/items/clothing/cm_hats.dmi and b/icons/obj/items/clothing/cm_hats.dmi differ diff --git a/icons/obj/items/clothing/cm_suits.dmi b/icons/obj/items/clothing/cm_suits.dmi index 232e74695a1b..74257ed6c8cd 100644 Binary files a/icons/obj/items/clothing/cm_suits.dmi and b/icons/obj/items/clothing/cm_suits.dmi differ diff --git a/icons/obj/items/clothing/donor/HEAD.dmi b/icons/obj/items/clothing/donor/HEAD.dmi index 177529db64b2..d7345e41d94b 100644 Binary files a/icons/obj/items/clothing/donor/HEAD.dmi and b/icons/obj/items/clothing/donor/HEAD.dmi differ diff --git a/icons/obj/items/clothing/donor/SUITS.dmi b/icons/obj/items/clothing/donor/SUITS.dmi index 5243cc564983..51c41b837c9a 100644 Binary files a/icons/obj/items/clothing/donor/SUITS.dmi and b/icons/obj/items/clothing/donor/SUITS.dmi differ diff --git a/icons/obj/items/clothing/gloves.dmi b/icons/obj/items/clothing/gloves.dmi index 44798f4f727e..b6aa7935f6c9 100644 Binary files a/icons/obj/items/clothing/gloves.dmi and b/icons/obj/items/clothing/gloves.dmi differ diff --git a/icons/obj/items/clothing/hats.dmi b/icons/obj/items/clothing/hats.dmi index d3dd143f8e17..1cdd7491cb0c 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/helmet_visors.dmi b/icons/obj/items/clothing/helmet_visors.dmi new file mode 100644 index 000000000000..6ba0cfe5623e Binary files /dev/null and b/icons/obj/items/clothing/helmet_visors.dmi differ diff --git a/icons/obj/items/clothing/masks.dmi b/icons/obj/items/clothing/masks.dmi index deaf71830f8c..e4d8c4c03c11 100644 Binary files a/icons/obj/items/clothing/masks.dmi and b/icons/obj/items/clothing/masks.dmi differ diff --git a/icons/obj/items/clothing/shoes.dmi b/icons/obj/items/clothing/shoes.dmi index a1cc3b93e8d7..66fab7cc8843 100644 Binary files a/icons/obj/items/clothing/shoes.dmi and b/icons/obj/items/clothing/shoes.dmi differ diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi index 668b9a86c62f..3982fec338dc 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/clothing/ties.dmi b/icons/obj/items/clothing/ties.dmi index 083aaa4d4ada..e0e25b9f579d 100644 Binary files a/icons/obj/items/clothing/ties.dmi and b/icons/obj/items/clothing/ties.dmi differ diff --git a/icons/obj/items/devices.dmi b/icons/obj/items/devices.dmi index de9e6fb01145..df3a53339dc4 100644 Binary files a/icons/obj/items/devices.dmi and b/icons/obj/items/devices.dmi differ diff --git a/icons/obj/items/hunter/pred_gear.dmi b/icons/obj/items/hunter/pred_gear.dmi index d647b32b96fd..4501e75a06b3 100644 Binary files a/icons/obj/items/hunter/pred_gear.dmi and b/icons/obj/items/hunter/pred_gear.dmi differ diff --git a/icons/obj/items/pamphlets.dmi b/icons/obj/items/pamphlets.dmi index 021adfcdee52..b178b6389802 100644 Binary files a/icons/obj/items/pamphlets.dmi and b/icons/obj/items/pamphlets.dmi differ diff --git a/icons/obj/items/radio.dmi b/icons/obj/items/radio.dmi index da2328fb227b..6352a14baef0 100644 Binary files a/icons/obj/items/radio.dmi and b/icons/obj/items/radio.dmi differ diff --git a/icons/obj/items/storage.dmi b/icons/obj/items/storage.dmi index 310bee26b9e9..6edbf5b6c7d3 100644 Binary files a/icons/obj/items/storage.dmi and b/icons/obj/items/storage.dmi differ diff --git a/icons/obj/items/weapons/grenade.dmi b/icons/obj/items/weapons/grenade.dmi index 7d648059ac88..7ee5af737066 100644 Binary files a/icons/obj/items/weapons/grenade.dmi and b/icons/obj/items/weapons/grenade.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi index 6d0e08c40623..2adece3b1ab1 100644 Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/event.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/event.dmi index 7328f00f8b3d..868ae1a1211a 100644 Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/event.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/event.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/twe_ammo.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/twe_ammo.dmi new file mode 100644 index 000000000000..2e8a3d18724d Binary files /dev/null and b/icons/obj/items/weapons/guns/ammo_by_faction/twe_ammo.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi index a6b212b5f0dc..6f160bbbe7cb 100644 Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi index 3d2f1377db6f..51bc441aefaa 100644 Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi differ diff --git a/icons/obj/items/weapons/guns/attachments.dmi b/icons/obj/items/weapons/guns/attachments.dmi index 4a879f0d91c0..332217fe1cf0 100644 Binary files a/icons/obj/items/weapons/guns/attachments.dmi and b/icons/obj/items/weapons/guns/attachments.dmi differ diff --git a/icons/obj/items/weapons/guns/attachments/barrel.dmi b/icons/obj/items/weapons/guns/attachments/barrel.dmi index d040aa85fd5d..03c2257c69c5 100644 Binary files a/icons/obj/items/weapons/guns/attachments/barrel.dmi and b/icons/obj/items/weapons/guns/attachments/barrel.dmi differ diff --git a/icons/obj/items/weapons/guns/attachments/rail.dmi b/icons/obj/items/weapons/guns/attachments/rail.dmi index 315005696ba8..68cb2648ebd1 100644 Binary files a/icons/obj/items/weapons/guns/attachments/rail.dmi and b/icons/obj/items/weapons/guns/attachments/rail.dmi differ diff --git a/icons/obj/items/weapons/guns/attachments/stock.dmi b/icons/obj/items/weapons/guns/attachments/stock.dmi index 8eb95d15770f..a15409b808ca 100644 Binary files a/icons/obj/items/weapons/guns/attachments/stock.dmi and b/icons/obj/items/weapons/guns/attachments/stock.dmi differ diff --git a/icons/obj/items/weapons/guns/attachments/under.dmi b/icons/obj/items/weapons/guns/attachments/under.dmi index 1a55ea7e215f..5a9be7542348 100644 Binary files a/icons/obj/items/weapons/guns/attachments/under.dmi and b/icons/obj/items/weapons/guns/attachments/under.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi b/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi index 1e659671c999..caa62ef55605 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_faction/event.dmi b/icons/obj/items/weapons/guns/guns_by_faction/event.dmi index 3494faec7f7e..4c517b712bb2 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_faction/event.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/event.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_faction/twe_guns.dmi b/icons/obj/items/weapons/guns/guns_by_faction/twe_guns.dmi new file mode 100644 index 000000000000..1976bcf8832d Binary files /dev/null and b/icons/obj/items/weapons/guns/guns_by_faction/twe_guns.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi b/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi index 68919a4b9db4..669efcfc59c4 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi index 8576612c13b2..49e06f5ee547 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/classic/back.dmi b/icons/obj/items/weapons/guns/guns_by_map/classic/back.dmi index 9ca0704b6f46..63b197dd36c4 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/classic/back.dmi and b/icons/obj/items/weapons/guns/guns_by_map/classic/back.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/classic/guns_lefthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/classic/guns_lefthand.dmi index d89a862cb7c3..22eae6bd0ba4 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/classic/guns_lefthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/classic/guns_lefthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/classic/guns_obj.dmi b/icons/obj/items/weapons/guns/guns_by_map/classic/guns_obj.dmi index 3f1b8385390e..b9aa8907a806 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/classic/guns_obj.dmi and b/icons/obj/items/weapons/guns/guns_by_map/classic/guns_obj.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/classic/guns_righthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/classic/guns_righthand.dmi index b5aaba3e9431..dd432a1fa2c1 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/classic/guns_righthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/classic/guns_righthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/desert/back.dmi b/icons/obj/items/weapons/guns/guns_by_map/desert/back.dmi index b06e4bcd63e9..63771f7ff133 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/desert/back.dmi and b/icons/obj/items/weapons/guns/guns_by_map/desert/back.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/desert/guns_lefthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/desert/guns_lefthand.dmi index b498fba1e8c1..6530e1d6967d 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/desert/guns_lefthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/desert/guns_lefthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/desert/guns_obj.dmi b/icons/obj/items/weapons/guns/guns_by_map/desert/guns_obj.dmi index f9e1d720098c..cae152f237ef 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/desert/guns_obj.dmi and b/icons/obj/items/weapons/guns/guns_by_map/desert/guns_obj.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/desert/guns_righthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/desert/guns_righthand.dmi index 4fe8f9cd3939..9df4a0d86ccc 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/desert/guns_righthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/desert/guns_righthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/jungle/back.dmi b/icons/obj/items/weapons/guns/guns_by_map/jungle/back.dmi index 7d4f0a5db658..04718caddcd1 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/jungle/back.dmi and b/icons/obj/items/weapons/guns/guns_by_map/jungle/back.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_lefthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_lefthand.dmi index 486d5a3d73b0..717a1182824e 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_lefthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_lefthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_obj.dmi b/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_obj.dmi index 479b0b9d39f2..9ce7e553ba45 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_obj.dmi and b/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_obj.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_righthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_righthand.dmi index c30fb58093bb..9f69b4ac6815 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_righthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/jungle/guns_righthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/snow/back.dmi b/icons/obj/items/weapons/guns/guns_by_map/snow/back.dmi index a9a1f0c3b1b7..b72963ff7917 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/snow/back.dmi and b/icons/obj/items/weapons/guns/guns_by_map/snow/back.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/snow/guns_lefthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/snow/guns_lefthand.dmi index ee677a66bc20..2c8dedb6cf35 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/snow/guns_lefthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/snow/guns_lefthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/snow/guns_obj.dmi b/icons/obj/items/weapons/guns/guns_by_map/snow/guns_obj.dmi index 801a03dbcfcd..fbc98874a4f6 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/snow/guns_obj.dmi and b/icons/obj/items/weapons/guns/guns_by_map/snow/guns_obj.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/snow/guns_righthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/snow/guns_righthand.dmi index 0af69fa8a9d6..6e7b9cb8c9b5 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/snow/guns_righthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/snow/guns_righthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/urban/back.dmi b/icons/obj/items/weapons/guns/guns_by_map/urban/back.dmi index 0a9f43029891..e849b8134004 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/urban/back.dmi and b/icons/obj/items/weapons/guns/guns_by_map/urban/back.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/urban/guns_lefthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/urban/guns_lefthand.dmi index 2eece9a9ffc4..c844b637ab7e 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/urban/guns_lefthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/urban/guns_lefthand.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/urban/guns_obj.dmi b/icons/obj/items/weapons/guns/guns_by_map/urban/guns_obj.dmi index 2899c72fa9a8..09029fb61f2b 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/urban/guns_obj.dmi and b/icons/obj/items/weapons/guns/guns_by_map/urban/guns_obj.dmi differ diff --git a/icons/obj/items/weapons/guns/guns_by_map/urban/guns_righthand.dmi b/icons/obj/items/weapons/guns/guns_by_map/urban/guns_righthand.dmi index 1950b50114db..78bebfdd4bd9 100644 Binary files a/icons/obj/items/weapons/guns/guns_by_map/urban/guns_righthand.dmi and b/icons/obj/items/weapons/guns/guns_by_map/urban/guns_righthand.dmi differ diff --git a/icons/obj/items/weapons/guns/handful.dmi b/icons/obj/items/weapons/guns/handful.dmi index 7d717db608c4..bbea110531ea 100644 Binary files a/icons/obj/items/weapons/guns/handful.dmi and b/icons/obj/items/weapons/guns/handful.dmi differ diff --git a/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi b/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi index 24cade43454f..0c416b3605e4 100644 Binary files a/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi and b/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi differ diff --git a/icons/obj/items/weapons/weapons.dmi b/icons/obj/items/weapons/weapons.dmi index 41a1f9981976..398256490294 100644 Binary files a/icons/obj/items/weapons/weapons.dmi and b/icons/obj/items/weapons/weapons.dmi differ diff --git a/icons/obj/structures/crates.dmi b/icons/obj/structures/crates.dmi index 5fab82b5185d..a1a494d90da2 100644 Binary files a/icons/obj/structures/crates.dmi and b/icons/obj/structures/crates.dmi differ diff --git a/icons/obj/structures/structures.dmi b/icons/obj/structures/structures.dmi index ef63dee56e13..d96329839a7b 100644 Binary files a/icons/obj/structures/structures.dmi and b/icons/obj/structures/structures.dmi differ diff --git a/icons/obj/vehicles/twe_tank.dmi b/icons/obj/vehicles/twe_tank.dmi new file mode 100644 index 000000000000..95f9c857148d Binary files /dev/null and b/icons/obj/vehicles/twe_tank.dmi differ diff --git a/icons/turf/ert_shuttle.dmi b/icons/turf/ert_shuttle.dmi index 6c38d6b409c0..befed9f547b7 100644 Binary files a/icons/turf/ert_shuttle.dmi and b/icons/turf/ert_shuttle.dmi differ diff --git a/icons/turf/twedropship.dmi b/icons/turf/twedropship.dmi new file mode 100644 index 000000000000..934d3892b307 Binary files /dev/null and b/icons/turf/twedropship.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 70b95a23b632..b309e852b468 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -76,7 +76,7 @@ set name = "Set FPS" set desc = "Set client FPS. 20 is the default" set category = "Preferences" - var/fps = tgui_input_number(usr,"New FPS Value. 0 is server-sync. Higher values cause more desync. Values over 30 not recommended.","Set FPS", 0, MAX_FPS, MIN_FPS) + var/fps = tgui_input_number(usr,"New FPS Value. 0 is server-sync. Higher values cause more desync.","Set FPS", 0, MAX_FPS, MIN_FPS) if(world.byond_version >= 511 && byond_version >= 511 && fps >= MIN_FPS && fps <= MAX_FPS) vars["fps"] = fps prefs.fps = fps diff --git a/maps/Nightmare/maps/DesertDam/nightmare.json b/maps/Nightmare/maps/DesertDam/nightmare.json index 261481f6531b..75a4a605556f 100644 --- a/maps/Nightmare/maps/DesertDam/nightmare.json +++ b/maps/Nightmare/maps/DesertDam/nightmare.json @@ -12,5 +12,12 @@ "chance": 1.0, "path": "standalone/crashlanding-upp-bar.dmm", "when": { "lvevent": "uppcrash" } + }, + { + "type": "map_insert", + "landmark": "uppcrash-supply", + "chance": 1.0, + "path": "standalone/crashlanding-upp-alt1.dmm", + "when": { "lvevent": "uppcrash" } } ] diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm index 32259fa72f45..4ec089e10bdd 100644 --- a/maps/map_files/BigRed/BigRed.dmm +++ b/maps/map_files/BigRed/BigRed.dmm @@ -30946,6 +30946,28 @@ icon_state = "floor5" }, /area/bigredv2/oob) +"jRi" = ( +/obj/item/ammo_magazine/smg/bizon{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/item/weapon/gun/smg/bizon{ + pixel_x = 1; + pixel_y = 11 + }, +/obj/item/ammo_magazine/smg/bizon{ + pixel_x = 11; + pixel_y = -3 + }, +/obj/item/ammo_magazine/smg/bizon, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/bigredv2/caves/mining) "jUc" = ( /obj/structure/surface/table, /obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, @@ -32113,28 +32135,6 @@ icon_state = "platingdmg3" }, /area/bigredv2/caves/mining) -"mmz" = ( -/obj/item/ammo_magazine/pistol/skorpion{ - pixel_x = 5; - pixel_y = -5 - }, -/obj/item/weapon/gun/pistol/skorpion{ - pixel_x = 1; - pixel_y = 11 - }, -/obj/item/ammo_magazine/pistol/skorpion{ - pixel_x = 11; - pixel_y = -3 - }, -/obj/item/ammo_magazine/pistol/skorpion, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating{ - dir = 8; - icon_state = "platingdmg3" - }, -/area/bigredv2/caves/mining) "moE" = ( /turf/open/mars_cave{ icon_state = "mars_cave_9" @@ -42324,7 +42324,7 @@ aao aao uHQ rMg -mmz +jRi uHQ rYD rtS @@ -43253,7 +43253,7 @@ aah aah aaF aah -aau +aah aei aaf aaf @@ -44111,7 +44111,7 @@ aah aah aah aah -aah +aau aah aah aah @@ -44655,7 +44655,7 @@ bjo bie bje bie -biI +bie bsc eWd eWd @@ -45513,7 +45513,7 @@ bie bie bie bie -bie +biI bie bie bie diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm index 3fefea9f08b0..88b90c7180e0 100644 --- a/maps/map_files/CORSAT/Corsat.dmm +++ b/maps/map_files/CORSAT/Corsat.dmm @@ -585,15 +585,6 @@ icon_state = "warnplate" }, /area/corsat/gamma/hangar) -"abW" = ( -/obj/docking_port/stationary/marine_dropship/lz1{ - dwidth = 1; - name = "Gamma Landing Zone" - }, -/turf/open/floor/plating{ - icon_state = "warnplate" - }, -/area/corsat/gamma/hangar) "abX" = ( /turf/open/floor/plating/icefloor{ icon_state = "warnplate" @@ -1897,15 +1888,6 @@ icon_state = "warnplate" }, /area/corsat/sigma/hangar) -"afO" = ( -/obj/docking_port/stationary/marine_dropship/lz2{ - dwidth = 1; - name = "Sigma Landing Zone" - }, -/turf/open/floor/plating{ - icon_state = "warnplate" - }, -/area/corsat/sigma/hangar) "afP" = ( /turf/open/floor/plating/icefloor{ icon_state = "warnplate" @@ -37491,6 +37473,13 @@ icon_state = "purplewhite" }, /area/corsat/gamma/biodome/virology) +"drp" = ( +/obj/docking_port/stationary/marine_dropship/lz1{ + dwidth = 1; + name = "Gamma Landing Zone" + }, +/turf/open/floor/plating, +/area/corsat/gamma/hangar) "drv" = ( /obj/effect/landmark/hunter_secondary, /turf/open/gm/river/desert/shallow{ @@ -38260,6 +38249,13 @@ icon_state = "purplewhite" }, /area/corsat/omega/complex) +"dUj" = ( +/obj/docking_port/stationary/marine_dropship/lz2{ + dwidth = 1; + name = "Sigma Landing Zone" + }, +/turf/open/floor/plating, +/area/corsat/sigma/hangar) "dUn" = ( /obj/structure/machinery/camera/autoname{ network = list("gamma") @@ -93444,7 +93440,7 @@ aaG aaG aaX aaG -abW +bBX aco aaG acG @@ -94414,7 +94410,7 @@ aaG aaG aaG aaG -aaG +drp aaG aaG aaG @@ -120957,7 +120953,7 @@ afi afi aeN afi -afO +eDz ajU aeB vkW @@ -121927,7 +121923,7 @@ afi afi afi afi -afi +dUj afi afi afi diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm index 938092bde688..66e91ebc2505 100644 --- a/maps/map_files/DesertDam/Desert_Dam.dmm +++ b/maps/map_files/DesertDam/Desert_Dam.dmm @@ -60501,6 +60501,14 @@ /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/floor/plating, /area/desert_dam/exterior/valley/valley_crashsite) +"fcu" = ( +/obj/effect/landmark/nightmare{ + insert_tag = "uppcrash-supply" + }, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) "fcE" = ( /obj/structure/flora/bush/desert{ icon_state = "tree_3" @@ -70315,7 +70323,7 @@ cDY cDY cDY cDY -cFa +cDY cML cBS cUl @@ -71241,7 +71249,7 @@ cDY cDY cDY cDY -cDY +cFa cDY cDY cDY @@ -73177,7 +73185,7 @@ aWh aWh aWh aWh -dGU +aWh bDO aVi aVh @@ -74103,7 +74111,7 @@ aWh aWh aWh aWh -aWh +dGU aWh aWh aWh @@ -103519,7 +103527,7 @@ cCH clZ clZ crW -cko +fcu cmc cpY cpY diff --git a/maps/map_files/DesertDam/standalone/crashlanding-upp-alt1.dmm b/maps/map_files/DesertDam/standalone/crashlanding-upp-alt1.dmm new file mode 100644 index 000000000000..b707028441cf --- /dev/null +++ b/maps/map_files/DesertDam/standalone/crashlanding-upp-alt1.dmm @@ -0,0 +1,1969 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bm" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"bz" = ( +/turf/closed/shuttle/ert{ + icon_state = "T7"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"bV" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 9 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"cn" = ( +/turf/closed/shuttle/ert{ + icon_state = "T5"; + name = "Fulcrum" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"cp" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"cG" = ( +/obj/structure/flora/grass/desert/lightgrass_9, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"dv" = ( +/obj/effect/landmark/monkey_spawn, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"dz" = ( +/obj/structure/desertdam/decals/road_stop{ + icon_state = "stop_decal5" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"dN" = ( +/obj/structure/flora/grass/desert/lightgrass_1, +/obj/effect/decal/cleanable/blood/oil, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"dP" = ( +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached18" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"eb" = ( +/obj/effect/spawner/gibspawner/human, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"eC" = ( +/turf/closed/shuttle/ert{ + icon_state = "T17"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"eF" = ( +/turf/open/desert/dirt{ + dir = 6; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"fa" = ( +/turf/closed/shuttle/ert{ + icon_state = "T9"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"fg" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"fp" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"ft" = ( +/turf/closed/wall, +/area/desert_dam/exterior/valley/valley_civilian) +"fA" = ( +/turf/closed/shuttle/ert{ + icon_state = "leftengine_2"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"fL" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"gb" = ( +/obj/structure/desertdam/decals/road_edge, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"ge" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"hK" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = -7; + pixel_y = 17 + }, +/turf/closed/shuttle/ert{ + icon_state = "upp4"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"hP" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 5 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"ig" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating, +/area/desert_dam/exterior/valley/valley_civilian) +"ih" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "upp21"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"im" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 5 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached18" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"jN" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached19" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"jU" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"jX" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"kd" = ( +/turf/closed/shuttle/ert{ + icon_state = "leftengine_1"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"kV" = ( +/obj/structure/flora/grass/desert/lightgrass_2, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"la" = ( +/turf/closed/wall/rock/orange, +/area/desert_dam/exterior/rock) +"ly" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/desert_dam/exterior/valley/valley_civilian) +"mk" = ( +/obj/structure/closet/crate/ammo, +/obj/item/explosive/grenade/high_explosive/upp, +/obj/item/explosive/grenade/high_explosive/upp, +/obj/item/explosive/grenade/high_explosive/upp, +/obj/item/explosive/grenade/high_explosive/upp, +/obj/item/explosive/grenade/high_explosive/upp, +/obj/item/explosive/grenade/high_explosive/upp, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"mt" = ( +/obj/structure/machinery/light/double{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"mw" = ( +/turf/open/desert/dirt{ + dir = 10; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"mM" = ( +/turf/open/desert/dirt{ + dir = 9; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"mN" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"nd" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"nj" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"nn" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"nA" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp4"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"nH" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 8 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"nX" = ( +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"of" = ( +/obj/structure/flora/grass/tallgrass/desert/corner, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"oj" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin4" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"os" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"oL" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"oX" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal9" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"pF" = ( +/turf/closed/shuttle/ert{ + icon_state = "T14"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"qD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/asphalt/cement_sunbleached, +/area/desert_dam/exterior/valley/valley_civilian) +"qM" = ( +/obj/structure/closet/crate/ammo, +/obj/item/ammo_magazine/rifle/type71/ap, +/obj/item/ammo_magazine/rifle/type71/ap, +/obj/item/ammo_magazine/rifle/type71/ap, +/obj/item/ammo_magazine/rifle/type71/ap, +/obj/item/ammo_magazine/rifle/type71/ap, +/obj/item/ammo_magazine/rifle/type71/ap, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"sl" = ( +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"ss" = ( +/obj/structure/flora/bush/desert/cactus/multiple{ + icon_state = "cacti_7" + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"sJ" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"ta" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal10" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"uw" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"uG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached, +/area/desert_dam/exterior/valley/valley_civilian) +"uK" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"uQ" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"vn" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"vz" = ( +/obj/structure/closet/crate/ammo, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/ammo_magazine/rifle/type71, +/obj/item/weapon/gun/rifle/type71, +/obj/item/weapon/gun/rifle/type71, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"vJ" = ( +/obj/structure/prop/invuln/fire, +/turf/closed/shuttle/ert{ + icon_state = "T3"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"wl" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 5 + }, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"xp" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal10" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"xt" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"xz" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating, +/area/desert_dam/exterior/valley/valley_civilian) +"xE" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"xK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood{ + layer = 3 + }, +/obj/structure/girder, +/turf/open/floor/plating, +/area/desert_dam/exterior/valley/valley_civilian) +"xM" = ( +/obj/structure/flora/bush/desert, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"xP" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"yl" = ( +/turf/closed/shuttle/ert{ + icon_state = "T19"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"ym" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"yU" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/closed/shuttle/ert{ + icon_state = "upp20"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"zs" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"zE" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"zO" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 8 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"As" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 10 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"AW" = ( +/turf/open/desert/dirt{ + dir = 1; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Bk" = ( +/turf/closed/shuttle/ert{ + icon_state = "T4"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"BE" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/asphalt/cement_sunbleached, +/area/desert_dam/exterior/valley/valley_civilian) +"BJ" = ( +/obj/structure/flora/grass/desert/lightgrass_3, +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"BM" = ( +/obj/structure/flora/grass/desert/lightgrass_3, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"BU" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached18" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"BY" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal10" + }, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"CB" = ( +/obj/structure/flora/grass/desert/lightgrass_11, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"CL" = ( +/obj/structure/bed/chair/dropship/passenger, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Dd" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = -7; + pixel_y = 17 + }, +/turf/closed/shuttle/ert{ + icon_state = "rightengine_2"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"DO" = ( +/obj/structure/flora/grass/desert/lightgrass_9, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Eh" = ( +/obj/structure/flora/grass/desert/lightgrass_1, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"EF" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"EL" = ( +/obj/structure/flora/grass/desert/lightgrass_2, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"EW" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 6 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"FG" = ( +/obj/structure/flora/grass/desert/lightgrass_8, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Gh" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Gt" = ( +/turf/closed/shuttle/ert{ + icon_state = "T4"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Hm" = ( +/turf/closed/shuttle/ert{ + icon_state = "T1"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Ho" = ( +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Hs" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = -8; + pixel_y = 10 + }, +/turf/closed/shuttle/ert{ + icon_state = "rightengine_1"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Hu" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 10 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"HP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached, +/area/desert_dam/exterior/valley/valley_civilian) +"IS" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp16"; + name = "Fulcrum" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Jb" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Jd" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/obj/effect/decal/sand_overlay/sand1/corner1, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Jy" = ( +/obj/structure/prop/invuln/fire, +/turf/closed/shuttle/ert{ + icon_state = "leftengine_2"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"JG" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"JW" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp25"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Kr" = ( +/turf/closed/shuttle/ert{ + icon_state = "T10"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"KC" = ( +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"KX" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Lc" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal9" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"Lp" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = 8; + pixel_y = 10 + }, +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Lt" = ( +/obj/effect/spawner/gibspawner/human, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/desert_dam/exterior/valley/valley_civilian) +"Lv" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"LD" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 1 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Mo" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Mp" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 5 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"MM" = ( +/turf/closed/shuttle/ert{ + icon_state = "T5"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Nt" = ( +/turf/closed/shuttle/ert{ + icon_state = "T7"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Ny" = ( +/obj/structure/closet/crate/ammo, +/obj/item/ammo_magazine/pkp, +/obj/item/weapon/gun/pkp, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"NP" = ( +/turf/closed/shuttle/ert{ + icon_state = "rightengine_2"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Ou" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/asphalt/cement_sunbleached, +/area/desert_dam/exterior/valley/valley_civilian) +"OB" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"OG" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"OJ" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Pc" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal7" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"Pf" = ( +/obj/structure/flora/grass/desert/lightgrass_12, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Pr" = ( +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"PI" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"PS" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp20"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Qc" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 5 + }, +/obj/effect/spawner/gibspawner/human, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Qj" = ( +/obj/structure/machinery/colony_floodlight, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Rq" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Ry" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/shuttle/dropship{ + icon_state = "rasputin8" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"RG" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Sb" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Sf" = ( +/turf/closed/shuttle/ert{ + icon_state = "T14"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Sm" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal8" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"SE" = ( +/obj/structure/flora/grass/desert/lightgrass_2, +/obj/effect/decal/sand_overlay/sand1{ + dir = 10 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"SN" = ( +/obj/effect/spawner/gibspawner/human, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"SV" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = -7; + pixel_y = 24 + }, +/turf/closed/shuttle/ert{ + icon_state = "T3"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Td" = ( +/obj/structure/flora/bush/desert/cactus, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Tn" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"TT" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/desert_dam/exterior/valley/valley_civilian) +"Ug" = ( +/obj/structure/bed/chair/dropship/pilot{ + dir = 1 + }, +/obj/structure/machinery/computer/cameras{ + desc = "The flight controls for a Mi-220 Attack Dropship. these controls look pretty banged up, and there's some blood covering the screen.."; + name = "\improper 'Buran' flight controls"; + network = null; + pixel_y = 21 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"UB" = ( +/obj/structure/prop/invuln/fire{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/closed/shuttle/ert{ + icon_state = "rightengine_1"; + opacity = 0; + name = "Buran" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"UK" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"VD" = ( +/obj/structure/flora/bush/desert/cactus{ + icon_state = "cactus_8" + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"VK" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/valley_civilian) +"Wb" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached2" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Wy" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"WU" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"WW" = ( +/turf/open/asphalt{ + icon_state = "tile" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Xn" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Xq" = ( +/turf/template_noop, +/area/template_noop) +"XT" = ( +/obj/structure/flora/tree/joshua, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Yr" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp27"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Yv" = ( +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"YD" = ( +/obj/structure/fence, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"YZ" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/valley_civilian) +"Zm" = ( +/obj/structure/flora/grass/tallgrass/desert, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/valley_civilian) +"Zz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/prop/invuln/fire{ + pixel_x = 8; + pixel_y = 10 + }, +/turf/closed/shuttle/ert{ + icon_state = "T2"; + name = "Buran"; + opacity = 0 + }, +/area/desert_dam/exterior/valley/valley_civilian) + +(1,1,1) = {" +la +la +la +la +la +la +la +la +la +la +la +la +la +la +la +la +Mo +Mo +Mo +Jd +Mo +Mo +Mo +Gh +WW +uK +Pr +Xq +Xq +Xq +"} +(2,1,1) = {" +la +la +la +la +la +la +la +la +la +la +la +la +la +la +la +ft +YD +YD +YD +ft +YD +YD +YD +ft +jN +uK +PI +Xq +Xq +Xq +"} +(3,1,1) = {" +la +la +la +la +la +la +la +la +la +la +la +la +la +la +Bk +sl +nX +xM +VD +nX +Jb +Xn +Hm +SV +vJ +Gt +Pr +Xq +Xq +Xq +"} +(4,1,1) = {" +la +la +la +la +la +la +la +la +la +la +la +la +la +Nt +cn +eF +Eh +Td +nX +uw +OJ +nH +As +xK +Zz +Sf +Pr +Xq +Xq +Xq +"} +(5,1,1) = {" +yU +nA +IS +nA +la +la +la +la +la +la +la +la +Nt +fa +Jy +kd +FG +nX +ss +uw +Mp +Sb +zO +ge +zE +OB +JG +Xq +Xq +Xq +"} +(6,1,1) = {" +Yr +Ug +ih +Ug +As +la +la +la +la +la +la +la +Nt +Kr +NP +Hs +cG +nX +RG +Wb +KX +KX +KX +KX +Lv +uQ +sJ +Xq +Xq +Xq +"} +(7,1,1) = {" +Yr +fg +OG +oL +jX +la +la +la +la +la +la +la +la +CB +nj +nj +SE +nX +WU +dP +oX +gb +gb +gb +gb +Pc +Pr +Xq +Xq +Xq +"} +(8,1,1) = {" +JW +Tn +TT +xz +Yv +nj +As +la +la +la +OJ +nj +nj +YZ +Yv +Yv +Yv +Qj +wl +BU +uK +Pr +Pr +Pr +dz +Pr +PI +Xq +Xq +Xq +"} +(9,1,1) = {" +nX +nX +nX +Mp +ym +Yv +Yv +PS +hK +nA +nA +xz +ig +Yv +Yv +DO +Yv +As +fL +im +mN +Pr +Pr +Pr +dz +Pr +Pr +Xq +Xq +Xq +"} +(10,1,1) = {" +nX +nX +Pf +BM +xt +XT +Yv +xz +Rq +mt +jU +OG +oj +Yv +Yv +Yv +Yv +EF +nX +nX +ta +VK +VK +VK +Sm +Pr +Pr +Xq +Xq +Xq +"} +(11,1,1) = {" +FG +EW +hP +nX +xt +Yv +Yv +ly +os +CL +mk +Ny +SN +kV +dN +Yv +Yv +Yv +As +nX +Lc +gb +gb +gb +Pc +Pr +PI +Xq +Xq +Xq +"} +(12,1,1) = {" +EW +Zm +LD +BJ +Yv +Yv +Yv +Lt +Wy +CL +vz +qM +xP +Yv +Yv +Yv +Yv +Yv +jX +eb +nn +Pr +Pr +Pr +dz +Pr +Pr +Xq +Xq +Xq +"} +(13,1,1) = {" +of +Zm +bV +xt +Yv +Yv +UK +xz +xE +bm +OG +OG +Ry +Yv +Yv +Yv +Yv +Yv +nd +nX +nn +Pr +Pr +Pr +dz +Pr +Pr +Xq +Xq +Xq +"} +(14,1,1) = {" +Hu +bV +cG +xt +Yv +nd +nX +TT +Tn +Lp +Tn +Tn +xz +Yv +Yv +Yv +ym +jX +nX +vn +BY +VK +VK +VK +Sm +Pr +PI +Xq +Xq +Xq +"} +(15,1,1) = {" +EL +nX +nX +Qc +nd +nX +mM +mw +la +la +la +la +yl +fA +kd +Yv +Yv +nd +nX +fp +oX +gb +gb +gb +Pc +Pr +Pr +Xq +Xq +Xq +"} +(16,1,1) = {" +nX +nX +mM +Ho +mw +mM +KC +la +la +la +la +la +eC +Dd +UB +Yv +nd +nX +BE +zs +uK +Pr +Pr +Pr +dz +Pr +Pr +Xq +Xq +Xq +"} +(17,1,1) = {" +nX +nX +AW +la +la +la +la +la +la +la +la +la +bz +MM +xt +jX +nX +Ou +HP +cp +uK +Pr +Pr +Pr +dz +Pr +Pr +Xq +Xq +Xq +"} +(18,1,1) = {" +dv +mM +la +la +la +la +la +la +la +la +la +la +la +pF +xt +nd +nX +uG +qD +cp +xp +VK +VK +VK +VK +VK +VK +Xq +Xq +Xq +"} +(19,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(20,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(21,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(22,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(23,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(24,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(25,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} +(26,1,1) = {" +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +Xq +"} diff --git a/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm b/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm index f4efd48f0a88..73ae1b5ef485 100644 --- a/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm +++ b/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm @@ -281,7 +281,9 @@ }, /obj/item/paper/bigred/upp{ pixel_y = 4; - pixel_x = 3 + pixel_x = 3; + icon_state = "paper_words"; + item_state = "paper_words" }, /turf/open/shuttle/dropship{ icon_state = "rasputin15" @@ -2002,6 +2004,7 @@ /obj/item/ammo_magazine/rifle/type71/heap{ current_rounds = 0 }, +/obj/effect/decal/cleanable/blood/oil/streak, /turf/open/shuttle/dropship{ icon_state = "rasputin3" }, @@ -2203,7 +2206,8 @@ }, /area/desert_dam/exterior/valley/bar_valley_dam) "Lo" = ( -/obj/effect/landmark/survivor_spawner/upp_medic, +/obj/effect/landmark/survivor_spawner/upp/soldier, +/obj/effect/decal/cleanable/blood/oil/streak, /turf/open/shuttle/dropship{ icon_state = "rasputin3" }, @@ -2301,6 +2305,15 @@ icon_state = "cement_sunbleached12" }, /area/desert_dam/exterior/valley/bar_valley_dam) +"Ne" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S-corner" + }, +/obj/effect/decal/cleanable/blood/oil/streak, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) "Nh" = ( /obj/structure/flora/grass/desert/lightgrass_4, /obj/effect/decal/sand_overlay/sand1{ @@ -2560,6 +2573,7 @@ /obj/item/ammo_box/rounds/type71/heap/empty{ bullet_amount = 0 }, +/obj/effect/decal/cleanable/blood/oil/streak, /turf/open/shuttle/dropship{ icon_state = "rasputin4" }, @@ -2567,6 +2581,15 @@ "Rl" = ( /obj/structure/closet/crate/supply, /obj/item/ammo_box/magazine/misc/flares, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_magazine/handful/shotgun/heavy/buckshot, +/obj/item/ammo_box/magazine/misc/flares, /turf/open/shuttle/dropship{ icon_state = "rasputin15" }, @@ -3094,12 +3117,6 @@ icon_state = "platingdmg1" }, /area/desert_dam/building/bar/bar_restroom) -"Zn" = ( -/obj/effect/landmark/survivor_spawner/upp_sapper, -/turf/open/shuttle/dropship{ - icon_state = "rasputin3" - }, -/area/desert_dam/building/bar/bar) "ZA" = ( /obj/effect/decal/sand_overlay/sand1{ dir = 1 @@ -3527,14 +3544,14 @@ hm CA DB NH -Zn +Cn Cn tu IF IF IF sE -RW +Ne GZ OS sv diff --git a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm index 9cba60a14b40..0fd8b269d33c 100644 --- a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm +++ b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm @@ -88624,7 +88624,7 @@ amu amu amu amu -aoj +amu axz jDr uaW @@ -89462,7 +89462,7 @@ amu amu amu amu -amu +aoj amu amu amu @@ -99271,7 +99271,7 @@ aYM aYM aYM aYM -bcF +aYM btu blH bkt @@ -100109,7 +100109,7 @@ aYM aYM aYM aYM -aYM +bcF aYM aYM aYM diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm index 4e1f9e3437ce..9d8033ae0ae8 100644 --- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm +++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm @@ -2251,10 +2251,6 @@ icon_state = "yellow" }, /area/fiorina/station/lowsec) -"bju" = ( -/obj/docking_port/stationary/marine_dropship/lz1, -/turf/open/floor/plating/prison, -/area/fiorina/lz/near_lzI) "bjx" = ( /turf/open/floor/prison{ dir = 1; @@ -6556,6 +6552,12 @@ icon_state = "blue_plate" }, /area/fiorina/station/botany) +"dYp" = ( +/obj/docking_port/stationary/marine_dropship/lz1{ + name = "Hangar Landing Zone" + }, +/turf/open/floor/plating/prison, +/area/fiorina/lz/near_lzI) "dYr" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/explosive/grenade/incendiary/molotov, @@ -16469,10 +16471,6 @@ icon_state = "bluefull" }, /area/fiorina/station/power_ring) -"kfE" = ( -/obj/docking_port/stationary/marine_dropship/lz2, -/turf/open/floor/plating/prison, -/area/fiorina/lz/near_lzII) "kfF" = ( /obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal, @@ -38473,6 +38471,10 @@ icon_state = "floor_plate" }, /area/fiorina/station/civres_blue) +"xYg" = ( +/obj/docking_port/stationary/marine_dropship/lz2, +/turf/open/floor/plating/prison, +/area/fiorina/lz/near_lzII) "xYA" = ( /turf/open/floor/prison{ dir = 8; @@ -72352,7 +72354,7 @@ wSm wSm xnU wSm -kfE +wSm eSF qnB fHB @@ -73190,7 +73192,7 @@ wSm wSm wSm wSm -wSm +xYg wSm wSm wSm @@ -88169,7 +88171,7 @@ xeO xeO cCx xeO -bju +xeO sLo hlK hKI @@ -89007,7 +89009,7 @@ xeO xeO xeO xeO -xeO +dYp xeO xeO xeO diff --git a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm index 76257b973b43..aaaaeb0c1199 100644 --- a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm +++ b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm @@ -16687,12 +16687,6 @@ "aWp" = ( /turf/open/floor/plating, /area/ice_colony/exterior/surface/landing_pad) -"aWq" = ( -/obj/docking_port/stationary/marine_dropship/lz1{ - name = "Hangar Landing Zone" - }, -/turf/open/floor/plating, -/area/ice_colony/exterior/surface/landing_pad) "aWr" = ( /obj/structure/machinery/landinglight/ds1/delayone{ dir = 4 @@ -19850,12 +19844,6 @@ icon_state = "dark2" }, /area/ice_colony/underground/requesition/lobby) -"bhs" = ( -/obj/docking_port/stationary/marine_dropship/lz2, -/turf/open/floor/plating/icefloor{ - icon_state = "warnplate" - }, -/area/ice_colony/underground/hangar) "bht" = ( /turf/open/floor/plating/icefloor{ icon_state = "warnplate" @@ -34506,6 +34494,10 @@ icon_state = "dark2" }, /area/ice_colony/surface/research) +"cEG" = ( +/obj/docking_port/stationary/marine_dropship/lz2, +/turf/open/floor/plating/icefloor, +/area/ice_colony/underground/hangar) "cVM" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -34910,6 +34902,12 @@ icon_state = "darkbrown2" }, /area/ice_colony/surface/hangar/alpha) +"sto" = ( +/obj/docking_port/stationary/marine_dropship/lz1{ + name = "Hangar Landing Zone" + }, +/turf/open/floor/plating, +/area/ice_colony/exterior/surface/landing_pad) "sKH" = ( /obj/structure/surface/table, /obj/item/device/analyzer, @@ -52476,7 +52474,7 @@ aZW bcy bbc aZW -bhs +bht bhG bht aZW @@ -53594,7 +53592,7 @@ aZW aZW aZW aZW -aZW +cEG aZW aZW aZW @@ -89400,7 +89398,7 @@ aWp aWp aWp aWQ -aWq +aWp bbl aUP aUP @@ -90518,7 +90516,7 @@ aWp aWp aWp aWp -aWp +sto aWp aWp aWp diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm index d221090da880..631e40c22643 100644 --- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm +++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm @@ -10613,10 +10613,6 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) -"fiy" = ( -/obj/docking_port/stationary/marine_dropship/lz2, -/turf/open/floor/plating, -/area/shiva/exterior/lz2_fortress) "fiK" = ( /turf/open/floor/wood, /area/shiva/interior/colony/botany) @@ -13499,6 +13495,16 @@ /obj/structure/machinery/colony_floodlight, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_lz2) +"ipY" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/structure/machinery/light/double, +/obj/item/weapon/gun/smg/pps43, +/obj/item/ammo_magazine/smg/pps43, +/obj/item/ammo_magazine/smg/pps43, +/turf/open/floor/shiva{ + dir = 1 + }, +/area/shiva/interior/colony/medseceng) "iqh" = ( /obj/item/device/flashlight, /turf/open/floor/wood, @@ -14877,6 +14883,15 @@ icon_state = "floor3" }, /area/shiva/interior/caves/cp_camp) +"jOA" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/weapon/gun/smg/pps43, +/obj/item/ammo_magazine/smg/pps43, +/obj/item/ammo_magazine/smg/pps43, +/turf/open/floor/shiva{ + dir = 1 + }, +/area/shiva/interior/colony/medseceng) "jOP" = ( /obj/effect/decal/warning_stripes{ icon_state = "E-corner" @@ -17359,6 +17374,12 @@ /obj/item/device/flashlight, /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/s_lz2) +"mlX" = ( +/obj/docking_port/stationary/marine_dropship/lz2{ + name = "Research Landing Zone" + }, +/turf/open/floor/plating, +/area/shiva/exterior/lz2_fortress) "mms" = ( /turf/open/floor/shiva{ dir = 1 @@ -24176,15 +24197,6 @@ /obj/structure/blocker/invisible_wall, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) -"tJX" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/item/weapon/gun/smg/ppsh, -/obj/item/ammo_magazine/smg/ppsh, -/obj/item/ammo_magazine/smg/ppsh, -/turf/open/floor/shiva{ - dir = 1 - }, -/area/shiva/interior/colony/medseceng) "tJY" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -24854,9 +24866,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"ukJ" = ( -/turf/open/floor/shiva, -/area/shiva/interior/colony/research_hab) "ukU" = ( /obj/structure/surface/table, /obj/item/clipboard, @@ -27083,16 +27092,6 @@ /obj/structure/window/framed/shiva, /turf/open/floor/plating/icefloor, /area/shiva/interior/telecomm/lz1_biceps) -"wOf" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/structure/machinery/light/double, -/obj/item/weapon/gun/smg/ppsh, -/obj/item/ammo_magazine/smg/ppsh, -/obj/item/ammo_magazine/smg/ppsh, -/turf/open/floor/shiva{ - dir = 1 - }, -/area/shiva/interior/colony/medseceng) "wOq" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/shiva{ @@ -31179,7 +31178,7 @@ gkY gkY mFm aar -fiy +gkY kiv mhP mFm @@ -31817,7 +31816,7 @@ gkY gkY gkY gkY -gkY +mlX gkY gkY gkY @@ -36780,7 +36779,7 @@ tRq chU ogu rZt -ukJ +rZt asz asz qNE @@ -54988,7 +54987,7 @@ fIz acT age agh -wOf +ipY acT pCJ agh @@ -55150,7 +55149,7 @@ pxi acT afv agh -tJX +jOA acT sxp hCX @@ -59474,7 +59473,7 @@ cQW cQW kLM gGH -boD +cQW kLM uqb lNg @@ -60112,7 +60111,7 @@ cQW cQW cQW cQW -cQW +boD cQW cQW cQW diff --git a/maps/map_files/Kutjevo/Kutjevo.dmm b/maps/map_files/Kutjevo/Kutjevo.dmm index e5a6a43cf617..646ed4dcbc8c 100644 --- a/maps/map_files/Kutjevo/Kutjevo.dmm +++ b/maps/map_files/Kutjevo/Kutjevo.dmm @@ -4752,6 +4752,12 @@ }, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/oob) +"gnj" = ( +/obj/docking_port/stationary/marine_dropship/lz1{ + name = "Dunes Landing Zone" + }, +/turf/open/floor/plating/kutjevo, +/area/shuttle/drop1/kutjevo) "gnP" = ( /turf/open/floor/kutjevo/colors/cyan/tile, /area/kutjevo/interior/complex/med/cells) @@ -7172,12 +7178,6 @@ "jYS" = ( /turf/open/auto_turf/sand/layer2, /area/kutjevo/interior/colony_S_East) -"jZJ" = ( -/obj/docking_port/stationary/marine_dropship/lz1{ - name = "Dunes Landing Zone" - }, -/turf/open/floor/plating/kutjevo, -/area/shuttle/drop1/kutjevo) "jZT" = ( /turf/open/floor/kutjevo/colors/cyan/edge{ dir = 8 @@ -7494,12 +7494,6 @@ /obj/effect/landmark/structure_spawner/setup/distress/xeno_wall, /turf/open/auto_turf/sand/layer1, /area/kutjevo/interior/colony_north) -"kvd" = ( -/obj/docking_port/stationary/marine_dropship/lz2{ - name = "NW Colony Landing Zone" - }, -/turf/open/floor/plating/kutjevo, -/area/shuttle/drop2/kutjevo) "kvf" = ( /obj/structure/platform_decoration/kutjevo/rock{ dir = 4 @@ -8095,6 +8089,12 @@ /obj/effect/landmark/corpsespawner/colonist/kutjevo, /turf/open/gm/river/desert/deep/covered, /area/kutjevo/interior/power/comms) +"lkY" = ( +/obj/docking_port/stationary/marine_dropship/lz2{ + name = "NW Colony Landing Zone" + }, +/turf/open/floor/plating/kutjevo, +/area/shuttle/drop2/kutjevo) "llg" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/auto_turf/sand/layer0, @@ -19888,7 +19888,7 @@ lAI lAI nbV nbV -jZJ +lAI nbV usd cWV @@ -20546,7 +20546,7 @@ lAI lAI lAI lAI -lAI +gnj lAI lAI lAI @@ -20960,7 +20960,7 @@ ppX ppX hzN hzN -kvd +ppX hzN lNl xBm @@ -21618,7 +21618,7 @@ ppX ppX ppX ppX -ppX +lkY ppX ppX ppX 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 f8b678e825dd..9fcb8b7386a7 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -1009,6 +1009,12 @@ }, /turf/open/floor/plating, /area/lv522/outdoors/colony_streets/north_east_street) +"aDE" = ( +/obj/docking_port/stationary/marine_dropship/lz2{ + name = "Southeast Landing Zone" + }, +/turf/open/floor/plating, +/area/shuttle/drop2/lv522) "aDS" = ( /turf/open/floor/corsat{ dir = 5; @@ -2166,12 +2172,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/lv522/indoors/c_block/cargo) -"bhy" = ( -/obj/docking_port/stationary/marine_dropship/lz1{ - name = "Southwest Landing Zone" - }, -/turf/open/floor/plating, -/area/shuttle/drop1/lv522) "bhD" = ( /obj/structure/platform_decoration{ dir = 1 @@ -6938,6 +6938,12 @@ icon_state = "marked" }, /area/lv522/indoors/a_block/dorms) +"dos" = ( +/obj/docking_port/stationary/marine_dropship/lz1{ + name = "Southwest Landing Zone" + }, +/turf/open/floor/plating, +/area/shuttle/drop1/lv522) "dox" = ( /obj/structure/prop/invuln/ice_prefab/roof_greeble{ icon_state = "vent5"; @@ -11236,12 +11242,6 @@ /obj/item/trash/plate, /turf/open/floor/carpet, /area/lv522/indoors/b_block/bar) -"fdt" = ( -/obj/docking_port/stationary/marine_dropship/lz2{ - name = "Southeast Landing Zone" - }, -/turf/open/floor/plating, -/area/shuttle/drop2/lv522) "fdC" = ( /obj/structure/machinery/light{ dir = 4 @@ -66151,7 +66151,7 @@ sYH sYH nFj nFj -bhy +sYH gnf ryU wes @@ -67049,7 +67049,7 @@ sYH sYH sYH sYH -sYH +dos sYH sYH sYH @@ -98401,7 +98401,7 @@ aIp aIp xYA xYA -fdt +aIp kcR hIf cDi @@ -99299,7 +99299,7 @@ aIp aIp aIp aIp -aIp +aDE aIp aIp aIp diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm index c0babffe0d94..7aaff922baa9 100644 --- a/maps/map_files/LV624/LV624.dmm +++ b/maps/map_files/LV624/LV624.dmm @@ -10305,7 +10305,6 @@ "aSQ" = ( /obj/structure/safe/floor{ name = "safe"; - pixel_x = 30; spawnkey = 0 }, /turf/open/floor{ @@ -28950,7 +28949,7 @@ aRg aRg aCi aKO -aBo +aRg aEw aRg wLz @@ -29852,7 +29851,7 @@ aRg aKO aRg aRg -aRg +aBo aRg aRg aRg @@ -55633,7 +55632,7 @@ ank ank ank ank -aLz +ank aSa aMq aky @@ -56535,7 +56534,7 @@ ank ank ank ank -ank +aLz ank ank ank diff --git a/maps/map_files/LV624/standalone/clfship.dmm b/maps/map_files/LV624/standalone/clfship.dmm index 362eef00fd21..e69c2de5bcb8 100644 --- a/maps/map_files/LV624/standalone/clfship.dmm +++ b/maps/map_files/LV624/standalone/clfship.dmm @@ -161,9 +161,7 @@ }, /area/lv624/lazarus/crashed_ship) "fA" = ( -/obj/structure/transmitter/colony_net{ - network_receive = "CLF"; - networks_transmit = list("CLF"); +/obj/structure/transmitter/clf_net{ phone_category = "CR-116"; phone_id = "Armoury"; pixel_y = 32 @@ -666,9 +664,7 @@ "sI" = ( /obj/structure/surface/table/reinforced/prison, /obj/effect/spawner/random/toolbox, -/obj/structure/transmitter/colony_net/rotary{ - network_receive = "CLF"; - networks_transmit = list("CLF"); +/obj/structure/transmitter/clf_net/rotary{ phone_category = "CR-116"; phone_color = "yellow"; phone_id = "Engineering" @@ -1661,9 +1657,7 @@ /area/lv624/lazarus/crashed_ship) "Qj" = ( /obj/structure/machinery/body_scanconsole, -/obj/structure/transmitter/colony_net{ - network_receive = "CLF"; - networks_transmit = list("CLF"); +/obj/structure/transmitter/clf_net{ phone_category = "CR-116"; phone_color = "green"; phone_id = "Medical Bay"; @@ -1993,9 +1987,7 @@ }, /area/lv624/lazarus/crashed_ship) "XM" = ( -/obj/structure/transmitter/colony_net{ - network_receive = "CLF"; - networks_transmit = list("CLF"); +/obj/structure/transmitter/clf_net{ phone_category = "CR-116"; phone_id = "Cargo Bay"; pixel_y = 32 diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm index 4488d13b9bc7..d315d9bfd84b 100644 --- a/maps/map_files/New_Varadero/New_Varadero.dmm +++ b/maps/map_files/New_Varadero/New_Varadero.dmm @@ -158,6 +158,30 @@ icon_state = "yellow" }, /area/varadero/interior/cargo) +"agi" = ( +/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/structure/barricade/handrail/wire{ + layer = 3.1 + }, +/turf/open/floor/wood, +/area/varadero/interior/bunks) "agl" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/wood, @@ -1540,6 +1564,19 @@ icon_state = "asteroidplating" }, /area/varadero/interior/maintenance/north) +"aXn" = ( +/obj/structure/prop/rock/brown, +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/turf/open/gm/river{ + name = "shallow ocean"; + default_name = "shallow ocean" + }, +/area/varadero/exterior/eastocean) "aXt" = ( /obj/structure/catwalk, /obj/effect/decal/cleanable/blood/oil, @@ -6621,6 +6658,18 @@ icon_state = "red" }, /area/varadero/interior/medical) +"esA" = ( +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/turf/open/gm/river{ + name = "shallow ocean"; + default_name = "shallow ocean" + }, +/area/varadero/exterior/eastocean) "esB" = ( /obj/structure/closet/radiation, /obj/effect/landmark/crap_item, @@ -8973,6 +9022,16 @@ icon_state = "asteroidplating" }, /area/varadero/exterior/eastbeach) +"fPy" = ( +/obj/structure/prop/rock/brown, +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/turf/open/gm/river{ + name = "shallow ocean"; + default_name = "shallow ocean" + }, +/area/varadero/exterior/eastocean) "fPJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/auto_turf/sand_white/layer1, @@ -10420,13 +10479,6 @@ icon_state = "greenfull" }, /area/varadero/interior/hall_SE) -"gIE" = ( -/obj/structure/flora/bush/ausbushes/var3/fernybush, -/turf/open/gm/river/ocean{ - name = "deep ocean"; - default_name = "deep ocean" - }, -/area/varadero/exterior/eastocean) "gJs" = ( /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 @@ -12233,15 +12285,6 @@ }, /turf/open/gm/dirt, /area/varadero/exterior/pontoon_beach) -"hXg" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/structure/machinery/light, -/turf/open/floor/shiva{ - icon_state = "green" - }, -/area/varadero/interior/court) "hXq" = ( /turf/open/floor/plating/icefloor{ icon_state = "asteroidplating" @@ -17733,6 +17776,13 @@ icon_state = "asteroidplating" }, /area/varadero/interior/comms1) +"lxs" = ( +/obj/structure/flora/bush/ausbushes/var3/fernybush, +/turf/open/gm/river{ + name = "shallow ocean"; + default_name = "shallow ocean" + }, +/area/varadero/exterior/eastocean) "lxy" = ( /obj/structure/closet/secure_closet/personal, /turf/open/floor/shiva{ @@ -20015,16 +20065,6 @@ default_name = "shallow ocean" }, /area/varadero/exterior/pontoon_beach) -"mRk" = ( -/obj/structure/prop/rock/brown, -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/turf/open/gm/river/ocean{ - name = "deep ocean"; - default_name = "deep ocean" - }, -/area/varadero/exterior/eastocean) "mRq" = ( /obj/structure/window/framed/colony, /turf/open/floor/plating, @@ -24535,19 +24575,6 @@ icon_state = "blue" }, /area/varadero/interior/maintenance) -"pNZ" = ( -/obj/structure/prop/rock/brown, -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/turf/open/gm/river/ocean{ - name = "deep ocean"; - default_name = "deep ocean" - }, -/area/varadero/exterior/eastocean) "pOa" = ( /obj/structure/largecrate/supply, /turf/open/floor/plating/icefloor{ @@ -26171,15 +26198,6 @@ icon_state = "asteroidplating" }, /area/varadero/interior/maintenance/research) -"qNr" = ( -/obj/structure/flora/bush/ausbushes/var3/sparsegrass{ - icon_state = "sparsegrass_2" - }, -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/turf/open/gm/coast/beachcorner2/north_west, -/area/varadero/exterior/eastocean) "qNu" = ( /turf/open/gm/dirt{ icon_state = "desert1" @@ -28386,15 +28404,6 @@ }, /turf/open/auto_turf/sand_white/layer1, /area/varadero/interior/caves/east) -"sfo" = ( -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/turf/open/gm/river/ocean{ - name = "deep ocean"; - default_name = "deep ocean" - }, -/area/varadero/exterior/eastocean) "sfs" = ( /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 @@ -31115,6 +31124,17 @@ icon_state = "multi_tiles" }, /area/varadero/interior/hall_NW) +"tTq" = ( +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/obj/structure/blocker/invisible_wall/water, +/obj/structure/flora/bush/ausbushes/var3/stalkybush, +/turf/open/gm/river{ + name = "shallow ocean"; + default_name = "shallow ocean" + }, +/area/varadero/exterior/farocean) "tTN" = ( /obj/structure/stairs/perspective{ color = "#b29082"; @@ -32077,18 +32097,6 @@ /obj/item/device/flashlight/lamp/green, /turf/open/floor/wood, /area/varadero/interior/hall_SE) -"uDr" = ( -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/turf/open/gm/river/ocean{ - name = "deep ocean"; - default_name = "deep ocean" - }, -/area/varadero/exterior/eastocean) "uDw" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -32219,31 +32227,6 @@ icon_state = "multi_tiles" }, /area/varadero/interior/disposals) -"uIj" = ( -/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/structure/barricade/handrail/wire{ - layer = 3.1 - }, -/obj/item/ammo_magazine/handful/shotgun/incendiary, -/turf/open/floor/wood, -/area/varadero/interior/bunks) "uIl" = ( /obj/structure/machinery/alarm{ dir = 4; @@ -34499,6 +34482,32 @@ }, /turf/open/gm/dirt, /area/varadero/exterior/eastbeach) +"vYQ" = ( +/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/structure/barricade/handrail/wire{ + layer = 3.1 + }, +/obj/item/ammo_magazine/handful/shotgun/buckshot, +/obj/item/ammo_magazine/handful/shotgun/buckshot, +/turf/open/floor/wood, +/area/varadero/interior/bunks) "vYW" = ( /turf/open/auto_turf/sand_white/layer1, /area/varadero/interior_protected/caves) @@ -34946,17 +34955,6 @@ icon_state = "multi_tiles" }, /area/varadero/interior/technical_storage) -"wkJ" = ( -/obj/effect/landmark/lv624/fog_blocker{ - time_to_dispel = 25000 - }, -/obj/structure/blocker/invisible_wall/water, -/obj/structure/flora/bush/ausbushes/var3/stalkybush, -/turf/open/gm/river/ocean{ - name = "deep ocean"; - default_name = "deep ocean" - }, -/area/varadero/exterior/farocean) "wkM" = ( /obj/structure/window/reinforced{ dir = 4; @@ -35285,6 +35283,18 @@ icon_state = "asteroidfloor" }, /area/varadero/exterior/eastbeach) +"wts" = ( +/obj/structure/flora/bush/ausbushes/var3/sparsegrass{ + icon_state = "sparsegrass_2" + }, +/obj/effect/landmark/lv624/fog_blocker{ + time_to_dispel = 25000 + }, +/turf/open/gm/river{ + name = "shallow ocean"; + default_name = "shallow ocean" + }, +/area/varadero/exterior/eastocean) "wty" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/shiva{ @@ -50142,7 +50152,7 @@ bZU qOh rtm bZU -oXw +bZU bwP mrC wMw @@ -50860,7 +50870,7 @@ bZU bZU bZU bZU -bZU +oXw bZU bZU bZU @@ -54388,7 +54398,7 @@ iLd iTP jZG tNE -uIj +vYQ lgb fEI wfy @@ -54732,7 +54742,7 @@ eMi qRy moK hPD -hXg +uQH riJ aQc qqA @@ -55298,7 +55308,7 @@ bAE kIg nmC ben -uIj +agi hDk aZb rAy @@ -63604,7 +63614,7 @@ wlB nFX ias lTg -aAX +wlB lTg lTg iQr @@ -64322,7 +64332,7 @@ wlB wlB wlB wlB -wlB +aAX wlB wlB wlB @@ -67132,10 +67142,10 @@ bGU rqg gPi xeU -xFb -sfo -sfo -pNZ +dRs +spv +spv +aXn kyj gPi bko @@ -67311,16 +67321,16 @@ bko gPi bko gPi -qNr -xFb -sfo -xFb -sfo -sfo -sfo -xFb -xFb -sfo +wts +dRs +spv +dRs +spv +spv +spv +dRs +dRs +spv ghN pZS kyD @@ -67490,19 +67500,19 @@ qoI gPi xfQ spv -xFb -uDr -xFb -uDr -xFb -sfo -xFb -xFb -sfo -sfo -xFb -sfo -sfo +dRs +esA +dRs +esA +dRs +spv +dRs +dRs +spv +spv +dRs +spv +spv ghN gRj bGU @@ -67670,21 +67680,21 @@ gPi gPi xfQ bUP -jFL -sfo -xFb -sfo -tHc -sfo -xFb -xFb -uDr -sfo -sfo -xFb -xFb -sfo -xFb +bUP +spv +dRs +spv +ulb +spv +dRs +dRs +esA +spv +spv +dRs +dRs +spv +dRs veV bko gPi @@ -67850,25 +67860,25 @@ bUP bUP bUP bUP -xFb -xFb -sfo -xFb -xFb -sfo -xFb -xFb -sfo -xFb -xFb -xFb -xFb -xFb -xFb -sfo -xFb -xFb -sfo +dRs +dRs +spv +dRs +dRs +spv +dRs +dRs +spv +dRs +dRs +dRs +dRs +dRs +dRs +spv +dRs +dRs +spv hwE ghN pZS @@ -68025,33 +68035,33 @@ xFb xFb dRs dRs -xFb -xFb -xFb -xFb dRs dRs -xFb -xFb -xFb -uDr -xFb -xFb -sfo -xFb -xFb -sfo -xFb -xFb -xFb -xFb -xFb -sfo -sfo -xFb -sfo -xFb -xFb +dRs +dRs +dRs +dRs +dRs +dRs +dRs +esA +dRs +dRs +spv +dRs +dRs +spv +dRs +dRs +dRs +dRs +dRs +spv +spv +dRs +spv +dRs +dRs aaG dkS qlw @@ -68201,39 +68211,39 @@ xFb xFb xFb xFb +dRs xFb xFb xFb xFb -xFb -xFb -xFb -tHc dRs -xFb -xFb dRs -xFb -xFb -sfo -uDr -xFb -xFb -sfo -xFb -xFb -xFb -sfo -sfo -xFb -xFb -mRk -sfo -xFb -sfo -xFb -xFb -uDr +ulb +dRs +dRs +dRs +dRs +dRs +dRs +spv +esA +dRs +dRs +spv +dRs +dRs +dRs +spv +spv +dRs +dRs +fPy +spv +dRs +spv +dRs +dRs +esA ihC ghN pmM @@ -68384,38 +68394,38 @@ xFb xFb xFb xFb -xFb -xFb -xFb dRs xFb xFb -xFb dRs xFb xFb -xFb dRs -xFb -uDr -sfo -xFb -xFb -sfo -sfo -xFb -xFb -xFb -sfo -uDr -sfo -sfo -xFb -xFb -uDr -xFb -uDr -xFb +dRs +dRs +dRs +dRs +dRs +dRs +esA +spv +dRs +dRs +spv +spv +dRs +dRs +dRs +spv +esA +spv +spv +dRs +dRs +esA +dRs +esA +dRs bUP ghN bGU @@ -68572,31 +68582,31 @@ xFb xFb byC xFb -xFb -xFb -xFb -byC -xFb -byC -xFb -uDr -xFb -gIE -xFb -xFb -uDr -sfo -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -sfo -sfo -xFb +dRs +dRs +dRs +exX +dRs +exX +dRs +esA +dRs +lxs +dRs +dRs +esA +spv +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +spv +spv +dRs dRs bUP veV @@ -68759,26 +68769,26 @@ xVw wBp wBp wBp -rYC +bBV wBp xBH -xFb -xFb -xFb -xFb -xFb -xFb -uDr -sfo -xFb -xFb -xFb -xFb -sfo -uDr -uDr -xFb -xFb +dRs +dRs +dRs +dRs +dRs +dRs +esA +spv +dRs +dRs +dRs +dRs +spv +esA +esA +dRs +dRs dRs bUP bUP @@ -68934,7 +68944,7 @@ mPk mPk mPk mPk -mPk +pRa cJL mPk mPk @@ -68943,25 +68953,25 @@ mPk mPk cJL mPk -wkJ -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -sfo -sfo -sfo -sfo -sfo -sfo -xFb -xFb +tTq +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +spv +spv +spv +spv +spv +spv +dRs +dRs +dRs dRs -xFb bUP ucL ghN @@ -69120,31 +69130,31 @@ mPk mPk mPk mPk -mPk +pRa mPk mPk mPk mPk rYC -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs bUP ghN bGU @@ -69306,27 +69316,27 @@ mPk mPk mPk mPk -cJL -wBp -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -tHc +rUa +mPW +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +ulb bUP veV jTR @@ -69490,26 +69500,26 @@ mPk mPk mPk xVw -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs bUP ghN bGU @@ -69671,153 +69681,138 @@ mPk mPk mPk mPk -wBp -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -dRs -xFb -bUP -veV -jTR -bGU -bGU -bGU -vNB -rvD -pGs -pGs -pGs -pGs -pGs -pGs -pGs -pGs -pGs -bsf -bsf -bsf -bsf -bsf -ulv -uvd -uvd -uvd -brT -kjI -vNT -brT -reA -brT -brT -snS -kjI -kjI -snS -brT -brT -rmS -brT -qwU -nnk -brT -uvd -uvd -uvd -brT -bsf -bsf -bsf -bsf -bsf -pGs -pGs -pGs -wUU -"} -(175,1,1) = {" -wUU -nvv -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -pkl -kkF -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk -mPk +wBp +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +bUP +veV +jTR +bGU +bGU +bGU +vNB +rvD +pGs +pGs +pGs +pGs +pGs +pGs +pGs +pGs +pGs +bsf +bsf +bsf +bsf +bsf +ulv +uvd +uvd +uvd +brT +kjI +vNT +brT +reA +brT +brT +snS +kjI +kjI +snS +brT +brT +rmS +brT +qwU +nnk +brT +uvd +uvd +uvd +brT +bsf +bsf +bsf +bsf +bsf +pGs +pGs +pGs +wUU +"} +(175,1,1) = {" +wUU +nvv +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +pkl +kkF +mPk +mPk +mPk +mPk +mPk +mPk +mPk mPk mPk mPk @@ -69853,27 +69848,42 @@ mPk mPk mPk mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +mPk +pRa wBp byC +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs xFb xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -dRs bUP bUP ghN @@ -70038,26 +70048,26 @@ mPk rYC xFb xFb +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs +dRs xFb xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb +dRs +dRs tHc -bUP +jFL ghN bGU bGU @@ -70222,24 +70232,24 @@ byC xFb xFb xFb +dRs +dRs +dRs +dRs +dRs +dRs +dRs xFb +dRs +dRs xFb +dRs xFb +dRs +dRs xFb xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -xFb -bUP +jFL ghN vNB rvD @@ -70402,18 +70412,18 @@ mPk wBp xFb xFb -xFb +dRs xFb byC +dRs xFb -xFb -xFb +dRs byC xFb xFb -xFb +dRs byC -xFb +dRs xFb byC xFb @@ -70766,6 +70776,7 @@ mPk mPk mPk mPk +pRa mPk mPk mPk @@ -70775,14 +70786,13 @@ mPk mPk mPk mPk -mPk -mPk +pRa cJL mPk mPk mPk cJL -mPk +pRa mPk mPk mPk @@ -70951,10 +70961,10 @@ mPk mPk mPk mPk +pRa mPk -mPk -mPk -mPk +pRa +pRa mPk mPk mPk diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm index c43a02dddf12..ff1d99eb8f78 100644 --- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm +++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm @@ -1473,11 +1473,6 @@ icon_state = "red1" }, /area/strata/ug/interior/jungle/deep/structures/res) -"aem" = ( -/obj/item/weapon/gun/pistol/c99, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/interior/outpost/gen/bball/nest) "aen" = ( /obj/effect/landmark/monkey_spawn, /turf/open/auto_turf/snow/brown_base/layer0, @@ -1550,13 +1545,6 @@ /obj/structure/flora/bush/ausbushes/grassybush, /turf/open/auto_turf/strata_grass/layer1, /area/strata/ug/interior/jungle/deep/minehead) -"aeA" = ( -/obj/structure/surface/rack, -/obj/item/weapon/gun/pistol/c99, -/turf/open/floor/strata{ - icon_state = "red1" - }, -/area/strata/ug/interior/jungle/deep/structures/res) "aeB" = ( /obj/structure/surface/table/reinforced/prison, /turf/open/floor/strata{ @@ -4300,11 +4288,6 @@ /obj/effect/decal/cleanable/blood, /turf/open/auto_turf/snow/brown_base/layer0, /area/strata/ag/exterior/paths/cabin_area) -"amy" = ( -/obj/effect/decal/strata_decals/catwalk/prison, -/obj/item/weapon/gun/pistol/c99, -/turf/open/floor/greengrid, -/area/strata/ag/exterior/research_decks) "amz" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -7014,16 +6997,6 @@ icon_state = "white_cyan1" }, /area/strata/ag/interior/outpost/canteen/lower_cafeteria) -"auS" = ( -/obj/item/weapon/gun/pistol/c99, -/obj/structure/pipes/standard/manifold/hidden/cyan{ - dir = 1 - }, -/turf/open/floor/strata{ - dir = 4; - icon_state = "white_cyan1" - }, -/area/strata/ag/interior/outpost/canteen/lower_cafeteria) "auU" = ( /obj/effect/decal/cleanable/blood/gibs/down, /obj/item/dogtag, @@ -9158,15 +9131,6 @@ }, /turf/closed/wall/strata_outpost, /area/strata/ag/interior/dorms) -"aBr" = ( -/obj/structure/surface/table/reinforced/prison, -/obj/item/storage/pouch/flare/full, -/obj/item/weapon/gun/pistol/c99, -/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, -/turf/open/floor/strata{ - icon_state = "orange_tile" - }, -/area/strata/ag/interior/dorms) "aBs" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -14757,10 +14721,6 @@ /obj/structure/pipes/standard/simple/hidden/cyan, /turf/open/floor/strata, /area/strata/ag/exterior/research_decks) -"aTo" = ( -/obj/item/weapon/gun/pistol/c99, -/turf/open/floor/strata, -/area/strata/ag/exterior/research_decks) "aTp" = ( /obj/structure/largecrate/random/case/small, /turf/open/asphalt/cement, @@ -20781,11 +20741,6 @@ /obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/auto_turf/snow/brown_base/layer0, /area/strata/ag/exterior/paths/southresearch) -"bpt" = ( -/obj/item/weapon/gun/pistol/c99, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior/paths/southresearch) "bpu" = ( /obj/structure/machinery/colony_floodlight, /turf/open/auto_turf/snow/brown_base/layer1, @@ -22037,16 +21992,6 @@ /obj/structure/bed/chair, /turf/open/auto_turf/snow/brown_base/layer2, /area/strata/ag/exterior/marsh/center) -"buh" = ( -/obj/structure/surface/rack, -/obj/item/tool/shovel/etool/folded, -/obj/item/weapon/gun/pistol/c99, -/obj/item/attachable/bayonet/upp, -/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, -/turf/open/floor/prison{ - icon_state = "darkredfull2" - }, -/area/strata/ag/interior/landingzone_checkpoint) "bui" = ( /obj/structure/tunnel{ id = "hole1" @@ -26679,11 +26624,6 @@ icon_state = "multi_tiles" }, /area/strata/ag/interior/outpost/canteen) -"caT" = ( -/obj/item/weapon/gun/pistol/c99, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/auto_turf/ice/layer1, -/area/strata/ag/interior/outpost/gen/bball/nest) "caV" = ( /obj/item/stack/sheet/wood, /obj/effect/decal/cleanable/blood, @@ -27004,13 +26944,6 @@ icon_state = "red1" }, /area/strata/ag/interior/outpost/security) -"cdf" = ( -/obj/structure/surface/rack, -/obj/item/weapon/gun/pistol/c99, -/turf/open/floor/strata{ - icon_state = "red1" - }, -/area/strata/ag/interior/outpost/security) "cdh" = ( /turf/open/floor/strata, /area/strata/ag/interior/outpost/canteen/lower_cafeteria) @@ -28838,12 +28771,6 @@ "cpg" = ( /turf/closed/wall/strata_ice/jungle, /area/strata/ug/interior/jungle/deep/east_dorms) -"cph" = ( -/obj/item/weapon/gun/pistol/c99, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/auto_turf/ice/layer1, -/area/strata/ag/interior/outpost/gen/bball/nest) "cpi" = ( /obj/item/stack/medical/ointment, /obj/item/stack/medical/splint, @@ -29821,6 +29748,16 @@ icon_state = "cyan3" }, /area/strata/ag/interior/outpost/med) +"cHm" = ( +/obj/item/weapon/gun/pistol/t73, +/obj/structure/pipes/standard/manifold/hidden/cyan{ + dir = 1 + }, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" + }, +/area/strata/ag/interior/outpost/canteen/lower_cafeteria) "cIM" = ( /obj/structure/machinery/door/airlock/prison{ dir = 1; @@ -30522,6 +30459,13 @@ "dWm" = ( /turf/closed/wall/strata_outpost/reinforced, /area/strata/ag/interior/outpost/gen/bball) +"dWu" = ( +/obj/structure/surface/rack, +/obj/item/weapon/gun/pistol/t73, +/turf/open/floor/strata{ + icon_state = "red1" + }, +/area/strata/ag/interior/outpost/security) "dXc" = ( /obj/effect/landmark/static_comms/net_one, /turf/open/auto_turf/snow/brown_base/layer0, @@ -30640,6 +30584,11 @@ icon_state = "red1" }, /area/strata/ug/interior/outpost/jung/dorms/sec2) +"ejw" = ( +/obj/item/weapon/gun/pistol/t73, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/auto_turf/strata_grass/layer1, +/area/strata/ug/interior/jungle/deep/east_engi) "ekc" = ( /obj/structure/barricade/snow, /turf/open/auto_turf/ice/layer1, @@ -30694,13 +30643,6 @@ }, /turf/open/auto_turf/ice/layer1, /area/strata/ag/exterior/marsh/center) -"enQ" = ( -/obj/structure/surface/rack, -/obj/item/weapon/gun/pistol/c99, -/turf/open/floor/strata{ - icon_state = "red1" - }, -/area/strata/ug/interior/jungle/deep/structures/engi) "enU" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -33121,6 +33063,20 @@ icon_state = "purp2" }, /area/strata/ug/interior/jungle/deep/structures/engi) +"iuh" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -11 + }, +/obj/structure/mirror{ + pixel_x = -29 + }, +/obj/item/weapon/gun/pistol/t73, +/turf/open/floor/strata{ + dir = 8; + icon_state = "white_cyan2" + }, +/area/strata/ug/interior/outpost/jung/dorms/sec1) "iuB" = ( /obj/structure/machinery/light/small{ dir = 1; @@ -33591,16 +33547,6 @@ }, /turf/closed/wall/strata_outpost, /area/strata/ag/exterior/research_decks) -"jhu" = ( -/obj/structure/surface/rack, -/obj/item/tool/shovel/etool/folded, -/obj/item/weapon/gun/pistol/c99, -/obj/item/attachable/bayonet/upp, -/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, -/turf/open/floor/strata{ - icon_state = "red1" - }, -/area/strata/ag/interior/landingzone_checkpoint) "jit" = ( /turf/open/asphalt/cement{ icon_state = "cement2" @@ -33759,14 +33705,6 @@ /obj/structure/sign/safety/biohazard, /turf/closed/wall/strata_outpost/reinforced/hull, /area/strata/ag/interior/mountain) -"jwS" = ( -/obj/structure/surface/rack, -/obj/item/weapon/gun/pistol/c99, -/obj/item/handcuffs, -/turf/open/floor/strata{ - icon_state = "red1" - }, -/area/strata/ag/interior/research_decks/security) "jxc" = ( /obj/effect/decal/strata_decals/catwalk/prison, /obj/structure/disposalpipe/segment, @@ -35210,6 +35148,10 @@ icon_state = "fake_wood" }, /area/strata/ag/interior/outpost/gen/bball) +"lUw" = ( +/obj/item/weapon/gun/pistol/t73, +/turf/open/floor/strata, +/area/strata/ag/exterior/research_decks) "lVF" = ( /obj/effect/blocker/sorokyne_cold_water, /obj/structure/platform/strata{ @@ -35277,6 +35219,13 @@ icon_state = "red1" }, /area/strata/ag/interior/outpost/gen/bball) +"mcD" = ( +/obj/structure/surface/rack, +/obj/item/weapon/gun/pistol/t73, +/turf/open/floor/strata{ + icon_state = "red1" + }, +/area/strata/ug/interior/jungle/deep/structures/res) "mcX" = ( /obj/structure/surface/rack, /obj/item/tool/shovel/snow, @@ -38789,6 +38738,10 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/strata, /area/strata/ag/interior/tcomms) +"sah" = ( +/obj/item/weapon/gun/pistol/t73, +/turf/open/auto_turf/strata_grass/layer1, +/area/strata/ug/interior/jungle/deep/east_engi) "sau" = ( /obj/structure/machinery/power/terminal{ dir = 8 @@ -38956,6 +38909,11 @@ icon_state = "cement9" }, /area/strata/ug/interior/jungle/platform/east/scrub) +"spp" = ( +/obj/item/weapon/gun/pistol/t73, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/auto_turf/ice/layer1, +/area/strata/ag/interior/outpost/gen/bball/nest) "sqT" = ( /turf/closed/wall/strata_ice/dirty, /area/strata/ag/exterior/marsh/crash) @@ -39249,11 +39207,6 @@ icon_state = "white_cyan1" }, /area/strata/ag/interior/dorms) -"sWr" = ( -/obj/item/weapon/gun/pistol/c99, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/auto_turf/strata_grass/layer1, -/area/strata/ug/interior/jungle/deep/east_engi) "sWO" = ( /obj/structure/machinery/light/small{ dir = 1; @@ -39413,6 +39366,11 @@ icon_state = "floor3" }, /area/strata/ag/exterior/research_decks) +"thz" = ( +/obj/effect/decal/strata_decals/catwalk/prison, +/obj/item/weapon/gun/pistol/t73, +/turf/open/floor/greengrid, +/area/strata/ag/exterior/research_decks) "tio" = ( /obj/structure/pipes/standard/manifold/hidden/cyan{ dir = 4 @@ -40021,6 +39979,16 @@ "uaH" = ( /turf/open/floor/strata, /area/strata/ug/interior/outpost/jung/dorms/admin2) +"ubo" = ( +/obj/structure/surface/rack, +/obj/item/tool/shovel/etool/folded, +/obj/item/weapon/gun/pistol/t73, +/obj/item/attachable/bayonet/upp, +/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, +/turf/open/floor/prison{ + icon_state = "darkredfull2" + }, +/area/strata/ag/interior/landingzone_checkpoint) "ubx" = ( /obj/structure/largecrate/random, /obj/item/paper_bin, @@ -40154,6 +40122,14 @@ }, /turf/open/floor/strata, /area/strata/ag/exterior/research_decks) +"ulv" = ( +/obj/structure/surface/rack, +/obj/item/weapon/gun/pistol/t73, +/obj/item/handcuffs, +/turf/open/floor/strata{ + icon_state = "red1" + }, +/area/strata/ag/interior/research_decks/security) "ulL" = ( /obj/structure/platform/strata/metal{ dir = 1 @@ -40488,6 +40464,21 @@ }, /turf/open/auto_turf/ice/layer1, /area/strata/ag/exterior/paths/north_outpost) +"uPH" = ( +/obj/structure/surface/rack, +/obj/item/tool/shovel/etool/folded, +/obj/item/weapon/gun/pistol/t73, +/obj/item/attachable/bayonet/upp, +/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, +/turf/open/floor/strata{ + icon_state = "red1" + }, +/area/strata/ag/interior/landingzone_checkpoint) +"uPR" = ( +/obj/item/weapon/gun/pistol/t73, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/auto_turf/snow/brown_base/layer0, +/area/strata/ag/exterior/paths/southresearch) "uRy" = ( /obj/structure/pipes/standard/simple/hidden/cyan{ dir = 4 @@ -40867,10 +40858,6 @@ icon_state = "purp2" }, /area/strata/ug/interior/jungle/deep/structures/engi) -"vsG" = ( -/obj/item/weapon/gun/pistol/c99, -/turf/open/auto_turf/strata_grass/layer1, -/area/strata/ug/interior/jungle/deep/east_engi) "vsL" = ( /obj/item/reagent_container/food/snacks/donkpocket, /turf/open/floor/strata{ @@ -41068,20 +41055,6 @@ icon_state = "cyan2" }, /area/strata/ag/interior/outpost/med) -"vDl" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -11 - }, -/obj/structure/mirror{ - pixel_x = -29 - }, -/obj/item/weapon/gun/pistol/c99, -/turf/open/floor/strata{ - dir = 8; - icon_state = "white_cyan2" - }, -/area/strata/ug/interior/outpost/jung/dorms/sec1) "vDm" = ( /obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/floor/strata{ @@ -41571,6 +41544,11 @@ /obj/effect/landmark/good_item, /turf/open/floor/strata, /area/strata/ug/interior/outpost/jung/dorms/admin2) +"wEU" = ( +/obj/item/weapon/gun/pistol/t73, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/auto_turf/snow/brown_base/layer0, +/area/strata/ag/interior/outpost/gen/bball/nest) "wFG" = ( /turf/open/auto_turf/strata_grass/layer1, /area/strata/ug/interior/jungle/deep/south_engi) @@ -42100,6 +42078,12 @@ icon_state = "multi_tiles" }, /area/strata/ag/exterior/research_decks) +"xFT" = ( +/obj/item/weapon/gun/pistol/t73, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/auto_turf/ice/layer1, +/area/strata/ag/interior/outpost/gen/bball/nest) "xGb" = ( /obj/structure/pipes/standard/simple/hidden/cyan{ dir = 6 @@ -42347,6 +42331,13 @@ "xUg" = ( /turf/open/gm/coast/south, /area/strata/ug/interior/jungle/deep/south_engi) +"xUo" = ( +/obj/structure/surface/rack, +/obj/item/weapon/gun/pistol/t73, +/turf/open/floor/strata{ + icon_state = "red1" + }, +/area/strata/ug/interior/jungle/deep/structures/engi) "xVQ" = ( /obj/structure/bed/chair/dropship/passenger{ dir = 4 @@ -42461,6 +42452,15 @@ icon_state = "floor3" }, /area/strata/ag/interior/tcomms) +"yis" = ( +/obj/structure/surface/table/reinforced/prison, +/obj/item/storage/pouch/flare/full, +/obj/item/weapon/gun/pistol/t73, +/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, +/turf/open/floor/strata{ + icon_state = "orange_tile" + }, +/area/strata/ag/interior/dorms) "yjG" = ( /obj/structure/flora/bush/ausbushes/var3/fullgrass, /turf/open/auto_turf/strata_grass/layer1, @@ -43739,7 +43739,7 @@ crE crE crE crE -ciy +crE crE fuA cmA @@ -44509,7 +44509,7 @@ crE crE crE crE -crE +ciy crE crE crE @@ -47289,7 +47289,7 @@ cwS fzN cwS cbO -jhu +uPH iVZ cxg bsU @@ -50849,7 +50849,7 @@ jWs jWs jWs jWs -iUK +jWs jWs qbk wvF @@ -51138,7 +51138,7 @@ bWy bZV ctC azL -aBr +yis ctC aDN aER @@ -51619,7 +51619,7 @@ jWs jWs jWs jWs -jWs +iUK jWs jWs jWs @@ -54731,7 +54731,7 @@ aac aac aac mfp -buh +ubo mLe cxg kkL @@ -57560,7 +57560,7 @@ aac aac nkp kcw -amy +thz kcw kcw kcw @@ -60122,7 +60122,7 @@ aKB oKo oKo ras -aTo +lUw cuP cuP fBh @@ -61910,7 +61910,7 @@ cva ybN jWi bdU -jwS +ulv ybN aGf aGL @@ -64062,7 +64062,7 @@ blE blJ blJ bpU -bpt +uPR bqa bqv bqJ @@ -64162,7 +64162,7 @@ pIa cdo aam aar -aem +wEU adC cdo ced @@ -64946,7 +64946,7 @@ aam ahn aar aar -cph +xFT ced ced hmw @@ -66114,7 +66114,7 @@ cdo aar aam aJn -caT +spp aJn aar aar @@ -68884,7 +68884,7 @@ caf ijo aAC aCc -cdf +dWu cea ceI cfx @@ -69664,7 +69664,7 @@ cdZ gAm aAF aCf -cdf +dWu cea ceI cfx @@ -70327,7 +70327,7 @@ tjo rqL oWO sHP -vDl +iuh tPl sHP aad @@ -71803,7 +71803,7 @@ bPf bPf asO cdh -auS +cHm cgW cgW bZB @@ -83966,7 +83966,7 @@ ixD sXl eUW kmt -enQ +xUo sXl pqG vsy @@ -84846,7 +84846,7 @@ aad uux adR aeh -aeA +mcD adz afs ady @@ -86040,7 +86040,7 @@ abX aue aiV awv -aeA +mcD adz ccz vEp @@ -87083,7 +87083,7 @@ mLn tgC tgC tgC -sWr +ejw tgC tgC wHW @@ -87477,7 +87477,7 @@ wHW wHW hyu wHW -vsG +sah tgC mLn mLn diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 186aa61b7835..8007d13db89e 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -1110,6 +1110,19 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"adC" = ( +/obj/structure/surface/rack, +/obj/item/stock_parts/manipulator/nano{ + pixel_y = -9 + }, +/obj/item/stock_parts/scanning_module/adv{ + pixel_y = 15; + pixel_x = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "adD" = ( /obj/structure/window/reinforced{ dir = 1; @@ -1431,6 +1444,15 @@ allow_construction = 0 }, /area/almayer/stair_clone) +"aeM" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "aeN" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -3744,23 +3766,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/repair_bay) -"amq" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 8 - }, -/turf/open/floor/almayer{ - icon_state = "red" - }, -/area/almayer/command/lifeboat) -"ams" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "red" - }, -/area/almayer/command/lifeboat) "amw" = ( /turf/open/floor/almayer{ dir = 9; @@ -5173,12 +5178,6 @@ icon_state = "test_floor4" }, /area/almayer/living/pilotbunks) -"aqC" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 5 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) "aqD" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/door_control{ @@ -5224,6 +5223,12 @@ icon_state = "red" }, /area/almayer/command/lifeboat) +"aqK" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "aqM" = ( /obj/effect/projector{ name = "Almayer_Up2"; @@ -5634,16 +5639,6 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engineering_workshop/hangar) -"asb" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ - id_tag = "Boat2-D2"; - linked_dock = "almayer-lifeboat2"; - throw_dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/command/lifeboat) "asc" = ( /turf/open/floor/almayer{ dir = 1; @@ -5835,7 +5830,7 @@ name = "ARES Core Access"; pixel_x = -24; pixel_y = 24; - req_one_access_txt = "1;200;90;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -7825,14 +7820,6 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering) -"ayg" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 5 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "ayh" = ( /obj/structure/machinery/power/smes/buildable, /obj/structure/sign/safety/hazard{ @@ -10651,10 +10638,6 @@ icon_state = "mono" }, /area/almayer/medical/hydroponics) -"aIM" = ( -/obj/structure/largecrate/random, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "aIP" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -11062,7 +11045,7 @@ name = "ARES Chamber Lockdown"; pixel_x = 24; pixel_y = -8; - req_one_access_txt = "1;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/structure/machinery/door_control{ id = "ARES Railing"; @@ -11610,20 +11593,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) -"aMR" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) -"aMS" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) "aMT" = ( /turf/open/floor/almayer{ icon_state = "plate" @@ -11680,6 +11649,12 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_f_s) +"aNl" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "aNm" = ( /turf/open/floor/wood/ship, /area/almayer/living/chapel) @@ -12058,15 +12033,6 @@ icon_state = "red" }, /area/almayer/squads/alpha) -"aPk" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/command/lifeboat) "aPl" = ( /obj/structure/machinery/cm_vending/clothing/marine/alpha{ density = 0; @@ -13360,6 +13326,13 @@ /obj/structure/largecrate/random/barrel/blue, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"aVC" = ( +/obj/structure/machinery/vending/cigarette, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "aVF" = ( /obj/structure/closet/secure_closet/engineering_electrical, /obj/structure/machinery/light/small, @@ -16421,6 +16394,11 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"blJ" = ( +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/starboard) "blZ" = ( /obj/structure/surface/table/reinforced/prison, /obj/structure/machinery/computer/med_data/laptop, @@ -20495,14 +20473,6 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) -"bFD" = ( -/obj/structure/pipes/vents/pump/no_boom{ - dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "bFJ" = ( /obj/docking_port/stationary/marine_dropship/almayer_hangar_2, /turf/open/floor/plating, @@ -20520,6 +20490,15 @@ "bGb" = ( /turf/closed/wall/almayer, /area/almayer/hallways/port_hallway) +"bGc" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/command/lifeboat) "bGe" = ( /obj/structure/machinery/light{ dir = 1 @@ -21884,7 +21863,7 @@ name = "ARES Core Lockdown"; pixel_x = 24; pixel_y = -8; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/structure/machinery/camera/autoname/almayer/containment/ares{ dir = 8; @@ -23531,6 +23510,25 @@ "bSy" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/engine_core) +"bSD" = ( +/obj/item/reagent_container/glass/bucket{ + pixel_x = -4; + pixel_y = -3 + }, +/obj/item/reagent_container/glass/bucket{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/reagent_container/glass/bucket{ + pixel_x = -4 + }, +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "bSG" = ( /obj/structure/machinery/power/smes/buildable, /turf/open/floor/almayer{ @@ -24526,6 +24524,14 @@ "bXe" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) +"bXf" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "bXl" = ( /obj/structure/stairs/perspective{ dir = 1; @@ -27087,10 +27093,6 @@ icon_state = "red" }, /area/almayer/hallways/port_hallway) -"ckn" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "ckr" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk, @@ -28817,6 +28819,14 @@ icon_state = "plate" }, /area/almayer/shipboard/weapon_room) +"cFn" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/almayer/command/lifeboat) "cFA" = ( /obj/structure/surface/rack, /obj/item/tool/weldpack, @@ -28846,12 +28856,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) -"cFZ" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "cGr" = ( /turf/open/floor/almayer{ icon_state = "plate" @@ -28934,6 +28938,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) +"cIG" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "cII" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -29082,7 +29094,6 @@ pixel_y = 1 }, /turf/open/floor/almayer/no_build{ - dir = 2; icon_state = "cargo_arrow" }, /area/almayer/command/airoom) @@ -29132,6 +29143,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/processing) +"cMN" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "cMV" = ( /obj/structure/sign/prop1{ pixel_x = -32; @@ -29207,6 +29227,19 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) +"cOK" = ( +/obj/structure/prop/invuln{ + desc = "An inflated membrane. This one is puncture proof. Wow!"; + icon = 'icons/obj/items/inflatable.dmi'; + icon_state = "wall"; + name = "umbilical wall" + }, +/obj/structure/blocker/invisible_wall, +/turf/open/floor/almayer_hull{ + dir = 4; + icon_state = "outerhull_dir" + }, +/area/almayer/engineering/upper_engineering/starboard) "cOM" = ( /obj/structure/sign/safety/medical{ pixel_x = 8; @@ -29605,12 +29638,26 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) +"cXY" = ( +/obj/item/stack/catwalk, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "cXZ" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) +"cYu" = ( +/obj/structure/pipes/vents/pump{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "cYT" = ( /obj/structure/machinery/light{ dir = 8 @@ -29738,6 +29785,12 @@ }, /turf/open/floor/plating, /area/almayer/living/port_emb) +"dbq" = ( +/turf/open/floor/almayer{ + dir = 1; + icon_state = "plating_striped" + }, +/area/almayer/engineering/upper_engineering/port) "dbv" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/prop/almayer/computer{ @@ -29909,6 +29962,21 @@ icon_state = "plate" }, /area/almayer/hallways/port_umbilical) +"dfg" = ( +/obj/structure/flora/pottedplant{ + icon_state = "pottedplant_22" + }, +/obj/structure/pipes/vents/pump{ + dir = 1 + }, +/obj/item/tool/mop{ + pixel_x = -6; + pixel_y = 24 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "dfk" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -30028,6 +30096,16 @@ icon_state = "test_floor4" }, /area/almayer/hallways/starboard_umbilical) +"diz" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ + id_tag = "Boat1-D4"; + linked_dock = "almayer-lifeboat1"; + throw_dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/port) "diF" = ( /obj/structure/pipes/standard/simple/visible{ dir = 4 @@ -30056,12 +30134,6 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/alpha_bravo_shared) -"djc" = ( -/obj/structure/machinery/constructable_frame, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_a_p) "djm" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -30821,6 +30893,15 @@ allow_construction = 0 }, /area/almayer/stair_clone/upper) +"dxK" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/almayer/command/lifeboat) "dxL" = ( /obj/structure/sign/safety/fire_haz{ pixel_x = 8; @@ -31580,6 +31661,20 @@ /obj/structure/bed/chair/comfy/black, /turf/open/floor/almayer, /area/almayer/shipboard/brig/chief_mp_office) +"dPm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) +"dPC" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "dPU" = ( /obj/structure/sign/safety/nonpress_ag{ pixel_x = 32 @@ -32066,6 +32161,12 @@ icon_state = "plate" }, /area/almayer/shipboard/port_point_defense) +"eaX" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "ebd" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/plating_catwalk, @@ -33141,6 +33242,12 @@ icon_state = "logo_c" }, /area/almayer/command/cic) +"euY" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "eva" = ( /obj/structure/sign/safety/distribution_pipes{ pixel_x = 32 @@ -33223,6 +33330,10 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_f_s) +"exi" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "exr" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -33367,6 +33478,13 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) +"eAL" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/almayer/command/lifeboat) "eAU" = ( /obj/structure/bed/chair{ dir = 8 @@ -34355,6 +34473,10 @@ /obj/structure/machinery/camera/autoname/almayer/containment/ares{ dir = 1 }, +/obj/structure/machinery/computer/working_joe{ + dir = 8; + pixel_x = 29 + }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, @@ -34391,6 +34513,15 @@ /obj/effect/landmark/start/synthetic, /turf/open/floor/almayer, /area/almayer/living/synthcloset) +"eYR" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orangecorner" + }, +/area/almayer/engineering/upper_engineering/port) "eYW" = ( /obj/structure/filingcabinet/security, /turf/open/floor/wood/ship, @@ -35012,12 +35143,6 @@ icon_state = "cargo" }, /area/almayer/hull/upper_hull/u_a_s) -"foI" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "foL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35623,6 +35748,12 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) +"fCp" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "fCL" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -35828,9 +35959,6 @@ /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) "fGu" = ( -/obj/structure/disposalpipe/junction{ - dir = 1 - }, /obj/structure/machinery/door_control{ dir = 1; id = "researchlockdownext"; @@ -35847,6 +35975,10 @@ pixel_y = 1; req_access_txt = "28" }, +/obj/structure/disposalpipe/junction{ + dir = 2; + icon_state = "pipe-j2" + }, /turf/open/floor/almayer{ dir = 8; icon_state = "sterile_green_side" @@ -36161,7 +36293,7 @@ name = "ARES Operations Shutter"; pixel_x = 24; pixel_y = -8; - req_one_access_txt = "1;200;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ dir = 4; @@ -36744,12 +36876,24 @@ name = "ARES Operations Shutter"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "1;200;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) +"gbs" = ( +/obj/structure/surface/table/reinforced/black, +/obj/item/ashtray/plastic{ + icon_state = "ashtray_full_bl"; + pixel_x = 5; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "gbQ" = ( /obj/structure/toilet{ dir = 8 @@ -36943,17 +37087,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/general_equipment) -"gfh" = ( -/obj/structure/closet/crate/freezer{ - desc = "A freezer crate. There is a note attached, it reads: Do not open, property of Pvt. Mendoza." - }, -/obj/item/storage/beer_pack, -/obj/item/reagent_container/food/drinks/cans/beer, -/obj/item/reagent_container/food/drinks/cans/beer, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_a_s) "gfk" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -37163,8 +37296,7 @@ /obj/structure/machinery/computer/working_joe{ dir = 8; pixel_x = 17; - pixel_y = -6; - ticket_console = 1 + pixel_y = -6 }, /obj/item/storage/box/ids{ pixel_x = -4 @@ -37289,6 +37421,13 @@ icon_state = "plate" }, /area/almayer/shipboard/starboard_point_defense) +"gms" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "gnu" = ( /obj/structure/surface/table/almayer, /obj/item/facepaint/green, @@ -37917,7 +38056,7 @@ name = "Working Joe Cryogenics Lockdown"; pixel_x = 24; pixel_y = 8; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -38070,12 +38209,14 @@ icon_state = "cargo" }, /area/almayer/squads/delta) -"gEz" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 6 +"gEv" = ( +/obj/structure/machinery/light{ + dir = 1 }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "gEK" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -38453,7 +38594,7 @@ name = "ARES Chamber Lockdown"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "1;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/structure/machinery/door/poddoor/railing{ closed_layer = 4.1; @@ -38522,7 +38663,7 @@ name = "ARES Chamber Lockdown"; pixel_x = 24; pixel_y = 8; - req_one_access_txt = "1;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/structure/machinery/door/poddoor/railing{ closed_layer = 4; @@ -38605,6 +38746,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/medical/medical_science) +"gQO" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "gRd" = ( /obj/structure/platform, /obj/structure/target{ @@ -38956,6 +39105,31 @@ "gZK" = ( /turf/open/floor/almayer, /area/almayer/living/auxiliary_officer_office) +"gZP" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ + id_tag = "Boat2-D4"; + linked_dock = "almayer-lifeboat2"; + throw_dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/command/lifeboat) +"had" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/almayer/command/lifeboat) +"hal" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/command/lifeboat) "ham" = ( /turf/open/floor/almayer{ icon_state = "sterile_green" @@ -39811,6 +39985,12 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"htb" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/starboard) "htI" = ( /obj/structure/platform_decoration{ dir = 1 @@ -40318,6 +40498,12 @@ /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) +"hFw" = ( +/obj/structure/machinery/disposal/broken, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "hFC" = ( /obj/structure/bed/chair/comfy, /turf/open/floor/almayer{ @@ -40843,6 +41029,15 @@ "hSk" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/upper_engineering/port) +"hSt" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "hSu" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -40938,6 +41133,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"hTF" = ( +/obj/structure/machinery/suit_storage_unit/compression_suit/uscm{ + isopen = 1; + starting_helmet_type = null; + starting_mask_type = null; + starting_suit_type = null; + starting_tank_type = null + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "hTP" = ( /obj/structure/machinery/door_control{ id = "crate_room2"; @@ -41075,6 +41282,12 @@ icon_state = "blue" }, /area/almayer/command/cichallway) +"hWU" = ( +/obj/structure/largecrate/random/barrel/blue, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_a_s) "hXb" = ( /turf/open/floor/almayer{ dir = 1; @@ -41710,6 +41923,12 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south1) +"ins" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "inw" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -42014,7 +42233,7 @@ name = "ARES Chamber Lockdown"; pixel_x = -24; pixel_y = 8; - req_one_access_txt = "1;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/structure/machinery/door/poddoor/railing{ closed_layer = 4; @@ -42734,6 +42953,14 @@ icon_state = "orange" }, /area/almayer/hallways/hangar) +"iKc" = ( +/obj/structure/closet/firecloset, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "iKf" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -42785,6 +43012,15 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/general_equipment) +"iKZ" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "iLd" = ( /obj/structure/stairs/perspective{ dir = 1; @@ -42893,13 +43129,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/armory) -"iOp" = ( -/obj/structure/machinery/camera/autoname/almayer{ - name = "ship-grade camera" - }, -/obj/structure/pipes/vents/pump/no_boom, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "iOD" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -42917,6 +43146,12 @@ icon_state = "silver" }, /area/almayer/living/briefing) +"iPD" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "iPS" = ( /obj/structure/machinery/cryopod/right, /turf/open/floor/almayer{ @@ -43143,6 +43378,16 @@ icon_state = "mono" }, /area/almayer/medical/hydroponics) +"iUW" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/item/tool/crowbar/red, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "iUZ" = ( /obj/docking_port/stationary/escape_pod/cl, /turf/open/floor/plating, @@ -43181,6 +43426,13 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) +"iVY" = ( +/obj/effect/decal/hefa_cult_decals/d32, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "iVZ" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/folder/black, @@ -43356,15 +43608,6 @@ }, /turf/open/floor/almayer, /area/almayer/command/lifeboat) -"iZr" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 6; - icon_state = "red" - }, -/area/almayer/command/lifeboat) "iZw" = ( /obj/effect/step_trigger/teleporter_vector{ name = "Almayer_AresUp"; @@ -43396,12 +43639,6 @@ icon_state = "emerald" }, /area/almayer/hallways/port_hallway) -"iZL" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 9 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) "iZP" = ( /obj/structure/platform{ dir = 8 @@ -43575,6 +43812,11 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_p) +"jcP" = ( +/turf/open/floor/almayer{ + icon_state = "plating_striped" + }, +/area/almayer/engineering/upper_engineering/starboard) "jcZ" = ( /obj/structure/machinery/light{ dir = 8 @@ -43818,6 +44060,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/upper_engineering/notunnel) +"jgC" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_a_p) "jgF" = ( /obj/structure/platform, /turf/open/floor/almayer{ @@ -44103,6 +44353,13 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/engineering/upper_engineering/port) +"jlT" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/machinery/camera/autoname/almayer{ + name = "ship-grade camera" + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "jlX" = ( /obj/structure/surface/table/almayer, /obj/item/tool/hand_labeler, @@ -44596,6 +44853,15 @@ icon_state = "sterile_green_side" }, /area/almayer/shipboard/brig/surgery) +"jAJ" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/port) "jBy" = ( /obj/structure/machinery/light{ dir = 4 @@ -44628,6 +44894,15 @@ dir = 8 }, /area/almayer/medical/containment/cell) +"jBX" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/command/lifeboat) "jCa" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk, @@ -44663,7 +44938,7 @@ id = "ARES StairsUpper"; name = "ARES Core Access"; pixel_x = 24; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -44808,6 +45083,15 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"jHL" = ( +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "jHQ" = ( /obj/structure/machinery/crema_switch{ pixel_x = -24; @@ -45000,6 +45284,16 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_s) +"jMG" = ( +/obj/structure/largecrate/random/case/small, +/obj/structure/largecrate/random/mini/wooden{ + pixel_x = 4; + pixel_y = 6 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "jMK" = ( /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ pixel_y = 25 @@ -45160,6 +45454,12 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_s) +"jPq" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "jQt" = ( /turf/open/floor/almayer/research/containment/floor2{ dir = 8 @@ -45194,6 +45494,15 @@ }, /turf/closed/wall/almayer/outer, /area/space) +"jRC" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "jRK" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -45754,6 +46063,15 @@ "kcp" = ( /turf/closed/wall/almayer, /area/almayer/living/auxiliary_officer_office) +"kcA" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "kcH" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/living/synthcloset) @@ -46748,7 +47066,7 @@ name = "ARES Core Lockdown"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ dir = 8; @@ -47093,12 +47411,30 @@ /obj/effect/decal/cleanable/blood, /turf/open/floor/almayer, /area/almayer/shipboard/brig/execution) +"kHS" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "kHT" = ( /turf/open/floor/almayer{ dir = 5; icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"kHY" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "kIm" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -47270,6 +47606,19 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) +"kMK" = ( +/obj/structure/prop/invuln{ + desc = "An inflated membrane. This one is puncture proof. Wow!"; + icon = 'icons/obj/items/inflatable.dmi'; + icon_state = "wall"; + name = "umbilical wall" + }, +/obj/structure/blocker/invisible_wall, +/turf/open/floor/almayer_hull{ + dir = 8; + icon_state = "outerhull_dir" + }, +/area/almayer/engineering/upper_engineering/port) "kMU" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 @@ -47290,6 +47639,12 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/processing) +"kNk" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/plating/almayer, +/area/almayer/engineering/upper_engineering/starboard) "kNl" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47971,12 +48326,15 @@ icon_state = "cargo" }, /area/almayer/squads/charlie) -"lbE" = ( -/obj/structure/pipes/vents/pump/no_boom, +"lbB" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, /turf/open/floor/almayer{ - icon_state = "plate" + dir = 1; + icon_state = "orange" }, -/area/almayer/command/lifeboat) +/area/almayer/engineering/upper_engineering/port) "lbX" = ( /obj/structure/bed/chair{ dir = 4 @@ -48454,6 +48812,12 @@ }, /turf/open/floor/almayer, /area/almayer/living/port_emb) +"lne" = ( +/obj/structure/bed/chair, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "lnm" = ( /turf/open/floor/almayer{ icon_state = "orangecorner" @@ -48498,7 +48862,7 @@ name = "ARES Operations Shutter"; pixel_x = 24; pixel_y = -8; - req_one_access_txt = "1;200;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -48517,6 +48881,18 @@ icon_state = "plate" }, /area/almayer/squads/charlie) +"lol" = ( +/obj/structure/machinery/status_display{ + pixel_x = 16; + pixel_y = -30 + }, +/obj/structure/sign/safety/airlock{ + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "lou" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -48914,6 +49290,13 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"luY" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "luZ" = ( /obj/structure/machinery/door/poddoor/almayer/open{ dir = 2; @@ -49147,6 +49530,15 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"lAu" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/airlock/multi_tile/almayer/engidoor{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/port) "lAy" = ( /obj/structure/bed/chair/comfy/beige{ dir = 8 @@ -49333,14 +49725,6 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) -"lDO" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 10 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "lDV" = ( /obj/effect/landmark/start/marine/medic/bravo, /obj/effect/landmark/late_join/bravo, @@ -50516,6 +50900,12 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) +"mhG" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "mhI" = ( /obj/structure/machinery/vending/cigarette{ density = 0; @@ -50656,6 +51046,23 @@ icon_state = "silver" }, /area/almayer/engineering/port_atmos) +"mkH" = ( +/obj/structure/surface/rack{ + density = 0; + pixel_y = 16 + }, +/obj/structure/surface/rack{ + layer = 2.5 + }, +/obj/item/storage/fancy/candle_box{ + pixel_x = 6; + pixel_y = -2 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "mlb" = ( /obj/effect/decal/warning_stripes{ icon_state = "S"; @@ -50977,6 +51384,12 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"msP" = ( +/obj/structure/largecrate/random/case/double, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "msV" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/plating/plating_catwalk, @@ -52498,6 +52911,12 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/auxiliary_officer_office) +"nau" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "naB" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/shipboard/brig/perma) @@ -52542,6 +52961,15 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"ncp" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "ncE" = ( /obj/structure/machinery/light{ dir = 8 @@ -52624,6 +53052,15 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/engineering_workshop) +"new" = ( +/obj/item/reagent_container/glass/bucket/janibucket, +/obj/item/reagent_container/glass/bucket/janibucket{ + pixel_y = 11 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "neE" = ( /obj/structure/platform_decoration{ dir = 1 @@ -52739,6 +53176,13 @@ icon_state = "redcorner" }, /area/almayer/living/briefing) +"ngU" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/oil/streak, +/turf/open/floor/almayer, +/area/almayer/engineering/upper_engineering/starboard) "nhi" = ( /obj/structure/bed/chair/comfy, /obj/structure/window/reinforced/ultra, @@ -52921,6 +53365,12 @@ icon_state = "cargo_arrow" }, /area/almayer/hallways/vehiclehangar) +"nkn" = ( +/obj/structure/pipes/vents/pump{ + dir = 8 + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "nkx" = ( /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ pixel_y = 25 @@ -52942,15 +53392,14 @@ icon_state = "red" }, /area/almayer/shipboard/brig/cells) -"nlV" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +"nlW" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/largecrate/random/barrel/green, /turf/open/floor/almayer{ - icon_state = "test_floor4" + dir = 5; + icon_state = "orange" }, -/area/almayer/command/lifeboat) +/area/almayer/engineering/upper_engineering/starboard) "nmb" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -53217,6 +53666,15 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) +"nrO" = ( +/obj/structure/bed/chair/comfy{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "nsc" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -53705,6 +54163,14 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"nCT" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "nDd" = ( /obj/structure/closet/secure_closet/guncabinet/red, /obj/item/ammo_magazine/smg/m39, @@ -54159,20 +54625,6 @@ icon_state = "bluefull" }, /area/almayer/living/briefing) -"nMq" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "E"; - pixel_x = 1 - }, -/obj/structure/machinery/computer/working_joe{ - dir = 8; - pixel_x = 17 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "silver" - }, -/area/almayer/hallways/aft_hallway) "nMu" = ( /turf/open/floor/almayer{ dir = 9; @@ -54368,17 +54820,6 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) -"nPM" = ( -/obj/structure/machinery/door/airlock/almayer/secure/reinforced{ - dir = 2; - name = "\improper Lifeboat Control Bubble"; - req_access = null - }, -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/command/lifeboat) "nPT" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ desc = "These shutters seem to be pretty poorly mantained and almost wedged into the room.. you're not sure if these are official."; @@ -54593,6 +55034,16 @@ icon_state = "green" }, /area/almayer/hallways/starboard_hallway) +"nVX" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ + id_tag = "Boat2-D1"; + linked_dock = "almayer-lifeboat2"; + throw_dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/starboard) "nWN" = ( /obj/structure/surface/table/almayer, /turf/open/floor/wood/ship, @@ -54819,8 +55270,7 @@ }, /obj/structure/machinery/computer/working_joe{ dir = 8; - pixel_x = 17; - ticket_console = 1 + pixel_x = 17 }, /obj/structure/sign/safety/laser{ pixel_y = 24 @@ -54845,6 +55295,27 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) +"odb" = ( +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) +"odl" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/engineering/upper_engineering/starboard) +"odu" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "red" + }, +/area/almayer/command/lifeboat) "odB" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -54874,6 +55345,15 @@ }, /turf/open/floor/plating, /area/almayer/shipboard/sea_office) +"odV" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "red" + }, +/area/almayer/command/lifeboat) "oed" = ( /turf/open/floor/almayer{ icon_state = "plate" @@ -54936,6 +55416,23 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_p) +"ofH" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) +"ofK" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "ofZ" = ( /obj/structure/bed/sofa/south/grey, /turf/open/floor/almayer{ @@ -54978,6 +55475,16 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"ohH" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ + id_tag = "Boat2-D3"; + linked_dock = "almayer-lifeboat2"; + throw_dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/command/lifeboat) "ohJ" = ( /obj/structure/machinery/computer/arcade, /turf/open/floor/wood/ship, @@ -54988,14 +55495,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/north2) -"ohR" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 9 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "oih" = ( /obj/structure/bed{ icon_state = "abed" @@ -55025,6 +55524,15 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"oir" = ( +/obj/structure/pipes/vents/pump{ + dir = 8 + }, +/obj/structure/machinery/power/apc/almayer/hardened{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "oit" = ( /obj/effect/landmark/railgun_computer{ dir = 1 @@ -55358,14 +55866,6 @@ icon_state = "green" }, /area/almayer/squads/req) -"opy" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 6 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "opC" = ( /obj/structure/machinery/door/airlock/almayer/command/reinforced{ name = "\improper Combat Information Center" @@ -55886,6 +56386,16 @@ icon_state = "mono" }, /area/almayer/engineering/upper_engineering/starboard) +"ozN" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ + id_tag = "Boat2-D2"; + linked_dock = "almayer-lifeboat2"; + throw_dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/starboard) "ozT" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -55957,6 +56467,15 @@ icon_state = "silver" }, /area/almayer/command/cichallway) +"oCf" = ( +/obj/structure/machinery/light{ + unacidable = 1; + unslashable = 1 + }, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "oCi" = ( /obj/structure/sign/safety/restrictedarea{ pixel_x = -17 @@ -55975,12 +56494,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) -"oCO" = ( -/obj/structure/pipes/vents/pump/no_boom{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "oCX" = ( /turf/open/floor/almayer{ dir = 6; @@ -56228,6 +56741,12 @@ icon_state = "orange" }, /area/almayer/shipboard/brig/perma) +"oIm" = ( +/obj/structure/prop/server_equipment/broken, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "oIn" = ( /obj/structure/bed/chair{ dir = 8; @@ -56290,7 +56809,7 @@ id = "ARES StairsUpper"; name = "ARES Core Access"; pixel_x = -24; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -56349,7 +56868,7 @@ name = "ARES Core Lockdown"; pixel_x = -24; pixel_y = 8; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/structure/machinery/camera/autoname/almayer/containment/ares{ dir = 4; @@ -56465,16 +56984,6 @@ /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/north1) -"oMT" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ - id_tag = "Boat2-D1"; - linked_dock = "almayer-lifeboat2"; - throw_dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/command/lifeboat) "oNb" = ( /obj/structure/surface/table/almayer, /obj/structure/flora/pottedplant{ @@ -56528,6 +57037,12 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) +"oPf" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "oPk" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/door_control{ @@ -56784,10 +57299,6 @@ icon_state = "cargo" }, /area/almayer/squads/alpha) -"oTP" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "oUG" = ( /obj/structure/machinery/light{ dir = 8 @@ -56966,6 +57477,15 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/main_office) +"paI" = ( +/obj/structure/sign/safety/debark_lounge{ + pixel_x = 15; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "paL" = ( /turf/open/floor/almayer/uscm/directional{ dir = 1 @@ -57030,6 +57550,15 @@ icon_state = "cargo" }, /area/almayer/hallways/hangar) +"pcv" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "pcD" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -57141,6 +57670,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/navigation) +"pfc" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/airlock/multi_tile/almayer/engidoor{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/starboard) "pfh" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -57277,15 +57818,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, /area/almayer/command/computerlab) -"pjh" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "red" - }, -/area/almayer/command/lifeboat) "pji" = ( /turf/closed/wall/almayer, /area/almayer/hallways/stern_hallway) @@ -57951,6 +58483,12 @@ icon_state = "plating" }, /area/almayer/shipboard/starboard_point_defense) +"pzJ" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "pzO" = ( /obj/item/tool/warning_cone{ pixel_y = 13 @@ -57999,12 +58537,6 @@ icon_state = "orangecorner" }, /area/almayer/hull/upper_hull/u_a_s) -"pCb" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 4 - }, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "pCi" = ( /turf/closed/wall/almayer/outer, /area/almayer/hull/upper_hull/u_f_s) @@ -58100,12 +58632,6 @@ icon_state = "plate" }, /area/almayer/squads/charlie) -"pDL" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ - dir = 10 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) "pEl" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -58437,6 +58963,13 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_medbay) +"pLv" = ( +/obj/structure/device/broken_moog, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "pLO" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -59361,6 +59894,22 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) +"qeK" = ( +/obj/structure/pipes/vents/scrubber, +/obj/structure/surface/table/reinforced/black, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/cable_coil{ + pixel_x = -7; + pixel_y = 11 + }, +/obj/item/device/helmet_visor{ + pixel_x = 8; + pixel_y = 13 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "qeY" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/toy/beach_ball/holoball, @@ -59601,6 +60150,14 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) +"qjV" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "qki" = ( /obj/effect/landmark/start/marine/smartgunner/charlie, /obj/effect/landmark/late_join/charlie, @@ -60064,7 +60621,7 @@ }, /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor{ dir = 2; - id_tag = "tc04"; + id_tag = "tc02"; name = "\improper Treatment Center" }, /turf/open/floor/almayer{ @@ -60143,7 +60700,7 @@ name = "ARES Operations Shutter"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "1;200;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ dir = 8; @@ -60404,6 +60961,17 @@ /obj/effect/landmark/late_join/bravo, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/bravo) +"qDt" = ( +/obj/structure/machinery/door/airlock/almayer/secure/reinforced{ + dir = 2; + name = "\improper Lifeboat Control Bubble"; + req_access = null + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/command/lifeboat) "qDv" = ( /obj/structure/closet, /obj/item/stack/sheet/glass/large_stack, @@ -60418,12 +60986,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"qDz" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, -/turf/open/floor/almayer{ - icon_state = "red" - }, -/area/almayer/command/lifeboat) "qDN" = ( /obj/structure/machinery/light{ dir = 8 @@ -61355,6 +61917,12 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"qYu" = ( +/obj/structure/pipes/vents/pump, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "qYC" = ( /obj/structure/disposalpipe/down/almayer{ dir = 4; @@ -61843,6 +62411,12 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) +"rjG" = ( +/obj/structure/pipes/standard/tank/oxygen, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "rjH" = ( /obj/structure/surface/rack, /obj/item/storage/beer_pack, @@ -61983,6 +62557,14 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"rmf" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + icon_state = "orangecorner" + }, +/area/almayer/engineering/upper_engineering/starboard) "rmv" = ( /obj/structure/machinery/door/airlock/almayer/security{ dir = 2; @@ -62406,6 +62988,12 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) +"rwb" = ( +/obj/structure/largecrate/random/barrel/white, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_a_s) "rwv" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/bed/chair/comfy/bravo, @@ -62576,6 +63164,13 @@ icon_state = "cargo" }, /area/almayer/squads/alpha) +"rAP" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "rBa" = ( /obj/structure/machinery/cm_vending/clothing/synth, /obj/structure/prop/invuln/overhead_pipe{ @@ -62666,6 +63261,18 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) +"rCD" = ( +/obj/structure/machinery/light/small{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "rCK" = ( /obj/structure/machinery/cryopod/right, /turf/open/floor/almayer{ @@ -62693,6 +63300,12 @@ icon_state = "silver" }, /area/almayer/shipboard/brig/cic_hallway) +"rDb" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/engineering/upper_engineering/port) "rDd" = ( /obj/structure/surface/table/woodentable/fancy, /obj/structure/machinery/computer/emails{ @@ -62854,6 +63467,12 @@ icon_state = "plating" }, /area/almayer/engineering/engine_core) +"rFy" = ( +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orangecorner" + }, +/area/almayer/engineering/upper_engineering/starboard) "rFB" = ( /obj/structure/machinery/suit_storage_unit/compression_suit/uscm, /obj/effect/decal/warning_stripes{ @@ -62940,7 +63559,7 @@ }, /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor{ dir = 2; - id_tag = "tc04"; + id_tag = "tc01"; name = "\improper Treatment Center" }, /turf/open/floor/almayer{ @@ -63436,12 +64055,12 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/chief_mp_office) -"rTB" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 4 +"rTJ" = ( +/obj/effect/decal/cleanable/blood/oil/streak, +/turf/open/floor/almayer{ + icon_state = "plate" }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) +/area/almayer/engineering/upper_engineering/port) "rTV" = ( /obj/structure/sign/safety/security{ pixel_x = 32 @@ -64093,6 +64712,15 @@ icon_state = "test_floor4" }, /area/almayer/command/lifeboat) +"skg" = ( +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "skl" = ( /obj/structure/bed/chair/office/dark{ dir = 8 @@ -64335,6 +64963,15 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"spK" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/largecrate/random/secure, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "spS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64448,6 +65085,12 @@ icon_state = "greencorner" }, /area/almayer/hallways/port_hallway) +"ssU" = ( +/obj/structure/machinery/constructable_frame, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "ssW" = ( /obj/structure/closet/secure_closet/guncabinet/red, /obj/item/ammo_magazine/shotgun/buckshot, @@ -64460,6 +65103,12 @@ icon_state = "redfull" }, /area/almayer/command/cic) +"ssX" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "ssZ" = ( /obj/structure/surface/table/almayer, /obj/item/paper_bin/uscm, @@ -64538,6 +65187,14 @@ }, /turf/open/floor/almayer, /area/almayer/command/lifeboat) +"svl" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "svp" = ( /obj/structure/closet/emcloset, /turf/open/floor/almayer{ @@ -65219,12 +65876,6 @@ }, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/north1) -"sLt" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 1 - }, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "sLE" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -65394,6 +66045,12 @@ }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) +"sQO" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "sQS" = ( /obj/structure/surface/table/almayer, /obj/item/tool/stamp{ @@ -66123,6 +66780,15 @@ icon_state = "plating" }, /area/almayer/shipboard/brig/armory) +"tgK" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "tgS" = ( /obj/effect/step_trigger/clone_cleaner, /obj/structure/sign/safety/maint{ @@ -66228,6 +66894,19 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"tiw" = ( +/obj/structure/machinery/constructable_frame{ + icon_state = "box_2" + }, +/obj/item/weapon/baseballbat/metal{ + pixel_x = -2; + pixel_y = 8 + }, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "tiE" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -66276,6 +66955,12 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south1) +"tjj" = ( +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "tjl" = ( /turf/open/floor/almayer{ dir = 1; @@ -66925,6 +67610,10 @@ pixel_y = 5 }, /obj/item/tool/pen, +/obj/structure/machinery/computer/working_joe{ + dir = 8; + pixel_x = 17 + }, /turf/open/floor/almayer{ icon_state = "sterile_green_side" }, @@ -67088,6 +67777,12 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) +"tAh" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "tAi" = ( /obj/structure/sign/safety/hvac_old{ pixel_x = 8; @@ -67097,6 +67792,20 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_s) +"tAq" = ( +/obj/structure/surface/table/reinforced/black, +/obj/item/clothing/mask/breath{ + pixel_y = -5; + pixel_x = -3 + }, +/obj/item/clothing/head/helmet/space/compression/uscm, +/obj/item/cell/crap{ + pixel_x = 7 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "tAL" = ( /obj/structure/machinery/cryopod, /turf/open/floor/almayer{ @@ -67170,12 +67879,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) -"tCk" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "tCN" = ( /turf/open/floor/almayer{ dir = 8; @@ -67679,6 +68382,15 @@ }, /turf/open/floor/plating, /area/almayer/shipboard/brig/chief_mp_office) +"tNP" = ( +/obj/structure/sign/safety/debark_lounge{ + pixel_x = 15; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "tNR" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -67907,6 +68619,10 @@ /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" @@ -68158,6 +68874,20 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"tZm" = ( +/obj/structure/closet/crate/freezer{ + desc = "A freezer crate. There is a note attached, it reads: Do not open, property of Pvt. Mendoza." + }, +/obj/item/storage/beer_pack, +/obj/item/reagent_container/food/drinks/cans/beer, +/obj/item/reagent_container/food/drinks/cans/beer, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_a_s) "tZB" = ( /obj/structure/machinery/light{ dir = 1 @@ -68481,6 +69211,17 @@ /obj/structure/machinery/cm_vending/sorted/marine_food, /turf/open/floor/almayer, /area/almayer/living/briefing) +"ugJ" = ( +/obj/structure/largecrate/random/case/small, +/obj/structure/largecrate/random/mini/small_case{ + pixel_x = -1; + pixel_y = 9 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "ugT" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -68505,6 +69246,12 @@ icon_state = "cargo_arrow" }, /area/almayer/living/offices) +"uhM" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/engineering/upper_engineering/starboard) "uhP" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -68533,6 +69280,19 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/starboard) +"uiR" = ( +/obj/structure/prop/invuln{ + desc = "An inflated membrane. This one is puncture proof. Wow!"; + icon = 'icons/obj/items/inflatable.dmi'; + icon_state = "wall"; + name = "umbilical wall" + }, +/obj/structure/blocker/invisible_wall, +/turf/open/floor/almayer_hull{ + dir = 8; + icon_state = "outerhull_dir" + }, +/area/almayer/engineering/upper_engineering/starboard) "uiT" = ( /turf/open/floor/almayer{ dir = 1; @@ -68673,6 +69433,15 @@ icon_state = "rasputin15" }, /area/almayer/powered/agent) +"umy" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "umC" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -68964,12 +69733,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) -"usB" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 8 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) "usX" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -70209,14 +70972,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_s) -"uSk" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/lifeboat) "uSq" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out"; @@ -70532,6 +71287,10 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_lobby) +"uYg" = ( +/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 @@ -70548,6 +71307,15 @@ icon_state = "emerald" }, /area/almayer/living/port_emb) +"uZH" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "uZQ" = ( /obj/structure/window/framed/almayer, /turf/open/floor/plating, @@ -70677,14 +71445,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/general_equipment) -"vcV" = ( -/obj/structure/surface/rack, -/obj/item/cell/high/empty, -/obj/item/cell/high/empty, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_a_s) "vdJ" = ( /obj/structure/surface/table/almayer, /obj/item/pipe{ @@ -71370,6 +72130,21 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/port_missiles) +"vqD" = ( +/obj/item/trash/candle, +/obj/item/tool/match/paper, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) +"vqK" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "vqL" = ( /obj/item/clothing/under/shorts/black, /obj/structure/machinery/power/apc/almayer{ @@ -71490,6 +72265,10 @@ icon_state = "cargo" }, /area/almayer/living/offices) +"vsh" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "vsF" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -72098,6 +72877,14 @@ "vGk" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_m_p) +"vGr" = ( +/obj/structure/closet/firecloset, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_a_p) "vGy" = ( /obj/structure/largecrate/supply/supplies/tables_racks, /turf/open/floor/plating, @@ -72380,6 +73167,12 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/port_hallway) +"vME" = ( +/turf/open/floor/almayer{ + dir = 9; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "vMG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72553,15 +73346,6 @@ /obj/item/device/camera, /turf/open/floor/almayer, /area/almayer/command/computerlab) -"vQu" = ( -/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ - dir = 8 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "red" - }, -/area/almayer/command/lifeboat) "vQN" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1 @@ -72605,6 +73389,20 @@ dir = 10 }, /area/almayer/command/cic) +"vRu" = ( +/obj/structure/surface/rack{ + layer = 2.5 + }, +/obj/item/tool/hand_labeler{ + pixel_x = 4; + pixel_y = 11 + }, +/obj/item/storage/box/matches, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "vRz" = ( /turf/closed/wall/almayer/outer, /area/almayer/hull/lower_hull/l_f_p) @@ -72955,8 +73753,7 @@ }, /obj/structure/machinery/computer/working_joe{ dir = 4; - pixel_x = -17; - ticket_console = 1 + pixel_x = -17 }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -73191,10 +73988,6 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/operating_room_four) -"wbR" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/command/lifeboat) "wbX" = ( /obj/structure/closet/secure_closet/cmdcabinet{ pixel_y = 24 @@ -73884,6 +74677,10 @@ /obj/structure/bed/chair/comfy/ares{ dir = 1 }, +/obj/structure/pipes/vents/pump/no_boom{ + name = "Security Vent"; + desc = "Has a valve and pump attached to it, connected to multiple gas tanks." + }, /turf/open/floor/almayer/no_build{ icon_state = "plating" }, @@ -74279,7 +75076,7 @@ name = "Working Joe Cryogenics Lockdown"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "91;92" }, /obj/effect/landmark/late_join/working_joe, /obj/effect/landmark/start/working_joe, @@ -74513,6 +75310,19 @@ icon_state = "rasputin3" }, /area/almayer/powered/agent) +"wEI" = ( +/obj/structure/surface/table/reinforced/black, +/obj/item/tool/pen, +/obj/item/paper_bin/uscm{ + pixel_y = 7 + }, +/obj/item/clipboard{ + pixel_x = 12 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "wEO" = ( /obj/structure/platform_decoration{ dir = 4 @@ -74679,7 +75489,6 @@ /obj/structure/machinery/door/airlock/almayer/research/reinforced{ dir = 1; name = "\improper CMO's Bedroom"; - req_access = null; req_one_access_txt = "1;5"; access_modified = 1 }, @@ -74933,6 +75742,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/upper_engineering/starboard) +"wOK" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "wPf" = ( /obj/structure/sign/safety/reception{ pixel_x = 32; @@ -75041,6 +75859,16 @@ }, /turf/open/floor/almayer, /area/almayer/living/grunt_rnr) +"wRP" = ( +/obj/structure/pipes/vents/pump{ + dir = 1 + }, +/obj/structure/machinery/camera/autoname/almayer{ + dir = 1; + name = "ship-grade camera" + }, +/turf/open/floor/almayer, +/area/almayer/command/lifeboat) "wRT" = ( /obj/structure/largecrate/random/case/double, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -75361,6 +76189,13 @@ icon_state = "containment_corner_variant_2" }, /area/almayer/medical/containment/cell) +"wWq" = ( +/obj/structure/surface/table/reinforced/black, +/obj/item/clothing/suit/space/compression/uscm, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "wWz" = ( /turf/closed/wall/almayer/research/containment/wall/north, /area/almayer/medical/containment/cell) @@ -75488,6 +76323,19 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/general_equipment) +"wZv" = ( +/obj/structure/prop/invuln{ + desc = "An inflated membrane. This one is puncture proof. Wow!"; + icon = 'icons/obj/items/inflatable.dmi'; + icon_state = "wall"; + name = "umbilical wall" + }, +/obj/structure/blocker/invisible_wall, +/turf/open/floor/almayer_hull{ + dir = 4; + icon_state = "outerhull_dir" + }, +/area/almayer/engineering/upper_engineering/port) "wZy" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -75536,6 +76384,12 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_p) +"wZX" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/command/lifeboat) "xad" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -75772,15 +76626,6 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/operating_room_one) -"xgg" = ( -/obj/structure/machinery/power/apc/almayer/hardened{ - dir = 4 - }, -/obj/structure/pipes/vents/pump/no_boom{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "xgh" = ( /obj/structure/pipes/vents/scrubber{ dir = 4 @@ -75789,6 +76634,12 @@ icon_state = "sterile_green" }, /area/almayer/medical/lower_medical_lobby) +"xgm" = ( +/obj/structure/reagent_dispensers/oxygentank, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "xgn" = ( /obj/structure/ladder{ height = 1; @@ -76176,6 +77027,12 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/port_point_defense) +"xoO" = ( +/turf/open/floor/almayer{ + dir = 10; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "xoS" = ( /obj/effect/decal/warning_stripes{ icon_state = "N" @@ -76522,7 +77379,7 @@ name = "ARES Core Lockdown"; pixel_x = 24; pixel_y = 8; - req_one_access_txt = "19;200;90;91;92" + req_one_access_txt = "90;91;92" }, /obj/effect/step_trigger/clone_cleaner, /turf/open/floor/almayer/no_build{ @@ -76735,6 +77592,9 @@ layer = 2.9; pixel_x = -8 }, +/obj/structure/machinery/computer/working_joe{ + pixel_y = 16 + }, /turf/open/floor/almayer{ icon_state = "mono" }, @@ -76847,6 +77707,16 @@ "xBe" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/engineering/upper_engineering) +"xBn" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ + id_tag = "Boat1-D3"; + linked_dock = "almayer-lifeboat1"; + throw_dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/engineering/upper_engineering/port) "xBQ" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -77084,13 +77954,6 @@ icon_state = "red" }, /area/almayer/living/briefing) -"xGU" = ( -/obj/structure/pipes/standard/simple/hidden/supply/no_boom, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "red" - }, -/area/almayer/command/lifeboat) "xHe" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -77203,6 +78066,12 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"xJn" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "xJC" = ( /obj/structure/machinery/door/airlock/almayer/generic/corporate{ name = "Corporate Liaison's Closet" @@ -77226,6 +78095,18 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/hangar) +"xKM" = ( +/obj/structure/machinery/status_display{ + pixel_x = 16; + pixel_y = -30 + }, +/obj/structure/sign/safety/airlock{ + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/starboard) "xKT" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/machinery/power/apc/almayer{ @@ -77463,6 +78344,15 @@ /obj/structure/largecrate/random/barrel/white, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"xPZ" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/port) "xQa" = ( /obj/structure/bed/chair/office/dark{ dir = 4 @@ -77794,7 +78684,7 @@ name = "ARES Core Access"; pixel_x = 24; pixel_y = 24; - req_one_access_txt = "1;200;90;91;92" + req_one_access_txt = "90;91;92" }, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" @@ -77921,16 +78811,6 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) -"xXu" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 1; - name = "ship-grade camera" - }, -/obj/structure/pipes/vents/pump/no_boom{ - dir = 1 - }, -/turf/open/floor/almayer, -/area/almayer/command/lifeboat) "xYf" = ( /obj/structure/machinery/cm_vending/clothing/sea, /turf/open/floor/almayer{ @@ -78182,6 +79062,16 @@ icon_state = "blue" }, /area/almayer/squads/delta) +"ydh" = ( +/obj/structure/pipes/vents/pump{ + dir = 1 + }, +/obj/structure/surface/table/reinforced/black, +/obj/item/tank/oxygen, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/engineering/upper_engineering/port) "ydx" = ( /obj/structure/sign/safety/hvac_old{ pixel_x = 8; @@ -78243,6 +79133,14 @@ }, /turf/open/floor/plating, /area/almayer/shipboard/brig/perma) +"ydY" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/lifeboat) "yeo" = ( /obj/structure/machinery/cm_vending/clothing/dress{ req_access = list(1) @@ -96197,7 +97095,7 @@ baI baI baI baI -bFJ +baI bGG bHB btO @@ -96999,7 +97897,7 @@ baI baI baI baI -baI +bFJ baI baI baI @@ -100663,7 +101561,7 @@ baI baI baI baI -bFR +baI bGN bHB xAY @@ -101465,7 +102363,7 @@ baI baI baI baI -baI +bFR baI baI baI @@ -116185,7 +117083,7 @@ auG azb azb azb -nMq +auG aDp apK cbr @@ -128144,7 +129042,7 @@ aag uMc vFv wOt -jhx +odl jhx keR jhx @@ -128153,21 +129051,21 @@ dwI aTS wqq agJ -nlV -ckn -foI -ckn -ckn -ayg +hal +uYg +nau +uYg +uYg +bXf aDO aDO aDO -opy -ckn -ckn -foI -ckn -nlV +gQO +uYg +uYg +nau +uYg +hal aGC wqq aTS @@ -128176,7 +129074,7 @@ soP tWi soP pDr -pDr +tWi tpd eim pql @@ -128345,9 +129243,9 @@ aaa aaa aad uMc -riJ -kPG -kPG +bNM +rmf +uZH bFt kPG kPG @@ -128358,17 +129256,17 @@ anR lNl aqq eky -pCb +aNl eky eky -lDO -wbR -wbR -wbR -ohR +nCT +vsh +vsh +vsh +ydY eky eky -pCb +aNl eky aqq aIe @@ -128379,9 +129277,9 @@ tim uWV ttd nLk -tim -khE -rID +rCD +eYR +uIv pql ajZ aaa @@ -128542,15 +129440,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aad -cuC -uMc -uMc +bdH +bdH +bdH +aac +aag cuC +htb +pfc +ptK ptK ucp cIW @@ -128560,8 +129458,8 @@ psm dKm psm aHe -iOp -oTP +jlT +exi eky eky eAC @@ -128571,8 +129469,8 @@ aBu eAC eky eky -sLt -xXu +ins +wRP aHe vuv vuv @@ -128582,12 +129480,12 @@ jWh olk jWh jWh +jWh +jAJ +lAu bYn -pql -pql -bYn -ajZ -aaa +aag +ajY aaa aaa aaa @@ -128745,15 +129643,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aae -aah -aah -aag -uMc +bdH +bdH +bdH +cuC +cuC +cuC +bNM +ofK +ptK uXL gPc trB @@ -128764,7 +129662,7 @@ psm psm eky eky -pCb +aNl eky uNV aHe @@ -128774,7 +129672,7 @@ aDQ aHe uNV eky -pCb +aNl eky rqj vuv @@ -128785,12 +129683,12 @@ qCg xjw pfA xAC -pql -aag -aah -aah -afm -aaa +jWh +lbB +uIv +bYn +bYn +bYn aaa aaa aaa @@ -128948,15 +129846,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -uMc +bdH +bdH +bdH +cuC +uiG +tfb +rFy +ofK +ptK uXL eet fcP @@ -128967,7 +129865,7 @@ xlX hSu aMT aMT -aMR +dPm qeF aHe aHe @@ -128977,7 +129875,7 @@ aEm aHe aHe okg -aMR +dPm aMT aMT iEs @@ -128988,12 +129886,12 @@ uUV rsW rsW fnQ -pql -ajZ -aaa -aaa -aaa -aaa +jWh +lbB +cKL +xXa +xoO +bYn aaa aaa aaa @@ -129151,15 +130049,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -uMc +bdH +bdH +bdH +cuC +bNM +rmf +luY +ncp +ptK cQg wxj lht @@ -129170,7 +130068,7 @@ jBB psm svf arV -aMS +wZX eky aDQ ayi @@ -129180,7 +130078,7 @@ eky jlX aDQ eky -aMS +wZX arV vUh vuv @@ -129191,12 +130089,12 @@ dkS rsW naQ fnQ -pql -ajZ -aaa -aaa -aaa -aaa +jWh +xPZ +pcv +eYR +uIv +bYn aaa aaa aaa @@ -129355,14 +130253,14 @@ aaa aaa aaa bdH -aaa -aaa -aaa -aaa -aaa -aaa -aad +bdH +bdH cuC +aeM +ofK +ptK +ptK +ptK ptK ptK afX @@ -129373,7 +130271,7 @@ psm psm eky arV -aMS +wZX eky aDQ pyy @@ -129383,7 +130281,7 @@ eky dLc aDQ eky -aMS +wZX arV eky vuv @@ -129394,15 +130292,15 @@ jWh kLc jWh jWh +jWh +jWh +jWh +lbB +oCf bYn -ajZ -aaa -aaa -aaa -aaa -aaa aaa aaa +bdH aaa aaa aaa @@ -129556,27 +130454,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -pVZ -gfh -aDg -xlX +bdH +bdH +bdH +bdH +uMc +bNM +ofK +psm kSd dmQ +tZm +dmQ +xlX +hWU +dmQ aeq psm aNe eky arV -aMS +wZX eky aHe jMQ @@ -129586,7 +130484,7 @@ eky dEn aHe eky -aMS +wZX arV eky aNe @@ -129594,15 +130492,15 @@ vuv ahb cxo nJy -fbx +boC +cxo iwh kfv -qMu -ajZ -aaa -aaa -bdH -bdH +vGr +vuv +lbB +uIv +pql bdH bdH bdH @@ -129759,37 +130657,37 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -pVZ +bdH +bdH +bdH +bdH +uMc +bNM +ofK +psm +kSd +dmQ nwu dmQ xlX -kSd +rwb dmQ jXY psm atY aMT aMT -uSk -cFZ -nPM -ckn -wbR -usB -wbR -ckn -nPM -cFZ -tCk +svl +pzJ +qDt +uYg +vsh +oPf +vsh +uYg +qDt +pzJ +sQO aMT aMT atY @@ -129798,14 +130696,14 @@ woM nqD cxo boC +cxo qMf wUN -qMu -ajZ -aaa -aaa -bdH -bdH +jgC +vuv +lbB +uIv +pql bdH bdH bdH @@ -129962,37 +130860,37 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -pVZ -pPz -dmQ +bdH +bdH +bdH +bdH +uMc +bNM +rtd +hSu xlX -dmQ +xlX +xlX +xlX +xlX +aiE dmQ atD psm psm aRp aRp -aPk +jBX akS aHe oxU bsy -xgg +oir gzw shh aHe tKf -aPk +jBX aRp edx vuv @@ -130000,15 +130898,15 @@ vuv myC crP cxo -boC -cxo -djc -qMu -ajZ -aaa -aaa -bdH -bdH +fbx +fbx +fbx +fbx +fbx +iEs +uWV +uIv +pql bdH bdH bdH @@ -130166,18 +131064,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -pVZ -pVZ -vcV -aIM +bdH +bdH +bdH +cuC +htb +pfc +psm +psm +psm +psm +pPz +xlX xlX xlX xlX @@ -130185,7 +131083,7 @@ xlX hSu qYG atM -ams +bGc atK aHe aHe @@ -130195,7 +131093,7 @@ aHe aHe aHe atM -ams +bGc atK qYG iEs @@ -130205,13 +131103,13 @@ jaj fbx boC hPg -qMu -qMu -afm -aaa -aaa -bdH -bdH +vuv +vuv +vuv +vuv +jAJ +lAu +bYn bdH bdH bdH @@ -130371,13 +131269,13 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad +bdH +cuC +bNM +tgK +tfb +skg +eaX pVZ pVZ pVZ @@ -130388,17 +131286,17 @@ pVZ pVZ aPw avu -pDL -amq -bFD +mhG +cFn +cYu aHe fdX wcR xJh aHe -lbE -vQu -iZL +qYu +dxK +dPC aMU aPw qMu @@ -130409,12 +131307,12 @@ qMu qMu qMu qMu -ajZ -aaa -aaa -aaa -bdH -bdH +euY +vME +jHL +wOK +uIv +bYn bdH bdH bdH @@ -130571,17 +131469,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aag +bdH +bdH +bdH +bdH +cuC +riJ +kHY +uhM +fcP +xJn +cuC aag aag aag @@ -130592,7 +131490,7 @@ aag aPw aqJ aBu -iZr +odu aMT aEg aDO @@ -130600,7 +131498,7 @@ aDO aDO aEg aMT -pjh +odV aBu aqp aPw @@ -130611,13 +131509,13 @@ aag aag aag aag -aag -ajZ -aaa -aaa -aaa -bdH -bdH +bYn +tAh +thV +rDb +qjV +rID +bYn bdH bdH bdH @@ -130774,17 +131672,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aah +bdH +bdH +bdH +bdH +cuC +cuC +umy +iKZ +tiw +cuC +cuC mNX mNX mNX @@ -130795,7 +131693,7 @@ cus aPw aPw atM -ams +bGc atK avu aMT @@ -130803,7 +131701,7 @@ arV aMT aMU atM -ams +bGc atK aPw aPw @@ -130814,13 +131712,13 @@ mNX mNX mNX qOk -aah -afm -aaa -aaa -aaa -bdH -bdH +bYn +bYn +tjj +kHS +rID +bYn +bYn bdH bdH bdH @@ -130977,17 +131875,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +aad +cuC +mkH +rtd +fcP +cuC +ajZ xVk xVk xVk @@ -130998,15 +131896,15 @@ xVk aad aPw vgD -pDL -qDz -xGU -cFZ -usB -cFZ -qDz -xGU -iZL +mhG +had +eAL +pzJ +oPf +pzJ +had +eAL +dPC ihX aPw ajZ @@ -131017,13 +131915,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +aad +bYn +kcA +uWV +uIv +bYn +ajZ bdH bdH bdH @@ -131180,17 +132078,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +aad +cuC +vRu +ngU +ssU +cuC +ajZ xVk xVk xVk @@ -131205,7 +132103,7 @@ aBA aqp avu eky -aMR +dPm eky aMU aqJ @@ -131220,13 +132118,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +aad +bYn +thV +uWV +uIv +bYn +ajZ bdH bdH bdH @@ -131383,17 +132281,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +aad +uMc +gbs +iEr +hFw +uMc +ajZ xVk xVk xVk @@ -131408,7 +132306,7 @@ aHe aHe mtD eky -aMS +wZX eky nKq aHe @@ -131423,13 +132321,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +aad +pql +thV +fCL +uIv +pql +ajZ bdH bdH bdH @@ -131586,17 +132484,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +aad +uMc +nrO +iEr +fcP +uMc +ajZ xVk xVk xVk @@ -131611,7 +132509,7 @@ aHe aHe avu eky -aMS +wZX eky aMU aHe @@ -131626,13 +132524,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +aad +pql +thV +fCL +uIv +pql +ajZ bdH bdH bdH @@ -131789,17 +132687,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +aad +uMc +aVC +iEr +fcP +uMc +ajZ xVk xVk xVk @@ -131814,7 +132712,7 @@ jcZ aDO qqu eky -pCb +aNl eky dFk aDO @@ -131829,13 +132727,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +aad +pql +thV +fCL +uIv +pql +ajZ bdH bdH bdH @@ -131992,17 +132890,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +aad +cuC +oIm +rtd +odb +cuC +ajZ xVk xVk xVk @@ -132017,7 +132915,7 @@ avu eky eky nJu -pCb +aNl eky eky eky @@ -132032,13 +132930,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +aad +bYn +thV +uWV +oCf +bYn +ajZ bdH bdH bdH @@ -132195,17 +133093,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +cuC +cuC +pLv +rtd +fcP +cuC +cOK xVk xVk xVk @@ -132220,7 +133118,7 @@ dnJ eky eky eky -pCb +aNl eky eky eky @@ -132235,6 +133133,107 @@ xVk xVk xVk xVk +wZv +bYn +thV +uWV +uIv +bYn +bYn +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aab +aaa +aaa +aKQ +aaa +aaa +aab +aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdH +aad +aag +aag +aag +wVb +qnP +uia +bhB +bhB +blm +bhB +bhB +bOi +xcp +kkO +gzr +kXK +bhB +bhB +bzX +bhB +bhB +ybr +vuR +vTK +aag +aag +aag +ajZ aaa aaa aaa @@ -132244,207 +133243,106 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa -aab -aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad -aag -aag -aag -wVb -qnP -uia -bhB -bhB -blm -bhB -bhB -bOi -xcp -kkO -gzr -kXK -bhB -bhB -bzX -bhB -bhB -ybr -vuR -vTK -aag -aag -aag -ajZ -aaa -aaa -aaa -aaa -aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -"} -(266,1,1) = {" -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -xVk -xVk -xVk -xVk -xVk -xVk -xVk -etf -oMT -atM -aDO -atK -eky -eky -pCb -eky -eky -atM -aDO -atK -sjr -xjz -xVk -xVk -xVk -xVk -xVk -xVk -xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aaa +aaa +aab +aaa +aaa +"} +(266,1,1) = {" +aaa +aaa +aab +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdH +bdH +aaa +aaa +uMc +iKc +iVY +cMN +trB +nVX +jcP +xVk +xVk +xVk +xVk +xVk +xVk +xVk +etf +ohH +atM +aDO +atK +eky +eky +aNl +eky +eky +atM +aDO +atK +sjr +xjz +xVk +xVk +xVk +xVk +xVk +xVk +xVk +dbq +xBn +vME +hSt +xoO +rjG +pql bdH bdH bdH @@ -132601,17 +133499,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uMc +cIG +vqD +iEr +fcP +blJ +jcP xVk xVk xVk @@ -132624,11 +133522,11 @@ aPz avu arV aMU -gEz -wbR -rTB -wbR -aqC +ssX +vsh +iPD +vsh +fCp avu arV aMU @@ -132641,13 +133539,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +dbq +gIJ +thV +fCL +lne +wEI +pql bdH bdH bdH @@ -132804,17 +133702,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uMc +dfg +rAP +vqK +lht +blJ +jcP xVk xVk xVk @@ -132827,11 +133725,11 @@ aPz aqJ aBu aqp -oCO +nkn lyw iZg lyw -oCO +nkn aqJ aBu aqp @@ -132844,13 +133742,13 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -bdH -bdH +dbq +gIJ +tjj +ofH +gms +ydh +pql bdH bdH bdH @@ -133007,17 +133905,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cuC +ptK +bSD +iEr +xKM +cuC +uiR xVk xVk xVk @@ -133047,15 +133945,15 @@ xVk xVk xVk xVk +kMK +bYn +gEv +fCL +lol +jWh +bYn aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH aaa aaa aaa @@ -133210,17 +134108,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cuC +ptK +new +iEr +paI +cuC +cOK xVk xVk xVk @@ -133250,15 +134148,15 @@ xVk xVk xVk xVk +wZv +bYn +vVw +fCL +tNP +jWh +bYn aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH aaa aaa aaa @@ -133413,17 +134311,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uMc +jMG +uiG +iUW +trB +ozN +jcP xVk xVk xVk @@ -133432,7 +134330,7 @@ xVk xVk xVk etf -asb +gZP atM aDO atK @@ -133453,17 +134351,17 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dbq +diz +vME +hSt +xoO +adC +pql +bdH +bdH +bdH +bdH aaa aaa aaa @@ -133616,17 +134514,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uMc +msP +ugJ +kNk +cXY +blJ +jcP xVk xVk xVk @@ -133656,16 +134554,16 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dbq +gIJ +thV +fCL +lne +wWq +pql +bdH +bdH +bdH aaa aaa aaa @@ -133819,17 +134717,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uMc +spK +nlW +uZH +lht +blJ +jcP xVk xVk xVk @@ -133859,16 +134757,16 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dbq +gIJ +tjj +jRC +gms +qeK +pql +bdH +bdH +bdH aaa aaa aaa @@ -134022,17 +134920,17 @@ aaa aaa aaa aaa +bdH +bdH aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cuC +cuC +jPq +xgm +aqK +cuC +uiR xVk xVk xVk @@ -134062,16 +134960,16 @@ xVk xVk xVk xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +kMK +bYn +hTF +rTJ +tAq +bYn +bYn +bdH +bdH +bdH aaa aaa aaa @@ -134230,11 +135128,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cuC +uMc +uMc +uMc +cuC aaa xVk xVk @@ -134266,15 +135164,15 @@ xVk xVk xVk aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bYn +pql +pql +pql +bYn +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134436,7 +135334,7 @@ aaa aaa aaa aaa -aaa +bdH aaa aaa xVk @@ -134470,13 +135368,13 @@ xVk xVk aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134673,12 +135571,12 @@ xVk xVk aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134876,12 +135774,12 @@ xVk xVk aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -135079,12 +135977,12 @@ xVk xVk aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -135282,12 +136180,12 @@ xVk xVk aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -135485,12 +136383,12 @@ xVk xVk aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa diff --git a/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm b/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm index 6a0e8b169fea..eb4f5fdb6025 100644 --- a/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm +++ b/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm @@ -868,9 +868,6 @@ "dl" = ( /turf/closed/wall/r_wall/unmeltable, /area/whiskey_outpost/inside/hospital) -"dn" = ( -/turf/open/space/basic, -/area/whiskey_outpost/inside/caves) "dr" = ( /obj/structure/window/reinforced{ dir = 4; @@ -1064,13 +1061,6 @@ /obj/effect/landmark/late_join, /turf/open/gm/dirt, /area/whiskey_outpost/inside/caves/tunnel) -"dV" = ( -/obj/structure/machinery/chem_dispenser, -/turf/open/floor{ - dir = 9; - icon_state = "whitegreen" - }, -/area/whiskey_outpost/inside/hospital) "dW" = ( /turf/open/floor/plating{ icon_state = "platebot" @@ -1205,15 +1195,6 @@ /obj/effect/landmark/late_join, /turf/open/gm/dirt, /area/whiskey_outpost/inside/caves/tunnel) -"ez" = ( -/obj/structure/machinery/chem_master{ - tether_range = 4 - }, -/turf/open/floor{ - dir = 1; - icon_state = "whitegreen" - }, -/area/whiskey_outpost/inside/hospital) "eB" = ( /turf/closed/wall/rock/brown, /area/whiskey_outpost/outside/lane/three_north) @@ -1960,15 +1941,6 @@ /obj/structure/machinery/defenses/sentry/premade, /turf/open/gm/dirt, /area/whiskey_outpost/outside/lane/four_north) -"he" = ( -/obj/structure/machinery/chem_master{ - tether_range = 4 - }, -/turf/open/floor{ - dir = 6; - icon_state = "whitegreen" - }, -/area/whiskey_outpost/inside/hospital) "hf" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -2229,6 +2201,9 @@ icon_state = "floor_plate" }, /area/whiskey_outpost/inside/living) +"hP" = ( +/turf/open/space/basic, +/area/whiskey_outpost/inside/caves) "hQ" = ( /turf/open/floor/prison{ icon_state = "floor_plate" @@ -2429,16 +2404,6 @@ icon_state = "warnplate" }, /area/whiskey_outpost/outside/north/northeast) -"ix" = ( -/obj/structure/machinery/chem_dispenser, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/open/floor{ - dir = 10; - icon_state = "whitegreen" - }, -/area/whiskey_outpost/inside/hospital) "iy" = ( /obj/effect/landmark/start/whiskey/cargo, /turf/open/floor/prison{ @@ -4306,6 +4271,15 @@ /obj/item/shard, /turf/open/floor/plating, /area/whiskey_outpost/outside/south/far) +"pn" = ( +/obj/structure/machinery/floodlight{ + light_on = 1 + }, +/turf/open/floor/plating{ + dir = 6; + icon_state = "asteroidwarning" + }, +/area/whiskey_outpost/outside/north/platform) "pq" = ( /turf/closed/wall/r_wall, /area/whiskey_outpost/inside/living) @@ -5974,15 +5948,6 @@ icon_state = "floor_plate" }, /area/whiskey_outpost/inside/bunker) -"vd" = ( -/obj/structure/machinery/floodlight{ - on = 1 - }, -/turf/open/floor/plating{ - dir = 6; - icon_state = "asteroidwarning" - }, -/area/whiskey_outpost/outside/north/platform) "ve" = ( /turf/closed/wall, /area/whiskey_outpost/outside/lane/one_north) @@ -7376,28 +7341,10 @@ "Af" = ( /turf/open/gm/coast/beachcorner/north_west, /area/whiskey_outpost/outside/lane/four_south) -"Ag" = ( -/obj/structure/machinery/floodlight{ - on = 1 - }, -/turf/open/floor/plating{ - dir = 5; - icon_state = "asteroidwarning" - }, -/area/whiskey_outpost/outside/north/platform) "Ah" = ( /obj/structure/sign/poster, /turf/closed/wall/r_wall, /area/whiskey_outpost/inside/supply) -"Ak" = ( -/obj/structure/machinery/floodlight{ - on = 1 - }, -/turf/open/floor/plating{ - dir = 9; - icon_state = "asteroidwarning" - }, -/area/whiskey_outpost/outside/north/platform) "Am" = ( /obj/structure/surface/rack, /obj/effect/landmark/wo_supplies/guns/common/m41a, @@ -7976,6 +7923,15 @@ icon_state = "asteroidfloor" }, /area/whiskey_outpost/outside/north/platform) +"Cs" = ( +/obj/structure/machinery/chem_master{ + tether_range = 4 + }, +/turf/open/floor{ + dir = 6; + icon_state = "whitegreen" + }, +/area/whiskey_outpost/inside/hospital) "Ct" = ( /obj/structure/platform_decoration{ dir = 4 @@ -8044,6 +8000,16 @@ icon_state = "floor_plate" }, /area/whiskey_outpost/inside/bunker/pillbox/three) +"CC" = ( +/obj/structure/machinery/chem_dispenser, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor{ + dir = 10; + icon_state = "whitegreen" + }, +/area/whiskey_outpost/inside/hospital) "CD" = ( /turf/open/gm/river, /area/whiskey_outpost/outside/lane/one_north) @@ -8102,6 +8068,15 @@ /obj/structure/machinery/colony_floodlight, /turf/open/gm/dirt, /area/whiskey_outpost/outside/lane/four_south) +"CU" = ( +/obj/structure/machinery/floodlight{ + light_on = 1 + }, +/turf/open/floor/plating{ + dir = 5; + icon_state = "asteroidwarning" + }, +/area/whiskey_outpost/outside/north/platform) "CY" = ( /obj/structure/platform, /turf/open/gm/river, @@ -8437,6 +8412,15 @@ "Ee" = ( /turf/open/gm/coast/east, /area/whiskey_outpost/outside/river/east) +"Ef" = ( +/obj/structure/machinery/floodlight{ + light_on = 1 + }, +/turf/open/floor/plating{ + dir = 9; + icon_state = "asteroidwarning" + }, +/area/whiskey_outpost/outside/north/platform) "Eg" = ( /turf/open/gm/coast/beachcorner/north_west, /area/whiskey_outpost/outside/river/west) @@ -8483,15 +8467,6 @@ }, /turf/open/gm/coast/beachcorner2/south_east, /area/whiskey_outpost/outside/lane/four_north) -"Et" = ( -/obj/structure/machinery/floodlight{ - on = 1 - }, -/turf/open/floor/plating{ - dir = 10; - icon_state = "asteroidwarning" - }, -/area/whiskey_outpost/outside/north/platform) "Eu" = ( /turf/open/gm/coast/beachcorner/north_east, /area/whiskey_outpost/outside/river/west) @@ -10034,6 +10009,15 @@ "Lh" = ( /turf/open/gm/coast/south, /area/whiskey_outpost/outside/river/west) +"Li" = ( +/obj/structure/machinery/chem_master{ + tether_range = 4 + }, +/turf/open/floor{ + dir = 1; + icon_state = "whitegreen" + }, +/area/whiskey_outpost/inside/hospital) "Lj" = ( /obj/effect/landmark/start/whiskey/medic, /turf/open/floor/prison{ @@ -12542,6 +12526,13 @@ icon_state = "desert2" }, /area/whiskey_outpost/inside/caves/caverns/west) +"WA" = ( +/obj/structure/machinery/chem_dispenser, +/turf/open/floor{ + dir = 9; + icon_state = "whitegreen" + }, +/area/whiskey_outpost/inside/hospital) "WC" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -12660,6 +12651,15 @@ /obj/effect/landmark/start/whiskey/marine, /turf/open/jungle, /area/whiskey_outpost/outside/lane/two_south) +"Xi" = ( +/obj/structure/machinery/floodlight{ + light_on = 1 + }, +/turf/open/floor/plating{ + dir = 10; + icon_state = "asteroidwarning" + }, +/area/whiskey_outpost/outside/north/platform) "Xj" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -22669,7 +22669,7 @@ mT mT mT mT -dn +hP mT mT dl @@ -23068,12 +23068,12 @@ mT mT mT mT -dn +hP mT mT mT mT -dn +hP mT mT qz @@ -23081,11 +23081,11 @@ JF qB yh qz -dV +WA gN hb JT -ix +CC qz CE RU @@ -23485,11 +23485,11 @@ SC la As qz -ez +Li qB hb oQ -he +Cs qz iV js @@ -24329,13 +24329,13 @@ BN BN ed Dp -vd +pn aj Av zY Av aj -Ag +CU Dn kI fI @@ -25541,13 +25541,13 @@ sQ ed ed Dp -Et +Xi aj xM mY xM aj -Ak +Ef Dn kI FX @@ -28571,13 +28571,13 @@ sQ ed ed Dp -vd +pn aj Av Bt FV aj -Ag +CU Dn Dp CM @@ -29366,13 +29366,13 @@ uv sU sQ Dp -vd +pn aj Av Bt Av aj -Ag +CU Dn BN BN @@ -29783,13 +29783,13 @@ BN ed ed Dp -Et +Xi aj xM Bw xM aj -Ak +Ef Dn kI fI @@ -30578,13 +30578,13 @@ mT in ed Dp -Et +Xi aj xM Bw xM aj -Ak +Ef Dn ed AC diff --git a/maps/map_files/generic/Admin_level.dmm b/maps/map_files/generic/Admin_level.dmm index 8dd8e17e6507..43b3d26ec3f9 100644 --- a/maps/map_files/generic/Admin_level.dmm +++ b/maps/map_files/generic/Admin_level.dmm @@ -219,8 +219,15 @@ /turf/open/floor/carpet, /area/centcom/living) "eA" = ( -/obj/structure/sign/poster/pinup, -/turf/closed/wall/r_wall/unmeltable, +/obj/effect/decal/warning_stripes{ + icon_state = "N" + }, +/obj/structure/machinery/door_control{ + id = "ERT Lock Big"; + name = "Hangar Lock"; + pixel_y = -32 + }, +/turf/open/floor/plating/almayer, /area/adminlevel/ert_station) "eE" = ( /turf/open/floor/carpet/edge{ @@ -735,14 +742,15 @@ /turf/open/floor/carpet, /area/centcom/living) "tP" = ( -/obj/structure/machinery/computer/cameras/wooden_tv{ - desc = "An old TV hooked up to a video cassette recorder, you can even use it to time shift WOW."; - name = "Television set"; - network = null; - pixel_x = -4; - pixel_y = 2 +/obj/effect/decal/warning_stripes{ + icon_state = "E" }, -/turf/closed/wall/r_wall/unmeltable, +/obj/structure/machinery/door_control{ + id = "ERT Lock 4"; + name = "Hangar Lock"; + pixel_x = -24 + }, +/turf/open/floor/plating/almayer, /area/adminlevel/ert_station) "tY" = ( /obj/structure/machinery/washing_machine, @@ -785,6 +793,10 @@ icon_state = "kitchen" }, /area/adminlevel/ert_station) +"ur" = ( +/obj/docking_port/stationary/emergency_response/idle_port6, +/turf/open/floor/plating, +/area/adminlevel/ert_station) "uI" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -1383,8 +1395,8 @@ }, /obj/structure/machinery/door/poddoor/almayer{ dir = 4; - unacidable = 1; - id = "ERT Lock 1" + id = "ERT Lock 1"; + unacidable = 1 }, /turf/open/floor/almayer{ icon_state = "tcomms" @@ -1646,21 +1658,6 @@ icon_state = "greencorner" }, /area/adminlevel/ert_station) -"KH" = ( -/obj/structure/machinery/door/airlock/almayer/generic{ - damage_cap = 50000; - name = "\improper Hangar"; - no_panel = 1 - }, -/obj/structure/machinery/door/poddoor/almayer{ - dir = 4; - unacidable = 1; - id = "ERT Lock Big" - }, -/turf/open/floor/almayer{ - icon_state = "tcomms" - }, -/area/adminlevel/ert_station) "KM" = ( /obj/structure/bed/chair{ dir = 4 @@ -1821,9 +1818,18 @@ /turf/open/floor/plating/almayer, /area/adminlevel/ert_station/shuttle_dispatch) "Ni" = ( -/obj/structure/curtain/open/shower, +/obj/structure/machinery/door/airlock/almayer/generic{ + damage_cap = 50000; + name = "\improper Hangar"; + no_panel = 1 + }, +/obj/structure/machinery/door/poddoor/almayer{ + dir = 4; + id = "ERT Lock 4"; + unacidable = 1 + }, /turf/open/floor/almayer{ - icon_state = "dark_sterile" + icon_state = "tcomms" }, /area/adminlevel/ert_station) "Nk" = ( @@ -1881,8 +1887,8 @@ }, /obj/structure/machinery/door/poddoor/almayer{ dir = 4; - unacidable = 1; - id = "ERT Lock 3" + id = "ERT Lock 3"; + unacidable = 1 }, /turf/open/floor/almayer{ icon_state = "tcomms" @@ -2094,13 +2100,9 @@ }, /area/tdome) "Sk" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "E" - }, -/obj/structure/machinery/door_control{ +/obj/structure/machinery/door/poddoor/almayer{ id = "ERT Lock Big"; - name = "Hangar Lock"; - pixel_x = -24 + unacidable = 1 }, /turf/open/floor/plating/almayer, /area/adminlevel/ert_station) @@ -2305,13 +2307,6 @@ }, /turf/open/floor/plating/almayer, /area/adminlevel/ert_station/shuttle_dispatch) -"Vu" = ( -/obj/structure/machinery/shower, -/obj/item/tool/soap/syndie, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/adminlevel/ert_station) "VC" = ( /obj/structure/sign/poster/clf, /turf/closed/wall, @@ -2565,8 +2560,8 @@ }, /obj/structure/machinery/door/poddoor/almayer{ dir = 4; - unacidable = 1; - id = "ERT Lock 2" + id = "ERT Lock 2"; + unacidable = 1 }, /turf/open/floor/almayer{ icon_state = "tcomms" @@ -2613,6 +2608,11 @@ aa aa aa aa +as +as +as +as +as aa aa aa @@ -2637,29 +2637,24 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa aa aa @@ -2770,24 +2765,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -2812,11 +2789,29 @@ aC aa aa aa -aa -aa -aa -aa -aa +as +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +aC +aC +aC +aC +aC aC aC aC @@ -2922,24 +2917,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -2964,12 +2941,30 @@ aC aC aa aa +as +TT +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa aa aa aa aa aa -aC aa aa aa @@ -3074,24 +3069,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -3116,18 +3093,36 @@ aa aC aa aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +wW +wW wW wW wW wW wW +Ch +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +hZ +wW +wW +wW +wW wW wW wW @@ -3226,24 +3221,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -3268,13 +3245,31 @@ aa aC aa aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +Ya +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ly +Ya wW Ya Ly @@ -3378,24 +3373,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -3420,13 +3397,31 @@ aa aC aa aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -3530,24 +3525,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -3572,13 +3549,31 @@ aa aC aa aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +Jl +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -3682,24 +3677,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -3724,13 +3701,31 @@ aa aC aa aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -3834,24 +3829,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -3876,13 +3853,31 @@ aa aC aC aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -3986,24 +3981,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -4028,13 +4005,31 @@ aa aa aC aa -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -4138,24 +4133,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -4180,13 +4157,31 @@ ab aa aC aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -4290,24 +4285,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -4332,13 +4309,31 @@ ab aa aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -4442,24 +4437,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -4484,13 +4461,31 @@ ab ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -4594,24 +4589,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -4636,13 +4613,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW KW FB @@ -4746,24 +4741,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -4788,13 +4765,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW Ya Js @@ -4898,24 +4893,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aC @@ -4940,13 +4917,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW wW wW @@ -5050,24 +5045,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -5092,14 +5069,32 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa -eA +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW va ug AL @@ -5202,24 +5197,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -5244,13 +5221,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW YU YU @@ -5354,24 +5349,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -5396,16 +5373,34 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as wW -Vu -Ni +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +Sk +AL +AL AL AL AL @@ -5506,24 +5501,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -5548,14 +5525,32 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa -wW +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +eA +wW YU YU YU @@ -5658,24 +5653,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -5700,13 +5677,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW BV Gr @@ -5810,24 +5805,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -5852,13 +5829,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW uk CU @@ -5962,24 +5957,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -6004,13 +5981,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW yk CU @@ -6114,24 +6109,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -6156,13 +6133,31 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW yC CU @@ -6266,24 +6261,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -6308,16 +6285,34 @@ ad ab aa aC -aa -aa -aa -aa -aa -aC -aa +as +TT +as wW -yQ -CU +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW +yQ +CU CU EI Iq @@ -6418,24 +6413,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aa @@ -6460,13 +6437,31 @@ ad ab aa aC -aa -aC -aC -aC -aC -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW zg CU @@ -6570,24 +6565,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aC aC @@ -6612,14 +6589,32 @@ ad ab aa aC -aa -aC -aa -aa -aa -aa -aa -tP +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW zk CU CU @@ -6722,24 +6717,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -6764,18 +6741,37 @@ ad ab aa aC -aa -aC -aa -wW +as +TT +as wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW wW wW wW wW wW -Ch wW wW wW @@ -6785,13 +6781,12 @@ wW wW wW Zw -KH +Ni Zw wW wW hZ wW -wW Zw Oa Zw @@ -6874,24 +6869,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -6916,9 +6893,31 @@ ab ab aa aC -aa -aC -aa +as +TT +as +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo wW Ya Ly @@ -6935,11 +6934,7 @@ Ly Ly Ly Ly -Ly -Ly -Ly -Sk -Ly +tP Ya wW Ya @@ -7026,24 +7021,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7068,9 +7045,9 @@ ab aa aa aC -aa -aC -aa +as +TT +as wW KW FB @@ -7112,11 +7089,29 @@ FB FB Fo wW -aa -aC -aa -aa -hp +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW +aa +aC +aa +aa +hp hp hp hp @@ -7178,24 +7173,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7220,9 +7197,9 @@ ab aa aC aC -aa -aC -aa +as +TT +as wW KW FB @@ -7234,7 +7211,6 @@ FB FB FB FB -Jl FB FB FB @@ -7244,6 +7220,25 @@ FB FB FB FB +FB +Fo +wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +ur +FB Fo wW KW @@ -7330,24 +7325,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7372,9 +7349,9 @@ aa aa aC aa -aa -aC -aa +as +TT +as wW KW FB @@ -7416,6 +7393,24 @@ FB FB Fo wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW aa aC aa @@ -7482,24 +7477,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7524,9 +7501,9 @@ aa aC aC aa -aa -aC -aa +as +TT +as wW KW FB @@ -7568,6 +7545,24 @@ FB FB Fo wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW aa aC aa @@ -7634,24 +7629,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7676,9 +7653,9 @@ aa aC aa aa -aa -aC -aa +as +TT +as wW KW FB @@ -7720,6 +7697,24 @@ FB FB Fo wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW aa aC aa @@ -7786,24 +7781,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7828,9 +7805,9 @@ aa aC aa aa -aa -aC -aa +as +TT +as wW KW FB @@ -7872,6 +7849,24 @@ FB FB Fo wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW aa aC aa @@ -7938,24 +7933,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -7980,10 +7957,10 @@ aa aC aa aa -aa -aC -aa -wW +as +TT +as +wW KW FB FB @@ -8024,6 +8001,24 @@ FB FB Fo wW +KW +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +FB +Fo +wW aa aC aa @@ -8090,24 +8085,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -8132,9 +8109,31 @@ aa aC aa aa -aa -aC -aa +as +TT +as +wW +Ya +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Ya wW KW FB @@ -8152,10 +8151,6 @@ FB FB FB FB -FB -FB -FB -FB Fo wW KW @@ -8242,24 +8237,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -8284,9 +8261,31 @@ aa aC aa aa -aa -aC -aa +as +TT +as +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW wW KW FB @@ -8304,10 +8303,6 @@ FB FB FB FB -FB -FB -FB -FB Fo wW KW @@ -8394,24 +8389,6 @@ as as as as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as -as aa aa aa @@ -8436,31 +8413,49 @@ aC aC aa aa +as +TT +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -aC aa +aa +as +as +as +as wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo +Ya +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Js +Ya wW Ya Js @@ -8541,29 +8536,11 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +as +as +as +as +as aa aa aa @@ -8588,31 +8565,49 @@ aC aa aa aa -aa +as +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT aC -aa +aC +aC +TT +TT +TT +as +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW +wW wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo wW wW wW @@ -8738,34 +8733,34 @@ aa aa aa aa -aa -aa -aa -aC -aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as +as +as +as +as +TT +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa aa aa @@ -8890,35 +8885,35 @@ aC aC aC aC -aa -aa -aa +as +as +as +as +as +as +as +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT +TT aC -aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW -aa aC aC aC @@ -9042,36 +9037,36 @@ aa aa aa aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa aa aa -aC -aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW -aa -aC aa aa aa @@ -9175,55 +9170,55 @@ as as as aa -aC -aa -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -ds -aa -aC -aa -aa -aa -aC +aC +aa +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +aa +aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW aa -aC aa as as @@ -9349,33 +9344,33 @@ aC aa aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW aa -aC +aa +aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa +as +as aa as as @@ -9498,36 +9493,36 @@ dy ds aa aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -aa -aa -aC -aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW -aa -aC +as +as as as as @@ -9653,33 +9648,33 @@ aC aa aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW aa -aC +aa +aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa +aa +as +as +as +as +as +as as as as @@ -9804,32 +9799,32 @@ aa aC aa aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as +as aa aC TT @@ -9956,32 +9951,32 @@ aa aC aa aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as +as aa TT as @@ -10108,32 +10103,32 @@ aa aC aa aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as +as aa aC as @@ -10261,31 +10256,31 @@ aC aa aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +as +as +as +as aa aC as @@ -10412,32 +10407,32 @@ aa aC aa aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as aa aC as @@ -10565,31 +10560,31 @@ aC aa aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +as +as +as aa aC as @@ -10717,31 +10712,31 @@ aC aa aa aa -aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as aa aC as @@ -10869,31 +10864,31 @@ aC aa aa aa -aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +as +as +as aa aC as @@ -11021,31 +11016,31 @@ aC aa aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +as +as +as aa aC as @@ -11173,31 +11168,31 @@ aC aa aa aa -aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +as +as +as aa aC as @@ -11325,31 +11320,31 @@ aC aa aa aa -aC +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +as +as +as aa aC as @@ -11477,31 +11472,31 @@ aC aa aa aa -aC -aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa +aa +aa +aa +aa aa aC as @@ -11629,31 +11624,31 @@ aC aa aa aa -aC aa -wW -KW -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -FB -Fo -wW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aC as @@ -11781,31 +11776,31 @@ aa aa aa aa -aC aa -wW -Ya -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Js -Ya -wW +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +aa +aa +aa +aa aa aC as @@ -11933,32 +11928,32 @@ aa aa aa aa -aC aa -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW -wW +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa +aa +aa +as +as aC as Oi @@ -12085,32 +12080,32 @@ as as as aa -aC -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as +as aa aa aa +as +as aC as Oi @@ -12237,32 +12232,32 @@ as as as as -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +as +as aC as as diff --git a/maps/shuttles/dropship_alamo.dmm b/maps/shuttles/dropship_alamo.dmm index 8ccfac333080..7c49edfdd0d2 100644 --- a/maps/shuttles/dropship_alamo.dmm +++ b/maps/shuttles/dropship_alamo.dmm @@ -15,19 +15,16 @@ }, /area/shuttle/drop1/sulaco) "ax" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "101" - }, +/obj/structure/shuttle/part/dropship1/transparent/nose_center, +/turf/template_noop, /area/shuttle/drop1/sulaco) "be" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "74" - }, +/obj/structure/shuttle/part/dropship1/transparent/upper_right_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "bj" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "102" - }, +/obj/structure/shuttle/part/dropship1/transparent/nose_top_right, +/turf/template_noop, /area/shuttle/drop1/sulaco) "cr" = ( /obj/structure/machinery/camera/autoname/almayer/dropship_one{ @@ -47,14 +44,8 @@ }, /area/shuttle/drop1/sulaco) "cC" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "99" - }, -/area/shuttle/drop1/sulaco) -"cK" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "17" - }, +/obj/structure/shuttle/part/dropship1/nose_front_right, +/turf/template_noop, /area/shuttle/drop1/sulaco) "cR" = ( /obj/item/device/radio/intercom/alamo{ @@ -83,9 +74,8 @@ }, /area/shuttle/drop1/sulaco) "eD" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "41" - }, +/obj/structure/shuttle/part/dropship1/transparent/engine_right_cap, +/turf/template_noop, /area/shuttle/drop1/sulaco) "hG" = ( /turf/closed/shuttle/dropship1{ @@ -93,9 +83,8 @@ }, /area/shuttle/drop1/sulaco) "if" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "3" - }, +/obj/structure/shuttle/part/dropship1/left_outer_wing_connector, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "ig" = ( /turf/closed/shuttle/dropship1{ @@ -133,9 +122,8 @@ }, /area/shuttle/drop1/sulaco) "jz" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "70" - }, +/obj/structure/shuttle/part/dropship1/transparent/middle_right_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "mb" = ( /turf/template_noop, @@ -180,9 +168,8 @@ }, /area/shuttle/drop1/sulaco) "oW" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "66" - }, +/obj/structure/shuttle/part/dropship1/transparent/middle_left_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "po" = ( /turf/closed/shuttle/dropship1{ @@ -196,9 +183,8 @@ /area/shuttle/drop1/sulaco) "qu" = ( /obj/effect/attach_point/weapon/dropship1/left_wing, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "61" - }, +/obj/structure/shuttle/part/dropship1/transparent/lower_left_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "qy" = ( /turf/closed/shuttle/dropship1/transparent{ @@ -222,9 +208,8 @@ }, /area/shuttle/drop1/sulaco) "rl" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "49" - }, +/obj/structure/shuttle/part/dropship1/lower_right_wall, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "rr" = ( /turf/closed/shuttle/dropship1/transparent{ @@ -240,14 +225,12 @@ }, /area/shuttle/drop1/sulaco) "rV" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "2" - }, +/obj/structure/shuttle/part/dropship1/transparent/left_outer_bottom_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "sA" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "46" - }, +/obj/structure/shuttle/part/dropship1/lower_left_wall, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "tR" = ( /obj/item/device/radio/intercom/alamo{ @@ -259,16 +242,10 @@ icon_state = "rasputin15" }, /area/shuttle/drop1/sulaco) -"wh" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "20" - }, -/area/shuttle/drop1/sulaco) "wk" = ( /obj/effect/attach_point/weapon/dropship1/right_wing, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "65" - }, +/obj/structure/shuttle/part/dropship1/transparent/lower_right_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "wr" = ( /obj/effect/attach_point/crew_weapon/dropship1, @@ -297,15 +274,9 @@ icon_state = "rasputin15" }, /area/shuttle/drop1/sulaco) -"xu" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "44" - }, -/area/shuttle/drop1/sulaco) "xM" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "15" - }, +/obj/structure/shuttle/part/dropship1/bottom_right_wall, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "yQ" = ( /turf/closed/shuttle/dropship1/transparent{ @@ -313,14 +284,12 @@ }, /area/shuttle/drop1/sulaco) "yU" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "9" - }, +/obj/structure/shuttle/part/dropship1/bottom_left_wall, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "zw" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "71" - }, +/obj/structure/shuttle/part/dropship1/transparent/upper_left_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "zN" = ( /turf/closed/shuttle/dropship1/transparent{ @@ -378,17 +347,15 @@ /obj/effect/attach_point/electronics/dropship1{ dir = 1 }, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "85" - }, +/obj/structure/shuttle/part/dropship1/transparent/inner_left_weapons, +/turf/template_noop, /area/shuttle/drop1/sulaco) "De" = ( /obj/effect/attach_point/electronics/dropship1{ dir = 1 }, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "90" - }, +/obj/structure/shuttle/part/dropship1/transparent/inner_right_weapons, +/turf/template_noop, /area/shuttle/drop1/sulaco) "Et" = ( /turf/closed/shuttle/dropship1{ @@ -401,19 +368,12 @@ }, /area/shuttle/drop1/sulaco) "EN" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "16" - }, +/obj/structure/shuttle/part/dropship1/transparent/engine_left_exhaust, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "FA" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "40" - }, -/area/shuttle/drop1/sulaco) -"Gl" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "45" - }, +/obj/structure/shuttle/part/dropship1/transparent/engine_left_cap, +/turf/template_noop, /area/shuttle/drop1/sulaco) "Gw" = ( /turf/closed/shuttle/dropship1/transparent{ @@ -436,9 +396,8 @@ /area/shuttle/drop1/sulaco) "HP" = ( /obj/effect/attach_point/weapon/dropship1/right_fore, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "91" - }, +/obj/structure/shuttle/part/dropship1/transparent/outer_right_weapons, +/turf/template_noop, /area/shuttle/drop1/sulaco) "HS" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1{ @@ -459,9 +418,8 @@ }, /area/shuttle/drop1/sulaco) "Jm" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "21" - }, +/obj/structure/shuttle/part/dropship1/transparent/engine_right_exhaust, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "JP" = ( /turf/closed/shuttle/dropship1{ @@ -486,9 +444,8 @@ }, /area/shuttle/drop1/sulaco) "Me" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "7" - }, +/obj/structure/shuttle/part/dropship1/left_inner_wing_connector, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "MP" = ( /turf/closed/shuttle/dropship1{ @@ -496,8 +453,8 @@ }, /area/shuttle/drop1/sulaco) "NQ" = ( -/obj/docking_port/mobile/marine_dropship/alamo, -/turf/closed/shuttle/dropship1/transparent, +/obj/structure/shuttle/part/dropship1/transparent/left_inner_bottom_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "Oq" = ( /turf/closed/shuttle/dropship1/transparent{ @@ -505,6 +462,7 @@ }, /area/shuttle/drop1/sulaco) "OK" = ( +/obj/docking_port/mobile/marine_dropship/alamo, /turf/closed/shuttle/dropship1{ icon_state = "53" }, @@ -549,14 +507,12 @@ }, /area/shuttle/drop1/sulaco) "QT" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "95" - }, +/obj/structure/shuttle/part/dropship1/nose_front_left, +/turf/template_noop, /area/shuttle/drop1/sulaco) "QW" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "6" - }, +/obj/structure/shuttle/part/dropship1/transparent/right_outer_bottom_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "RI" = ( /turf/closed/shuttle/dropship1{ @@ -569,14 +525,12 @@ }, /area/shuttle/drop1/sulaco) "Ta" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "8" - }, +/obj/structure/shuttle/part/dropship1/right_inner_wing_connector, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "Te" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "5" - }, +/obj/structure/shuttle/part/dropship1/transparent/right_inner_bottom_wing, +/turf/template_noop, /area/shuttle/drop1/sulaco) "Tt" = ( /turf/open/shuttle/dropship{ @@ -617,9 +571,8 @@ /area/shuttle/drop1/sulaco) "TM" = ( /obj/effect/attach_point/weapon/dropship1/left_fore, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "84" - }, +/obj/structure/shuttle/part/dropship1/transparent/outer_left_weapons, +/turf/template_noop, /area/shuttle/drop1/sulaco) "Ua" = ( /obj/effect/attach_point/fuel/dropship1, @@ -644,14 +597,12 @@ }, /area/shuttle/drop1/sulaco) "VM" = ( -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "100" - }, +/obj/structure/shuttle/part/dropship1/transparent/nose_top_left, +/turf/template_noop, /area/shuttle/drop1/sulaco) "Wg" = ( -/turf/closed/shuttle/dropship1{ - icon_state = "4" - }, +/obj/structure/shuttle/part/dropship1/right_outer_wing_connector, +/turf/open/space/basic, /area/shuttle/drop1/sulaco) "WQ" = ( /turf/closed/shuttle/dropship1{ @@ -733,7 +684,7 @@ eD Il iC rr -cK +Jm mb mb NQ @@ -913,11 +864,11 @@ Pf nC nE rl -xu +FA Bn Qh TE -wh +EN mb mb QW @@ -936,7 +887,7 @@ mb mb mb mb -Gl +eD Gw os qy diff --git a/maps/shuttles/dropship_normandy.dmm b/maps/shuttles/dropship_normandy.dmm index e5aaaa568590..f1595cd97db9 100644 --- a/maps/shuttles/dropship_normandy.dmm +++ b/maps/shuttles/dropship_normandy.dmm @@ -5,9 +5,8 @@ }, /area/shuttle/drop2/sulaco) "af" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "74" - }, +/obj/structure/shuttle/part/dropship2/transparent/upper_right_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "aH" = ( /obj/structure/blocker/invisible_wall, @@ -17,8 +16,8 @@ }, /area/shuttle/drop2/sulaco) "bc" = ( -/obj/docking_port/mobile/marine_dropship/normandy, -/turf/closed/shuttle/dropship2/transparent, +/obj/structure/shuttle/part/dropship2/transparent/left_outer_bottom_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "bJ" = ( /turf/closed/shuttle/dropship2{ @@ -34,9 +33,8 @@ }, /area/shuttle/drop2/sulaco) "cj" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "6" - }, +/obj/structure/shuttle/part/dropship2/transparent/right_outer_bottom_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "do" = ( /obj/effect/attach_point/crew_weapon/dropship2, @@ -78,9 +76,8 @@ }, /area/shuttle/drop2/sulaco) "fQ" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "7" - }, +/obj/structure/shuttle/part/dropship2/left_inner_wing_connector, +/turf/open/space/basic, /area/shuttle/drop2/sulaco) "gD" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -118,9 +115,8 @@ }, /area/shuttle/drop2/sulaco) "iI" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "8" - }, +/obj/structure/shuttle/part/dropship2/right_inner_wing_connector, +/turf/open/space/basic, /area/shuttle/drop2/sulaco) "jc" = ( /obj/item/device/radio/intercom/normandy{ @@ -137,19 +133,16 @@ }, /area/shuttle/drop2/sulaco) "ko" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "15" - }, +/obj/structure/shuttle/part/dropship2/bottom_right_wall, +/turf/template_noop, /area/shuttle/drop2/sulaco) "kP" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "70" - }, +/obj/structure/shuttle/part/dropship2/transparent/middle_right_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "kT" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "9" - }, +/obj/structure/shuttle/part/dropship2/bottom_left_wall, +/turf/template_noop, /area/shuttle/drop2/sulaco) "lh" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -158,9 +151,8 @@ /area/shuttle/drop2/sulaco) "lz" = ( /obj/effect/attach_point/weapon/dropship2/right_fore, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "91" - }, +/obj/structure/shuttle/part/dropship2/transparent/outer_right_weapons, +/turf/template_noop, /area/shuttle/drop2/sulaco) "lH" = ( /obj/structure/machinery/computer/dropship_weapons/dropship2, @@ -200,24 +192,20 @@ /area/shuttle/drop2/sulaco) "nq" = ( /obj/effect/attach_point/weapon/dropship2/left_fore, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "84" - }, +/obj/structure/shuttle/part/dropship2/transparent/outer_left_weapons, +/turf/template_noop, /area/shuttle/drop2/sulaco) "nS" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "46" - }, +/obj/structure/shuttle/part/dropship2/lower_left_wall, +/turf/open/space/basic, /area/shuttle/drop2/sulaco) "oc" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "102" - }, +/obj/structure/shuttle/part/dropship2/transparent/nose_top_right, +/turf/template_noop, /area/shuttle/drop2/sulaco) "os" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "66" - }, +/obj/structure/shuttle/part/dropship2/transparent/middle_left_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "oS" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -248,9 +236,8 @@ }, /area/shuttle/drop2/sulaco) "rw" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "99" - }, +/obj/structure/shuttle/part/dropship2/nose_front_right, +/turf/template_noop, /area/shuttle/drop2/sulaco) "sk" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -258,9 +245,8 @@ }, /area/shuttle/drop2/sulaco) "uk" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "71" - }, +/obj/structure/shuttle/part/dropship2/transparent/upper_left_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "vd" = ( /turf/open/shuttle/dropship{ @@ -282,9 +268,8 @@ /obj/effect/attach_point/electronics/dropship2{ dir = 1 }, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "90" - }, +/obj/structure/shuttle/part/dropship2/transparent/inner_right_weapons, +/turf/template_noop, /area/shuttle/drop2/sulaco) "xe" = ( /turf/closed/shuttle/dropship2{ @@ -302,9 +287,8 @@ }, /area/shuttle/drop2/sulaco) "yh" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "41" - }, +/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap, +/turf/template_noop, /area/shuttle/drop2/sulaco) "yl" = ( /turf/closed/shuttle/dropship2{ @@ -316,11 +300,6 @@ icon_state = "27" }, /area/shuttle/drop2/sulaco) -"Ac" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "40" - }, -/area/shuttle/drop2/sulaco) "AN" = ( /turf/closed/shuttle/dropship2{ icon_state = "48" @@ -347,14 +326,8 @@ }, /area/shuttle/drop2/sulaco) "BG" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "20" - }, -/area/shuttle/drop2/sulaco) -"BM" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "44" - }, +/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap, +/turf/template_noop, /area/shuttle/drop2/sulaco) "Cl" = ( /turf/closed/shuttle/dropship2{ @@ -373,9 +346,8 @@ /area/shuttle/drop2/sulaco) "DW" = ( /obj/effect/attach_point/weapon/dropship2/right_wing, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "65" - }, +/obj/structure/shuttle/part/dropship2/transparent/lower_right_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "En" = ( /obj/structure/machinery/door/airlock/dropship_hatch/two{ @@ -431,6 +403,7 @@ }, /area/shuttle/drop2/sulaco) "Iv" = ( +/obj/docking_port/mobile/marine_dropship/normandy, /turf/closed/shuttle/dropship2{ icon_state = "53" }, @@ -444,9 +417,8 @@ /obj/effect/attach_point/electronics/dropship2{ dir = 1 }, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "85" - }, +/obj/structure/shuttle/part/dropship2/transparent/inner_left_weapons, +/turf/template_noop, /area/shuttle/drop2/sulaco) "Le" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -484,14 +456,12 @@ }, /area/shuttle/drop2/sulaco) "LY" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "101" - }, +/obj/structure/shuttle/part/dropship2/transparent/nose_center, +/turf/template_noop, /area/shuttle/drop2/sulaco) "Mx" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "100" - }, +/obj/structure/shuttle/part/dropship2/transparent/nose_top_left, +/turf/template_noop, /area/shuttle/drop2/sulaco) "ME" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -512,9 +482,8 @@ /area/shuttle/drop2/sulaco) "Nt" = ( /obj/effect/attach_point/weapon/dropship2/left_wing, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "61" - }, +/obj/structure/shuttle/part/dropship2/transparent/lower_left_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "Nw" = ( /turf/closed/shuttle/dropship2{ @@ -522,14 +491,12 @@ }, /area/shuttle/drop2/sulaco) "NM" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "3" - }, +/obj/structure/shuttle/part/dropship2/left_outer_wing_connector, +/turf/open/space/basic, /area/shuttle/drop2/sulaco) "Ov" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "5" - }, +/obj/structure/shuttle/part/dropship2/transparent/right_inner_bottom_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "OI" = ( /turf/closed/shuttle/dropship2{ @@ -588,9 +555,8 @@ }, /area/shuttle/drop2/sulaco) "QK" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "49" - }, +/obj/structure/shuttle/part/dropship2/lower_right_wall, +/turf/open/space/basic, /area/shuttle/drop2/sulaco) "Rr" = ( /turf/template_noop, @@ -609,14 +575,12 @@ }, /area/shuttle/drop2/sulaco) "RJ" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "4" - }, +/obj/structure/shuttle/part/dropship2/right_outer_wing_connector, +/turf/open/space/basic, /area/shuttle/drop2/sulaco) "SB" = ( -/turf/closed/shuttle/dropship2{ - icon_state = "95" - }, +/obj/structure/shuttle/part/dropship2/nose_front_left, +/turf/template_noop, /area/shuttle/drop2/sulaco) "SC" = ( /obj/structure/machinery/door/airlock/dropship_hatch/two{ @@ -658,9 +622,8 @@ }, /area/shuttle/drop2/sulaco) "Uu" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "17" - }, +/obj/structure/shuttle/part/dropship2/transparent/engine_right_exhaust, +/turf/template_noop, /area/shuttle/drop2/sulaco) "UP" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -673,9 +636,8 @@ }, /area/shuttle/drop2/sulaco) "Vh" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "2" - }, +/obj/structure/shuttle/part/dropship2/transparent/left_outer_inner_wing, +/turf/template_noop, /area/shuttle/drop2/sulaco) "Vs" = ( /turf/closed/shuttle/dropship2/transparent{ @@ -687,11 +649,6 @@ icon_state = "25" }, /area/shuttle/drop2/sulaco) -"VC" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "45" - }, -/area/shuttle/drop2/sulaco) "VW" = ( /obj/structure/machinery/door/airlock/hatch/cockpit/two, /obj/structure/blocker/forcefield/multitile_vehicles, @@ -710,14 +667,8 @@ }, /area/shuttle/drop2/sulaco) "Xr" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "16" - }, -/area/shuttle/drop2/sulaco) -"XX" = ( -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "21" - }, +/obj/structure/shuttle/part/dropship2/transparent/engine_left_exhaust, +/turf/template_noop, /area/shuttle/drop2/sulaco) "ZK" = ( /turf/closed/shuttle/dropship2{ @@ -739,7 +690,7 @@ Rr Rr Rr Rr -Ac +BG SQ vw sk @@ -946,11 +897,11 @@ En gG RG QK -BM +BG gD oW lh -BG +Xr Rr Rr cj @@ -969,11 +920,11 @@ Rr Rr Rr Rr -VC +yh UP es zt -XX +Uu Rr Rr Rr diff --git a/maps/shuttles/ert_twe_shuttle.dmm b/maps/shuttles/ert_twe_shuttle.dmm new file mode 100644 index 000000000000..7e518ae9af66 --- /dev/null +++ b/maps/shuttles/ert_twe_shuttle.dmm @@ -0,0 +1,334 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"b" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe25" + }, +/area/shuttle/ert) +"e" = ( +/obj/effect/landmark/ert_spawns/distress_twe, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/ert) +"f" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/ert) +"g" = ( +/obj/structure/surface/rack, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"h" = ( +/turf/open/shuttle/dropship{ + icon_state = "floor8" + }, +/area/shuttle/ert) +"i" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe3" + }, +/area/shuttle/ert) +"j" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe23" + }, +/area/shuttle/ert) +"k" = ( +/turf/closed/shuttle/ert{ + icon_state = "rightengine_3"; + opacity = 0 + }, +/area/shuttle/ert) +"l" = ( +/turf/closed/shuttle/ert{ + icon_state = "leftengine_2"; + opacity = 0 + }, +/area/shuttle/ert) +"o" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe1" + }, +/area/shuttle/ert) +"p" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin8" + }, +/area/shuttle/ert) +"q" = ( +/obj/docking_port/mobile/emergency_response/ert4, +/turf/closed/shuttle/ert{ + icon_state = "leftengine_1"; + opacity = 0 + }, +/area/shuttle/ert) +"r" = ( +/obj/structure/blocker/invisible_wall, +/obj/structure/machinery/computer/shuttle/ert, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"s" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/shuttle/ert) +"t" = ( +/obj/structure/surface/rack, +/obj/item/storage/firstaid/regular, +/obj/item/storage/belt/medical/lifesaver/full, +/obj/item/device/healthanalyzer, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"v" = ( +/turf/closed/shuttle/ert{ + icon_state = "rightengine_2"; + opacity = 0 + }, +/area/shuttle/ert) +"x" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe4" + }, +/area/shuttle/ert) +"y" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe_leftengine" + }, +/area/shuttle/ert) +"z" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe27" + }, +/area/shuttle/ert) +"A" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe21" + }, +/area/shuttle/ert) +"D" = ( +/obj/structure/machinery/door/airlock/almayer/generic, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/ert) +"E" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe22" + }, +/area/shuttle/ert) +"F" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe8" + }, +/area/shuttle/ert) +"G" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe2" + }, +/area/shuttle/ert) +"H" = ( +/obj/structure/bed/chair/dropship/passenger{ + dir = 8 + }, +/obj/effect/landmark/ert_spawns/distress_twe, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"J" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe_rightengine" + }, +/area/shuttle/ert) +"K" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin4" + }, +/area/shuttle/ert) +"L" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/shuttle/ert) +"M" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + dir = 2 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"N" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe5" + }, +/area/shuttle/ert) +"O" = ( +/turf/template_noop, +/area/template_noop) +"P" = ( +/obj/structure/bed/chair/dropship/passenger, +/obj/effect/landmark/ert_spawns/distress_twe, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"T" = ( +/turf/closed/shuttle/ert{ + icon_state = "leftengine_3"; + opacity = 0 + }, +/area/shuttle/ert) +"U" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe9" + }, +/area/shuttle/ert) +"V" = ( +/turf/closed/shuttle/ert{ + icon_state = "rightengine_1"; + opacity = 0 + }, +/area/shuttle/ert) +"W" = ( +/obj/structure/bed/chair/dropship/passenger{ + dir = 4 + }, +/obj/effect/landmark/ert_spawns/distress_twe, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) +"X" = ( +/turf/closed/shuttle/ert{ + icon_state = "twe20" + }, +/area/shuttle/ert) +"Y" = ( +/obj/structure/surface/rack, +/obj/item/storage/backpack/rmc/frame, +/obj/item/ammo_box/magazine/misc/mre, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/ert) + +(1,1,1) = {" +O +X +x +D +x +x +x +D +x +y +T +l +q +"} +(2,1,1) = {" +O +A +Y +a +W +W +W +a +t +F +x +x +o +"} +(3,1,1) = {" +X +E +L +e +e +e +e +e +K +a +a +a +M +"} +(4,1,1) = {" +z +r +h +P +P +P +P +P +h +f +f +f +G +"} +(5,1,1) = {" +b +j +s +e +e +e +e +e +p +a +a +a +M +"} +(6,1,1) = {" +O +A +g +a +H +H +H +a +t +U +N +N +i +"} +(7,1,1) = {" +O +b +N +D +N +N +N +D +N +J +k +v +V +"} diff --git a/maps/shuttles/escape_shuttle_e.dmm b/maps/shuttles/escape_shuttle_e.dmm index d8e14b742701..0ba589df217e 100644 --- a/maps/shuttles/escape_shuttle_e.dmm +++ b/maps/shuttles/escape_shuttle_e.dmm @@ -10,7 +10,7 @@ }, /area/shuttle/escape_pod) "e" = ( -/obj/docking_port/mobile/escape_shuttle/e, +/obj/docking_port/mobile/crashable/escape_shuttle/e, /turf/closed/shuttle/escapepod{ icon_state = "wall9" }, diff --git a/maps/shuttles/escape_shuttle_e_cl.dmm b/maps/shuttles/escape_shuttle_e_cl.dmm index fb35b994891d..df10125c3a3a 100644 --- a/maps/shuttles/escape_shuttle_e_cl.dmm +++ b/maps/shuttles/escape_shuttle_e_cl.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/obj/docking_port/mobile/escape_shuttle/cl, +/obj/docking_port/mobile/crashable/escape_shuttle/cl, /turf/closed/shuttle/escapepod{ icon_state = "wall9" }, diff --git a/maps/shuttles/escape_shuttle_n.dmm b/maps/shuttles/escape_shuttle_n.dmm index ff00ef6d3117..71f8515daba8 100644 --- a/maps/shuttles/escape_shuttle_n.dmm +++ b/maps/shuttles/escape_shuttle_n.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /turf/closed/shuttle/escapepod{ - icon_state = "wall6"; + icon_state = "wall6" }, /area/shuttle/escape_pod) "c" = ( -/obj/docking_port/mobile/escape_shuttle/n, +/obj/docking_port/mobile/crashable/escape_shuttle/n, /turf/closed/shuttle/escapepod{ icon_state = "wall9" }, diff --git a/maps/shuttles/escape_shuttle_s.dmm b/maps/shuttles/escape_shuttle_s.dmm index f3e4c74b480e..82391a5218d5 100644 --- a/maps/shuttles/escape_shuttle_s.dmm +++ b/maps/shuttles/escape_shuttle_s.dmm @@ -76,7 +76,7 @@ }, /area/shuttle/escape_pod) "U" = ( -/obj/docking_port/mobile/escape_shuttle/s, +/obj/docking_port/mobile/crashable/escape_shuttle/s, /turf/closed/shuttle/escapepod{ icon_state = "wall9" }, diff --git a/maps/shuttles/escape_shuttle_w.dmm b/maps/shuttles/escape_shuttle_w.dmm index d10d5fdfc1c8..8f81c83b500b 100644 --- a/maps/shuttles/escape_shuttle_w.dmm +++ b/maps/shuttles/escape_shuttle_w.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/obj/docking_port/mobile/escape_shuttle/w, +/obj/docking_port/mobile/crashable/escape_shuttle/w, /turf/closed/shuttle/escapepod{ icon_state = "wall9" }, diff --git a/maps/shuttles/lifeboat-port-archive.dmm b/maps/shuttles/lifeboat-port-archive.dmm new file mode 100644 index 000000000000..7279e78237b6 --- /dev/null +++ b/maps/shuttles/lifeboat-port-archive.dmm @@ -0,0 +1,701 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aF" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "1,6" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"cs" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,4" + }, +/area/shuttle/lifeboat) +"cT" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,4" + }, +/area/shuttle/lifeboat) +"dg" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,0" + }, +/area/shuttle/lifeboat) +"dt" = ( +/turf/open/shuttle/lifeboat{ + dir = 1; + icon_state = "plating_striped" + }, +/area/shuttle/lifeboat) +"en" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,5" + }, +/area/shuttle/lifeboat) +"ew" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "1,0" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"eL" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,1" + }, +/area/shuttle/lifeboat) +"fa" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,6" + }, +/area/shuttle/lifeboat) +"fr" = ( +/turf/closed/shuttle/lifeboat/transparent, +/area/shuttle/lifeboat) +"hY" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "26,1" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"iR" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,1" + }, +/area/shuttle/lifeboat) +"je" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair{ + dir = 4; + name = "pilot seat" + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"jU" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,6" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"jW" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "window2" + }, +/area/shuttle/lifeboat) +"jX" = ( +/obj/structure/extinguisher_cabinet/lifeboat{ + pixel_x = 8; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"lC" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,5" + }, +/area/shuttle/lifeboat) +"mr" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,3" + }, +/area/shuttle/lifeboat) +"mB" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "7,6" + }, +/area/shuttle/lifeboat) +"nf" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,1" + }, +/area/shuttle/lifeboat) +"nn" = ( +/turf/open/shuttle/lifeboat{ + icon_state = "plate" + }, +/area/shuttle/lifeboat) +"on" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "24,3" + }, +/area/shuttle/lifeboat) +"qA" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "22,0" + }, +/area/shuttle/lifeboat) +"rb" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "25,3" + }, +/area/shuttle/lifeboat) +"rp" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,1" + }, +/area/shuttle/lifeboat) +"rv" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,3" + }, +/area/shuttle/lifeboat) +"rH" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "25,4" + }, +/area/shuttle/lifeboat) +"sX" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,0" + }, +/area/shuttle/lifeboat) +"tm" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair{ + dir = 1 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"tI" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "7,0" + }, +/area/shuttle/lifeboat) +"vd" = ( +/obj/structure/extinguisher_cabinet/lifeboat{ + pixel_x = 15; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"vx" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,3" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"vz" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,1" + }, +/area/shuttle/lifeboat) +"vZ" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,0" + }, +/area/shuttle/lifeboat) +"wX" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,2" + }, +/area/shuttle/lifeboat) +"xG" = ( +/obj/docking_port/mobile/crashable/lifeboat/port, +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,0" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"yf" = ( +/obj/structure/machinery/cm_vending/sorted/supplies/lifeboat{ + pixel_x = -12; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"yE" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "25,1" + }, +/area/shuttle/lifeboat) +"yS" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "26,3" + }, +/area/shuttle/lifeboat) +"zd" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,2" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"zq" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "26,5" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"BC" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "25,6" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"Ct" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/shuttle/lifeboat{ + dir = 8 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Cz" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat1-D1"; + throw_dir = 1 + }, +/turf/open/shuttle/lifeboat{ + icon_state = "test_floor4" + }, +/area/shuttle/lifeboat) +"CI" = ( +/turf/template_noop, +/area/template_noop) +"Db" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,5" + }, +/area/shuttle/lifeboat) +"DR" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair{ + dir = 4 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"FR" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/communications{ + dir = 8 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"FZ" = ( +/obj/structure/machinery/cm_vending/sorted/medical/wall_med/lifeboat{ + pixel_x = -5; + pixel_y = 27 + }, +/obj/structure/machinery/cm_vending/sorted/supplies/lifeboat{ + pixel_x = 10; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Gf" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "25,0" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"Hv" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,5" + }, +/area/shuttle/lifeboat) +"HI" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,5" + }, +/area/shuttle/lifeboat) +"Id" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,5" + }, +/area/shuttle/lifeboat) +"Ih" = ( +/turf/closed/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Jg" = ( +/turf/open/shuttle/escapepod{ + icon_state = "floor8" + }, +/area/shuttle/lifeboat) +"Jw" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,0" + }, +/area/shuttle/lifeboat) +"Mk" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,0" + }, +/area/shuttle/lifeboat) +"MF" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,5" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"MN" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat1-D2"; + throw_dir = 1 + }, +/turf/open/shuttle/lifeboat{ + icon_state = "test_floor4" + }, +/area/shuttle/lifeboat) +"Nm" = ( +/turf/open/shuttle/lifeboat{ + icon_state = "test_floor4" + }, +/area/shuttle/lifeboat) +"Ob" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,6" + }, +/area/shuttle/lifeboat) +"Od" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "24,4" + }, +/area/shuttle/lifeboat) +"Oe" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "12,0" + }, +/area/shuttle/lifeboat) +"Ow" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "16,0" + }, +/area/shuttle/lifeboat) +"OX" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,1" + }, +/area/shuttle/lifeboat) +"PU" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,5" + }, +/area/shuttle/lifeboat) +"Qi" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,6" + }, +/area/shuttle/lifeboat) +"QH" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Ro" = ( +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Rs" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,6" + }, +/area/shuttle/lifeboat) +"RR" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "26,2" + }, +/area/shuttle/lifeboat) +"Sn" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "25,5" + }, +/area/shuttle/lifeboat) +"So" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,4" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"Sy" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "11,0" + }, +/area/shuttle/lifeboat) +"SV" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,1" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"TO" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,2" + }, +/area/shuttle/lifeboat) +"TT" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,1" + }, +/area/shuttle/lifeboat) +"Ub" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,6" + }, +/area/shuttle/lifeboat) +"Uf" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/cameras/almayer/vehicle{ + dir = 8 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"UG" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "24,2" + }, +/area/shuttle/lifeboat) +"UU" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "25,2" + }, +/area/shuttle/lifeboat) +"Ym" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "18,0" + }, +/area/shuttle/lifeboat) +"Yn" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,6" + }, +/area/shuttle/lifeboat) +"Ze" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "26,4" + }, +/area/shuttle/lifeboat) + +(1,1,1) = {" +jU +MF +So +vx +zd +SV +xG +"} +(2,1,1) = {" +aF +Db +cT +mr +TO +eL +ew +"} +(3,1,1) = {" +Yn +en +cs +rv +wX +nf +Ih +"} +(4,1,1) = {" +fa +PU +DR +DR +DR +OX +dg +"} +(5,1,1) = {" +jW +QH +Ro +Jg +Ro +tm +fr +"} +(6,1,1) = {" +jW +QH +Ro +Jg +Ro +tm +fr +"} +(7,1,1) = {" +Rs +Id +jX +nn +Ro +iR +vZ +"} +(8,1,1) = {" +mB +PU +yf +nn +Ro +OX +tI +"} +(9,1,1) = {" +Cz +dt +Ro +Jg +Ro +tm +fr +"} +(10,1,1) = {" +Nm +dt +Ro +Jg +Ro +tm +fr +"} +(11,1,1) = {" +Nm +dt +Ro +Jg +Ro +tm +fr +"} +(12,1,1) = {" +Rs +Id +Ro +nn +Ro +iR +Sy +"} +(13,1,1) = {" +mB +PU +Ro +nn +Ro +OX +Oe +"} +(14,1,1) = {" +MN +dt +Ro +Jg +Ro +tm +fr +"} +(15,1,1) = {" +Nm +dt +Ro +Jg +Ro +tm +fr +"} +(16,1,1) = {" +Nm +dt +Ro +Jg +Ro +tm +fr +"} +(17,1,1) = {" +Rs +Id +vd +nn +Ro +iR +Ow +"} +(18,1,1) = {" +Ob +HI +FZ +nn +Ro +vz +Mk +"} +(19,1,1) = {" +mB +PU +Ro +nn +Ro +OX +Ym +"} +(20,1,1) = {" +jW +QH +Ro +Jg +Ro +tm +fr +"} +(21,1,1) = {" +jW +QH +Ro +Jg +Ro +tm +fr +"} +(22,1,1) = {" +jW +QH +Ro +Jg +Ro +tm +fr +"} +(23,1,1) = {" +Rs +Id +je +je +je +iR +qA +"} +(24,1,1) = {" +Qi +lC +Uf +Ct +FR +TT +sX +"} +(25,1,1) = {" +Ub +Hv +Od +on +UG +rp +Jw +"} +(26,1,1) = {" +BC +Sn +rH +rb +UU +yE +Gf +"} +(27,1,1) = {" +CI +zq +Ze +yS +RR +hY +CI +"} diff --git a/maps/shuttles/lifeboat-port.dmm b/maps/shuttles/lifeboat-port.dmm index cba75c63cc02..0117730f6971 100644 --- a/maps/shuttles/lifeboat-port.dmm +++ b/maps/shuttles/lifeboat-port.dmm @@ -116,6 +116,11 @@ icon_state = "24,3" }, /area/shuttle/lifeboat) +"pH" = ( +/turf/open/shuttle/lifeboat{ + icon_state = "plating_striped" + }, +/area/shuttle/lifeboat) "qA" = ( /turf/closed/shuttle/lifeboat{ icon_state = "22,0" @@ -186,12 +191,19 @@ }, /area/shuttle/lifeboat) "xG" = ( -/obj/docking_port/mobile/lifeboat/port, +/obj/docking_port/mobile/crashable/lifeboat/port, /obj/structure/prop/invuln/dropship_parts/lifeboat{ icon_state = "0,0" }, /turf/template_noop, /area/shuttle/lifeboat) +"xS" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat1-D4"; + throw_dir = 2 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) "yf" = ( /obj/structure/machinery/cm_vending/sorted/supplies/lifeboat{ pixel_x = -12; @@ -257,6 +269,13 @@ }, /turf/open/shuttle/lifeboat, /area/shuttle/lifeboat) +"EW" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat1-D3"; + throw_dir = 2 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) "FR" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/computer/communications{ @@ -534,8 +553,8 @@ dt Ro Jg Ro -tm -fr +pH +EW "} (10,1,1) = {" Nm @@ -543,8 +562,8 @@ dt Ro Jg Ro -tm -fr +pH +Ro "} (11,1,1) = {" Nm @@ -552,8 +571,8 @@ dt Ro Jg Ro -tm -fr +pH +Ro "} (12,1,1) = {" Rs @@ -579,8 +598,8 @@ dt Ro Jg Ro -tm -fr +pH +xS "} (15,1,1) = {" Nm @@ -588,8 +607,8 @@ dt Ro Jg Ro -tm -fr +pH +Ro "} (16,1,1) = {" Nm @@ -597,8 +616,8 @@ dt Ro Jg Ro -tm -fr +pH +Ro "} (17,1,1) = {" Rs diff --git a/maps/shuttles/lifeboat-starboard-archive.dmm b/maps/shuttles/lifeboat-starboard-archive.dmm new file mode 100644 index 000000000000..5094315b7b6f --- /dev/null +++ b/maps/shuttles/lifeboat-starboard-archive.dmm @@ -0,0 +1,691 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ce" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,5" + }, +/area/shuttle/lifeboat) +"ci" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,6" + }, +/area/shuttle/lifeboat) +"ej" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,4" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"em" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,6" + }, +/area/shuttle/lifeboat) +"ep" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,2" + }, +/area/shuttle/lifeboat) +"ex" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,2" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"gp" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "25,4" + }, +/area/shuttle/lifeboat) +"gS" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "26,5" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"hb" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/shuttle/lifeboat{ + dir = 8 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"ho" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "7,0" + }, +/area/shuttle/lifeboat) +"hD" = ( +/obj/structure/machinery/cm_vending/sorted/medical/wall_med/lifeboat{ + pixel_x = -5; + pixel_y = 27 + }, +/obj/structure/machinery/cm_vending/sorted/supplies/lifeboat{ + pixel_x = 10; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"hQ" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,3" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"ix" = ( +/obj/structure/extinguisher_cabinet/lifeboat{ + pixel_x = 8; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"iP" = ( +/turf/closed/shuttle/lifeboat/transparent, +/area/shuttle/lifeboat) +"jA" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,0" + }, +/area/shuttle/lifeboat) +"kC" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,5" + }, +/area/shuttle/lifeboat) +"kE" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"lK" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "22,0" + }, +/area/shuttle/lifeboat) +"lS" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat2-D2"; + throw_dir = 2 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"mt" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "24,2" + }, +/area/shuttle/lifeboat) +"mA" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,3" + }, +/area/shuttle/lifeboat) +"pr" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "26,4" + }, +/area/shuttle/lifeboat) +"qV" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,6" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"rM" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,6" + }, +/area/shuttle/lifeboat) +"su" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,5" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"sO" = ( +/turf/closed/shuttle/lifeboat, +/area/shuttle/lifeboat) +"tB" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,1" + }, +/area/shuttle/lifeboat) +"uJ" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "25,6" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"uN" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "26,1" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"vG" = ( +/obj/docking_port/mobile/crashable/lifeboat/starboard, +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,0" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"wA" = ( +/turf/template_noop, +/area/template_noop) +"xI" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "25,3" + }, +/area/shuttle/lifeboat) +"zv" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,6" + }, +/area/shuttle/lifeboat) +"zz" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,5" + }, +/area/shuttle/lifeboat) +"zK" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,1" + }, +/area/shuttle/lifeboat) +"Ax" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,2" + }, +/area/shuttle/lifeboat) +"AF" = ( +/turf/open/shuttle/lifeboat{ + icon_state = "plating_striped" + }, +/area/shuttle/lifeboat) +"Bf" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "window2" + }, +/area/shuttle/lifeboat) +"BC" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,0" + }, +/area/shuttle/lifeboat) +"BP" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "18,0" + }, +/area/shuttle/lifeboat) +"Cq" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,5" + }, +/area/shuttle/lifeboat) +"CS" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "25,2" + }, +/area/shuttle/lifeboat) +"Dj" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,1" + }, +/area/shuttle/lifeboat) +"Dn" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,0" + }, +/area/shuttle/lifeboat) +"Ep" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat2-D1"; + throw_dir = 2 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"EI" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/communications{ + dir = 8 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"EP" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "16,0" + }, +/area/shuttle/lifeboat) +"FI" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "24,3" + }, +/area/shuttle/lifeboat) +"FS" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "25,0" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"GA" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "7,6" + }, +/area/shuttle/lifeboat) +"GD" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,1" + }, +/area/shuttle/lifeboat) +"GQ" = ( +/obj/structure/machinery/cm_vending/sorted/supplies/lifeboat{ + pixel_x = -12; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"HW" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,1" + }, +/area/shuttle/lifeboat) +"Io" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "1,4" + }, +/area/shuttle/lifeboat) +"KZ" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "26,3" + }, +/area/shuttle/lifeboat) +"Lk" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/cameras/almayer/vehicle{ + dir = 8 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Mu" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,5" + }, +/area/shuttle/lifeboat) +"NE" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair{ + dir = 4; + name = "pilot seat" + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"NF" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "1,0" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"NK" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,4" + }, +/area/shuttle/lifeboat) +"NO" = ( +/obj/structure/extinguisher_cabinet/lifeboat{ + pixel_x = 15; + pixel_y = 27 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Od" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,6" + }, +/area/shuttle/lifeboat) +"Ow" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "6,0" + }, +/area/shuttle/lifeboat) +"OO" = ( +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"PJ" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair{ + dir = 1 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"Qa" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "12,0" + }, +/area/shuttle/lifeboat) +"Rk" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "25,5" + }, +/area/shuttle/lifeboat) +"RH" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "0,1" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"RR" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,6" + }, +/area/shuttle/lifeboat) +"Td" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "3,5" + }, +/area/shuttle/lifeboat) +"Tn" = ( +/obj/structure/bed/chair/dropship/passenger/shuttle_chair{ + dir = 4 + }, +/turf/open/shuttle/lifeboat, +/area/shuttle/lifeboat) +"TM" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "24,4" + }, +/area/shuttle/lifeboat) +"TU" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "2,3" + }, +/area/shuttle/lifeboat) +"Up" = ( +/obj/structure/prop/invuln/dropship_parts/lifeboat{ + icon_state = "1,6" + }, +/turf/template_noop, +/area/shuttle/lifeboat) +"UG" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "23,5" + }, +/area/shuttle/lifeboat) +"Vj" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "25,1" + }, +/area/shuttle/lifeboat) +"VF" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "17,1" + }, +/area/shuttle/lifeboat) +"VZ" = ( +/turf/open/shuttle/escapepod{ + icon_state = "floor8" + }, +/area/shuttle/lifeboat) +"Xj" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,1" + }, +/area/shuttle/lifeboat) +"XV" = ( +/turf/open/shuttle/lifeboat{ + icon_state = "plate" + }, +/area/shuttle/lifeboat) +"Zl" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "24,0" + }, +/area/shuttle/lifeboat) +"ZP" = ( +/turf/closed/shuttle/lifeboat/transparent{ + icon_state = "26,2" + }, +/area/shuttle/lifeboat) +"ZR" = ( +/turf/closed/shuttle/lifeboat{ + icon_state = "11,0" + }, +/area/shuttle/lifeboat) + +(1,1,1) = {" +qV +su +ej +hQ +ex +RH +vG +"} +(2,1,1) = {" +Up +zz +Io +mA +ep +Dj +NF +"} +(3,1,1) = {" +zv +Cq +NK +TU +Ax +HW +sO +"} +(4,1,1) = {" +Od +Td +Tn +Tn +Tn +GD +Dn +"} +(5,1,1) = {" +Bf +kE +OO +VZ +OO +PJ +iP +"} +(6,1,1) = {" +Bf +kE +OO +VZ +OO +PJ +iP +"} +(7,1,1) = {" +em +kC +ix +XV +OO +zK +Ow +"} +(8,1,1) = {" +GA +Td +GQ +XV +OO +GD +ho +"} +(9,1,1) = {" +Bf +kE +OO +VZ +OO +AF +Ep +"} +(10,1,1) = {" +Bf +kE +OO +VZ +OO +AF +OO +"} +(11,1,1) = {" +Bf +kE +OO +VZ +OO +AF +OO +"} +(12,1,1) = {" +em +kC +OO +XV +OO +zK +ZR +"} +(13,1,1) = {" +GA +Td +OO +XV +OO +GD +Qa +"} +(14,1,1) = {" +Bf +kE +OO +VZ +OO +AF +lS +"} +(15,1,1) = {" +Bf +kE +OO +VZ +OO +AF +OO +"} +(16,1,1) = {" +Bf +kE +OO +VZ +OO +AF +OO +"} +(17,1,1) = {" +em +kC +NO +XV +OO +zK +EP +"} +(18,1,1) = {" +ci +ce +hD +XV +OO +VF +jA +"} +(19,1,1) = {" +GA +Td +OO +XV +OO +GD +BP +"} +(20,1,1) = {" +Bf +kE +OO +VZ +OO +PJ +iP +"} +(21,1,1) = {" +Bf +kE +OO +VZ +OO +PJ +iP +"} +(22,1,1) = {" +Bf +kE +OO +VZ +OO +PJ +iP +"} +(23,1,1) = {" +em +kC +NE +NE +NE +zK +lK +"} +(24,1,1) = {" +RR +UG +Lk +hb +EI +tB +BC +"} +(25,1,1) = {" +rM +Mu +TM +FI +mt +Xj +Zl +"} +(26,1,1) = {" +uJ +Rk +gp +xI +CS +Vj +FS +"} +(27,1,1) = {" +wA +gS +pr +KZ +ZP +uN +wA +"} diff --git a/maps/shuttles/lifeboat-starboard.dmm b/maps/shuttles/lifeboat-starboard.dmm index b1857064804c..57e302923131 100644 --- a/maps/shuttles/lifeboat-starboard.dmm +++ b/maps/shuttles/lifeboat-starboard.dmm @@ -102,7 +102,7 @@ /area/shuttle/lifeboat) "lS" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ - id = "Boat2-D2"; + id = "Boat2-D4"; throw_dir = 2 }, /turf/open/shuttle/lifeboat, @@ -159,8 +159,17 @@ }, /turf/template_noop, /area/shuttle/lifeboat) +"uX" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat2-D2"; + throw_dir = 1 + }, +/turf/open/shuttle/lifeboat{ + icon_state = "test_floor4" + }, +/area/shuttle/lifeboat) "vG" = ( -/obj/docking_port/mobile/lifeboat/starboard, +/obj/docking_port/mobile/crashable/lifeboat/starboard, /obj/structure/prop/invuln/dropship_parts/lifeboat{ icon_state = "0,0" }, @@ -174,6 +183,15 @@ icon_state = "25,3" }, /area/shuttle/lifeboat) +"ya" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ + id = "Boat2-D1"; + throw_dir = 1 + }, +/turf/open/shuttle/lifeboat{ + icon_state = "test_floor4" + }, +/area/shuttle/lifeboat) "zv" = ( /turf/closed/shuttle/lifeboat{ icon_state = "2,6" @@ -236,7 +254,7 @@ /area/shuttle/lifeboat) "Ep" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat{ - id = "Boat2-D1"; + id = "Boat2-D3"; throw_dir = 2 }, /turf/open/shuttle/lifeboat, @@ -357,6 +375,11 @@ icon_state = "12,0" }, /area/shuttle/lifeboat) +"Qj" = ( +/turf/open/shuttle/lifeboat{ + icon_state = "test_floor4" + }, +/area/shuttle/lifeboat) "Rk" = ( /turf/closed/shuttle/lifeboat{ icon_state = "25,5" @@ -373,6 +396,12 @@ icon_state = "23,6" }, /area/shuttle/lifeboat) +"SA" = ( +/turf/open/shuttle/lifeboat{ + dir = 1; + icon_state = "plating_striped" + }, +/area/shuttle/lifeboat) "Td" = ( /turf/closed/shuttle/lifeboat{ icon_state = "3,5" @@ -519,8 +548,8 @@ GD ho "} (9,1,1) = {" -Bf -kE +ya +SA OO VZ OO @@ -528,8 +557,8 @@ AF Ep "} (10,1,1) = {" -Bf -kE +Qj +SA OO VZ OO @@ -537,8 +566,8 @@ AF OO "} (11,1,1) = {" -Bf -kE +Qj +SA OO VZ OO @@ -564,8 +593,8 @@ GD Qa "} (14,1,1) = {" -Bf -kE +uX +SA OO VZ OO @@ -573,8 +602,8 @@ AF lS "} (15,1,1) = {" -Bf -kE +Qj +SA OO VZ OO @@ -582,8 +611,8 @@ AF OO "} (16,1,1) = {" -Bf -kE +Qj +SA OO VZ OO diff --git a/maps/templates/clf_ert_station.dmm b/maps/templates/clf_ert_station.dmm index 330f7b2a1819..9d6ccd92aaa0 100644 --- a/maps/templates/clf_ert_station.dmm +++ b/maps/templates/clf_ert_station.dmm @@ -1823,7 +1823,7 @@ "RB" = ( /obj/structure/flora/jungle/plantbot1{ icon_state = "alienplant1"; - luminosity = 2 + light_range = 2 }, /turf/open/gm/river, /area/adminlevel/ert_station/clf_station) diff --git a/maps/templates/twe_ert_station.dmm b/maps/templates/twe_ert_station.dmm new file mode 100644 index 000000000000..78c98b4d16a9 --- /dev/null +++ b/maps/templates/twe_ert_station.dmm @@ -0,0 +1,5116 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ad" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"ai" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"aq" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ar" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/structure/machinery/cm_vending/clothing/antag, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"aH" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 5 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out" + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"aK" = ( +/obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/plating, +/area/adminlevel/ert_station/royal_marines_station) +"aW" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "1,1" + }, +/area/adminlevel/ert_station/royal_marines_station) +"aX" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"bp" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "5,13" + }, +/area/adminlevel/ert_station/royal_marines_station) +"bs" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "3,15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"bG" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "6,12" + }, +/area/adminlevel/ert_station/royal_marines_station) +"bO" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 9 + }, +/area/adminlevel/ert_station/royal_marines_station) +"bS" = ( +/obj/structure/machinery/optable, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"co" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"cu" = ( +/obj/structure/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/adminlevel/ert_station/royal_marines_station) +"cJ" = ( +/obj/structure/bed/chair{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"cL" = ( +/obj/structure/platform{ + dir = 4 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "2,1" + }, +/area/adminlevel/ert_station/royal_marines_station) +"dc" = ( +/turf/open/floor/plating, +/area/adminlevel/ert_station/royal_marines_station) +"dd" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,8" + }, +/area/adminlevel/ert_station/royal_marines_station) +"dj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"dm" = ( +/obj/structure/closet/coffin/woodencrate, +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ds" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"du" = ( +/obj/structure/platform, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 6; + layer = 3.51 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"dK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"eh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ei" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"eu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light, +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ev" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"eV" = ( +/obj/structure/machinery/medical_pod/bodyscanner, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"eX" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"fp" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ft" = ( +/obj/structure/machinery/bioprinter{ + stored_metal = 1000 + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"fx" = ( +/obj/structure/platform{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"fD" = ( +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"fJ" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + id = "Delta_1"; + name = "\improper Bathroom" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"fM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 9 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gg" = ( +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gl" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/prop/almayer/computer/PC{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"go" = ( +/obj/structure/platform, +/obj/structure/blocker/invisible_wall, +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,0" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gq" = ( +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gx" = ( +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gJ" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gS" = ( +/turf/closed/wall/almayer/outer, +/area/adminlevel/ert_station/royal_marines_station) +"gT" = ( +/turf/open/floor/almayer{ + dir = 9; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"gU" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "1,11" + }, +/area/adminlevel/ert_station/royal_marines_station) +"hm" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,7" + }, +/area/adminlevel/ert_station/royal_marines_station) +"hp" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "3,13" + }, +/area/adminlevel/ert_station/royal_marines_station) +"hA" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"hI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"hL" = ( +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iz" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iE" = ( +/obj/structure/prop/almayer/computers/sensor_computer1{ + density = 0; + pixel_y = 16 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iG" = ( +/obj/structure/bed/alien, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iI" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,6" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iK" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,1" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iO" = ( +/obj/structure/surface/table/almayer, +/obj/item/storage/surgical_tray, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"iR" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 8 + }, +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"iS" = ( +/obj/structure/platform_decoration{ + dir = 4 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"ja" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"je" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jk" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jr" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "4,7" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ju" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jB" = ( +/obj/structure/platform, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 6 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "2,0" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jD" = ( +/obj/structure/surface/table/almayer, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jI" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,3" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jL" = ( +/turf/open/space/basic, +/area/space) +"jU" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"jV" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"jW" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "1,4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kf" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kh" = ( +/obj/structure/surface/table/almayer, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"kx" = ( +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ky" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kH" = ( +/obj/structure/largecrate/random/barrel/blue, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kL" = ( +/obj/structure/machinery/photocopier, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kO" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper_bin/uscm{ + pixel_y = 7 + }, +/obj/item/tool/pen, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kW" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"kX" = ( +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ll" = ( +/turf/open/floor/almayer{ + dir = 4; + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"lq" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "5,12" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ls" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"lF" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"lG" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"lI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/vending/security, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"lN" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"lW" = ( +/obj/structure/platform{ + dir = 8 + }, +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"lX" = ( +/obj/structure/machinery/cryopod{ + layer = 3.1; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"mb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/prop/almayer/computers/sensor_computer1{ + density = 0; + pixel_y = 16 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"mc" = ( +/obj/structure/platform, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"mo" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"mw" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"mI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/machinery/iv_drip, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"mK" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"nj" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 4 + }, +/area/adminlevel/ert_station/royal_marines_station) +"nl" = ( +/obj/structure/largecrate/random/barrel/green, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"nn" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"nw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"nI" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/machinery/cryopod{ + layer = 3.1; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"nT" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"nW" = ( +/obj/structure/closet/coffin/woodencrate, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"od" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ol" = ( +/obj/structure/machinery/door/airlock/almayer/security/colony{ + dir = 8; + name = "\improper Brig Cell" + }, +/obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; + id = "RMC_brig_2"; + name = "shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"oo" = ( +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"op" = ( +/obj/structure/platform{ + dir = 1 + }, +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"oA" = ( +/obj/structure/platform, +/turf/closed/shuttle/twe_dropship{ + icon_state = "1,0" + }, +/area/adminlevel/ert_station/royal_marines_station) +"oC" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"oY" = ( +/obj/structure/machinery/chem_dispenser, +/obj/item/reagent_container/glass/beaker/bluespace, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"oZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"pk" = ( +/obj/structure/machinery/cryopod/right, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ps" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"pJ" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 6 + }, +/area/adminlevel/ert_station/royal_marines_station) +"pL" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"pO" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "2,13" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qb" = ( +/obj/structure/bed/chair{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qi" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 9 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + layer = 2.5 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/obj/structure/machinery/recharger, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qx" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qG" = ( +/obj/structure/platform, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 10; + layer = 3.51 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qN" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"qZ" = ( +/obj/structure/largecrate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ri" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/structure/prop/almayer/hangar_stencil, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ro" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"rv" = ( +/obj/structure/machinery/sleep_console, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"rI" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 5 + }, +/area/adminlevel/ert_station/royal_marines_station) +"rP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/cryopod{ + dir = 1; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"rS" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"sb" = ( +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"su" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/cm_vending/clothing/antag, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"sy" = ( +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"sF" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"sI" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"sP" = ( +/obj/structure/surface/table/almayer, +/obj/item/roller, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"sR" = ( +/obj/structure/platform{ + dir = 8 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "6,1" + }, +/area/adminlevel/ert_station/royal_marines_station) +"te" = ( +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"tr" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "3,14" + }, +/area/adminlevel/ert_station/royal_marines_station) +"tv" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/machinery/cryopod{ + dir = 1; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"tw" = ( +/turf/open/floor/almayer{ + dir = 6; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"uc" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"uq" = ( +/obj/structure/largecrate/random/barrel, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"uC" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"uE" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"uK" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"uQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"uU" = ( +/obj/structure/largecrate/random/barrel, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"vm" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"vB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/plating_catwalk, +/area/adminlevel/ert_station/royal_marines_station) +"vD" = ( +/obj/structure/machinery/door/airlock/almayer/security/colony{ + dir = 8; + name = "\improper Brig Cell" + }, +/obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; + id = "RMC_brig_1"; + name = "shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"vR" = ( +/obj/structure/surface/table/almayer, +/obj/item/book/manual/marine_law{ + pixel_x = -3; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"wl" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "2,2" + }, +/area/adminlevel/ert_station/royal_marines_station) +"wt" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/milosoup{ + pixel_y = 10 + }, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"wF" = ( +/obj/structure/machinery/cryopod/right{ + layer = 3.1; + pixel_y = 13 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/prop/almayer/computers/sensor_computer2{ + density = 0; + pixel_y = 16 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xm" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,7" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xw" = ( +/obj/structure/machinery/door/airlock/almayer/medical{ + id_tag = null; + name = "Operating Theatre 1" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xx" = ( +/turf/open/floor/almayer{ + dir = 1; + icon_state = "redcorner" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xE" = ( +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xN" = ( +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xW" = ( +/obj/structure/bed/chair/vehicle{ + dir = 1; + pixel_x = 8 + }, +/obj/structure/bed/chair/vehicle{ + dir = 1; + pixel_x = -8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"xX" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"yK" = ( +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"yQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"yW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/spray/cleaner, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"zk" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"zw" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,12" + }, +/area/adminlevel/ert_station/royal_marines_station) +"zL" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Spare Prison Uniforms"; + req_one_access = null + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"zM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"zY" = ( +/obj/structure/surface/table/almayer, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Aa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/obj/item/device/defibrillator, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ac" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ad" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/chem_master, +/obj/item/storage/box/pillbottles{ + pixel_y = 11 + }, +/obj/item/storage/box/pillbottles{ + pixel_y = 11 + }, +/obj/item/storage/box/pillbottles{ + pixel_y = 11 + }, +/obj/item/storage/box/pillbottles{ + pixel_y = 11 + }, +/obj/item/storage/box/pillbottles{ + pixel_y = 11 + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ai" = ( +/obj/structure/platform{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Am" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Aq" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Au" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"AQ" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,6" + }, +/area/adminlevel/ert_station/royal_marines_station) +"AU" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ba" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Bh" = ( +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Bk" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"BC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"BV" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin8" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ci" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Cj" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "6,2" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Cm" = ( +/obj/item/handcuffs{ + pixel_y = 12 + }, +/obj/structure/surface/table/almayer, +/obj/item/handcuffs, +/obj/item/weapon/baton{ + pixel_x = -12 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Cu" = ( +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"CT" = ( +/turf/closed/wall/r_wall/elevator/gears, +/area/adminlevel/ert_station/royal_marines_station) +"Dc" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 29 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Dg" = ( +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orangecorner" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Do" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_x = 1; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"DA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror{ + pixel_x = -29 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"DS" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "4,15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"DU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/door/airlock/almayer/generic{ + id = "Delta_1"; + name = "\improper Bathroom" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"DV" = ( +/obj/structure/window/framed/almayer, +/turf/open/floor/plating, +/area/adminlevel/ert_station/royal_marines_station) +"Ei" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/obj/item/tool/hand_labeler, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"EG" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,8" + }, +/area/adminlevel/ert_station/royal_marines_station) +"EJ" = ( +/obj/structure/mirror{ + pixel_x = -29 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"EK" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,11" + }, +/area/adminlevel/ert_station/royal_marines_station) +"EX" = ( +/obj/structure/surface/table/almayer, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Fp" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 9 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"Fw" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"FA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"FN" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"FX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/machinery/cm_vending/gear/antag_guns, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Gd" = ( +/obj/structure/machinery/cryopod, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"GM" = ( +/turf/open/floor/almayer{ + dir = 10; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"GO" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 5 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"GQ" = ( +/obj/structure/platform, +/obj/structure/blocker/invisible_wall, +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,0" + }, +/area/adminlevel/ert_station/royal_marines_station) +"GX" = ( +/obj/structure/platform, +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,0" + }, +/area/adminlevel/ert_station/royal_marines_station) +"GZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"He" = ( +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"Hg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Hp" = ( +/obj/structure/prop/almayer/cannon_cable_connector{ + pixel_y = 6 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "4,10" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Hz" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"HD" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/machinery/cm_vending/gear/antag_guns, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"HJ" = ( +/turf/open/floor/almayer{ + dir = 5; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"HM" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,6" + }, +/area/adminlevel/ert_station/royal_marines_station) +"HX" = ( +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"Id" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ip" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ir" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/prop/almayer/computer/PC{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"Iw" = ( +/obj/structure/platform, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 10 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"IC" = ( +/obj/structure/bed/chair/vehicle{ + pixel_x = -8 + }, +/obj/structure/bed/chair/vehicle{ + pixel_x = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"IH" = ( +/obj/structure/machinery/door/airlock/almayer/security/colony{ + dir = 8; + name = "\improper Brig Cell" + }, +/obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; + id = "RMC_Pub_brig"; + name = "shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"IK" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 4 + }, +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"IQ" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"IY" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Jg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/cm_vending/gear/antag_guns, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"JD" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + layer = 2.5; + pixel_x = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_x = 1; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_x = -1; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"JM" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"JO" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Kl" = ( +/obj/structure/reagent_dispensers/fueltank/custom, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ko" = ( +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/prop/vehicles/tank/twe{ + layer = 5.1; + pixel_y = -6 + }, +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"Ks" = ( +/turf/open/shuttle/elevator/grating, +/area/adminlevel/ert_station/royal_marines_station) +"Ku" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"KD" = ( +/obj/structure/platform_decoration{ + dir = 8 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"KF" = ( +/turf/open/shuttle/elevator, +/area/adminlevel/ert_station/royal_marines_station) +"KJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Lj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Mb" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Spare Prison Uniforms"; + req_one_access = null + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Mg" = ( +/obj/structure/surface/table/almayer, +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = 30 + }, +/obj/item/toy/deck{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ms" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"MJ" = ( +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"MM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"MN" = ( +/obj/structure/prop/almayer/cannon_cable_connector{ + pixel_y = -3 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"MQ" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,5" + }, +/area/adminlevel/ert_station/royal_marines_station) +"MU" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"MX" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"MY" = ( +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Nc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ni" = ( +/obj/structure/platform{ + dir = 1 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,8" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Nl" = ( +/obj/structure/machinery/cm_vending/gear/antag, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Nm" = ( +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Nv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"NE" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,3" + }, +/area/adminlevel/ert_station/royal_marines_station) +"NF" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"NV" = ( +/turf/closed/wall/r_wall/elevator, +/area/adminlevel/ert_station/royal_marines_station) +"Oi" = ( +/obj/structure/machinery/medical_pod/sleeper, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ok" = ( +/obj/structure/machinery/cryopod{ + dir = 1; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Or" = ( +/obj/structure/machinery/cryopod{ + layer = 3.1; + pixel_y = 13 + }, +/turf/open/floor/almayer{ + icon_state = "cargo" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Os" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "1,2" + }, +/area/adminlevel/ert_station/royal_marines_station) +"OA" = ( +/obj/structure/platform_decoration{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"OB" = ( +/obj/structure/surface/table/almayer, +/obj/item/storage/syringe_case{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/syringe_case, +/obj/item/storage/syringe_case{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"OE" = ( +/obj/structure/largecrate, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"OK" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/obj/structure/platform{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"OO" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "5,14" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Pb" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Pd" = ( +/obj/structure/platform{ + dir = 4 + }, +/turf/open/floor/plating/kutjevo, +/area/adminlevel/ert_station/royal_marines_station) +"Pg" = ( +/turf/open/shuttle/dropship, +/area/adminlevel/ert_station/royal_marines_station) +"Pk" = ( +/obj/structure/machinery/door/airlock/almayer/medical{ + name = "Operating Theatre 2" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Pl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/obj/structure/machinery/reagentgrinder{ + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/phoron{ + amount = 25; + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Px" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "4,14" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PB" = ( +/turf/open/floor/almayer{ + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PC" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/platform{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/door_control/brbutton{ + id = "RMC_Pub_brig"; + pixel_x = -29 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PL" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"PM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/platform, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 10; + layer = 3.51 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PN" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/plating_catwalk, +/area/adminlevel/ert_station/royal_marines_station) +"PS" = ( +/obj/structure/machinery/cm_vending/sorted/medical/chemistry/no_access{ + req_access = null + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PU" = ( +/obj/structure/machinery/medical_pod/autodoc, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"PY" = ( +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Qi" = ( +/obj/structure/machinery/cm_vending/sorted/medical/no_access{ + req_access = null + }, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Qj" = ( +/obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/machinery/door/poddoor/shutters/almayer/open{ + id = "RMC_Pub_brig"; + name = "shutters" + }, +/turf/open/floor/plating, +/area/adminlevel/ert_station/royal_marines_station) +"QP" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "1,12" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ri" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/adminlevel/ert_station/royal_marines_station) +"Rq" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/obj/structure/machinery/cm_vending/clothing/antag, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Rw" = ( +/obj/structure/platform{ + dir = 1 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,8" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ry" = ( +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"RF" = ( +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"RH" = ( +/obj/structure/largecrate/machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Sb" = ( +/obj/docking_port/stationary/emergency_response/idle_port6, +/turf/open/floor/plating, +/area/adminlevel/ert_station/royal_marines_station) +"Sc" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Sd" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 10 + }, +/area/adminlevel/ert_station/royal_marines_station) +"Sm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Sv" = ( +/obj/structure/surface/table/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Sw" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "7,2" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ST" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "0,3" + }, +/area/adminlevel/ert_station/royal_marines_station) +"SY" = ( +/obj/structure/machinery/cm_vending/sorted/medical/chemistry/no_access, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Tf" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/mint, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"Tm" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 1 + }, +/area/adminlevel/ert_station/royal_marines_station) +"Tx" = ( +/obj/structure/bed/chair/comfy{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"TP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/shower{ + pixel_y = 16 + }, +/turf/open/floor/plating/plating_catwalk, +/area/adminlevel/ert_station/royal_marines_station) +"TY" = ( +/obj/structure/machinery/cm_vending/sorted/marine_food, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ub" = ( +/obj/structure/platform, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 10 + }, +/turf/closed/shuttle/twe_dropship{ + icon_state = "6,0" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Uc" = ( +/obj/structure/largecrate/machine, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Uk" = ( +/obj/structure/platform, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 6 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"Ul" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Up" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Uq" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Ur" = ( +/turf/open/floor/plating/plating_catwalk, +/area/adminlevel/ert_station/royal_marines_station) +"Ut" = ( +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Uv" = ( +/obj/structure/bed/chair/comfy{ + dir = 1 + }, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"UF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"UH" = ( +/turf/closed/wall/r_wall/elevator{ + dir = 8 + }, +/area/adminlevel/ert_station/royal_marines_station) +"UJ" = ( +/obj/structure/largecrate/random/barrel/blue, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"UT" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"UV" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"UZ" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/fishandchips, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"Va" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "4,9" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Vt" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Vu" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "5,15" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Vv" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/platform, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"VA" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/faxmachine/uscm/brig, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"VF" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform, +/obj/structure/platform_decoration{ + dir = 10 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"VG" = ( +/obj/structure/machinery/cm_vending/sorted/medical/blood, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"VH" = ( +/obj/structure/machinery/light{ + unacidable = 1; + unslashable = 1 + }, +/obj/structure/surface/table/almayer, +/obj/item/storage/box/handcuffs{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/device/flash{ + pixel_y = -8 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"VL" = ( +/obj/structure/surface/table/almayer, +/obj/item/clothing/suit/straight_jacket, +/obj/item/handcuffs{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/handcuffs, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Wa" = ( +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp/green{ + pixel_x = 6 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"We" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_x = 1; + pixel_y = 2 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Wo" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/platform, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 6; + layer = 3.51 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Wt" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 5 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Wx" = ( +/obj/structure/bed/chair/comfy{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"WB" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform_decoration{ + dir = 9 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"WC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"WD" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/recharger, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"WI" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Spare Prison Uniforms" + }, +/obj/item/clothing/shoes/orange, +/obj/item/clothing/shoes/orange, +/obj/item/clothing/shoes/orange, +/obj/item/clothing/shoes/orange, +/obj/item/clothing/under/color/orange, +/obj/item/clothing/under/color/orange, +/obj/item/clothing/under/color/orange, +/obj/item/clothing/under/color/orange, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"WL" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "6,13" + }, +/area/adminlevel/ert_station/royal_marines_station) +"WM" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"WS" = ( +/turf/closed/wall/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"WW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"WY" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 5 + }, +/obj/structure/blocker/invisible_wall, +/turf/open/void, +/area/adminlevel/ert_station/royal_marines_station) +"WZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Xe" = ( +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Xh" = ( +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Xz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "orange" + }, +/area/adminlevel/ert_station/royal_marines_station) +"XB" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 29 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"XF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"XN" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) +"XT" = ( +/obj/structure/machinery/door_control/brbutton{ + id = "RMC_brig_1"; + pixel_x = 25; + pixel_y = -5 + }, +/obj/structure/machinery/door_control/brbutton{ + id = "RMC_brig_2"; + pixel_x = 25; + pixel_y = 8 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/adminlevel/ert_station/royal_marines_station) +"XV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "cargo_arrow" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Yk" = ( +/obj/structure/machinery/autodoc_console, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"YI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/body_scanconsole, +/turf/open/floor/almayer{ + icon_state = "sterile_green" + }, +/area/adminlevel/ert_station/royal_marines_station) +"YZ" = ( +/obj/structure/platform_decoration{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Zf" = ( +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Zk" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/platform, +/obj/structure/platform_decoration{ + dir = 6 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Zl" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/adminlevel/ert_station/royal_marines_station) +"Zx" = ( +/obj/structure/surface/table/almayer, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/storage/box/syringes, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ZA" = ( +/obj/structure/bed/chair/comfy, +/turf/open/floor/almayer, +/area/adminlevel/ert_station/royal_marines_station) +"ZO" = ( +/turf/closed/shuttle/twe_dropship{ + icon_state = "8,5" + }, +/area/adminlevel/ert_station/royal_marines_station) +"ZV" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_x = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/adminlevel/ert_station/royal_marines_station) + +(1,1,1) = {" +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +"} +(2,1,1) = {" +jL +jL +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +jL +jL +jL +jL +jL +jL +jL +"} +(3,1,1) = {" +jL +gS +gS +ai +yK +yK +Nl +WS +TY +yK +Sv +Sv +Sv +gS +TY +TY +TY +gS +Sv +Sv +Sv +uq +OE +WS +TP +DA +WZ +ad +ad +WZ +EJ +cu +WS +qj +Ad +oY +SY +gS +gS +jL +jL +jL +jL +jL +jL +"} +(4,1,1) = {" +jL +gS +HD +XF +hL +yK +Nl +WS +TY +XF +oZ +NF +NF +IQ +gJ +gJ +gJ +IQ +NF +Ac +Ac +Xz +Uc +WS +TP +WW +Au +ad +ad +Zf +vm +cu +WS +Hg +je +Zf +xN +eV +gS +gS +gS +gS +gS +gS +jL +"} +(5,1,1) = {" +jL +gS +Jg +yQ +hL +kx +WS +WS +WS +ai +Am +jU +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +jU +GZ +WS +WS +WS +ad +DU +WS +WS +fJ +WS +WS +WS +WS +mI +Zf +Au +YI +Oi +WS +ft +bS +iO +gS +jL +"} +(6,1,1) = {" +jL +gS +Jg +yQ +hL +yK +yK +aK +yK +PB +sb +MJ +MJ +ZA +wt +kh +Uv +ZA +UZ +kh +Uv +dK +yK +aK +yK +Up +gJ +gJ +gJ +kT +MX +yK +aK +Kl +Zf +Zf +Au +Au +rv +WS +xN +Zf +xN +gS +jL +"} +(7,1,1) = {" +jL +gS +su +yQ +hL +hL +yK +mK +yK +PB +sb +MJ +MJ +ZA +kh +kh +Uv +ZA +kh +kh +Uv +RF +yK +mK +yK +sb +Bh +Bh +xE +xE +RF +yK +mK +Zf +Zf +Zf +Au +Au +xN +WS +WS +Pk +WS +gS +jL +"} +(8,1,1) = {" +jL +gS +su +hL +hL +XF +yK +aK +yK +PB +sb +MJ +MJ +ZA +kh +kh +Uv +ZA +kh +Tf +Uv +RF +yK +aK +yK +sb +MJ +MJ +jU +jU +RF +yK +aK +Zf +Au +sP +yW +Au +Zf +jk +Zf +Zf +Bk +gS +jL +"} +(9,1,1) = {" +jL +gS +ar +zk +Do +Nv +WS +WS +WS +ai +sb +MJ +MJ +MJ +MJ +MJ +jU +jU +jU +MJ +MJ +Xe +WS +WS +WS +WM +Bh +Bh +xE +xE +Xe +WS +WS +WS +uQ +Zx +OB +Zf +Zf +Nm +Zf +Zf +UT +gS +jL +"} +(10,1,1) = {" +jL +gS +Ur +Ur +Ip +vB +vB +WS +TY +yK +gx +gq +gq +Bh +Bh +FA +jl +jl +gq +gq +gq +gg +kH +WS +uU +sb +MJ +MJ +jU +MJ +RF +qZ +WS +Aa +je +VG +VG +Au +xN +WS +WS +xw +WS +gS +jL +"} +(11,1,1) = {" +jL +gS +Ok +Ur +Ip +vB +rP +WS +TY +yK +mo +mo +yK +Id +Sv +Sv +yK +uE +yK +yK +uE +kH +kH +WS +mb +Am +Bh +Bh +Bh +Bh +RF +RH +aK +Pl +je +Zf +Zf +Zf +PU +WS +xN +Zf +xN +gS +jL +"} +(12,1,1) = {" +jL +gS +WS +lG +JD +iz +ad +WS +WS +DV +Nm +Pb +DV +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +xb +Am +MJ +MJ +MJ +MJ +dK +XF +aK +Ei +je +Zf +Zf +xN +Yk +WS +ft +bS +iO +gS +jL +"} +(13,1,1) = {" +jL +gS +lX +Ur +MM +Ur +lX +aK +nI +zM +zk +zk +ls +nI +WS +Hz +qN +ri +gT +gJ +IQ +gJ +gJ +aK +XF +Am +MJ +MJ +kh +Ir +aX +XF +aK +PS +xN +Zf +Zf +lF +gS +gS +gS +gS +gS +gS +jL +"} +(14,1,1) = {" +jL +gS +Ur +Ur +Ur +Ur +Ur +mK +Ur +Ur +yK +yK +Ur +Ur +WS +MU +yK +oC +gx +gq +Dg +MJ +MJ +mK +aq +eX +gq +gq +gq +ro +hA +XF +aK +Qi +xN +xN +xN +lF +gS +jL +jL +jL +jL +jL +jL +"} +(15,1,1) = {" +jL +gS +pk +wF +Ok +pk +wF +aK +pk +wF +pk +wF +pk +wF +WS +ds +zk +Ms +ll +ll +Vt +gq +gq +aK +KJ +WC +ll +uE +yK +yK +XF +XF +WS +Qi +xN +ei +ll +ll +gS +jL +jL +jL +jL +jL +jL +"} +(16,1,1) = {" +gS +gS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +Nm +Pb +WS +WS +WS +WS +WS +Nm +Pb +WS +WS +WS +WS +WS +WS +WS +WS +WS +Nm +Pb +gS +gS +jL +jL +jL +jL +jL +"} +(17,1,1) = {" +gS +yK +Ur +Ur +PN +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +PN +Ur +Ur +WY +HX +HX +HX +Iw +Ur +Ur +WY +HX +HX +HX +HX +HX +HX +HX +Iw +Ur +Ur +Sm +gS +jL +jL +jL +jL +jL +"} +(18,1,1) = {" +gS +yK +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +uC +Cu +Cu +Cu +mc +Ur +Ur +uC +dd +xm +uc +ST +Cu +Cu +Cu +mc +Ur +vB +XF +gS +jL +jL +jL +jL +jL +"} +(19,1,1) = {" +gS +yK +aH +Ai +OK +OK +VF +Ur +Wt +OK +VF +Ur +Wt +OK +OK +Ai +qG +yK +Ur +Ur +uC +Cu +Cu +Cu +mc +Ur +Ur +Rw +xm +HM +MQ +uc +ST +Cu +Cu +go +Ur +vB +XF +gS +gS +gS +gS +gS +gS +"} +(20,1,1) = {" +gS +yK +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +Sb +Vv +yK +Ur +Ur +uC +Cu +Cu +QP +gU +Nm +Nm +gU +gU +jW +gU +jW +gU +Os +aW +oA +Ur +vB +XF +bO +NV +NV +NV +Sd +gS +"} +(21,1,1) = {" +gS +xy +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +Wo +yK +Ur +GO +iS +Cu +pO +bG +ju +Zl +Zl +Zl +Zl +rS +Ba +Ba +MN +wl +cL +jB +Ur +vB +hI +CT +KF +Ks +KF +UH +gS +"} +(22,1,1) = {" +gS +XF +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +yK +yK +Ur +uC +bs +tr +hp +lq +Ci +IC +xW +IC +xW +Ci +iR +lW +Ko +YZ +Ur +Ur +Ur +XF +XV +Nm +Ks +Ks +Ks +Nm +gS +"} +(23,1,1) = {" +gS +XF +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +yK +yK +Ur +uC +DS +Px +iE +Nm +Pg +Hp +Va +Va +jr +Ci +op +sy +sy +Nm +Ur +Ur +Ur +XF +PB +Nm +Ks +KF +Ks +Nm +gS +"} +(24,1,1) = {" +gS +XF +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +yK +yK +Ur +uC +Vu +OO +bp +lq +Ci +IC +xW +IC +xW +Ci +IK +Pd +Pd +OA +Ur +Ur +Ur +XF +PB +Nm +Ks +Ks +Ks +Nm +gS +"} +(25,1,1) = {" +gS +ai +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +PM +yK +Ur +Fp +KD +Cu +WL +bG +fp +Zl +Zl +Zl +Zl +BV +Ba +Ba +MN +Cj +sR +Ub +Ur +Ur +kx +CT +KF +Ks +KF +nj +gS +"} +(26,1,1) = {" +gS +yK +ky +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +dc +Vv +yK +Ur +Ur +uC +Cu +Cu +zw +EK +Nm +Nm +NE +NE +mw +NE +iI +NE +Sw +iK +GX +Ur +Ur +yK +rI +Tm +Tm +Tm +pJ +gS +"} +(27,1,1) = {" +gS +yK +qi +fx +PC +PC +Zk +Ur +fM +PC +IY +Ur +fM +PC +PC +fx +du +yK +Ur +Ur +uC +Cu +Cu +Cu +mc +Ur +Ur +Ni +hm +AQ +ZO +AU +jI +Cu +Cu +GQ +Ur +Ur +yK +gS +gS +gS +gS +gS +gS +"} +(28,1,1) = {" +gS +yK +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +uC +Cu +Cu +Cu +mc +Ur +Ur +uC +EG +hm +AU +jI +Cu +Cu +Cu +mc +Ur +Ur +yK +gS +jL +jL +jL +jL +jL +"} +(29,1,1) = {" +gS +nW +Ur +Ur +Ri +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ri +Ur +Ur +WB +He +He +He +Uk +Ur +Ur +WB +He +He +He +He +He +He +He +Uk +Ur +Ur +uE +gS +jL +jL +jL +jL +jL +"} +(30,1,1) = {" +gS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +Nm +Pb +WS +WS +WS +WS +WS +Nm +Pb +WS +WS +WS +WS +WS +WS +WS +WS +WS +Uq +Pb +gS +gS +jL +jL +jL +jL +jL +"} +(31,1,1) = {" +jL +gS +Gd +Or +lX +Gd +Or +aK +Gd +Or +Gd +Or +Gd +Or +WS +Hz +qN +ri +mo +mo +pL +FN +FN +aK +dm +ps +mo +Ul +PY +yK +XF +OE +WS +VA +kO +kL +ps +ps +gS +jL +jL +jL +jL +jL +jL +"} +(32,1,1) = {" +jL +gS +Ur +Ur +Ur +Ur +Ur +mK +Ur +Ur +yK +yK +Ur +Ur +WS +MU +yK +oC +Ut +FN +xx +MJ +MJ +mK +aq +nn +FN +zY +gl +zY +Ku +UJ +aK +WD +Lj +yK +yK +yK +gS +jL +jL +jL +jL +jL +jL +"} +(33,1,1) = {" +jL +gS +Ok +Ur +Sc +Ur +Ok +aK +tv +UV +jV +jV +sI +tv +WS +ds +zk +Ms +HJ +fD +ja +fD +fD +aK +XF +BC +MJ +MJ +MJ +MJ +ev +XF +aK +WD +Xh +Xh +Xh +yK +gS +gS +gS +gS +gS +gS +jL +"} +(34,1,1) = {" +jL +gS +WS +kf +We +sF +WS +WS +WS +DV +Nm +Pb +DV +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +WS +nl +Ry +nT +nT +nT +nT +ev +XF +aK +WI +Xh +Xh +Xh +yK +Qj +cJ +qb +FN +GM +gS +jL +"} +(35,1,1) = {" +jL +gS +lX +Ur +XN +Ur +lX +WS +TY +yK +ll +ll +XF +Sm +XF +XF +XF +Ul +yK +yK +Sm +UJ +UJ +WS +RH +Ry +MJ +MJ +MJ +MJ +ev +XF +aK +WI +Xh +Xh +Xh +XF +Qj +HJ +fD +fD +tw +gS +jL +"} +(36,1,1) = {" +jL +gS +Ur +Ur +XN +Ur +Ur +WS +TY +yK +Ut +xX +xX +te +te +te +FN +FN +FN +FN +FN +Ku +UJ +WS +OE +Ry +nT +nT +nT +nT +kX +UJ +WS +lI +Xh +Xh +Xh +XF +WS +WS +WS +WS +IH +gS +jL +"} +(37,1,1) = {" +jL +gS +Rq +jV +ZV +eu +WS +WS +WS +ai +Ry +MJ +MJ +kh +kh +kh +MJ +MJ +MJ +MJ +MJ +MY +WS +WS +WS +uK +jU +MJ +MJ +MJ +MY +WS +WS +WS +Lj +Xh +Xh +yK +XF +jk +Ut +PD +Ku +gS +jL +"} +(38,1,1) = {" +jL +gS +su +Xh +Xh +XF +yK +aK +yK +PB +Ry +MJ +MJ +kh +kh +kh +MJ +MJ +MJ +MJ +MJ +kX +yK +aK +yK +Ry +Fw +Fw +nT +nT +kX +yK +aK +yK +Xh +Xh +Lj +Xh +yK +Nm +HJ +XT +eh +gS +jL +"} +(39,1,1) = {" +jL +gS +su +Xh +Xh +Lj +yK +mK +yK +PB +Ry +MJ +MJ +Tx +PL +PL +MJ +MJ +MJ +oo +oo +kX +yK +mK +yK +Ry +jU +jU +MJ +MJ +ev +yK +mK +yK +Xh +Lj +Lj +Xh +zL +WS +ol +WS +vD +gS +jL +"} +(40,1,1) = {" +jL +gS +Jg +Lj +Xh +yK +yK +aK +yK +PB +Ry +oo +oo +Wx +jU +MJ +MJ +MJ +MJ +kh +kh +ev +yK +aK +yK +od +co +co +fD +fD +dj +yK +aK +yK +Xh +VH +VL +Xh +Mb +WS +Xh +WS +Xh +gS +jL +"} +(41,1,1) = {" +jL +gS +Jg +Lj +Xh +kx +WS +WS +WS +ai +Ry +kh +kh +lN +jU +MJ +MJ +MJ +MJ +kh +kh +Nc +WS +WS +WS +WS +fJ +ad +WS +fJ +ad +WS +WS +WS +Xh +Cm +jD +yK +Mb +WS +iG +WS +iG +gS +jL +"} +(42,1,1) = {" +jL +gS +FX +XF +Xh +yK +Nl +WS +TY +yK +HJ +EX +EX +qx +co +fD +fD +fD +fD +kW +kW +eh +RH +WS +TP +nw +Au +ad +ad +Au +Aq +cu +WS +vR +Xh +Xh +yK +XF +gS +gS +gS +gS +gS +gS +jL +"} +(43,1,1) = {" +jL +gS +gS +xy +yK +yK +Nl +WS +TY +yK +yK +JO +JO +gS +TY +TY +TY +gS +yK +yK +yK +Uc +qZ +WS +TP +Dc +UF +ad +ad +JM +XB +cu +WS +Wa +Mg +yK +XF +gS +gS +jL +jL +jL +jL +jL +jL +"} +(44,1,1) = {" +jL +jL +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +gS +jL +jL +jL +jL +jL +jL +jL +"} +(45,1,1) = {" +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +jL +"} diff --git a/maps/templates/weyland_ert_station.dmm b/maps/templates/weyland_ert_station.dmm index 854299a4efda..ce495acd3f65 100644 --- a/maps/templates/weyland_ert_station.dmm +++ b/maps/templates/weyland_ert_station.dmm @@ -38,8 +38,8 @@ "bf" = ( /obj/structure/surface/table/reinforced/black, /obj/item/tool/stamp/internalaffairs{ - pixel_y = 9; - pixel_x = -5 + pixel_x = -5; + pixel_y = 9 }, /obj/item/paper_bin/wy, /obj/item/tool/pen, @@ -201,8 +201,8 @@ dir = 1 }, /turf/open/floor/corsat{ - icon_state = "yellowcorner"; - dir = 4 + dir = 4; + icon_state = "yellowcorner" }, /area/adminlevel/ert_station/weyland_station) "cZ" = ( @@ -403,9 +403,9 @@ /area/adminlevel/ert_station/weyland_station) "fe" = ( /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_meeting"; - name = "\improper Meeting Room Shutters"; - dir = 4 + name = "\improper Meeting Room Shutters" }, /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 @@ -440,14 +440,14 @@ /area/adminlevel/ert_station/weyland_station) "fD" = ( /obj/structure/closet/emcloset{ - pixel_y = 15; + density = 0; pixel_x = 8; - density = 0 + pixel_y = 15 }, /obj/structure/closet/firecloset/full{ - pixel_y = 15; + density = 0; pixel_x = -8; - density = 0 + pixel_y = 15 }, /turf/open/floor/corsat{ dir = 9; @@ -633,14 +633,14 @@ /area/adminlevel/ert_station/weyland_station) "hZ" = ( /obj/structure/closet/secure_closet/brig{ - pixel_y = 16; + density = 0; pixel_x = 7; - density = 0 + pixel_y = 16 }, /obj/structure/closet/secure_closet/brig{ - pixel_y = 16; + density = 0; pixel_x = -7; - density = 0 + pixel_y = 16 }, /turf/open/floor/corsat{ dir = 1; @@ -684,8 +684,8 @@ pixel_y = 10 }, /obj/item/device/flashlight/lamp/green{ - pixel_y = 20; - pixel_x = 16 + pixel_x = 16; + pixel_y = 20 }, /turf/open/floor/wood/ship, /area/adminlevel/ert_station/weyland_station) @@ -862,9 +862,9 @@ "kO" = ( /obj/structure/window/framed/corsat/research, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_center_medbay_or"; - name = "\improper Central Medbay Operation Room Shutters"; - dir = 4 + name = "\improper Central Medbay Operation Room Shutters" }, /turf/open/floor/plating, /area/adminlevel/ert_station/weyland_station) @@ -1095,8 +1095,8 @@ /area/adminlevel/ert_station/weyland_station) "nb" = ( /obj/structure/filingcabinet/filingcabinet{ - pixel_x = 8; - density = 0 + density = 0; + pixel_x = 8 }, /turf/open/floor/corsat{ dir = 4; @@ -1183,14 +1183,14 @@ layer = 2.5 }, /obj/structure/closet/emcloset{ - pixel_y = 15; + density = 0; pixel_x = 8; - density = 0 + pixel_y = 15 }, /obj/structure/closet/firecloset/full{ - pixel_y = 15; + density = 0; pixel_x = -8; - density = 0 + pixel_y = 15 }, /obj/structure/machinery/light/double{ dir = 4; @@ -1576,9 +1576,9 @@ "sX" = ( /obj/structure/window/framed/corsat/research, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_center_medbay"; - name = "\improper Central Medbay Shutters"; - dir = 4 + name = "\improper Central Medbay Shutters" }, /turf/open/floor/plating, /area/adminlevel/ert_station/weyland_station) @@ -1682,8 +1682,8 @@ pixel_y = 32 }, /obj/structure/sink{ - pixel_y = 21; - pixel_x = 1 + pixel_x = 1; + pixel_y = 21 }, /obj/structure/pipes/vents/pump, /turf/open/floor/corsat{ @@ -1739,8 +1739,8 @@ /area/adminlevel/ert_station/weyland_station) "vb" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/colony{ - name = "Barracks"; - dir = 1 + dir = 1; + name = "Barracks" }, /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 @@ -1862,8 +1862,8 @@ "xk" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/storage/fancy/cigarettes/wypacket{ - pixel_y = 4; - pixel_x = -5 + pixel_x = -5; + pixel_y = 4 }, /obj/item/tool/lighter/zippo/gold, /turf/open/floor/wood/ship, @@ -1876,9 +1876,9 @@ /area/adminlevel/ert_station/weyland_station) "xD" = ( /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_meeting"; - name = "\improper Meeting Room Shutters"; - dir = 4 + name = "\improper Meeting Room Shutters" }, /turf/open/floor/corsat{ icon_state = "sigma" @@ -2365,8 +2365,8 @@ "Dk" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/storage/firstaid/rad{ - pixel_y = 6; - pixel_x = 7 + pixel_x = 7; + pixel_y = 6 }, /obj/item/storage/firstaid/toxin, /turf/open/floor/corsat{ @@ -2410,8 +2410,8 @@ pixel_y = 13 }, /obj/item/device/flashlight/lamp/green{ - pixel_y = 21; - pixel_x = 16 + pixel_x = 16; + pixel_y = 21 }, /turf/open/floor/wood/ship, /area/adminlevel/ert_station/weyland_station) @@ -2484,8 +2484,8 @@ /area/adminlevel/ert_station/weyland_station) "EC" = ( /turf/open/floor/corsat{ - icon_state = "yellowcorner"; - dir = 4 + dir = 4; + icon_state = "yellowcorner" }, /area/adminlevel/ert_station/weyland_station) "ED" = ( @@ -2696,8 +2696,8 @@ pixel_y = 32 }, /obj/structure/sink{ - pixel_y = 23; - pixel_x = 1 + pixel_x = 1; + pixel_y = 23 }, /turf/open/floor/corsat{ icon_state = "damaged1" @@ -2795,10 +2795,10 @@ "Js" = ( /obj/structure/surface/table/reinforced/black, /obj/structure/transmitter/rotary{ + callable = 0; name = "Weyland-Yutani Station CiC"; phone_category = "W-Y"; - phone_id = "W-Y Station CiC"; - callable = 0 + phone_id = "W-Y Station CiC" }, /turf/open/floor/corsat{ icon_state = "squares" @@ -2911,9 +2911,9 @@ name = "\improper Meeting Room" }, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_meeting"; - name = "\improper Meeting Room Shutters"; - dir = 4 + name = "\improper Meeting Room Shutters" }, /turf/open/floor/corsat{ icon_state = "sigma" @@ -3497,9 +3497,9 @@ "RL" = ( /obj/structure/window/framed/corsat, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_meeting"; - name = "\improper Meeting Room Shutters"; - dir = 4 + name = "\improper Meeting Room Shutters" }, /turf/open/floor/plating, /area/adminlevel/ert_station/weyland_station) @@ -3550,8 +3550,8 @@ "Sr" = ( /obj/structure/pipes/standard/simple/hidden/green, /turf/open/floor/corsat{ - icon_state = "brown"; - dir = 1 + dir = 1; + icon_state = "brown" }, /area/adminlevel/ert_station/weyland_station) "Ss" = ( @@ -3588,10 +3588,10 @@ "SE" = ( /obj/structure/surface/table/woodentable/fancy, /obj/structure/transmitter/rotary{ + callable = 0; name = "Weyland-Yutani Station Meeting Room"; phone_category = "W-Y"; - phone_id = "W-Y Station Meeting Room"; - callable = 0 + phone_id = "W-Y Station Meeting Room" }, /turf/open/floor/wood/ship, /area/adminlevel/ert_station/weyland_station) @@ -3872,14 +3872,14 @@ icon_state = "SE-out" }, /obj/structure/closet/emcloset{ - pixel_y = 15; + density = 0; pixel_x = 8; - density = 0 + pixel_y = 15 }, /obj/structure/closet/firecloset/full{ - pixel_y = 15; + density = 0; pixel_x = -8; - density = 0 + pixel_y = 15 }, /obj/structure/machinery/light/double{ dir = 8; @@ -3992,8 +3992,8 @@ /area/adminlevel/ert_station/weyland_station) "XQ" = ( /turf/open/floor/corsat{ - icon_state = "brown"; - dir = 1 + dir = 1; + icon_state = "brown" }, /area/adminlevel/ert_station/weyland_station) "XR" = ( @@ -4047,8 +4047,8 @@ /area/adminlevel/ert_station/weyland_station) "YB" = ( /obj/structure/machinery/photocopier{ - pixel_y = 16; - density = 0 + density = 0; + pixel_y = 16 }, /turf/open/floor/wood/ship, /area/adminlevel/ert_station/weyland_station) @@ -4074,8 +4074,8 @@ pixel_y = 32 }, /obj/structure/sink{ - pixel_y = 21; - pixel_x = 1 + pixel_x = 1; + pixel_y = 21 }, /turf/open/floor/corsat{ icon_state = "retrosquareslight" @@ -4120,9 +4120,9 @@ name = "\improper Meeting Room" }, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ + dir = 4; id = "WY_meeting"; - name = "\improper Meeting Room Shutters"; - dir = 4 + name = "\improper Meeting Room Shutters" }, /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 diff --git a/sound/bullets/bullet_vulture_impact.ogg b/sound/bullets/bullet_vulture_impact.ogg new file mode 100644 index 000000000000..8ccf6c77deac Binary files /dev/null and b/sound/bullets/bullet_vulture_impact.ogg differ diff --git a/sound/weapons/gun_mg.ogg b/sound/weapons/gun_mg.ogg new file mode 100644 index 000000000000..9741526d31b0 Binary files /dev/null and b/sound/weapons/gun_mg.ogg differ diff --git a/sound/weapons/gun_tt.ogg b/sound/weapons/gun_tt.ogg new file mode 100644 index 000000000000..e55663329860 Binary files /dev/null and b/sound/weapons/gun_tt.ogg differ diff --git a/sound/weapons/gun_vulture_fire.ogg b/sound/weapons/gun_vulture_fire.ogg new file mode 100644 index 000000000000..156127cb5a14 Binary files /dev/null and b/sound/weapons/gun_vulture_fire.ogg differ diff --git a/sound/weapons/gun_vulture_report.ogg b/sound/weapons/gun_vulture_report.ogg new file mode 100644 index 000000000000..16cb5eae9e32 Binary files /dev/null and b/sound/weapons/gun_vulture_report.ogg differ diff --git a/sound/weapons/handling/gun_vulture_bolt_close.ogg b/sound/weapons/handling/gun_vulture_bolt_close.ogg new file mode 100644 index 000000000000..1417782295d5 Binary files /dev/null and b/sound/weapons/handling/gun_vulture_bolt_close.ogg differ diff --git a/sound/weapons/handling/gun_vulture_bolt_eject.ogg b/sound/weapons/handling/gun_vulture_bolt_eject.ogg new file mode 100644 index 000000000000..a0a1dc7d0904 Binary files /dev/null and b/sound/weapons/handling/gun_vulture_bolt_eject.ogg differ diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index 28a5639e884d..835a94341708 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -933,6 +933,9 @@ em { .hcradio { color: #318779; } +.pvstradio { + color: #9b0612; +} .cryoradio { color: #ad6d48; } @@ -985,6 +988,10 @@ em { color: #e3580e; } +.rmcradio { + color: #e3580e; +} + .cmbradio { color: #1b748c; } diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index adbb56ed9b89..8501d0b9526c 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -972,6 +972,9 @@ h2.alert { .hcradio { color: #318779; } +.pvstradio { + color: #9b0612; +} .airadio { color: #ff00ff; diff --git a/tgui/packages/tgui/interfaces/AresInterface.js b/tgui/packages/tgui/interfaces/AresInterface.js index 3023cf1a5297..aae115d150b0 100644 --- a/tgui/packages/tgui/interfaces/AresInterface.js +++ b/tgui/packages/tgui/interfaces/AresInterface.js @@ -11,12 +11,12 @@ const PAGES = { 'apollo': () => ApolloLog, 'access_log': () => AccessLogs, 'delete_log': () => DeletionLogs, + 'flight_log': () => FlightLogs, 'talking': () => ARESTalk, 'deleted_talks': () => DeletedTalks, 'read_deleted': () => ReadingTalks, 'security': () => Security, 'requisitions': () => Requisitions, - 'antiair': () => AntiAir, 'emergency': () => Emergency, }; @@ -163,14 +163,14 @@ const MainMenu = (props, context) => { + + ); + })} + + + ); +}; + +const SquadPanel = (props, context) => { + const { act, data } = useBackend(context); + + const [category, setCategory] = useLocalState(context, 'selected', 'monitor'); + let hello = 2; + + return ( + <> + + + + + + + + + + setCategory('monitor')}> + Squad Monitor + + {!!data.can_launch_crates && ( + setCategory('supply')}> + Supply Drop + + )} + setCategory('ob')}> + Orbital Bombardment + + act('tacmap_unpin')}> + Tactical Map + + + {category === 'monitor' && } + {category === 'supply' && data.can_launch_crates && } + {category === 'ob' && } + + ); +}; + +const MainDashboard = (props, context) => { + const { act, data } = useBackend(context); + + let { current_squad, primary_objective, secondary_objective } = data; + + return ( +
+ + + + }> + + + PRIMARY ORDERS + SECONDARY ORDERS + + + + {primary_objective ? primary_objective : 'NONE'} + + + {secondary_objective ? secondary_objective : 'NONE'} + + +
+ + + {primary_objective && ( + + )} + + {secondary_objective && ( + + )} + + + + + + +
+ ); +}; + +const RoleTable = (props, context) => { + const { act, data } = useBackend(context); + + const { + squad_leader, + leaders_alive, + ftl_alive, + ftl_count, + specialist_type, + spec_alive, + smart_alive, + smart_count, + spec_count, + medic_count, + medic_alive, + engi_alive, + engi_count, + living_count, + total_deployed, + } = data; + + return ( + + + + Squad Leader + + + Fire Team Leaders + + + Specialist + + + Smartgunner + + + Hospital Corpsmen + + + Combat Technicians + + + Total/Living + + + + {(squad_leader && ( + + {squad_leader.name ? squad_leader.name : 'NONE'} + + {squad_leader.state !== 'Dead' ? 'ALIVE' : 'DEAD'} + + + )) || ( + + NONE + NOT DEPLOYED + + )} + + + {ftl_count} DEPLOYED + {ftl_alive} ALIVE + + + {specialist_type ? specialist_type : 'NONE'} + + {spec_count ? (spec_alive ? 'ALIVE' : 'DEAD') : 'NOT DEPLOYED'} + + + + + {smart_count ? smart_count + ' DEPLOYED' : 'NONE'} + + + {smart_count ? (smart_alive ? 'ALIVE' : 'DEAD') : 'N/A'} + + + + {medic_count} DEPLOYED + {medic_alive} ALIVE + + + {engi_count} DEPLOYED + {engi_alive} ALIVE + + + {total_deployed} TOTAL + {living_count} ALIVE + + +
+ ); +}; + +const SquadMonitor = (props, context) => { + const { act, data } = useBackend(context); + + const sortByRole = (a, b) => { + a = a.role; + b = b.role; + const roleValues = { + 'Squad Leader': 10, + 'Fireteam Leader': 9, + 'Weapons Specialist': 8, + 'Smartgunner': 7, + 'Hospital Corpsman': 6, + 'Combat Technician': 5, + 'Rifleman': 4, + }; + let valueA = roleValues[a]; + let valueB = roleValues[b]; + if (a.includes('Weapons Specialist')) { + valueA = roleValues['Weapons Specialist']; + } + if (b.includes('Weapons Specialist')) { + valueB = roleValues['Weapons Specialist']; + } + if (!valueA && !valueB) return 0; // They're both unknown + if (!valueA) return 1; // B is defined but A is not + if (!valueB) return -1; // A is defined but B is not + + if (valueA > valueB) return -1; // A is more important + if (valueA < valueB) return 1; // B is more important + + return 0; // They're equal + }; + + let { marines, squad_leader } = data; + + const [hidden_marines, setHiddenMarines] = useLocalState( + context, + 'hidden_marines', + [] + ); + + const [showHiddenMarines, setShowHiddenMarines] = useLocalState( + context, + 'showhidden', + false + ); + const [showDeadMarines, setShowDeadMarines] = useLocalState( + context, + 'showdead', + false + ); + + const [marineSearch, setMarineSearch] = useLocalState( + context, + 'marinesearch', + null + ); + + let determine_status_color = (status) => { + let conscious = status.includes('Conscious'); + let unconscious = status.includes('Unconscious'); + + let state_color = 'red'; + if (conscious) { + state_color = 'green'; + } else if (unconscious) { + state_color = 'yellow'; + } + return state_color; + }; + + let toggle_marine_hidden = (ref) => { + if (!hidden_marines.includes(ref)) { + setHiddenMarines([...hidden_marines, ref]); + } else { + let array_copy = [...hidden_marines]; + let index = array_copy.indexOf(ref); + if (index > -1) { + array_copy.splice(index, 1); + } + setHiddenMarines(array_copy); + } + }; + + let location_filter; + if (data.z_hidden === 2) { + location_filter = 'groundside'; + } else if (data.z_hidden === 1) { + location_filter = 'shipside'; + } else { + location_filter = 'all'; + } + + return ( +
+ + {(showDeadMarines && ( + + )) || ( + + )} + {(showHiddenMarines && ( + + )) || ( + + )} + + + + }> + setMarineSearch(value)} + /> + + + Name + Role + + State + + Location + + SL Dist. + + + + {squad_leader && ( + + + {(squad_leader.has_helmet && ( + + )) || {squad_leader.name} (NO HELMET)} + + {squad_leader.role} + + {squad_leader.state} + + {squad_leader.area_name} + + {squad_leader.distance} + + + + )} + {marines && + marines + .sort(sortByRole) + .filter((marine) => { + if (marineSearch) { + const searchableString = String(marine.name).toLowerCase(); + return searchableString.match(new RegExp(marineSearch, 'i')); + } + return marine; + }) + .map((marine, index) => { + if (squad_leader) { + if (marine.ref === squad_leader.ref) { + return; + } + } + if (hidden_marines.includes(marine.ref) && !showHiddenMarines) { + return; + } + if (marine.state === 'Dead' && !showDeadMarines) { + return; + } + + return ( + + + {(marine.has_helmet && ( + + )) || {marine.name} (NO HELMET)} + + {marine.role} + + {marine.state} + + {marine.area_name} + + {marine.distance} + + + {(hidden_marines.includes(marine.ref) && ( +
+
+ ); +}; + +const SupplyDrop = (props, context) => { + const { act, data } = useBackend(context); + + const [supplyX, setSupplyX] = useSharedState(context, 'supplyx', 0); + const [supplyY, setSupplyY] = useSharedState(context, 'supply', 0); + + let crate_status = 'Crate Loaded'; + let crate_color = 'green'; + if (data.supply_cooldown) { + crate_status = 'Cooldown - ' + data.supply_cooldown / 10 + ' seconds'; + crate_color = 'yellow'; + } else if (!data.has_crate_loaded) { + crate_status = 'No crate loaded'; + crate_color = 'red'; + } + + return ( +
+ + + + + setSupplyX(value)} + width="75px" + /> + + + setSupplyY(value)} + width="75px" + /> + + + + {crate_status} + + + + + + + + + + + + + +
+ ); +}; + +const OrbitalBombardment = (props, context) => { + const { act, data } = useBackend(context); + + const [OBX, setOBX] = useSharedState(context, 'obx', 0); + const [OBY, setOBY] = useSharedState(context, 'oby', 0); + + let ob_status = 'Ready'; + let ob_color = 'green'; + if (data.ob_cooldown) { + ob_status = 'Cooldown - ' + data.ob_cooldown / 10 + ' seconds'; + ob_color = 'yellow'; + } else if (!data.ob_loaded) { + ob_status = 'Not chambered'; + ob_color = 'red'; + } + + return ( +
+ + + + + setOBX(value)} + width="75px" + /> + + + setOBY(value)} + width="75px" + /> + + + + + {ob_status} + + + + + + + + + + + + + +
+ ); +}; + +const SavedCoordinates = (props, context) => { + const { act, data } = useBackend(context); + + const [OBX, setOBX] = useSharedState(context, 'obx', 0); + const [OBY, setOBY] = useSharedState(context, 'oby', 0); + const [supplyX, setSupplyX] = useSharedState(context, 'supplyx', 0); + const [supplyY, setSupplyY] = useSharedState(context, 'supply', 0); + + const { forOB, forSupply } = props; + + let transferCoords = (x, y) => { + if (forSupply) { + setSupplyX(x); + setSupplyY(y); + } else if (forOB) { + setOBX(x); + setOBY(y); + } + }; + + console.log(props); + + return ( + + + Max 3 stored coordinates. Will overwrite oldest first. + + + + + LONG. + + + LAT. + + COMMENT + + + {data.saved_coordinates.map((coords, index) => ( + + {coords.x} + {coords.y} + + + act('change_coordinate_comment', { + comment: value, + index: coords.index, + }) + } + /> + + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/VultureScope.tsx b/tgui/packages/tgui/interfaces/VultureScope.tsx new file mode 100644 index 000000000000..10c73df2ba65 --- /dev/null +++ b/tgui/packages/tgui/interfaces/VultureScope.tsx @@ -0,0 +1,244 @@ +import { BooleanLike } from '../../common/react'; +import { useBackend } from '../backend'; +import { Box, Button, Flex, Stack, Icon, Section, ProgressBar } from '../components'; +import { Window } from '../layouts'; + +type ScopeData = { + offset_x: Number; + offset_y: Number; + valid_offset_dirs: Array; + valid_adjust_dirs: Array; + scope_cooldown: BooleanLike; + breath_cooldown: BooleanLike; + breath_recharge: Number; + current_scope_drift: Number; + time_to_fire_remaining: Number; +}; + +enum Direction { + North = 1, + NorthEast = 5, + East = 4, + SouthEast = 6, + South = 2, + SouthWest = 10, + West = 8, + NorthWest = 9, +} + +const DirectionAbbreviation: Record = { + [Direction.North]: 'N', + [Direction.NorthEast]: 'NE', + [Direction.East]: 'E', + [Direction.SouthEast]: 'SE', + [Direction.South]: 'S', + [Direction.SouthWest]: 'SW', + [Direction.West]: 'W', + [Direction.NorthWest]: 'NW', +}; + +const OffsetAdjuster = (props, context) => { + const { act, data } = useBackend(context); + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; + +const OffsetDirection = (props, context) => { + const { dir } = props; + const { data, act } = useBackend(context); + return ( + + + + + + + + + + + + + +
+ ); +}; + +const ScopePosition = (props, context) => { + const { dir } = props; + const { data, act } = useBackend(context); + return ( + +