Skip to content

The weapon of the future, TODAY! #745

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 50 commits into from
Apr 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
b30f9c2
The weapon of the future, TODAY!
BonniePandora Feb 8, 2025
77fa2b7
Adds classic-camo sprites to files needing
BonniePandora Feb 8, 2025
4e9497e
Missing icon
BonniePandora Feb 8, 2025
0cf44af
Reload and projectile tweaks
BonniePandora Feb 8, 2025
3c09730
XM99 guncase
BonniePandora Feb 8, 2025
a1855de
Vehicle damage tweaks
BonniePandora Feb 8, 2025
8fbd86e
Fine tuning
BonniePandora Feb 8, 2025
89b404f
Admin-spawn ammo stuff
BonniePandora Feb 9, 2025
99f3582
BEAM ME DOWN, SNOTTY!
BonniePandora Feb 9, 2025
500e75f
More lightshow proofing
BonniePandora Feb 9, 2025
730b690
Ammo tweaks
BonniePandora Feb 10, 2025
782c079
Merge branch 'master' into Plasma
BonniePandora Feb 10, 2025
f06bac0
Merge branch 'master' into Plasma
BonniePandora Feb 12, 2025
c851f98
Use modified .dmi option is a LIE
BonniePandora Feb 12, 2025
99ba05b
Reverts A1 to the A model
BonniePandora Feb 15, 2025
68b9981
Merge branch 'master' into Plasma
BonniePandora Feb 16, 2025
79741b4
Merge branch 'master' into Plasma
BonniePandora Feb 20, 2025
640e4f5
Icon conflict moment
BonniePandora Feb 20, 2025
e7efb7d
Merge branch 'master' into Plasma
BonniePandora Feb 21, 2025
cb03019
Icon conflicts
BonniePandora Feb 21, 2025
620aa4e
Merge branch 'master' into Plasma
BonniePandora Feb 21, 2025
8805845
Small tweak & fix
BonniePandora Feb 21, 2025
e7f6e33
Merge branch 'master' into Plasma
BonniePandora Feb 24, 2025
1a893ab
icon conflicts
BonniePandora Feb 24, 2025
721d3ad
Merge branch 'master' into Plasma
BonniePandora Feb 26, 2025
bac259a
Update kits.dmi
BonniePandora Feb 26, 2025
a333a93
Merge branch 'master' into Plasma
BonniePandora Feb 28, 2025
536590a
Merge branch 'master' into Plasma
BonniePandora Mar 6, 2025
b2f72dc
Merge branch 'master' into Plasma
BonniePandora Mar 14, 2025
0f17a64
Merge branch 'master' into Plasma
BonniePandora Mar 17, 2025
37c763f
Beam generation re-do pt1
BonniePandora Mar 17, 2025
7f48dcb
Awaga
BonniePandora Mar 20, 2025
3dc7f62
Merge branch 'master' into Plasma
BonniePandora Mar 20, 2025
63ec8b9
M. Bison "YESSSS" goes here
BonniePandora Mar 20, 2025
8baba4d
Merge branch 'master' into Plasma
BonniePandora Mar 23, 2025
5e55f05
Merge branch 'master' into Plasma
BonniePandora Apr 2, 2025
c0e8b26
Storage & beam tweaks
BonniePandora Apr 5, 2025
971eabc
Merge branch 'master' into Plasma
BonniePandora Apr 5, 2025
cb2866a
Merge branch 'master' into Plasma
BonniePandora Apr 6, 2025
a5d79b2
Merge branch 'master' into Plasma
BonniePandora Apr 8, 2025
a647670
Merge branch 'master' into Plasma
BonniePandora Apr 9, 2025
5434c6c
Merge branch 'master' into Plasma
BonniePandora Apr 10, 2025
c672ac8
Reload/unload fixes
BonniePandora Apr 11, 2025
f989b9d
Merge branch 'master' into Plasma
BonniePandora Apr 11, 2025
3cb6d75
Woe; arc-eye upon ye
BonniePandora Apr 13, 2025
8ba9bca
Requested tweaks
BonniePandora Apr 15, 2025
2ab6461
Ammo counter & empty beep-beep-beep
BonniePandora Apr 15, 2025
bf4712e
Merge branch 'master' into Plasma
BonniePandora Apr 15, 2025
8b3d4a0
Subtle hue shifts & colourblindness
BonniePandora Apr 16, 2025
6311208
Migraine here I come
BonniePandora Apr 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions code/__DEFINES/weapon_stats.dm
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ As such, don't expect any values assigned to common firearms to even consider ho
#define AMMO_SPEED_TIER_6 6
#define AMMO_SPEED_TIER_7 7
#define AMMO_SPEED_TIER_8 8
#define AMMO_SPEED_TIER_HITSCAN 300

/*
////ARMOR PENETRATION////
Expand Down
80 changes: 80 additions & 0 deletions code/datums/ammo/energy.dm
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,86 @@
accuracy = HIT_ACCURACY_TIER_3
damage_falloff = DAMAGE_FALLOFF_TIER_8

/datum/ammo/energy/plasma
name = "plasma bolt"
icon_state = "arcane_barrage"
flags_ammo_behavior = AMMO_ENERGY|AMMO_HITS_TARGET_TURF|AMMO_ANTISTRUCT
headshot_state = HEADSHOT_OVERLAY_HEAVY
damage = 150
damage_type = BURN
penetration = ARMOR_PENETRATION_TIER_8 //It's a freaking plasma beam
accurate_range = 20
effective_range_max = 11
max_range = 20
var/vehicle_slowdown_time = 2 SECONDS
shell_speed = AMMO_SPEED_TIER_HITSCAN
scatter = SCATTER_AMOUNT_NONE
accuracy = HIT_ACCURACY_MULT_TIER_10
damage_falloff = DAMAGE_FALLOFF_TIER_1
ammo_glowing = TRUE
bullet_light_color = COLOR_PURPLE

/datum/ammo/energy/plasma/set_bullet_traits()
. = ..()
LAZYADD(traits_to_give, list(
BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary, /datum/reagent/napalm/deathsquad),
BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating/weak)
))

/datum/ammo/energy/plasma/on_hit_mob(mob/M,obj/projectile/P)
if(M.mob_size >= MOB_SIZE_BIG)
var/mob/living/L = M
L.apply_armoured_damage(damage*1.6, ARMOR_ENERGY, BURN, null, penetration)
burst(get_turf(M),P,damage_type, 1 , 5)
new /obj/effect/overlay/temp/plasma_impact(M)

/datum/ammo/energy/plasma/on_near_target(turf/T, obj/projectile/P)
burst(get_turf(T),P,damage_type, 1 , 5)
return 1

/datum/ammo/energy/plasma/on_hit_obj(obj/O,obj/projectile/P)
if(istype(O, /obj/vehicle/multitile))
var/obj/vehicle/multitile/mob = O
mob.next_move = world.time + vehicle_slowdown_time
playsound(mob, 'sound/effects/meteorimpact.ogg', 35)
mob.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Blast"))
mob.interior_crash_effect()
mob.ex_act(150, P.dir, P.weapon_cause_data, 100)
return
burst(get_turf(P),P,damage_type, 1 , 5)
new /obj/effect/overlay/temp/plasma_impact(O)

/datum/ammo/energy/plasma/on_hit_turf(turf/T,obj/projectile/P)
burst(get_turf(T),P,damage_type, 1 , 5)
new /obj/effect/overlay/temp/plasma_impact(T)

/datum/ammo/energy/plasma/heavy
name = "heavy plasma bolt"
damage = 300
penetration = ARMOR_PENETRATION_TIER_10
accurate_range = 13
effective_range_max = 8
max_range = 13 // As far as a mini-scope will let them see
vehicle_slowdown_time = 5 SECONDS

/datum/ammo/energy/plasma/heavy/on_hit_mob(mob/M,obj/projectile/P)
. = ..()
cell_explosion(get_turf(M), 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, null, P.weapon_cause_data)
if(iscarbon(M))
M.ex_act(280, null, P.weapon_cause_data, 350)

/datum/ammo/energy/plasma/heavy/on_near_target(turf/T, obj/projectile/P)
. = ..()
cell_explosion(get_turf(T), 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, null, P.weapon_cause_data)

/datum/ammo/energy/plasma/heavy/on_hit_obj(obj/O,obj/projectile/P)
. = ..()
cell_explosion(get_turf(O), 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, null, P.weapon_cause_data)

/datum/ammo/energy/plasma/heavy/on_hit_turf(turf/T,obj/projectile/P)
. = ..()
cell_explosion(get_turf(T), 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, null, P.weapon_cause_data)

/datum/ammo/energy/yautja
headshot_state = HEADSHOT_OVERLAY_MEDIUM
accurate_range = 12
Expand Down
13 changes: 13 additions & 0 deletions code/datums/beam.dm
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,16 @@
if(! (prob(probability) && ishuman(AM)) )
return
var/mob/living/carbon/human/moving_human = AM
var/datum/internal_organ/eyes/E = moving_human.internal_organs_by_name["eyes"]
var/laser_protection = moving_human.get_eye_protection()
var/rand_laser_power = rand(EYE_PROTECTION_FLAVOR, strength)
if(rand_laser_power > laser_protection)
if(strength == EYE_PROTECTION_WELDING)
INVOKE_ASYNC(moving_human, /mob/proc/emote, "pain")
moving_human.AdjustEyeBlur(12,20)
E.take_damage(rand(15, 25), TRUE)
visible_message(SPAN_DANGER("[moving_human] screams out in pain as \the [src] sears their eyes!"), SPAN_NOTICE("Aurgh!!! \The [src] flashes across your unprotected eyes for a split-second, blinding you!"))
return
//ouch!
INVOKE_ASYNC(moving_human, /mob/proc/emote, "pain")
visible_message(SPAN_DANGER("[moving_human] screams out in pain as \the [src] moves across their eyes!"), SPAN_NOTICE("Aurgh!!! \The [src] moves across your unprotected eyes for a split-second!"))
Expand All @@ -181,6 +188,12 @@
strength = EYE_PROTECTION_FLAVOR
probability = 5

/obj/effect/ebeam/laser/plasma
name = "intense plasma beam"
alpha = 255
strength = EYE_PROTECTION_WELDING
probability = 80

/obj/effect/ebeam/Destroy()
owner = null
return ..()
Expand Down
9 changes: 9 additions & 0 deletions code/game/objects/effects/overlays.dm
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,15 @@
icon = 'icons/obj/items/weapons/projectiles.dmi'
icon_state = "laser_target3"

/obj/effect/overlay/temp/plasma_impact
name = "plasma impact"
icon = 'icons/effects/effects.dmi'
icon_state = "impact_laser_purple"
light_range = 2
effect_duration = 8
anchored = TRUE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT

/obj/effect/overlay/temp/emp_sparks
icon = 'icons/effects/effects.dmi'
icon_state = "empdisable"
Expand Down
2 changes: 2 additions & 0 deletions code/game/objects/items/storage/belt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -589,10 +589,12 @@
/obj/item/explosive/grenade,
/obj/item/explosive/mine,
/obj/item/reagent_container/food/snacks,
/obj/item/ammo_magazine/plasma,
)
bypass_w_limit = list(
/obj/item/ammo_magazine/rifle,
/obj/item/ammo_magazine/smg,
/obj/item/ammo_magazine/plasma,
)
has_gamemode_skin = FALSE

Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/storage/pouch.dm
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@
/obj/item/ammo_magazine/sniper,
/obj/item/ammo_magazine/m60,
/obj/item/ammo_magazine/handful,
/obj/item/ammo_magazine/plasma,
)

/obj/item/storage/pouch/magazine/attackby(obj/item/W, mob/user)
Expand Down
3 changes: 3 additions & 0 deletions code/modules/clothing/under/ties.dm
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,7 @@
/obj/item/ammo_magazine/rifle,
/obj/item/ammo_magazine/smg,
/obj/item/ammo_magazine/sniper,
/obj/item/ammo_magazine/plasma,
)

/obj/item/clothing/accessory/storage/webbing
Expand Down Expand Up @@ -1371,6 +1372,7 @@
can_hold = list(
/obj/item/ammo_magazine/rifle,
/obj/item/ammo_magazine/smg/m39,
/obj/item/ammo_magazine/plasma,
)

//Partial Pre-load For Props
Expand Down Expand Up @@ -1405,6 +1407,7 @@
/obj/item/storage/internal/accessory/black_vest/m3generic
cant_hold = list(
/obj/item/ammo_magazine/handful/shotgun,
/obj/item/ammo_magazine/plasma,
)

//Pre-load For Army Props
Expand Down
26 changes: 26 additions & 0 deletions code/modules/cm_marines/equipment/guncases.dm
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,32 @@
if(locate(/obj/item/weapon/gun/rifle/m49a/pve) in src.contents)
overlays += image(src.icon, "+r2")

/obj/item/storage/box/guncase/heavy/XM99
name = "\improper XM99A plasma rifle case"
desc = "A heavy case for storing an XM99A phased plasma pulse rifle, an experimental and deadly energy weapon system."
icon_state = "xm99case"
storage_slots = 7
can_hold = list(/obj/item/weapon/gun/XM99, /obj/item/attachable/scope/pve, /obj/item/ammo_magazine/plasma)

/obj/item/storage/box/guncase/heavy/XM99/fill_preset_inventory()
new /obj/item/weapon/gun/XM99(src)
new /obj/item/attachable/scope/pve(src)
new /obj/item/ammo_magazine/plasma(src)
new /obj/item/ammo_magazine/plasma(src)
new /obj/item/ammo_magazine/plasma(src)
new /obj/item/ammo_magazine/plasma(src)
new /obj/item/ammo_magazine/plasma(src)

/obj/item/storage/box/guncase/heavy/XM99/update_icon()
overlays.Cut()
if(opened)
overlays += image(icon, "bigcase_lid_open")
else
overlays += image(icon, "xm99case_lid")
return
if(locate(/obj/item/weapon/gun/XM99) in contents)
overlays += image(icon, "+xm99")

/obj/item/storage/box/guncase/heavy/hpr
name = "\improper M41AE2 heavy pulse rifle case"
desc = "A case storing an M41AE2 heavy pulse rifle, a heavier variant of the M41A designed for sustained automatic fire."
Expand Down
148 changes: 148 additions & 0 deletions code/modules/projectiles/guns/misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,154 @@
create_reagents(15)
. = ..()


// XM99A, The quintesential phased plasma rifle in the 40 watt range

/obj/item/weapon/gun/XM99
name = "\improper XM99A phased plasma pulse rifle"
desc = "An experimental directed energy weapon system designed by Armat, the XM99A is a long-range prototype rifle that fires super-heated blasts of plasma."
icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi'
icon_state = "xm99a"
item_state = "xm99a"
muzzleflash_iconstate = "muzzle_flash_blue"
muzzle_flash_color = COLOR_PURPLE
muzzle_flash_lum = 5
w_class = SIZE_LARGE
flags_equip_slot = SLOT_BACK|SLOT_SUIT_STORE
unacidable = TRUE
map_specific_decoration = TRUE
indestructible = 1
fire_sound = 'sound/weapons/gun_xm99.ogg'
reload_sound = 'sound/weapons/handling/nsg23_reload.ogg'
unload_sound = 'sound/weapons/handling/nsg23_unload.ogg'
current_mag = /obj/item/ammo_magazine/plasma
force = 12
wield_delay = WIELD_DELAY_SLOW
attachable_allowed = list(
/obj/item/attachable/reddot,
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/flashlight,
/obj/item/attachable/reflex,
/obj/item/attachable/scope/mini,
/obj/item/attachable/scope/pve,
)
flags_gun_features = GUN_WIELDED_FIRING_ONLY|GUN_AMMO_COUNTER
flags_item = TWOHANDED

var/obj/effect/ebeam/plasma_beam_type = /obj/effect/ebeam/laser/plasma
///world.time value, to prevent a lightshow without actually firing
var/beam_cooldown = 0
///Delay before another beam can start again, in tenths of seconds
var/beam_delay = 20


// Stolen from the rocket-launcher code to prevent the +1 shot in the plasma rifle
/obj/item/weapon/gun/XM99/load_into_chamber(mob/user)
return ready_in_chamber()

/obj/item/weapon/gun/XM99/reload_into_chamber(mob/user)
if(current_mag.current_rounds <= 0)
playsound(src, empty_sound, 25, 1)
return TRUE

/obj/item/weapon/gun/XM99/delete_bullet(obj/projectile/projectile_to_fire, refund = 0)
if(!current_mag)
return
qdel(projectile_to_fire)
if(refund)
current_mag.current_rounds++
return TRUE

/obj/item/weapon/gun/XM99/proc/make_battery_drum(mob/user, remaining_rounds = 0)
if(!current_mag)
return

var/obj/item/ammo_magazine/plasma/cell = new current_mag.type()
if(remaining_rounds <= 0)
cell.current_rounds = 0
user.put_in_hands(cell)
else
cell.current_rounds = remaining_rounds
user.put_in_hands(cell)
cell.update_icon()

/obj/item/weapon/gun/XM99/reload(mob/user, obj/item/ammo_magazine/plasma)
if(!plasma || !istype(plasma) || !istype(src, plasma.gun_type))
to_chat(user, SPAN_WARNING("That's not going to fit!"))
return

if(current_mag)
to_chat(user, SPAN_WARNING("[src] is already loaded!"))
return

if(plasma.current_rounds <= 0)
to_chat(user, SPAN_WARNING("That battery drum is empty!"))
return

else
to_chat(user, SPAN_NOTICE("You begin reloading [src]. Hold still..."))
if(do_after(user, 20, INTERRUPT_ALL, BUSY_ICON_FRIENDLY))
user.drop_inv_item_on_ground(plasma)
current_mag = plasma
plasma.forceMove(src)
replace_ammo(,plasma)
to_chat(user, SPAN_NOTICE("You load the new battery drum into [src]."))
playsound(user, reload_sound, 25, 1)
else
to_chat(user, SPAN_WARNING("Your reload was interrupted!"))
return
update_icon()
return TRUE

/obj/item/weapon/gun/XM99/unload(mob/user, reload_override = 0)
if(user && !current_mag)
to_chat(user, SPAN_WARNING("[src] is already empty!"))
return
if(user && (current_mag != null))
to_chat(user, SPAN_NOTICE("You unload [src]."))
playsound(user, unload_sound, 25, 1)
if(current_mag.current_rounds > 0)
user.visible_message(SPAN_NOTICE("[user] unloads [current_mag] from [src]."),
SPAN_NOTICE("You unload [current_mag] from [src]."))
make_battery_drum(user, current_mag.current_rounds)
if(current_mag.current_rounds <= 0)
user.visible_message(SPAN_NOTICE("[user] unloads [current_mag] from [src]."),
SPAN_NOTICE("You unload [current_mag] from [src]."))
make_battery_drum(user, current_mag.current_rounds)
current_mag = null
update_icon()

/obj/item/weapon/gun/XM99/set_gun_attachment_offsets()
attachable_offset = list("muzzle_x" = 39, "muzzle_y" = 17,"rail_x" = 11, "rail_y" = 21, "under_x" = 19, "under_y" = 14, "stock_x" = 19, "stock_y" = 14, "side_rail_x" = 23, "side_rail_y" = 17)

/obj/item/weapon/gun/XM99/set_gun_config_values()
..()
set_fire_delay(FIRE_DELAY_TIER_VULTURE)
set_burst_amount(BURST_AMOUNT_TIER_1)
accuracy_mult = BASE_ACCURACY_MULT * 3 //you HAVE to be able to hit
scatter = SCATTER_AMOUNT_TIER_8
damage_mult = BASE_BULLET_DAMAGE_MULT
recoil = RECOIL_AMOUNT_TIER_5

/obj/item/weapon/gun/XM99/set_bullet_traits()
. = ..()
LAZYADD(traits_to_give, list(
BULLET_TRAIT_ENTRY_ID("vehicles", /datum/element/bullet_trait_damage_boost, 75, GLOB.damage_boost_vehicles),
))


/obj/item/weapon/gun/XM99/handle_fire(atom/target, mob/living/user, params, reflex = FALSE, dual_wield, check_for_attachment_fire, akimbo, fired_by_akimbo)

var/datum/beam/plasma_beam
if(!current_mag)
click_empty(user)
return
if(current_mag.current_rounds <= 0)
return
plasma_beam = target.beam(user, "light_beam", 'icons/effects/beam.dmi', time = 0.7 SECONDS, maxdistance = 30, beam_type = plasma_beam_type, always_turn = TRUE)
animate(plasma_beam.visuals, alpha = 255, time = 0.7 SECONDS, color = COLOR_PURPLE, luminosity = 3 , easing = SINE_EASING|EASE_OUT)
. = ..()

//-------------------------------------------------------
//P9 Sonic Harpoon Artillery Remote Projectile(SHARP) Rifle

Expand Down
Loading