diff --git a/code/datums/ammo/bullet/sniper.dm b/code/datums/ammo/bullet/sniper.dm
index 22371972e623..8759caa7efca 100644
--- a/code/datums/ammo/bullet/sniper.dm
+++ b/code/datums/ammo/bullet/sniper.dm
@@ -104,23 +104,51 @@
shrapnel_chance = 0 // This isn't leaving any shrapnel.
accuracy = HIT_ACCURACY_TIER_8
- damage = 125
+ damage = 100
+ shell_speed = AMMO_SPEED_TIER_6
+
+/datum/ammo/bullet/sniper/wallpopper/
+ name = "wallpopper sniper bullet"
+
+ shrapnel_chance = 0 // hesh leaves no shrapnel
+ accuracy = HIT_ACCURACY_TIER_8
+ damage = 55
shell_speed = AMMO_SPEED_TIER_6
/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/M,obj/projectile/P)
if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original)
var/mob/living/L = M
- var/size_damage_mod = 0.8
+ var/size_damage_mod = 0.2
if(isxeno(M))
var/mob/living/carbon/xenomorph/target = M
if(target.mob_size >= MOB_SIZE_XENO)
- size_damage_mod += 0.6
+ size_damage_mod += 0.4
if(target.mob_size >= MOB_SIZE_BIG)
size_damage_mod += 0.6
L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration)
// 180% damage to all targets (225), 240% (300) against non-Runner xenos, and 300% against Big xenos (375). -Kaga
+ // keeping above for book keeping sake, damage isnt that high anymore, does way less, very similar to normal sniper
to_chat(P.firer, SPAN_WARNING("Bullseye!"))
+/datum/ammo/bullet/sniper/wallpopper/set_bullet_traits()
+ . = ..()
+ LAZYADD(traits_to_give, list(
+ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff),
+ // BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_damage_boost, 30, GLOB.damage_boost_turfs), //2550, 2 taps colony walls, 4 taps reinforced walls
+ // BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_damage_boost, 0.23, GLOB.damage_boost_turfs_xeno), //2550*0.23 = 586, 2 taps resin walls, 3 taps thick resin
+ // BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_damage_boost, 15, GLOB.damage_boost_breaching), //1275, enough to 1 tap airlocks
+ // BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_damage_boost, 6, GLOB.damage_boost_pylons), //510, 4 shots to take out a pylon
+ ))
+
+/datum/ammo/bullet/sniper/anti_materiel/set_bullet_traits()
+ . = ..()
+ LAZYADD(traits_to_give, list(
+ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff),
+ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating/light),
+ // BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_damage_boost, 3, GLOB.damage_boost_turfs),
+ // BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_damage_boost, 3, GLOB.damage_boost_breaching), //edited to take 5 shots for heavy resin and 3 for normal resin walls, since it wallbangs this shouldnt be a issue i dont think it would be an issue
+ // BULLET_TRAIT_ENTRY( /datum/element/bullet_trait_damage_boost, 2, GLOB.damage_boost_pylons) //At 200 per shot it'll take 9 to break a Pylon (1800 HP). No Damage Boost vs other xeno structures yet, those will require a whole new list w/ the damage_boost trait.
+ ))
/datum/ammo/bullet/sniper/anti_materiel/vulture
damage = 400 // Fully intended to vaporize anything smaller than a mini cooper
accurate_range_min = 10
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index 08b5ea9f9a64..a47edc7af641 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -175,6 +175,12 @@
strength = EYE_PROTECTION_FLASH
probability = 35
+/obj/effect/ebeam/laser/purple
+ name = "purple laser beam"
+ alpha = 255
+ strength = EYE_PROTECTION_FLASH
+ probability = 45
+
/obj/effect/ebeam/laser/weak
name = "weak laser beam"
alpha = 150
diff --git a/code/datums/elements/bullet_trait/damage_boost.dm b/code/datums/elements/bullet_trait/damage_boost.dm
index eee4a8e80f4b..a74f6e5898ad 100644
--- a/code/datums/elements/bullet_trait/damage_boost.dm
+++ b/code/datums/elements/bullet_trait/damage_boost.dm
@@ -61,7 +61,7 @@ GLOBAL_LIST_INIT(damage_boost_vehicles, typecacheof(/obj/vehicle/multitile))
COMSIG_BULLET_PRE_HANDLE_OBJ,
COMSIG_BULLET_PRE_HANDLE_TURF,
COMSIG_BULLET_PRE_HANDLE_MOB,
- ), PROC_REF(handle_bullet))
+ ), PROC_REF(handle_bullet), override = TRUE)
/datum/element/bullet_trait_damage_boost/proc/check_type(atom/A)
if(istype(A, /obj/structure/machinery/door)) return "door"
diff --git a/code/datums/elements/bullet_trait/penetrating/light.dm b/code/datums/elements/bullet_trait/penetrating/light.dm
new file mode 100644
index 000000000000..9dd97dd5599f
--- /dev/null
+++ b/code/datums/elements/bullet_trait/penetrating/light.dm
@@ -0,0 +1,23 @@
+/datum/element/bullet_trait_penetrating/light
+ // Generic bullet trait vars
+ element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE
+ id_arg_index = 3
+
+ /// For every mob this pierces, how much damage should this lose?
+ var/damage_lost_per_hit = 15
+
+
+/datum/element/bullet_trait_penetrating/light/Attach(datum/target, distance_loss_per_hit = 2, damage_lost_per_hit = 15)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE)
+ return
+
+ src.damage_lost_per_hit = damage_lost_per_hit
+
+/datum/element/bullet_trait_penetrating/light/handle_passthrough_movables(obj/projectile/bullet, atom/movable/hit_movable, did_hit)
+ if(did_hit)
+ bullet.distance_travelled += distance_loss_per_hit
+ if(ismob(hit_movable))
+ bullet.damage -= damage_lost_per_hit
+
+ return COMPONENT_BULLET_PASS_THROUGH
diff --git a/code/datums/supply_packs/spec_ammo.dm b/code/datums/supply_packs/spec_ammo.dm
index f0eb5ab9cea2..b2745bb9dc24 100644
--- a/code/datums/supply_packs/spec_ammo.dm
+++ b/code/datums/supply_packs/spec_ammo.dm
@@ -109,8 +109,7 @@
containername = "M42A Incendiary Magazine Crate"
group = "Weapons Specialist Ammo"
-//XM43E1 - Disabled during testing per request.
-/*
+
/datum/supply_packs/ammo_amr_marksman
name = "XM43E1 anti-materiel rifle marksman magazines crate (x5)"
contains = list(
@@ -123,8 +122,23 @@
cost = 30
containertype = /obj/structure/closet/crate/ammo
containername = "XM43E1 Anti-Materiel Magazine Crate"
- group = "Specialist Ammo"
-*/
+ group = "Weapons Specialist Ammo"
+
+
+/datum/supply_packs/ammo_amr_wallpopper
+ name = "XM43E1 anti-materiel rifle wallpopper magazines crate (x5)"
+ contains = list(
+ /obj/item/ammo_magazine/sniper/wallpopper,
+ /obj/item/ammo_magazine/sniper/wallpopper,
+ /obj/item/ammo_magazine/sniper/wallpopper,
+ /obj/item/ammo_magazine/sniper/wallpopper,
+ /obj/item/ammo_magazine/sniper/wallpopper,
+ )
+ cost = 30
+ containertype = /obj/structure/closet/crate/ammo
+ containername = "XM43E1 Wall-Popper Magazine Crate"
+ group = "Weapons Specialist Ammo"
+
//M4RA
/datum/supply_packs/ammo_scout_mix
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 e800fc1efd56..a65e197ec591 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
@@ -17,6 +17,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list(
list("M42A Flak Magazine (10x28mm)", 40, /obj/item/ammo_magazine/sniper/flak, null, VENDOR_ITEM_REGULAR),
list("M42A Incendiary Magazine (10x28mm)", 40, /obj/item/ammo_magazine/sniper/incendiary, null, VENDOR_ITEM_REGULAR),
list("M42A Marksman Magazine (10x28mm Caseless)", 40, /obj/item/ammo_magazine/sniper, null, VENDOR_ITEM_REGULAR),
+ list("XM43E1 Anti-Material (10x99mm Caseless)", 40, /obj/item/ammo_magazine/sniper/anti_materiel, null, VENDOR_ITEM_REGULAR),
+
list("EXTRA DEMOLITIONIST AMMUNITION", 0, null, null, null),
list("84mm Anti-Armor Rocket", 40, /obj/item/ammo_magazine/rocket/ap, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/items/devices/motion_detector.dm b/code/game/objects/items/devices/motion_detector.dm
index 7db2825deedf..0ef397bebb1f 100644
--- a/code/game/objects/items/devices/motion_detector.dm
+++ b/code/game/objects/items/devices/motion_detector.dm
@@ -199,6 +199,11 @@
if(ishuman(holder.loc))
return holder.loc
+/obj/item/device/motiondetector/xm43/get_user()
+ var/atom/holder = loc
+ if(ishuman(holder.loc))
+ return holder.loc
+
/obj/item/device/motiondetector/proc/apply_debuff(mob/M)
return
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 26c92f632ee2..c771d0c8b453 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -886,6 +886,87 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
flags_inventory = BLOCKSHARPOBJ
clothing_traits = list(TRAIT_EAR_PROTECTION)
unacidable = TRUE
+/obj/item/clothing/head/helmet/marine/xm43e1
+ name = "\improper XM-3VL pattern marksman helmet"
+ icon_state = "xm43e1_helmet"
+ item_state = "xm43e1_helmet"
+ specialty = "XM-3VL experimental light"
+ desc = "A state of the art helmet designed in tandem with the XM43E1, this helmets equiped with all the gizmos and gadgets, ballistics tracker, astrology, wind elevation, proper escalation, everything you can think of it has... probably, thats why the helmets flashing.. probably."
+ min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROT
+ flags_atom = NO_SNOW_TYPE
+ flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE
+
+ /// XM43 Integral Motion Detector Ability
+ actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/xm43/toggle_motion_detector)
+ var/motion_detector = FALSE
+ var/obj/item/device/motiondetector/xm43/proximity
+ var/long_range_cooldown = 2
+ var/recycletime = 120
+
+/obj/item/clothing/head/helmet/marine/xm43e1/Initialize(mapload, ...)
+ . = ..()
+ proximity = new(src)
+ update_icon()
+
+/datum/action/item_action/xm43/action_activate()
+ if(!ishuman(owner))
+ return
+
+/datum/action/item_action/xm43/update_button_icon()
+ return
+
+/datum/action/item_action/xm43/toggle_motion_detector/New(Target, obj/item/holder)
+ . = ..()
+ name = "Toggle Motion Detector"
+ action_icon_state = "motion_detector"
+ button.name = name
+ button.overlays.Cut()
+ button.overlays += image('icons/mob/hud/actions.dmi', button, action_icon_state)
+
+/datum/action/item_action/xm43/toggle_motion_detector/action_activate()
+ . = ..()
+ var/obj/item/clothing/head/helmet/marine/xm43e1/recon = holder_item
+ recon.toggle_motion_detector(owner)
+
+/datum/action/item_action/xm43/toggle_motion_detector/proc/update_icon()
+ if(!holder_item)
+ return
+ var/obj/item/clothing/head/helmet/marine/xm43e1/recon = holder_item
+ if(recon.motion_detector)
+ button.icon_state = "template_on"
+ else
+ button.icon_state = "template"
+
+/obj/item/clothing/head/helmet/marine/xm43e1/process()
+ if(!motion_detector)
+ STOP_PROCESSING(SSobj, src)
+ if(motion_detector)
+ recycletime--
+ if(!recycletime)
+ recycletime = initial(recycletime)
+ proximity.refresh_blip_pool()
+ long_range_cooldown--
+ if(long_range_cooldown)
+ return
+ long_range_cooldown = initial(long_range_cooldown)
+ proximity.scan()
+
+/obj/item/clothing/head/helmet/marine/xm43e1/proc/toggle_motion_detector(mob/user)
+ to_chat(user,SPAN_NOTICE("You [motion_detector? "disable" : "enable"] \the [src]'s motion detector."))
+ if(!motion_detector)
+ playsound(loc,'sound/items/detector_turn_on.ogg', 25, 1)
+ else
+ playsound(loc,'sound/items/detector_turn_off.ogg', 25, 1)
+ motion_detector = !motion_detector
+ var/datum/action/item_action/xm43/toggle_motion_detector/TMD = locate(/datum/action/item_action/xm43/toggle_motion_detector) in actions
+ TMD.update_icon()
+ motion_detector()
+
+/obj/item/clothing/head/helmet/marine/xm43e1/proc/motion_detector()
+ if(motion_detector)
+ START_PROCESSING(SSobj, src)
+ else
+ STOP_PROCESSING(SSobj, src)
/obj/item/clothing/head/helmet/marine/pilot
name = "\improper M30 tactical helmet"
diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm
index fd926c4ffd50..169f8999a12b 100644
--- a/code/modules/clothing/suits/marine_armor/_marine_armor.dm
+++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm
@@ -649,6 +649,18 @@
flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE
unacidable = TRUE
+/obj/item/clothing/suit/storage/marine/light/vest/xm43e1_vest
+ name = "\improper XM-3VL pattern fire support vest"
+ armor_melee = CLOTHING_ARMOR_MEDIUM
+ slowdown = SLOWDOWN_ARMOR_LIGHT
+ desc = "A smartgun rig mated to a lightweight combat vest intended to allow ease of transport durign field testing. The vest is equiped with a support arm similar to that of the smartgun, it helps keep the rifle steady more so than dampening recoil."
+ icon_state = "xm43e1_vest"
+ storage_slots = 3
+ uniform_restricted = list(/obj/item/clothing/under/marine)
+ armor_melee = CLOTHING_ARMOR_MEDIUM
+ flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE
+ unacidable = TRUE
+
/obj/item/clothing/suit/storage/RO
name = "quartermaster jacket"
desc = "A green jacket worn by USCM personnel. The back has the flag of the United Americas on it."
diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm
index d99da8f59f2c..85903a7fb29c 100644
--- a/code/modules/cm_marines/equipment/kit_boxes.dm
+++ b/code/modules/cm_marines/equipment/kit_boxes.dm
@@ -51,7 +51,12 @@
kit_overlay = "sniper"
/obj/item/storage/box/spec/sniper/fill_preset_inventory()
- // sniper
+ new /obj/item/spec_kit/sniper_weapon_selector(src)
+ new /obj/item/weapon/gun/pistol/vp78(src)
+ new /obj/item/ammo_magazine/pistol/vp78(src)
+ new /obj/item/ammo_magazine/pistol/vp78(src)
+
+/obj/item/storage/box/spec/sniper/m42a/fill_preset_inventory()
new /obj/item/clothing/suit/storage/marine/ghillie(src)
new /obj/item/clothing/head/helmet/marine/ghillie(src)
new /obj/item/clothing/glasses/night/m42_night_goggles(src)
@@ -61,14 +66,21 @@
new /obj/item/ammo_magazine/sniper/flak(src)
new /obj/item/ammo_magazine/sniper/flak(src)
new /obj/item/storage/backpack/marine/smock(src)
- new /obj/item/weapon/gun/pistol/vp78(src)
- new /obj/item/ammo_magazine/pistol/vp78(src)
- new /obj/item/ammo_magazine/pistol/vp78(src)
new /obj/item/weapon/gun/rifle/sniper/M42A(src)
- new /obj/item/facepaint/sniper(src)
// spotter
new /obj/item/storage/box/kit/spotter(src)
+/obj/item/storage/box/spec/sniper/antimaterial/fill_preset_inventory()
+ desc = "a large case containing a XM43E1 anti material rifle"
+ new /obj/item/clothing/suit/storage/marine/light/vest/xm43e1_vest(src)
+ new /obj/item/clothing/head/helmet/marine/xm43e1(src)
+ new /obj/item/weapon/gun/rifle/sniper/XM43E1(src)
+ new /obj/item/ammo_magazine/sniper/anti_materiel(src)
+ new /obj/item/ammo_magazine/sniper/anti_materiel(src)
+ new /obj/item/ammo_magazine/sniper/anti_materiel(src)
+ new /obj/item/ammo_magazine/sniper/wallpopper(src)
+ new /obj/item/ammo_magazine/sniper/wallpopper(src)
+
/obj/item/storage/box/spec/scout
name = "\improper Scout equipment case"
desc = "A large case containing an M4RA battle rifle, M3-S light armor and helmet, M4RA battle sight, M68 thermal cloak, V3 reactive thermal tarp, improved scout laser designator, ammunition and additional pieces of equipment.\nDrag this sprite onto yourself to open it up! NOTE: You cannot put items back inside this case."
@@ -278,6 +290,30 @@
return TRUE
return FALSE
+//Sniper weapon selector snowflake
+/obj/item/spec_kit/sniper_weapon_selector
+ name = "\improper Sniper weapon case"
+ desc = "A large case with the option of the M42A sniper rifle and the XM43E1 Anti-Material rifle."
+
+/obj/item/spec_kit/sniper_weapon_selector/can_use(mob/living/carbon/human/user)
+ return TRUE
+
+/obj/item/spec_kit/sniper_weapon_selector/select_and_spawn(mob/living/carbon/human/user)
+ var/sniper_selection = tgui_input_list(usr, "Select your weapon", "Weapon Selection", list("M42A sniper rifle", "XM43E1 Anti-Material rifle"))
+ if(!sniper_selection || QDELETED(src))
+ return FALSE
+ var/turf/T = get_turf(loc)
+ var/obj/item/storage/box/spec/weapon_box
+ switch(sniper_selection)
+ if("M42A sniper rifle")
+ weapon_box = new /obj/item/storage/box/spec/sniper/m42a(T)
+ user.put_in_hands(weapon_box)
+ return TRUE
+ if("XM43E1 Anti-Material rifle")
+ weapon_box = new /obj/item/storage/box/spec/sniper/antimaterial(T)
+ user.put_in_hands(weapon_box)
+ return TRUE
+ return FALSE
//******************************************PFC Kits****************************************************************/
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index c38ddbcd552c..28aaafcb05b1 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -254,6 +254,13 @@
var/datum/action/item_action/intel/toggle_motion_detector/TMD = locate(/datum/action/item_action/intel/toggle_motion_detector) in xm4.actions
TMD.update_icon()
xm4.motion_detector()
+ if(istype(i, /obj/item/clothing/head/helmet/marine/xm43e1))
+ var/obj/item/clothing/head/helmet/marine/xm43e1/xm43 = i
+ if(xm43.motion_detector)
+ xm43.motion_detector = FALSE
+ var/datum/action/item_action/xm43/toggle_motion_detector/TMD = locate(/datum/action/item_action/xm43/toggle_motion_detector) in xm43.actions
+ TMD.update_icon()
+ xm43.motion_detector()
/mob/living/carbon/human/proc/disable_headsets()
//Disable all radios to reduce radio spam for dead people
diff --git a/code/modules/projectiles/guns/specialist/sniper.dm b/code/modules/projectiles/guns/specialist/sniper.dm
index bdb0ba02f3ab..b1b225c989be 100644
--- a/code/modules/projectiles/guns/specialist/sniper.dm
+++ b/code/modules/projectiles/guns/specialist/sniper.dm
@@ -346,7 +346,7 @@
unacidable = TRUE
indestructible = 1
- fire_sound = 'sound/weapons/sniper_heavy.ogg'
+ fire_sound = 'sound/weapons/xm43e1_fire.ogg'
current_mag = /obj/item/ammo_magazine/sniper/anti_materiel //Renamed from anti-tank to align with new identity/description. Other references have been changed as well. -Kaga
force = 12
wield_delay = WIELD_DELAY_HORRIBLE //Ends up being 1.6 seconds due to scope
@@ -354,9 +354,9 @@
attachable_allowed = list(/obj/item/attachable/bipod)
flags_gun_features = GUN_AUTO_EJECTOR|GUN_SPECIALIST|GUN_WIELDED_FIRING_ONLY|GUN_AMMO_COUNTER
starting_attachment_types = list(/obj/item/attachable/pmc_sniperbarrel)
- sniper_beam_type = /obj/effect/ebeam/laser/intense
- sniper_beam_icon = "laser_beam_intense"
- sniper_lockon_icon = "sniper_lockon_intense"
+ sniper_beam_type = /obj/effect/ebeam/laser/purple
+ sniper_beam_icon = "laser_beam_purple"
+ sniper_lockon_icon = "sniper_lockon_purple"
/obj/item/weapon/gun/rifle/sniper/XM43E1/handle_starting_attachment()
..()
@@ -376,33 +376,58 @@
..()
set_fire_delay(FIRE_DELAY_TIER_6 * 6 )//Big boy damage, but it takes a lot of time to fire a shot.
//Kaga: Adjusted from 56 (Tier 4, 7*8) -> 30 (Tier 6, 5*6) ticks. 95 really wasn't big-boy damage anymore, although I updated it to 125 to remain consistent with the other 10x99mm caliber weapon (M42C). Now takes only twice as long as the M42A.
+ //Backsea: keeping above for progress updates and such adjusted to meet current CM standards, deals less damage since this thing shredded the fuck out of xenos
set_burst_amount(BURST_AMOUNT_TIER_1)
accuracy_mult = BASE_ACCURACY_MULT + 2*HIT_ACCURACY_MULT_TIER_10 //Who coded this like this, and why? It just calculates out to 1+1=2. Leaving a note here to check back later.
scatter = SCATTER_AMOUNT_TIER_10
damage_mult = BASE_BULLET_DAMAGE_MULT
recoil = RECOIL_AMOUNT_TIER_1
-/obj/item/weapon/gun/rifle/sniper/XM43E1/set_bullet_traits()
- LAZYADD(traits_to_give, list(
- BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff),
- BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating),
- BULLET_TRAIT_ENTRY_ID("turfs", /datum/element/bullet_trait_damage_boost, 11, GLOB.damage_boost_turfs),
- BULLET_TRAIT_ENTRY_ID("breaching", /datum/element/bullet_trait_damage_boost, 11, GLOB.damage_boost_breaching),
- //At 1375 per shot it'll take 1 shot to break resin turfs, and a full mag of 8 to break reinforced walls.
- BULLET_TRAIT_ENTRY_ID("pylons", /datum/element/bullet_trait_damage_boost, 6, GLOB.damage_boost_pylons)
- //At 750 per shot it'll take 3 to break a Pylon (1800 HP). No Damage Boost vs other xeno structures yet, those will require a whole new list w/ the damage_boost trait.
- ))
+/obj/item/weapon/gun/rifle/sniper/XM43E1/replace_magazine(mob/user, obj/item/ammo_magazine/magazine)
+ . = ..()
+ set_bullet_trait_type()
+
+/obj/item/weapon/gun/rifle/sniper/XM43E1/proc/set_bullet_trait_type()
+ remove_bullet_trait("breaching")
+ remove_bullet_trait("pylons")
+ remove_bullet_trait("turfs")
+ remove_bullet_trait("xeno turfs")
+ if(istype(current_mag, /obj/item/ammo_magazine/sniper/wallpopper))
+ LAZYADD(traits_to_give, list(
+ BULLET_TRAIT_ENTRY_ID("turfs", /datum/element/bullet_trait_damage_boost, 40, GLOB.damage_boost_turfs), //2550, 2 taps colony walls, 4 taps reinforced walls
+ BULLET_TRAIT_ENTRY_ID("xeno turfs", /datum/element/bullet_trait_damage_boost, 0.23, GLOB.damage_boost_turfs_xeno), //2550*0.23 = 586, 2 taps resin walls, 3 taps thick resin
+ BULLET_TRAIT_ENTRY_ID("breaching", /datum/element/bullet_trait_damage_boost, 30, GLOB.damage_boost_breaching), //1275, enough to 1 tap airlocks
+ BULLET_TRAIT_ENTRY_ID("pylons", /datum/element/bullet_trait_damage_boost, 6, GLOB.damage_boost_pylons), //510, 4 shots to take out a pylon
+ ))
+ return
+ if(istype(current_mag, /obj/item/ammo_magazine/sniper/anti_materiel))
+ LAZYADD(traits_to_give, list(
+ BULLET_TRAIT_ENTRY_ID("turfs", /datum/element/bullet_trait_damage_boost, 3, GLOB.damage_boost_turfs),
+ BULLET_TRAIT_ENTRY_ID("breaching", /datum/element/bullet_trait_damage_boost, 3, GLOB.damage_boost_breaching), //edited to take 5 shots for heavy resin and 3 for normal resin walls, since it wallbangs this shouldnt be a issue i dont think it would be an issue
+ BULLET_TRAIT_ENTRY_ID("pylons", /datum/element/bullet_trait_damage_boost, 2, GLOB.damage_boost_pylons), //At 200 per shot it'll take 9 to break a Pylon (1800 HP). No Damage Boost vs other xeno structures yet, those will require a whole new list w/ the damage_boost trait.
+ ))
/*
//Disabled until an identity is better defined. -Kaga
-/obj/item/weapon/gun/rifle/sniper/M42B/afterattack(atom/target, mob/user, flag)
+/obj/item/weapon/gun/rifle/sniper/XM43E1/afterattack(atom/target, mob/user, flag)
if(able_to_fire(user))
if(get_dist(target,user) <= 8)
to_chat(user, SPAN_WARNING("The [src.name] beeps, indicating that the target is within an unsafe proximity to the rifle, refusing to fire."))
return
else ..()
+// i cant figure this shit out and with the current state of the rifle it should be fine with this disabled, if someone somehow manages to make shit worse ill figure out how to make this work lol
*/
+/obj/item/weapon/gun/rifle/sniper/XM43E1/simulate_recoil(total_recoil = 2, mob/user, atom/target)
+ . = ..()
+ if(.)
+ var/mob/living/carbon/human/xm43e1_vest = user
+ if(xm43e1_vest.body_position == STANDING_UP && !istype(xm43e1_vest.wear_suit,/obj/item/clothing/suit/storage/marine/light/vest/xm43e1_vest))
+ xm43e1_vest.visible_message(SPAN_WARNING("[xm43e1_vest] is blown backwards from the recoil of the [src.name]!"),SPAN_HIGHDANGER("You are knocked prone by the blowback!"))
+ step(xm43e1_vest,turn(xm43e1_vest.dir,180))
+ xm43e1_vest.KnockDown(1)
+ xm43e1_vest.Stun(1)
+
/obj/item/weapon/gun/rifle/sniper/elite
name = "\improper M42C anti-tank sniper rifle"
desc = "A high-end superheavy magrail sniper rifle from Weyland-Armat chambered in a specialized variant of the heaviest ammo available, 10x99mm Caseless. This weapon requires a specialized armor rig for recoil mitigation in order to be used effectively."
diff --git a/code/modules/projectiles/magazines/specialist.dm b/code/modules/projectiles/magazines/specialist.dm
index 761e77305254..9d6243c8646a 100644
--- a/code/modules/projectiles/magazines/specialist.dm
+++ b/code/modules/projectiles/magazines/specialist.dm
@@ -30,11 +30,25 @@
//XM43E1 Magazine
/obj/item/ammo_magazine/sniper/anti_materiel
name = "\improper XM43E1 marksman magazine (10x99mm)"
- desc = "A magazine of caseless 10x99mm anti-materiel rounds."
+ desc = "A magazine of caseless 10x99mm anti-materiel rounds, these rounds easily penetrate armour with little to no spall, be mindful of over penetration."
max_rounds = 8
caliber = "10x99mm"
default_ammo = /datum/ammo/bullet/sniper/anti_materiel
gun_type = /obj/item/weapon/gun/rifle/sniper/XM43E1
+ icon_state = "xm43e1"
+ ammo_band_icon = "+m42c_band"
+ ammo_band_icon_empty = "+m42c_band_e"
+
+/obj/item/ammo_magazine/sniper/wallpopper
+ name = "\improper XM43E1 wallpopper magazine (10x99mm)"
+ desc = "A magazine of caseless 10x99mm anti-materiel rounds, these rounds are made similarly to a hesh shell with a thin outer casing of metal and a small amount of plastic explosive, this allows the rounds to be used in long range light demolition, due to the main target of said demolition being walls, the nickname of wallpopper came to be, referencing the rivets bursting out of walls due to the pressure built up inside of the wall when the round impacts."
+ max_rounds = 12
+ caliber = "10x99mm"
+ default_ammo = /datum/ammo/bullet/sniper/wallpopper
+ gun_type = /obj/item/weapon/gun/rifle/sniper/XM43E1
+ icon_state = "xm43e1wp"
+ ammo_band_icon = "+m42c_band"
+ ammo_band_icon_empty = "+m42c_band_e"
//M42C magazine
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 8cefc82f5f62..90a44713b747 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -493,6 +493,7 @@
#include "code\datums\elements\bullet_trait\ignored_range.dm"
#include "code\datums\elements\bullet_trait\incendiary.dm"
#include "code\datums\elements\bullet_trait\penetrating\heavy.dm"
+#include "code\datums\elements\bullet_trait\penetrating\light.dm"
#include "code\datums\elements\bullet_trait\penetrating\penetrating.dm"
#include "code\datums\elements\traitbound\_traitbound.dm"
#include "code\datums\elements\traitbound\crawler.dm"
diff --git a/icons/effects/Targeted.dmi b/icons/effects/Targeted.dmi
index 24b82a90fe6c..eeb5de449043 100644
Binary files a/icons/effects/Targeted.dmi and b/icons/effects/Targeted.dmi differ
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index d6ee40cf7fe8..966282cba727 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/mob/humans/onmob/head_1.dmi b/icons/mob/humans/onmob/head_1.dmi
index ab93b68640fc..79986dce3ef1 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/suit_1.dmi b/icons/mob/humans/onmob/suit_1.dmi
index c372b8a6d72c..35065a708da3 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/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi
index ff0aa3d08ec8..fa5d0239ba94 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 c1910d21b599..8b4f16132c44 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/weapons/guns/ammo_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi
index 8b3b5e0f1c80..39e360d8a696 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/sound/weapons/xm43e1_fire.ogg b/sound/weapons/xm43e1_fire.ogg
new file mode 100644
index 000000000000..9da5575fe7fb
Binary files /dev/null and b/sound/weapons/xm43e1_fire.ogg differ