Files
a1e55d0958 Right Arms of the Broken World - Tajara Gun Resprites (#21743)
Resprites 3 Tajaran rifles, expanding them to use a 48x32 canvas, and
brings them in-line with lore as written in terms of weapon design
history. Additionally, adds 6.8mm in the form of the Tajaran Z33
Tamparii cartridge to further separate Tajara and Human history and arms
development.

All weapon sprites are made by me, except the ba and ss sling which was
borrowed from the Dominian rifle sprites. Special thanks to Elorg for
help in making these not look awful.
<details><summary>Z33 Tamparii</summary>
<p>
<img width="331" height="332" alt="image"
src="https://github.com/user-attachments/assets/f9892dc8-9c6d-45c6-8779-3ad3e39abaed"
/>

An old caliber that continues to show its usefulness. The compromise
between weight and firepower, as well as room to change the powder load
has seen the cartridge remain in service across Adhomai.
</p>
</details> 
<details><summary>Tsarrayut Rifle (PRA)</summary>
<p>
<img width="572" height="387" alt="image"
src="https://github.com/user-attachments/assets/53327f3b-4b87-415e-8215-b1c2ccc08c9c"
/>

Redesigned to a general magazine-fed rifle. Not meant to be flashy or
cool, simply easy to mass-produce and train conscripts. Additionally,
still takes old bolt action rifle clips.
</p>
</details> 
<details><summary>Hotaki Marksman Rifle (ALA)</summary>
<p>
<img width="586" height="400" alt="image"
src="https://github.com/user-attachments/assets/c08986ec-1134-4869-8dc2-36b981a211f9"
/>

Carries many of the same lines and design from the Tsarrayut, especially
in the receiver. However, it was modified to be a bullpup for a longer
barrel. Higher bullet velocity for a similar overall length; perfect for
a marksman harassing down an enemy.
</p>
</details> 
<details><summary>Mrrazhak Assault Rifle (ALA)</summary>
<p>
<img width="483" height="332" alt="image"
src="https://github.com/user-attachments/assets/3f0a2885-49bb-418b-b956-4d2f89a60b40"
/>

Pretty much a shortened Hotaki. Intended to have a similar barrel length
to the Tsarrayut, but a shorter overall gun.
</p>
</details> 

WIP for the following items:

- [x] Golden Mrrazhak
- [x] Cartridge balancing
- [x] Addition/clean-up with uplink items
- [x] Addition/clean-up with ghost roles

---------

Signed-off-by: CatsinHD <31459154+CatsinHD@users.noreply.github.com>
Signed-off-by: Wildkins <john.wildkins@gmail.com>
Co-authored-by: Wildkins <john.wildkins@gmail.com>
2026-02-17 16:30:22 +00:00

435 lines
15 KiB
Plaintext

/obj/item/gun/projectile/shotgun/pump/rifle
name = "bolt action rifle"
desc = "A cheap ballistic rifle, often found in the hands of Tajaran conscripts."
icon = 'icons/obj/guns/moistnugget.dmi'
icon_state = "moistnugget"
item_state = "moistnugget"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
fire_sound = 'sound/weapons/gunshot/gunshot_rifle.ogg'
caliber = "6.8mm"
ammo_type = /obj/item/ammo_casing/a68
magazine_type = /obj/item/ammo_magazine/boltaction/adhomai
max_shells = 5
rack_sound = 'sound/weapons/riflebolt.ogg'
rack_verb = "pull back the bolt on"
cycle_anim = FALSE
can_bayonet = TRUE
knife_x_offset = 23
knife_y_offset = 13
can_sawoff = TRUE
sawnoff_workmsg = "shorten the barrel and stock"
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed
name = "strange rifle"
desc = DESC_PARENT
can_sawoff = FALSE
load_method = MAGAZINE
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/handle_pump_loading()
if(ammo_magazine && length(ammo_magazine.stored_ammo))
var/obj/item/ammo_casing/AC = ammo_magazine.stored_ammo[1] //load next casing.
if(AC)
AC.forceMove(src)
ammo_magazine.stored_ammo -= AC
chambered = AC
/obj/item/gun/projectile/shotgun/pump/rifle/blank
desc = "A replica of a traditional Adhomian bolt action rifle. It has the seal of the Grand Romanovich Casino on its stock."
ammo_type = /obj/item/ammo_casing/a68/blank
/obj/item/gun/projectile/shotgun/pump/rifle/scope
name = "sniper bolt action rifle"
desc = "A cheap ballistic rifle, often found in the hands of Tajaran conscripts. This one has a telescopic sight attached to it."
icon = 'icons/obj/guns/bolt_scope.dmi'
/obj/item/gun/projectile/shotgun/pump/rifle/scope/verb/scope()
set category = "Object.Held"
set name = "Use Scope"
set src in usr
if(wielded)
toggle_scope(2.0, usr)
else
to_chat(usr, SPAN_WARNING ("You can't look through the scope without stabilizing the rifle!"))
/obj/item/gun/projectile/shotgun/pump/rifle/saw_off(mob/user, obj/item/tool)
icon = 'icons/obj/guns/obrez.dmi'
icon_state = "obrez"
item_state = "obrez"
w_class = WEIGHT_CLASS_NORMAL
recoil = 2
accuracy = -2
slot_flags &= ~SLOT_BACK
slot_flags |= (SLOT_BELT|SLOT_HOLSTER)
can_bayonet = FALSE
if(bayonet)
qdel(bayonet)
bayonet = null
update_icon()
name = "sawn-off bolt action rifle"
desc = "A shortened bolt action rifle, not really acurate."
to_chat(user, SPAN_WARNING("You shorten the barrel and stock of the rifle!"))
/obj/item/gun/projectile/shotgun/pump/rifle/obrez
name = "sawn-off bolt action rifle"
desc = "A shortened bolt action rifle, not really accurate."
icon = 'icons/obj/guns/obrez.dmi'
icon_state = "obrez"
item_state = "obrez"
w_class = WEIGHT_CLASS_NORMAL
recoil = 2
accuracy = -2
slot_flags = SLOT_BELT|SLOT_HOLSTER
can_bayonet = FALSE
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/pipegun
name = "pipegun"
desc = "An excellent weapon for flushing out tunnel rats and enemy assistants, but its rifling leaves much to be desired."
icon = 'icons/obj/guns/pipegun.dmi'
icon_state = "pipegun"
item_state = "pipegun"
caliber = "a556"
ammo_type = null
magazine_type = null
allowed_magazines = list(/obj/item/ammo_magazine/a556/makeshift)
load_method = MAGAZINE
max_shells = 7
can_sawoff = FALSE
needspin = FALSE
has_safety = FALSE
slot_flags = SLOT_BACK|SLOT_S_STORE // can be stored in suit slot due to built in sling
jam_chance = -10
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/pipegun/condition_hints(mob/user, distance, is_adjacent, infix, suffix)
. = list()
. += ..()
switch(jam_chance)
if(10 to 20)
. += SPAN_NOTICE("\The [src] is starting to accumulate fouling. Might want to grab a rag.")
if(20 to 40)
. += SPAN_WARNING("\The [src] looks reasonably fouled up. Maybe you should clean it with a rag.")
if(40 to 80)
. += SPAN_WARNING("\The [src] is starting to look quite gunked up. You should clean it with a rag.")
if(80 to INFINITY)
. += SPAN_DANGER("\The [src] is completely fouled. You're going to be extremely lucky to get a shot off. Clean it with a rag.")
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/pipegun/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/reagent_containers/glass/rag))
if(!jam_chance || jam_chance == initial(jam_chance))
to_chat(user, SPAN_WARNING("There's no fouling present on \the [src]."))
return
user.visible_message("<b>[user]</b> starts cleaning \the [src] with \the [attacking_item].", SPAN_NOTICE("You start cleaning \the [src] with \the [attacking_item]."))
if(do_after(user, jam_chance * 5))
to_chat(user, SPAN_WARNING("You completely clean \the [src]."))
jam_chance = initial(jam_chance)
return
return ..()
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/pipegun/handle_post_fire(mob/user)
. = ..()
jam_chance = min(jam_chance + 5, 100)
/obj/item/gun/projectile/shotgun/pump/rifle/dominia
name = "dominian sniper rifle"
desc = "A precision rifle used by snipers and sharpshooters of the Imperial Army. One of the few modern military-grade weapons to use a bolt for its action."
desc_extended = "The MPMR-08/2 is a precisely machined and meticulously designed rifle which prioritizes accuracy and precision over rate of fire. \
Outside of the Imperial Army, it is commonly seen in the hands of competition shooters."
icon = 'icons/obj/guns/dominia_bolt_action.dmi'
icon_state = "dom_bolt_action"
item_state = "dom_bolt_action"
caliber = "a762"
ammo_type = /obj/item/ammo_casing/a762
magazine_type = /obj/item/ammo_magazine/boltaction
load_method = SPEEDLOADER
/obj/item/gun/projectile/shotgun/pump/rifle/dominia/verb/scope()
set category = "Object.Held"
set name = "Use Scope"
set src in usr
if(wielded)
toggle_scope(2.0, usr)
else
to_chat(usr, SPAN_WARNING("You can't look through the scope without stabilizing the rifle!"))
/obj/item/gun/projectile/contender
name = "pocket rifle"
desc = "A perfect, pristine replica of an ancient one-shot hand-cannon. This one has been modified to work almost like a bolt-action."
icon = 'icons/obj/guns/pockrifle.dmi'
icon_state = "pockrifle"
item_state = "pockrifle"
caliber = "a556"
handle_casings = HOLD_CASINGS
max_shells = 1
ammo_type = /obj/item/ammo_casing/a556
magazine_type = /obj/item/ammo_magazine/a556
slot_flags = SLOT_BELT|SLOT_HOLSTER
load_method = SINGLE_CASING
fire_sound = 'sound/weapons/gunshot/gunshot3.ogg'
var/retracted_bolt = 0
var/icon_retracted = "pockrifle-empty"
/obj/item/gun/projectile/contender/special_check(mob/user)
if(retracted_bolt)
to_chat(user, SPAN_WARNING("You can't fire \the [src] while the bolt is open!"))
return 0
return ..()
/obj/item/gun/projectile/contender/unique_action(mob/user as mob)
if(chambered)
chambered.forceMove(get_turf(src))
chambered = null
var/obj/item/ammo_casing/C = loaded[1]
loaded -= C
if(!retracted_bolt)
to_chat(user, SPAN_NOTICE("You cycle back the bolt on \the [src], ejecting the casing and allowing you to reload."))
playsound(user, 'sound/weapons/riflebolt.ogg', 60, 1)
icon_state = icon_retracted
item_state = icon_retracted
retracted_bolt = 1
user.update_inv_l_hand()
user.update_inv_r_hand()
return 1
else if(retracted_bolt && loaded.len)
to_chat(user, SPAN_NOTICE("You cycle the loaded round into the chamber, allowing you to fire."))
else
to_chat(user, SPAN_NOTICE("You cycle the bolt back into position, leaving the gun empty."))
icon_state = initial(icon_state)
item_state = initial(item_state)
user.update_inv_l_hand()
user.update_inv_r_hand()
retracted_bolt = 0
/obj/item/gun/projectile/contender/load_ammo(var/obj/item/A, mob/user)
if(!retracted_bolt)
to_chat(user, SPAN_NOTICE("You can't load \the [src] without cycling the bolt."))
return
..()
/obj/item/gun/projectile/contender/unload_ammo(mob/user, allow_dump = TRUE, drop_mag = FALSE)
if(!retracted_bolt)
to_chat(user, SPAN_NOTICE("You can't unload \the [src] without cycling the bolt."))
return
..()
/obj/item/gun/projectile/shotgun/pump/rifle/vintage
name = "vintage bolt action rifle"
desc = "An extremely old-looking rifle. Words you can't read are stamped on the gun. Doesn't look like it'll take any modern rounds."
icon = 'icons/obj/guns/springfield.dmi'
icon_state = "springfield"
item_state = "springfield"
origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 3)
fire_sound = 'sound/weapons/gunshot/gunshot_rifle.ogg'
slot_flags = SLOT_BACK
load_method = SINGLE_CASING|SPEEDLOADER
handle_casings = HOLD_CASINGS
caliber = "30-06 govt"
ammo_type = /obj/item/ammo_casing/vintage
magazine_type = /obj/item/ammo_magazine/boltaction/vintage
can_bayonet = TRUE
var/open_bolt = 0
var/obj/item/ammo_magazine/boltaction/vintage/has_clip
/obj/item/gun/projectile/shotgun/pump/rifle/vintage/unique_action(mob/living/user as mob)
if(wielded)
pump(user)
if(open_bolt && has_clip)
if(has_clip.stored_ammo.len > 0)
load_ammo(has_clip, user)
src.ClearOverlays()
if(!has_clip.stored_ammo.len)
AddOverlays("springfield-clip-empty")
else if(has_clip.stored_ammo.len <= 3)
AddOverlays("springfield-clip-half")
else
AddOverlays("springfield-clip-full")
else
to_chat(user, SPAN_WARNING("There is no ammo in \the [has_clip.name]!"))
else if(!open_bolt)
to_chat(user, SPAN_WARNING("The bolt on \the [src.name] is closed! You'll have to grip it with both hands to rack it."))
else
to_chat(user, SPAN_WARNING("There is no clip in \the [src.name]!"))
/obj/item/gun/projectile/shotgun/pump/rifle/vintage/pump(mob/M as mob)
if(!open_bolt)
open_bolt = 1
icon_state = "springfield-openbolt"
playsound(M, rack_sound, 60, 1)
update_icon()
return
open_bolt = 0
icon_state = "springfield"
playsound(M, rack_sound, 60, 1)
if(has_clip)
has_clip.forceMove(get_turf(src))
has_clip = null
ClearOverlays()
if(chambered)//We have a shell in the chamber
chambered.forceMove(get_turf(src))//Eject casing
chambered = null
if(loaded.len)
var/obj/item/ammo_casing/AC = loaded[1] //load next casing.
loaded -= AC //Remove casing from loaded list.
chambered = AC
update_icon()
/obj/item/gun/projectile/shotgun/pump/rifle/vintage/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/ammo_magazine/boltaction/vintage))
if(!open_bolt)
to_chat(user, SPAN_NOTICE("You need to open the bolt of \the [src] first."))
return
if(!has_clip)
user.drop_from_inventory(attacking_item, src)
has_clip = attacking_item
to_chat(user, SPAN_NOTICE("You load the clip into \the [src]."))
if(!has_clip.stored_ammo.len)
AddOverlays("springfield-clip-empty")
else if(has_clip.stored_ammo.len <= 3)
AddOverlays("springfield-clip-half")
else
AddOverlays("springfield-clip-full")
else
to_chat(user, SPAN_NOTICE("There's already a clip in \the [src]."))
else
..()
/obj/item/gun/projectile/shotgun/pump/rifle/vintage/load_ammo(var/obj/item/A, mob/user)
if(!open_bolt)
to_chat(user, SPAN_WARNING("The bolt is closed on \the [src]!"))
return
..()
/obj/item/gun/projectile/shotgun/pump/rifle/vintage/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
if(open_bolt)
to_chat(user, SPAN_WARNING("The bolt is open on \the [src]!"))
return
..()
/obj/item/gun/projectile/gauss
name = "gauss thumper"
desc = "An outdated gauss weapon which sees sparing use in modern times."
w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BACK
magazine_type = /obj/item/ammo_magazine/gauss
allowed_magazines = list(/obj/item/ammo_magazine/gauss)
icon = 'icons/obj/guns/gauss_thumper.dmi'
icon_state = "gauss_thumper"
item_state = "gauss_thumper"
caliber = "gauss"
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
fire_sound = SFX_SHOOT_GAUSS
load_method = MAGAZINE
handle_casings = DELETE_CASINGS
force = 15
can_bayonet = TRUE
knife_x_offset = 23
knife_y_offset = 13
fire_delay = ROF_UNWIELDY
accuracy = -1
fire_delay_wielded = ROF_HEAVY
accuracy_wielded = 2
is_wieldable = TRUE
/obj/item/gun/projectile/gauss/update_icon()
..()
icon_state = (ammo_magazine)? "gauss_thumper" : "gauss_thumper-e"
/obj/item/gun/energy/gauss/mounted/mech
name = "heavy gauss cannon"
desc = "An outdated and power hungry gauss cannon, modified to deliver high explosive rounds at high velocities."
icon = 'icons/obj/guns/gauss_thumper.dmi'
icon_state = "gauss_thumper"
fire_sound = SFX_SHOOT_GAUSS
fire_delay = ROF_UNWIELDY
charge_meter = 0
max_shots = 3
charge_cost = 500
projectile_type = /obj/projectile/bullet/gauss/highex
self_recharge = TRUE
use_external_power = TRUE
recharge_time = 12
needspin = FALSE
/obj/item/gun/projectile/gauss/carbine
name = "gauss carbine"
desc = "A simple gun utilizing the gauss technology. It is still reliable and cheap despite being outdated."
icon = 'icons/obj/guns/gauss_carbine.dmi'
icon_state = "gauss_carbine"
item_state = "gauss_carbine"
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
ammo_type = /obj/item/ammo_casing/gauss/carbine
load_method = SINGLE_CASING
handle_casings = HOLD_CASINGS
max_shells = 1
fire_delay_wielded = ROF_INTERMEDIATE
accuracy_wielded = 1
/obj/item/gun/projectile/gauss/carbine/update_icon()
..()
if(loaded.len)
icon_state = "gauss_carbine"
else
icon_state = "gauss_carbine-e"
/obj/item/gun/projectile/gauss/carbine/special_check(mob/user)
if(!wielded)
to_chat(user, SPAN_WARNING("You can't fire without stabilizing \the [src]!"))
return 0
return ..()
/obj/item/gun/projectile/shotgun/pump/lever_action
name = "lever action rifle"
desc = "A lever action rifle with a side-loading port, these are still popular with frontiersmen for hunting and self-defense purposes."
icon = 'icons/obj/guns/leveraction.dmi'
icon_state = "leveraction"
item_state = "leveraction"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
fire_sound = 'sound/weapons/gunshot/gunshot_rifle.ogg'
caliber = "45-70 govt"
ammo_type = /obj/item/ammo_casing/govt
max_shells = 4
load_method = SINGLE_CASING
handle_casings = HOLD_CASINGS
cycle_anim = TRUE
rack_sound = 'sound/weapons/reloads/lever_action_cock1.ogg'
rack_verb = "work the lever on"
can_bayonet = FALSE
can_sawoff = FALSE
/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/crackrifle
name = "crack rifle"
desc = "A heavy bolt-action rifle of Moghesian manufacture."
desc_extended = "Manufactured by the Azarak Kingdom in 2350, the Azarak-96 'Crack Rifle' is a bolt-action rifle of Moghesian manufacture, easily recognizable by its long bayonet and large magazine wrapped around its trigger guard.\
This heavy but powerful weapon is mostly known for its use by the common warrior of the Traditionalist Coalition during the Contact War.\
Many of these rifles survived the ravages of the Contact War, a testament to their reliability."
icon = 'icons/obj/guns/unathi_ballistics.dmi'
icon_state = "crackrifle"
item_state = "crackrifle"
caliber = "5.8mm"
magazine_type = /obj/item/ammo_magazine/crackrifle
allowed_magazines = list(/obj/item/ammo_magazine/crackrifle)
load_method = MAGAZINE