From 5b1189686782ef80abcc1f963d0309c498dc19b3 Mon Sep 17 00:00:00 2001 From: Steelpoint <6595389+Steelpoint@users.noreply.github.com> Date: Wed, 10 Jul 2024 01:45:32 +0800 Subject: [PATCH] FORECON Gear Preset + Admin ERT Addition (#6364) # About the pull request Adds a set of FORECON gear presets set to simulate the FORECON marines, but properly equipped. Furthermore adds two admin only ERT's to summon a squad (6 people) or a platoon (30 people) of FORECON. - Adds a set of recon light armour for FORECON, has same defence as medium armour but light armour move speed. - Tactical attachment variant of the custom M4RA and regular M4RA that FORECON use - Adds squad settings for ERT FORECON No changes to regular FORECON are made. # Explain why it's good for the game The intention behind this is to give staff more tools to make use of FORECON in regular gameplay, either to spawn in individual FORECON marines or to send in FORECON ERT's for an event. The PR does not add FORECON to the regular Distress Beacon pool. # Testing Photographs and Procedure ![Screenshot 2024-06-03 02 37 06](https://github.com/cmss13-devs/cmss13/assets/6595389/f0291deb-0646-44c8-865f-9a4c21a8124c) # Changelog :cl: add: Marine force reconnaissance gear presets have been added for admin use. add: ERT force reconnaissance have functional squad settings, including a squad colour (green) and a radio channel. These settings do not apply for survivor force reconnaissance marines. add: A marine force reconnaissance distress signal has been added. Spawning either a 6-man squad, or a 30-man platoon. These are currently for admin use only. add: A set of customized M3-R armour has been added for force reconnaissance marines. It has comparable defensive values to M3 armour but has the speed slowdown of M3-L armour. Only ERT force reconnaissance marines will spawn with this. /:cl: --------- Co-authored-by: Steelpoint --- code/__DEFINES/job.dm | 1 + code/controllers/subsystem/communications.dm | 3 + code/datums/emergency_calls/forecon.dm | 62 +++++ code/game/jobs/job/marine/squads.dm | 12 + code/game/machinery/telecomms/presets.dm | 2 +- .../objects/items/devices/radio/headset.dm | 8 + .../suits/marine_armor/_marine_armor.dm | 13 + code/modules/gear_presets/uscm_forecon.dm | 255 ++++++++++++++++++ code/modules/projectiles/guns/rifles.dm | 5 + .../projectiles/guns/specialist/scout.dm | 3 + colonialmarines.dme | 2 + 11 files changed, 365 insertions(+), 1 deletion(-) create mode 100644 code/datums/emergency_calls/forecon.dm create mode 100644 code/modules/gear_presets/uscm_forecon.dm diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index bedc8234d9c9..79f40c89bb53 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -12,6 +12,7 @@ #define SQUAD_MARINE_INTEL "Intel" #define SQUAD_SOF "SOF" #define SQUAD_CBRN "CBRN" +#define SQUAD_FORECON "FORECON" // Job name defines #define JOB_SQUAD_MARINE "Rifleman" diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index c245b1012900..7397d98a0d52 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -115,6 +115,7 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency #define SOF_FREQ 1472 #define PVST_FREQ 1473 #define CBRN_FREQ 1474 +#define FORECON_FREQ 1475 //Ship department channels #define SENTRY_FREQ 1480 @@ -171,6 +172,7 @@ GLOBAL_LIST_INIT(radiochannels, list( SQUAD_MARINE_CRYO = CRYO_FREQ, SQUAD_SOF = SOF_FREQ, SQUAD_CBRN = CBRN_FREQ, + SQUAD_FORECON = FORECON_FREQ, RADIO_CHANNEL_ALAMO = DS1_FREQ, RADIO_CHANNEL_NORMANDY = DS2_FREQ, @@ -278,6 +280,7 @@ SUBSYSTEM_DEF(radio) "[ECHO_FREQ]" = "echoradio", "[CRYO_FREQ]" = "cryoradio", "[CBRN_FREQ]" = "hcradio", + "[FORECON_FREQ]" = "hcradio", "[SOF_FREQ]" = "hcradio", "[HC_FREQ]" = "hcradio", "[PVST_FREQ]" = "pvstradio", diff --git a/code/datums/emergency_calls/forecon.dm b/code/datums/emergency_calls/forecon.dm new file mode 100644 index 000000000000..98e6a1c27ec2 --- /dev/null +++ b/code/datums/emergency_calls/forecon.dm @@ -0,0 +1,62 @@ +/datum/emergency_call/forecon + name = "FORECON (Squad)" + arrival_message = "A Force Reconnaissance squad has been dispatched to your ship. Stand by." + objectives = "Handle whatever threat is present. Further orders may be provided." + home_base = /datum/lazy_template/ert/weyland_station + probability = 0 + mob_min = 3 + mob_max = 6 + + max_heavies = 1 + max_medics = 1 + max_smartgunners = 1 + +/datum/emergency_call/forecon/create_member(datum/mind/new_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) + new_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 + arm_equipment(mob, /datum/equipment_preset/uscm/forecon/squad_leader, TRUE, TRUE) + to_chat(mob, SPAN_ROLE_HEADER("You are the FORECON Squad Leader!")) + + else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job)) + medics++ + arm_equipment(mob, /datum/equipment_preset/uscm/forecon/tech, TRUE, TRUE) + to_chat(mob, SPAN_ROLE_HEADER("You are the FORECON Support Technician!")) + + else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN)) + smartgunners++ + to_chat(mob, SPAN_ROLE_HEADER("You are a FORECON Smartgunner!")) + arm_equipment(mob, /datum/equipment_preset/uscm/forecon/smartgunner, TRUE, TRUE) + + else if(heavies < max_heavies && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(mob.client, JOB_SQUAD_SPECIALIST)) + heavies++ + to_chat(mob, SPAN_ROLE_HEADER("You are a FORECON Designated Marskman!")) + arm_equipment(mob, /datum/equipment_preset/uscm/forecon/marksman, TRUE, TRUE) + + else + arm_equipment(mob, /datum/equipment_preset/uscm/forecon/standard, TRUE, TRUE) + to_chat(mob, SPAN_ROLE_HEADER("You are a FORECON Rifleman!")) + + to_chat(mob, SPAN_ROLE_BODY("You are a member of the USCM's Force Reconnisance. FORECON is a force that specializes in special operations behind enemy lines, or conducting reconnisance in situations regular Marines are not expected to handle.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + +/datum/emergency_call/forecon/platoon + name = "FORECON (Platoon)" + mob_min = 6 + mob_max = 30 + probability = 0 + max_medics = 6 + max_heavies = 1 + max_smartgunners = 2 + +/datum/emergency_call/forecon/platoon/New() + ..() + arrival_message = "A Force Reconnaissance squad has been dispatched to your ship. Stand by." + objectives = "Handle whatever threat is present. Further orders may be provided." diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 419f7d545fcf..75f6622506a9 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -221,6 +221,18 @@ roundstart = FALSE locked = TRUE +/datum/squad/marine/forecon + name = SQUAD_FORECON + equipment_color = "#32CD32" + chat_color = "#32CD32" + radio_freq = FORECON_FREQ + minimap_color = "#32CD32" + + active = FALSE + roundstart = FALSE + locked = TRUE + + //############################### UPP Squads /datum/squad/upp name = "Root" diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 3997484f39e7..0c9e875534da 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -458,7 +458,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, PVST_FREQ, SOF_FREQ, CBRN_FREQ) + freq_listening = list(WY_WO_FREQ, PMC_FREQ, DUT_FREQ, YAUT_FREQ, HC_FREQ, PVST_FREQ, SOF_FREQ, CBRN_FREQ, FORECON_FREQ) //Buses diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 320e44f3f503..e414ca3dafdd 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -897,6 +897,14 @@ ignore_z = TRUE has_hud = TRUE +/obj/item/device/radio/headset/distress/forecon + name = "\improper Force Recon headset" + desc = "A headset given to FORECON marines. Channels are as follows: :g - public, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel" + frequency = FORECON_FREQ + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/mcom) + ignore_z = TRUE + has_hud = TRUE + /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, /obj/item/device/encryptionkey/WY) diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm index 15340bc1aae2..e6cf78611a7f 100644 --- a/code/modules/clothing/suits/marine_armor/_marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm @@ -521,6 +521,19 @@ icon_state = "c_VL_syn_camo" flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE +/obj/item/clothing/suit/storage/marine/light/recon + name = "M3-R pattern light armor" + desc = "Special issue light armor for forward econnaissance Marines. Offers similar protection as M3 armor but none of the slowdown." + armor_melee = CLOTHING_ARMOR_MEDIUM + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_NONE + armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_MEDIUM + movement_compensation = SLOWDOWN_ARMOR_LIGHT + // M3-EOD pattern heavy armor /obj/item/clothing/suit/storage/marine/heavy name = "\improper M3-EOD pattern heavy armor" diff --git a/code/modules/gear_presets/uscm_forecon.dm b/code/modules/gear_presets/uscm_forecon.dm new file mode 100644 index 000000000000..dfe4e7dd8d5c --- /dev/null +++ b/code/modules/gear_presets/uscm_forecon.dm @@ -0,0 +1,255 @@ +/datum/equipment_preset/uscm/forecon + assignment = JOB_SQUAD_MARINE + rank = JOB_SQUAD_MARINE + paygrade = PAY_SHORT_ME5 + idtype = /obj/item/card/id/dogtag + role_comm_title = "FORECON" + rank = JOB_MARINE + faction_group = list(FACTION_MARINE) + flags = EQUIPMENT_PRESET_START_OF_ROUND + auto_squad_name = SQUAD_FORECON + ert_squad = TRUE + +/datum/equipment_preset/uscm/forecon/New() + . = ..() + access = get_access(ACCESS_LIST_UA) + + dress_shoes = list(/obj/item/clothing/shoes/dress) + dress_gloves = list(/obj/item/clothing/gloves/marine/dress) + dress_under = list(/obj/item/clothing/under/marine/dress/blues/senior) + dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues/nco) + dress_hat = list(/obj/item/clothing/head/marine/dress_cover) + +/datum/equipment_preset/uscm/forecon/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/reconnaissance/uniform = new() + var/obj/item/clothing/accessory/storage/droppouch/pouch = new() + var/obj/item/clothing/accessory/ranks/marine/e5/pin = new() + var/obj/item/clothing/accessory/patch/patch_uscm = new() + var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new() + uniform.attach_accessory(new_human,pouch) + uniform.attach_accessory(new_human,patch_uscm) + uniform.attach_accessory(new_human,pin) + uniform.attach_accessory(new_human,patch_forecon) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/recon(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY) + 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/tool/crowbar/tactical(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET) + 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/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR) + GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human) + +/datum/equipment_preset/uscm/forecon/proc/add_forecon_weapon(mob/living/carbon/human/new_human) + var/random_gun = rand(1,3) + switch(random_gun) + if(1 , 2) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41a/tactical(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/extended(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/extended(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ap(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ap(new_human), WEAR_IN_BACK) + if(3) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m4ra/tactical(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/ext(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/ext(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/ap(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/ap(new_human), WEAR_IN_BACK) + +/datum/equipment_preset/uscm/forecon/proc/spawn_random_headgear(mob/living/carbon/human/new_human) + var/i = rand(1,10) + switch(i) + if (1 , 2) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/cmcap(new_human), WEAR_HEAD) + if (3 , 4) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beanie(new_human), WEAR_HEAD) + if (5 , 6) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/durag(new_human), WEAR_HEAD) + if (7 , 8) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/cmcap/boonie(new_human), WEAR_HEAD) + if (9) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD) + +/datum/equipment_preset/uscm/forecon/proc/add_forecon_weapon_pistol(mob/living/carbon/human/new_human) + var/random_pistol = rand(1,5) + switch(random_pistol) + if(1 , 2) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + if(3 , 4) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m39, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/m39(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/extended(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/extended(new_human), WEAR_IN_BELT) + if(5) + new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector(new_human),WEAR_WAIST) + +/datum/equipment_preset/uscm/forecon/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + +/datum/equipment_preset/uscm/forecon/standard + name = "USCM Reconnaissance Marine" + assignment = JOB_FORECON_RIFLEMAN + rank = JOB_SQUAD_MARINE + role_comm_title = "RFN" + minimap_icon = "" + skills = /datum/skills/military/survivor/forecon_standard + +/datum/equipment_preset/uscm/forecon/standard/load_gear(mob/living/carbon/human/new_human) + ..() + spawn_random_headgear(new_human) + add_forecon_weapon_pistol(new_human) + add_forecon_weapon(new_human) + +/datum/equipment_preset/uscm/forecon/tech + name = "USCM Reconnaissance Support Technician" + assignment = JOB_FORECON_SUPPORT + rank = JOB_SQUAD_MEDIC + role_comm_title = "SuppTech" + minimap_icon = "engi" + skills = /datum/skills/military/survivor/forecon_techician + +/datum/equipment_preset/uscm/forecon/tech/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/big(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_human), WEAR_WAIST) + 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/storage/belt/utility/full(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK) + add_forecon_weapon(new_human) + spawn_random_headgear(new_human) + +/datum/equipment_preset/uscm/forecon/marksman + name = "USCM Reconnaissance Designated Marksman" + assignment = JOB_FORECON_MARKSMAN + rank = JOB_SQUAD_SPECIALIST + role_comm_title = "DMR" + minimap_icon = "spec" + skills = /datum/skills/military/survivor/forecon_marksman + +/datum/equipment_preset/uscm/forecon/marksman/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/reconnaissance/uniform = new() + var/obj/item/clothing/accessory/storage/droppouch/pouch = new() + var/obj/item/clothing/accessory/ranks/marine/e5/pin = new() + var/obj/item/clothing/accessory/patch/patch_uscm = new() + var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new() + uniform.attach_accessory(new_human,pouch) + uniform.attach_accessory(new_human,patch_uscm) + uniform.attach_accessory(new_human,pin) + uniform.attach_accessory(new_human,patch_forecon) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/M3S, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY) + 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/tool/crowbar/tactical(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET) + 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/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m4ra_custom/tactical(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/custom(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/custom(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/custom(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/custom/impact(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m4ra/custom/incendiary(new_human), WEAR_IN_BACK) + GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human) + ..() + add_forecon_weapon_pistol(new_human) + spawn_random_headgear(new_human) + +/datum/equipment_preset/uscm/forecon/smartgunner + name = "USCM Reconnaissance Smartgunner" + assignment = JOB_FORECON_SMARTGUNNER + rank = JOB_SQUAD_SMARTGUN + role_comm_title = "SG" + minimap_icon = "smartgunner" + skills = /datum/skills/military/survivor/forecon_smartgunner + +/datum/equipment_preset/uscm/forecon/smartgunner/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/reconnaissance/uniform = new() + var/obj/item/clothing/accessory/storage/droppouch/pouch = new() + var/obj/item/clothing/accessory/ranks/marine/e5/pin = new() + var/obj/item/clothing/accessory/patch/patch_uscm = new() + var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new() + uniform.attach_accessory(new_human,pouch) + uniform.attach_accessory(new_human,patch_uscm) + uniform.attach_accessory(new_human,pin) + uniform.attach_accessory(new_human,patch_forecon) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/smartgunner(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET) + 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/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/forecon(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun(new_human), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun(new_human), WEAR_IN_BELT) + GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human) + spawn_random_headgear(new_human) + +/datum/equipment_preset/uscm/forecon/squad_leader + name = "USCM Reconnaissance Squad Leader" + assignment = JOB_FORECON_SL + rank = JOB_SQUAD_LEADER + role_comm_title = "SL" + skills = /datum/skills/military/survivor/forecon_squad_leader + paygrade = PAY_SHORT_MO1 + + dress_under = list(/obj/item/clothing/under/marine/dress/blues/senior) + dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues/officer) + dress_hat = list(/obj/item/clothing/head/marine/dress_cover/officer) + +/datum/equipment_preset/uscm/forecon/squad_leader/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/reconnaissance/uniform = new() + var/obj/item/clothing/accessory/storage/droppouch/pouch = new() + var/obj/item/clothing/accessory/ranks/marine/o1/pin = new() + var/obj/item/clothing/accessory/patch/patch_uscm = new() + var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new() + uniform.attach_accessory(new_human,pouch) + uniform.attach_accessory(new_human,patch_uscm) + uniform.attach_accessory(new_human,pin) + uniform.attach_accessory(new_human,patch_forecon) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/tactical(new_human), WEAR_R_HAND) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human), WEAR_IN_BACK) + ..() + add_forecon_weapon_pistol(new_human) + spawn_random_headgear(new_human) diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index b631f093bafe..ad85220400fb 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -1587,6 +1587,11 @@ /obj/item/weapon/gun/rifle/m4ra/training current_mag = /obj/item/ammo_magazine/rifle/m4ra/rubber +/obj/item/weapon/gun/rifle/m4ra/tactical + current_mag = /obj/item/ammo_magazine/rifle/m4ra/ext + starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/attachable/suppressor, /obj/item/attachable/angledgrip) + + //------------------------------------------------------- //L42A Battle Rifle diff --git a/code/modules/projectiles/guns/specialist/scout.dm b/code/modules/projectiles/guns/specialist/scout.dm index c2c5abd54add..8443e59580cc 100644 --- a/code/modules/projectiles/guns/specialist/scout.dm +++ b/code/modules/projectiles/guns/specialist/scout.dm @@ -81,3 +81,6 @@ if(!skillcheck(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && user.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_SCOUT) to_chat(user, SPAN_WARNING("You don't seem to know how to use \the [src]...")) return FALSE + +/obj/item/weapon/gun/rifle/m4ra_custom/tactical + starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/attachable/bayonet, /obj/item/attachable/angledgrip) diff --git a/colonialmarines.dme b/colonialmarines.dme index 5193cd3571cb..9bfccac6a56e 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -522,6 +522,7 @@ #include "code\datums\emergency_calls\emergency_call.dm" #include "code\datums\emergency_calls\ert_stations.dm" #include "code\datums\emergency_calls\feral_xenos.dm" +#include "code\datums\emergency_calls\forecon.dm" #include "code\datums\emergency_calls\forsaken_xenos.dm" #include "code\datums\emergency_calls\goons.dm" #include "code\datums\emergency_calls\hefa_knight.dm" @@ -1784,6 +1785,7 @@ #include "code\modules\gear_presets\uscm.dm" #include "code\modules\gear_presets\uscm_dress.dm" #include "code\modules\gear_presets\uscm_event.dm" +#include "code\modules\gear_presets\uscm_forecon.dm" #include "code\modules\gear_presets\uscm_medical.dm" #include "code\modules\gear_presets\uscm_police.dm" #include "code\modules\gear_presets\uscm_ship.dm"