diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 44037305dd..14feaf1b5f 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -103,6 +103,12 @@
#define ui_alien_fire "EAST-1:28,NORTH-3:25"
#define ui_alien_oxygen "EAST-1:28,NORTH-4:25"
+// Goes above HUD, mid-right
+#define ui_ammo_hud1 "EAST-1:28,CENTER+1:25"
+#define ui_ammo_hud2 "EAST-1:28,CENTER+2:27"
+#define ui_ammo_hud3 "EAST-1:28,CENTER+3:29"
+#define ui_ammo_hud4 "EAST-1:28,CENTER+4:31"
+
//Middle right (status indicators)
#define ui_temp "EAST-1:28,CENTER-2:13"
#define ui_health "EAST-1:28,CENTER-1:15"
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 98c187fc97..aef10cd979 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -1,3 +1,4 @@
+#define MAX_AMMO_HUD_POSSIBLE 4 // Cap the amount of HUDs at 4.
/*
The global hud:
Uses the same visual objects for all players.
@@ -191,6 +192,9 @@ var/list/global_huds = list(
var/icon/ui_style
var/ui_color
var/ui_alpha
+
+ // TGMC Ammo HUD Port
+ var/list/obj/screen/ammo_hud_list = list()
var/list/minihuds = list()
@@ -220,6 +224,7 @@ var/list/global_huds = list(
other_important = null
hotkeybuttons = null
// item_action_list = null // ?
+ QDEL_LIST(ammo_hud_list)
mymob = null
/datum/hud/proc/hidden_inventory_update()
@@ -460,4 +465,37 @@ var/list/global_huds = list(
client.screen += client.void
/mob/new_player/add_click_catcher()
- return
\ No newline at end of file
+ return
+
+/* TGMC Ammo HUD Port
+ * These procs call to screen_objects.dm's respective procs.
+ * All these do is manage the amount of huds on screen and set the HUD.
+*/
+///Add an ammo hud to the user informing of the ammo count of G
+/datum/hud/proc/add_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
+ if(length(ammo_hud_list) >= MAX_AMMO_HUD_POSSIBLE)
+ return
+ var/obj/screen/ammo/ammo_hud = new
+ ammo_hud_list[G] = ammo_hud
+ ammo_hud.screen_loc = ammo_hud.ammo_screen_loc_list[length(ammo_hud_list)]
+ ammo_hud.add_hud(user, G)
+ ammo_hud.update_hud(user, G)
+
+///Remove the ammo hud related to the gun G from the user
+/datum/hud/proc/remove_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
+ var/obj/screen/ammo/ammo_hud = ammo_hud_list[G]
+ if(isnull(ammo_hud))
+ return
+ ammo_hud.remove_hud(user, G)
+ qdel(ammo_hud)
+ ammo_hud_list -= G
+ var/i = 1
+ for(var/key in ammo_hud_list)
+ ammo_hud = ammo_hud_list[key]
+ ammo_hud.screen_loc = ammo_hud.ammo_screen_loc_list[i]
+ i++
+
+///Update the ammo hud related to the gun G
+/datum/hud/proc/update_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
+ var/obj/screen/ammo/ammo_hud = ammo_hud_list[G]
+ ammo_hud?.update_hud(user, G)
\ No newline at end of file
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 00446add6d..a06df0c082 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -898,3 +898,80 @@
icon_state = null
plane = PLANE_HOLOMAP_ICONS
appearance_flags = KEEP_TOGETHER
+
+// Begin TGMC Ammo HUD Port
+/obj/screen/ammo
+ name = "ammo"
+ icon = 'icons/mob/screen_ammo.dmi'
+ icon_state = "ammo"
+ screen_loc = ui_ammo_hud1
+ var/warned = FALSE
+ var/static/list/ammo_screen_loc_list = list(ui_ammo_hud1, ui_ammo_hud2, ui_ammo_hud3 ,ui_ammo_hud4)
+
+/obj/screen/ammo/proc/add_hud(var/mob/living/user, var/obj/item/weapon/gun/G)
+
+ if(!user?.client)
+ return
+
+ if(!G)
+ CRASH("/obj/screen/ammo/proc/add_hud() has been called from [src] without the required param of G")
+
+ if(!G.has_ammo_counter())
+ return
+
+ user.client.screen += src
+
+/obj/screen/ammo/proc/remove_hud(var/mob/living/user)
+ user?.client?.screen -= src
+
+/obj/screen/ammo/proc/update_hud(var/mob/living/user, var/obj/item/weapon/gun/G)
+ if(!user?.client?.screen.Find(src))
+ return
+
+ if(!G || !istype(G) || !G.has_ammo_counter() || !G.get_ammo_type() || isnull(G.get_ammo_count()))
+ remove_hud()
+ return
+
+ var/list/ammo_type = G.get_ammo_type()
+ var/rounds = G.get_ammo_count()
+
+ var/hud_state = ammo_type[1]
+ var/hud_state_empty = ammo_type[2]
+
+ overlays.Cut()
+
+ var/empty = image('icons/mob/screen_ammo.dmi', src, "[hud_state_empty]")
+
+ if(rounds == 0)
+ if(warned)
+ overlays += empty
+ else
+ warned = TRUE
+ var/obj/screen/ammo/F = new /obj/screen/ammo(src)
+ F.icon_state = "frame"
+ user.client.screen += F
+ flick("[hud_state_empty]_flash", F)
+ spawn(20)
+ user.client.screen -= F
+ qdel(F)
+ overlays += empty
+ else
+ warned = FALSE
+ overlays += image('icons/mob/screen_ammo.dmi', src, "[hud_state]")
+
+ rounds = num2text(rounds)
+ //Handle the amount of rounds
+ switch(length(rounds))
+ if(1)
+ overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[1]]")
+ if(2)
+ overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[2]]")
+ overlays += image('icons/mob/screen_ammo.dmi', src, "t[rounds[1]]")
+ if(3)
+ overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[3]]")
+ overlays += image('icons/mob/screen_ammo.dmi', src, "t[rounds[2]]")
+ overlays += image('icons/mob/screen_ammo.dmi', src, "h[rounds[1]]")
+ else //"0" is still length 1 so this means it's over 999
+ overlays += image('icons/mob/screen_ammo.dmi', src, "o9")
+ overlays += image('icons/mob/screen_ammo.dmi', src, "t9")
+ overlays += image('icons/mob/screen_ammo.dmi', src, "h9")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/explosive.dm b/code/game/objects/items/weapons/grenades/explosive.dm
index 076a7accce..77e07e2c5f 100644
--- a/code/game/objects/items/weapons/grenades/explosive.dm
+++ b/code/game/objects/items/weapons/grenades/explosive.dm
@@ -12,6 +12,7 @@
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
var/spread_range = 7
loadable = null
+ hud_state = "grenade_frag" // TGMC Ammo HUD Port
/obj/item/weapon/grenade/explosive/detonate()
..()
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 209e47b253..9bdf650c64 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -13,6 +13,8 @@
var/det_time = 50
var/loadable = TRUE
var/arm_sound = 'sound/weapons/armbomb.ogg'
+ var/hud_state = "grenade_he" // TGMC Ammo HUD Port
+ var/hud_state_empty = "grenade_empty" // TGMC Ammo HUD Port
/obj/item/weapon/grenade/proc/clown_check(var/mob/living/user)
if((CLUMSY in user.mutations) && prob(50))
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index 75c0e6a299..1cb98be61a 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -6,6 +6,7 @@
det_time = 20
item_state = "flashbang"
slot_flags = SLOT_BELT
+ hud_state = "grenade_smoke"
var/datum/effect/effect/system/smoke_spread/bad/smoke
var/smoke_color
var/smoke_strength = 8
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 4ec2d0a5e2..852a086d97 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -54,6 +54,12 @@
if(self_recharge)
if(world.time >= last_use + charge_delay)
give(charge_amount)
+ // TGMC Ammo HUD - Update the HUD every time we're called to recharge.
+ if(istype(loc, /obj/item/weapon/gun/energy)) // Are we in a gun currently?
+ var/obj/item/weapon/gun/energy/gun = loc
+ var/mob/living/user = gun.loc
+ if(istype(user))
+ user?.hud_used.update_ammo_hud(user, gun) // Update the HUD
else
return PROCESS_KILL
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 7c04ec3750..1565ad5ba2 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -435,6 +435,7 @@
else
set_light(0)
//VOREStation Edit End
+ user.hud_used.update_ammo_hud(user, src)
// Similar to the above proc, but does not require a user, which is ideal for things like turrets.
/obj/item/weapon/gun/proc/Fire_userless(atom/target)
@@ -527,6 +528,7 @@
/obj/item/weapon/gun/proc/handle_click_empty(mob/user)
if (user)
user.visible_message("*click click*", "*click*")
+ user.hud_used.update_ammo_hud(user, src)
else
src.visible_message("*click click*")
playsound(src, 'sound/weapons/empty.ogg', 100, 1)
@@ -758,8 +760,35 @@
var/datum/firemode/new_mode = firemodes[sel_mode]
new_mode.apply_to(src)
to_chat(user, "\The [src] is now set to [new_mode.name].")
+ user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD
return new_mode
/obj/item/weapon/gun/attack_self(mob/user)
switch_firemodes(user)
+
+/* TGMC Ammo HUD Port Begin */
+/obj/item/weapon/gun
+ var/hud_enabled = TRUE
+
+/obj/item/weapon/gun/proc/has_ammo_counter()
+ return FALSE
+
+/obj/item/weapon/gun/proc/get_ammo_type()
+ return FALSE
+
+/obj/item/weapon/gun/proc/get_ammo_count()
+ return FALSE
+
+/obj/item/weapon/gun/equipped(mob/living/user, slot) // When a gun is equipped to your hands, we'll add the HUD to the user. Pending porting over TGMC guncode where wielding is far more sensible.
+ if(slot == slot_l_hand || slot == slot_r_hand)
+ user.hud_used.add_ammo_hud(user, src)
+ else
+ user.hud_used.remove_ammo_hud(user, src)
+
+ return ..()
+
+/obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti.
+ user.hud_used.remove_ammo_hud(user, src)
+
+ ..()
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 74dc34a72c..cf68420045 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -91,6 +91,9 @@
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
update_icon()
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src) // TGMC Ammo HUD
else
charge_tick = 0
return 1
@@ -110,6 +113,9 @@
if(!power_supply) return null
if(!ispath(projectile_type)) return null
if(!power_supply.checked_use(charge_cost)) return null
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src)
return new projectile_type(src)
/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user)
@@ -131,6 +137,7 @@
playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
update_icon()
update_held_icon()
+ user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD
else
to_chat(user, "This cell is not fitted for [src].")
return
@@ -147,6 +154,7 @@
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
update_icon()
update_held_icon()
+ user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD
else
to_chat(user, "[src] does not have a power cell.")
@@ -234,3 +242,20 @@
results += ..()
return results
+
+// TGMC AMMO HUD
+/obj/item/weapon/gun/energy/has_ammo_counter()
+ return TRUE
+
+/obj/item/weapon/gun/energy/get_ammo_type()
+ if(!projectile_type)
+ return list("unknown", "unknown")
+ else
+ var/obj/item/projectile/P = projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+
+/obj/item/weapon/gun/energy/get_ammo_count()
+ if(!power_supply)
+ return 0
+ else
+ return FLOOR(power_supply.charge / max(charge_cost, 1), 1)
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm
index e7edc8418d..68b13e76fe 100644
--- a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm
+++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm
@@ -49,8 +49,6 @@
var/obj/item/ammo_casing/microbattery/batt = chambered
- charge_left = batt.shots_left
- max_charge = initial(batt.shots_left)
if(ammo_magazine) //Crawl to find more
for(var/obj/item/ammo_casing/microbattery/bullet as anything in ammo_magazine.stored_ammo)
if(istype(bullet,batt.type))
@@ -67,6 +65,9 @@
chambered = new_batt
update_charge()
update_icon()
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src)
/obj/item/weapon/gun/projectile/cell_loaded/attack_self(mob/user)
if(!chambered)
@@ -169,6 +170,11 @@
update_icon()
playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
update_icon()
+ if(istype(loc, /obj/item/weapon/gun/projectile/cell_loaded)) // Update the HUD if we're in a gun + have a user. Not that one should be able to reload the mag while it's in a gun, but just in caaaaase.
+ var/obj/item/weapon/gun/projectile/cell_loaded/cell_load = loc
+ var/mob/living/M = cell_load.loc
+ if(istype(M))
+ M?.hud_used.update_ammo_hud(M, cell_load)
/obj/item/ammo_magazine/cell_mag/update_icon()
cut_overlays()
@@ -277,4 +283,31 @@
new /obj/item/ammo_casing/microbattery/combat/xray(src)
new /obj/item/ammo_casing/microbattery/medical/stabilize2(src)
new /obj/item/ammo_casing/microbattery/medical/haste(src)
- new /obj/item/ammo_casing/microbattery/medical/resist(src)
\ No newline at end of file
+ new /obj/item/ammo_casing/microbattery/medical/resist(src)
+
+// TGMC Ammo HUD: Custom handling for cell-loaded weaponry.
+/*
+/obj/item/weapon/gun/projectile/cell_loaded/get_ammo_type()
+ if(!projectile_type)
+ return list("unknown", "unknown")
+ else
+ var/obj/item/projectile/P = projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+*/
+/obj/item/weapon/gun/projectile/cell_loaded/get_ammo_count()
+ if(!chambered)
+ return 0 // We're not chambered, so we have 0 rounds loaded.
+
+ var/obj/item/ammo_casing/microbattery/batt = chambered
+
+ var/shots
+ if(ammo_magazine) // Check how much ammo we have
+ for(var/obj/item/ammo_casing/microbattery/bullet as anything in ammo_magazine.stored_ammo)
+ if(istype(bullet,batt.type))
+ shots += bullet.shots_left
+ if(shots > 0) // We have shots ready to fire.
+ return shots
+ else // We're out of shots.
+ return 0
+ else // Else, we're unloaded/don't have a magazine.
+ return 0
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
index 6663d6e380..2e2b0d8bff 100644
--- a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
+++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
@@ -13,6 +13,7 @@
damage = 0
check_armour = "laser"
light_color = "#80F5FF"
+ hud_state = "laser_disabler"
combustion = FALSE
diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon.dm
index 4c40da9721..426301e756 100644
--- a/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon.dm
+++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon.dm
@@ -57,4 +57,16 @@
/obj/item/weapon/gun/projectile/multi_cannon/unload_ammo(mob/user, var/allow_dump=1)
.=..()
update_icon()
- chambered = null
\ No newline at end of file
+ chambered = null
+
+/obj/item/weapon/gun/projectile/multi_cannon/get_ammo_count() // Custom handling for the Curabitur.
+ if(istype(chambered, /obj/item/ammo_casing/macrobattery))
+ var/obj/item/ammo_casing/macrobattery/battery = chambered
+ if(battery.charge) // Does the battery have charge?
+ return battery.charge // This should safely return the amount of shots we have. Every time we fire, we decrement charge by 1, at least in all the cells I can see.
+ else // No charge in the battery.
+ return 0 // Return 0 ammo to the HUD.
+ else if(chambered == null)
+ return 0
+ else
+ CRASH("/obj/item/weapon/gun/projectile/multi_cannon/get_ammo_count() was called from [src] but did not have a valid magazine loaded, somehow! Chambered is currently [chambered].")
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon_cells.dm
index 53dd7c0ad3..d333081c37 100644
--- a/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon_cells.dm
+++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/multi_cannon_cells.dm
@@ -38,6 +38,12 @@
//alright, the below seems jank. it IS jank, but for whatever reason I can't reuse BB. big bad
BB = null
BB = new projectile_type
+ // TGMC Ammo HUD - Update the HUD every time we expend/fire, given the Curabitur's method of handling firing.
+ if(istype(loc, /obj/item/weapon/gun/projectile/multi_cannon))
+ var/obj/item/weapon/gun/projectile/multi_cannon = loc
+ var/mob/living/user = multi_cannon.loc
+ if(istype(user))
+ user?.hud_used.update_ammo_hud(user, multi_cannon)
return
else
BB = null
@@ -52,6 +58,13 @@
STOP_PROCESSING(SSobj, src)
if(istype(loc,/obj/item/weapon/gun/projectile/multi_cannon))
loc.update_icon()
+
+ // TGMC Ammo HUD - Update the HUD every time we're called to recharge.
+ if(istype(loc, /obj/item/weapon/gun/projectile/multi_cannon))
+ var/obj/item/weapon/gun/projectile/multi_cannon = loc
+ var/mob/living/user = multi_cannon.loc
+ if(istype(user))
+ user?.hud_used.update_ammo_hud(user, multi_cannon)
//variants here, there's not many of them.
diff --git a/code/modules/projectiles/guns/energy/laser_vr.dm b/code/modules/projectiles/guns/energy/laser_vr.dm
index 9472d512c1..0add3098a3 100644
--- a/code/modules/projectiles/guns/energy/laser_vr.dm
+++ b/code/modules/projectiles/guns/energy/laser_vr.dm
@@ -184,11 +184,13 @@
if(!do_after(user, 10, src))
break
playsound(src,'sound/items/change_drill.ogg',25,1)
+ user.hud_used.update_ammo_hud(user, src)
if(power_supply.give(phase_power) < phase_power)
break
recharging = 0
update_icon()
+ user.hud_used.update_ammo_hud(user, src) // Update one last time once we're finished!
/obj/item/weapon/gun/energy/locked/frontier/update_icon()
if(recharging)
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 31ffe40e13..92ca4535fc 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -54,6 +54,10 @@
chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len]
if(handle_casings != HOLD_CASINGS)
ammo_magazine.stored_ammo -= chambered
+
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src)
if (chambered)
return chambered.BB
@@ -98,6 +102,10 @@
if(handle_casings != HOLD_CASINGS)
chambered = null
+
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src)
//Attempts to load A into src, depending on the type of thing being loaded and the load_method
@@ -117,6 +125,7 @@
AM.loc = src
ammo_magazine = AM
user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].")
+ user.hud_used.update_ammo_hud(user, src)
playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
if(SPEEDLOADER)
if(loaded.len >= max_shells)
@@ -131,8 +140,10 @@
loaded += C
AM.stored_ammo -= C //should probably go inside an ammo_magazine proc, but I guess less proc calls this way...
count++
+ user.hud_used.update_ammo_hud(user, src)
if(count)
user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].")
+ user.hud_used.update_ammo_hud(user, src)
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
AM.update_icon()
else if(istype(A, /obj/item/ammo_casing))
@@ -168,6 +179,7 @@
sleep(1 SECOND)
update_icon()
+ user.hud_used.update_ammo_hud(user, src)
//attempts to unload src. If allow_dump is set to 0, the speedloader unloading method will be disabled
/obj/item/weapon/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump=1)
@@ -177,6 +189,7 @@
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
ammo_magazine.update_icon()
ammo_magazine = null
+ user.hud_used.update_ammo_hud(user, src)
else if(loaded.len)
//presumably, if it can be speed-loaded, it can be speed-unloaded.
if(allow_dump && (load_method & SPEEDLOADER))
@@ -195,9 +208,11 @@
user.put_in_hands(C)
user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].")
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
+ user.hud_used.update_ammo_hud(user, src)
else
to_chat(user, "[src] is empty.")
update_icon()
+ user.hud_used.update_ammo_hud(user, src)
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob)
..()
@@ -228,6 +243,7 @@
ammo_magazine.update_icon()
ammo_magazine = null
update_icon() //make sure to do this after unsetting ammo_magazine
+ user.hud_used.update_ammo_hud(user, src)
/obj/item/weapon/gun/projectile/examine(mob/user)
. = ..()
@@ -256,3 +272,72 @@
unload_ammo(usr)
*/
+
+// TGMC Ammo HUD Insertion
+/obj/item/weapon/gun/projectile/has_ammo_counter()
+ return TRUE
+
+/obj/item/weapon/gun/projectile/get_ammo_type()
+ if(load_method & MAGAZINE)
+ if(chambered) // Do we have an ammo casing chambered
+ var/obj/item/ammo_casing/A = chambered
+ var/obj/item/projectile/P = A.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+ else if(ammo_magazine && ammo_magazine.stored_ammo.len) // Do we have a mag, and have ammo in the mag, but nothing chambered?
+ var/obj/item/ammo_casing/A = ammo_magazine.stored_ammo[1]
+ var/obj/item/projectile/P = A.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+ else if(src.projectile_type) // Else, we're entirely empty, and irregardless of the mag we have loaded (as it's empty, or it would've passed the length check above), return the DEFAULT projectile_type on the gun, if set.
+ var/obj/item/projectile/P = src.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+ else
+ return list("unknown", "unknown") // Safety, this shouldn't happen, but just in case
+ else if(load_method & (SINGLE_CASING|SPEEDLOADER)) // Do we load with single casings OR speedloaders?
+ if(chambered) // Do we have an ammo casing loaded in the chamber? All casings still have a projectile_type var.
+ var/obj/item/ammo_casing/A = chambered
+ var/obj/item/projectile/P = A.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty)) // Return the casing's projectile_type ammo hud state
+ else if(loaded.len) // Else, is the gun loaded, but no ammo casings in chamber currently?
+ var/obj/item/ammo_casing/A = loaded[1]
+ var/obj/item/projectile/P = A.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty)) // Return the ammunition loaded in the gun's hud_state
+ else if(src.projectile_type) // Else, we're entirely empty, and have nothing loaded in the gun, and nothing in the chamber. Return the DEFAULT projectile_type on the gun, if set.
+ var/obj/item/projectile/P = src.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+ else
+ return list("unknown", "unknown") // Safety, this shouldn't happen, but just in case
+ else if(src.projectile_type) // Failsafe if we somehow don't pass the above. Return the DEFAULT projectile_type on the gun, if set.
+ var/obj/item/projectile/P = src.projectile_type
+ return list(initial(P.hud_state), initial(P.hud_state_empty))
+ else // Failsafe if we somehow fail all three methods
+ return list("unknown", "unknown")
+
+/obj/item/weapon/gun/projectile/get_ammo_count()
+ if(ammo_magazine) // Do we have a magazine loaded?
+ var/shots_left
+ if(chambered && chambered.BB) // Do we have a bullet in the currently-chambered casing, if any?
+ shots_left++
+ for(var/obj/item/ammo_casing/bullet in ammo_magazine.stored_ammo)
+ if(bullet.BB)
+ shots_left++
+
+ if(shots_left > 0)
+ return shots_left
+ else
+ return 0 // No ammo left or failsafe.
+ else if(loaded) // Do we use internal ammunition
+ var/shots_left
+ if(chambered && chambered.BB) // Do we have a bullet in the currently-chambered casing, if any?
+ shots_left++
+ for(var/obj/item/ammo_casing/bullet in loaded)
+ if(bullet.BB) // Only increment how many shots we have left if we're loaded.
+ shots_left++
+
+ if(shots_left > 0)
+ return shots_left
+ else
+ return 0 // No ammo left or failsafe.
+ else if(chambered) // If we don't have a magazine or internal ammunition loaded, but we have a casing in chamber, return the amount.
+ return chambered.BB ? 1 : 0
+ else // Failsafe, or completely unloaded
+ return 0
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 20868b555e..d04bd2b31f 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -1,6 +1,7 @@
/*
* Shotgun
*/
+
/obj/item/weapon/gun/projectile/shotgun/pump
name = "shotgun"
desc = "The mass-produced MarsTech Meteor 29 shotgun is a favourite of police and security forces on many worlds. Uses 12g rounds."
@@ -43,12 +44,14 @@
else
chambered.loc = get_turf(src) // Eject casing
chambered = null
+ M.hud_used.update_ammo_hud(M, src) // TGMC Ammo HUD Port
// Load next shell
if(loaded.len)
var/obj/item/ammo_casing/AC = loaded[1] // Load next casing.
loaded -= AC // Remove casing from loaded list.
chambered = AC
+ M.hud_used.update_ammo_hud(M, src) // TGMC Ammo HUD Port
if(pump_animation) // This affects all bolt action and shotguns.
flick("[pump_animation]", src) // This plays any pumping
@@ -180,6 +183,7 @@
burst = 2
user.visible_message("The shotgun goes off!", "The shotgun goes off in your face!")
Fire_userless(user)
+ user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD Port
burst = burstsetting
return
if(do_after(user, 30)) // SHIT IS STEALTHY EYYYYY
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index abba257a93..8ed8d98ffd 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -139,6 +139,10 @@
var/impact_effect_type = null
var/list/impacted_mobs = list()
+
+ // TGMC Ammo HUD Port
+ var/hud_state = "unknown" // What HUD state we use when we have ammunition.
+ var/hud_state_empty = "unknown" // The empty state. DON'T USE _FLASH IN THE NAME OF THE EMPTY STATE STRING, THAT IS ADDED BY THE CODE.
/obj/item/projectile/proc/Range()
range--
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 312c92a5ea..9597deb00d 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -23,6 +23,9 @@
tracer_type = /obj/effect/projectile/tracer/laser
impact_type = /obj/effect/projectile/impact/laser
+ hud_state = "laser"
+ hud_state_empty = "battery_empty"
+
/obj/item/projectile/beam/practice
name = "laser"
icon_state = "laser"
@@ -31,15 +34,18 @@
damage_type = BURN
check_armour = "laser"
eyeblur = 2
+ hud_state = "laser"
/obj/item/projectile/beam/weaklaser
name = "weak laser"
icon_state = "laser"
damage = 15
+ hud_state = "laser"
/obj/item/projectile/beam/weaklaser/blue
icon_state = "bluelaser"
light_color = "#0066FF"
+ hud_state = "laser_disabler"
muzzle_type = /obj/effect/projectile/muzzle/laser_blue
tracer_type = /obj/effect/projectile/tracer/laser_blue
@@ -47,14 +53,17 @@
/obj/item/projectile/beam/smalllaser
damage = 25
+ hud_state = "laser"
/obj/item/projectile/beam/burstlaser
damage = 30
armor_penetration = 10
+ hud_state = "laser"
/obj/item/projectile/beam/midlaser
damage = 40
armor_penetration = 10
+ hud_state = "laser"
/obj/item/projectile/beam/mininglaser
name = "pulsating laser"
@@ -81,6 +90,7 @@
muzzle_type = /obj/effect/projectile/muzzle/laser_heavy
tracer_type = /obj/effect/projectile/tracer/laser_heavy
impact_type = /obj/effect/projectile/impact/laser_heavy
+ hud_state = "laser_overcharge"
/obj/item/projectile/beam/heavylaser/fakeemitter
name = "emitter beam"
@@ -88,6 +98,7 @@
fire_sound = 'sound/weapons/emitter.ogg'
light_color = "#00CC33"
excavation_amount = 140 // 2 shots to dig a standard rock turf. Superior due to being a mounted tool beam, to make it actually viable.
+ hud_state = "laser_overcharge"
muzzle_type = /obj/effect/projectile/muzzle/emitter
tracer_type = /obj/effect/projectile/tracer/emitter
@@ -97,6 +108,7 @@
damage = 80
armor_penetration = 50
light_color = "#FF0D00"
+ hud_state = "laser_overcharge"
/obj/item/projectile/beam/xray
name = "xray beam"
@@ -105,6 +117,7 @@
damage = 25
armor_penetration = 50
light_color = "#00CC33"
+ hud_state = "laser_sniper"
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
@@ -118,6 +131,7 @@
armor_penetration = 90
irradiate = 20
light_color = "#00CC33"
+ hud_state = "laser_sniper"
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
@@ -129,6 +143,7 @@
fire_sound = 'sound/weapons/eluger.ogg'
damage = 40
light_color = "#00C6FF"
+ hud_state = "laser_disabler"
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
@@ -141,6 +156,7 @@
damage = 100 //Badmin toy, don't care
armor_penetration = 100
light_color = "#0066FF"
+ hud_state = "pulse"
muzzle_type = /obj/effect/projectile/muzzle/laser_pulse
tracer_type = /obj/effect/projectile/tracer/laser_pulse
@@ -158,6 +174,7 @@
damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm
light_color = "#00CC33"
excavation_amount = 70 // 3 shots to mine a turf
+ hud_state = "laser_overcharge"
muzzle_type = /obj/effect/projectile/muzzle/emitter
tracer_type = /obj/effect/projectile/tracer/emitter
@@ -171,13 +188,14 @@
no_attack_log = 1
damage_type = BURN
check_armour = "laser"
+ hud_state = "monkey"
combustion = FALSE
/obj/item/projectile/beam/lasertag/blue
icon_state = "bluelaser"
light_color = "#0066FF"
-
+ hud_state = "monkey"
muzzle_type = /obj/effect/projectile/muzzle/laser_blue
tracer_type = /obj/effect/projectile/tracer/laser_blue
impact_type = /obj/effect/projectile/impact/laser_blue
@@ -192,6 +210,7 @@
/obj/item/projectile/beam/lasertag/red
icon_state = "laser"
light_color = "#FF0D00"
+ hud_state = "monkey"
/obj/item/projectile/beam/lasertag/red/on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
@@ -203,6 +222,7 @@
/obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE
icon_state = "omnilaser"
light_color = "#00C6FF"
+ hud_state = "monkey"
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
@@ -222,6 +242,7 @@
damage = 50
armor_penetration = 10
light_color = "#00CC33"
+ hud_state = "laser_sniper"
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
@@ -238,12 +259,15 @@
light_color = "#FFFFFF"
hitsound = 'sound/weapons/zapbang.ogg'
+
combustion = FALSE
muzzle_type = /obj/effect/projectile/muzzle/stun
tracer_type = /obj/effect/projectile/tracer/stun
impact_type = /obj/effect/projectile/impact/stun
+ hud_state = "taser" // TGMC Ammo HUD port
+
/obj/item/projectile/beam/stun/weak
name = "weak stun beam"
icon_state = "stun"
@@ -278,6 +302,7 @@
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
impact_type = /obj/effect/projectile/impact/laser_omni
+ hud_state = "laser_disabler"
/obj/item/projectile/beam/stun/blue
icon_state = "bluelaser"
@@ -285,6 +310,7 @@
muzzle_type = /obj/effect/projectile/muzzle/laser_blue
tracer_type = /obj/effect/projectile/tracer/laser_blue
impact_type = /obj/effect/projectile/impact/laser_blue
+ hud_state = "laser_disabler"
/obj/item/projectile/beam/disable
name = "disabler beam"
@@ -294,6 +320,7 @@
agony = 100 //One shot stuns for the time being until adjustments are fully made.
damage_type = HALLOSS
light_color = "#00CECE"
+ hud_state = "laser_disabler"
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
@@ -312,6 +339,7 @@
agony = 15
eyeblur = 2
hitsound = 'sound/weapons/zapbang.ogg'
+ hud_state = "taser"
/obj/item/projectile/beam/shock/weak
damage = 5
@@ -324,6 +352,7 @@
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
impact_type = /obj/effect/projectile/impact/xray
+ hud_state = "laser"
/obj/item/projectile/beam/imperial
name = "laser beam"
@@ -333,7 +362,7 @@
muzzle_type = /obj/effect/projectile/muzzle/darkmatter
tracer_type = /obj/effect/projectile/tracer/darkmatter
impact_type = /obj/effect/projectile/impact/darkmatter
-
+ hud_state = "plasma_rifle_blast"
//
// Projectile Beam Definitions
//
@@ -344,7 +373,7 @@
damage_type = ELECTROCUTE //You should be safe inside a voidsuit
sharp = FALSE //"Wide" spectrum beam
light_color = COLOR_GOLD
-
+ hud_state = "monkey"
excavation_amount = 200 // Good at shooting rocks
muzzle_type = /obj/effect/projectile/muzzle/pointdefense
@@ -361,6 +390,8 @@
agony = 5
damage_type = HALLOSS
light_color = "#00CC33"
+ hud_state = "flame_green"
+ hud_state_empty = "flame_empty"
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
@@ -386,7 +417,7 @@
damage_type = BURN
check_armour = "laser"
light_color = "#80F5FF"
-
+ hud_state = "laser_disabler"
combustion = FALSE
muzzle_type = /obj/effect/projectile/muzzle/medigun
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 76f2e1ad7c..431c8a4b19 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -12,6 +12,8 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect
excavation_amount = 20
var/mob_passthrough_check = 0
+ hud_state = "pistol_lightap"
+ hud_state_empty = "pistol_empty" // Just in case we somehow have no hud_state_empty defined
muzzle_type = /obj/effect/projectile/muzzle/bullet
@@ -70,30 +72,38 @@
/obj/item/projectile/bullet/pistol // 9mm pistols and most SMGs. Sacrifice power for capacity.
fire_sound = 'sound/weapons/gunshot2.ogg'
damage = 20
+ hud_state = "pistol"
+ hud_state_empty = "pistol_empty"
/obj/item/projectile/bullet/pistol/ap
damage = 15
armor_penetration = 30
+ hud_state = "pistol_light_ap"
/obj/item/projectile/bullet/pistol/hp
damage = 25
armor_penetration = -50
+ hud_state = "pistol_ap"
/obj/item/projectile/bullet/pistol/medium // .45 (and maybe .40 if it ever gets added) caliber security pistols. Balance between capacity and power.
fire_sound = 'sound/weapons/gunshot3.ogg' // Snappier sound.
damage = 25
+ hud_state = "pistol"
/obj/item/projectile/bullet/pistol/medium/ap
damage = 20
armor_penetration = 15
+ hud_state = "pistol_light_ap"
/obj/item/projectile/bullet/pistol/medium/hp
damage = 30
armor_penetration = -50
+ hud_state = "pistol_ap"
/obj/item/projectile/bullet/pistol/strong // .357 and .44 caliber stuff. High power pistols like the Mateba or Desert Eagle. Sacrifice capacity for power.
fire_sound = 'sound/weapons/gunshot4.ogg'
damage = 60
+ hud_state = "pistol_heavy"
/obj/item/projectile/bullet/pistol/rubber/strong // "Rubber" bullets for high power pistols.
fire_sound = 'sound/weapons/gunshot3.ogg' // Rubber shots have less powder, but these still have more punch than normal rubber shot.
@@ -102,6 +112,7 @@
embed_chance = 0
sharp = FALSE
check_armour = "melee"
+ hud_state = "pistol_special"
/obj/item/projectile/bullet/pistol/rubber // "Rubber" bullets for all other pistols.
name = "rubber bullet"
@@ -110,6 +121,7 @@
embed_chance = 0
sharp = FALSE
check_armour = "melee"
+ hud_state = "pistol_special"
fire_sound ='sound/weapons/Gunshot_pathetic.ogg' // Rubber shots have less powder in the casing.
/* shotgun projectiles */
@@ -119,6 +131,8 @@
fire_sound = 'sound/weapons/Gunshot_shotgun.ogg'
damage = 50
armor_penetration = 20
+ hud_state = "shotgun_slug"
+ hud_state_empty = "shotgun_empty"
/obj/item/projectile/bullet/shotgun/beanbag //because beanbags are not bullets
name = "beanbag"
@@ -127,6 +141,7 @@
embed_chance = 0
sharp = FALSE
check_armour = "melee"
+ hud_state = "shotgun_beanbag"
//Should do about 80 damage at 1 tile distance (adjacent), and 50 damage at 3 tiles distance.
//Overall less damage than slugs in exchange for more damage at very close range and more embedding
@@ -137,12 +152,14 @@
pellets = 6
range_step = 1
spread_step = 10
+ hud_state = "shotgun_buckshot"
/obj/item/projectile/bullet/pellet/shotgun/flak
damage = 2 //The main weapon using these fires four at a time, usually with different destinations. Usually.
range_step = 2
spread_step = 30
armor_penetration = 10
+ hud_state = "shotgun_flechette"
//EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. //Not currently used
/obj/item/projectile/bullet/shotgun/ion
@@ -152,6 +169,7 @@
embed_chance = 0
sharp = FALSE
check_armour = "melee"
+ hud_state = "shotgun_ion"
combustion = FALSE
@@ -167,46 +185,57 @@
fire_sound = 'sound/weapons/Gunshot_generic_rifle.ogg'
armor_penetration = 15
penetrating = 1
+ hud_state = "rifle"
+ hud_state_empty = "rifle_empty"
/obj/item/projectile/bullet/rifle/a762
fire_sound = 'sound/weapons/Gunshot_heavy.ogg'
damage = 35
+ hud_state = "rifle_heavy"
/obj/item/projectile/bullet/rifle/a762/sniper // Hitscan specifically for sniper ammo; to be implimented at a later date, probably for the SVD. -Ace
fire_sound = 'sound/weapons/Gunshot_sniper.ogg'
hitscan = 1 //so the ammo isn't useless as a sniper weapon
+ hud_state = "hivelo"
/obj/item/projectile/bullet/rifle/a762/ap
damage = 30
armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds.
+ hud_state = "rifle_ap"
/obj/item/projectile/bullet/rifle/a762/hp
damage = 40
armor_penetration = -50
penetrating = 0
+ hud_state = "hivelo_iff"
/obj/item/projectile/bullet/rifle/a762/hunter // Optimized for killing simple animals and not people, because Balance(tm)
damage = 20
SA_bonus_damage = 50 // 70 total on animals.
SA_vulnerability = SA_ANIMAL
+ hud_state = "rifle_heavy"
/obj/item/projectile/bullet/rifle/a545
fire_sound = 'sound/weapons/Gunshot_light.ogg'
damage = 25
+ hud_state = "rifle"
/obj/item/projectile/bullet/rifle/a545/ap
damage = 20
armor_penetration = 50 // At 40 or more armor, this will do more damage than standard rounds.
+ hud_state = "rifle_ap"
/obj/item/projectile/bullet/rifle/a545/hp
damage = 35
armor_penetration = -50
penetrating = 0
+ hud_state = "hivelo_iff"
/obj/item/projectile/bullet/rifle/a545/hunter
damage = 15
SA_bonus_damage = 35 // 50 total on animals.
SA_vulnerability = SA_ANIMAL
+ hud_state = "rifle_heavy"
/obj/item/projectile/bullet/rifle/a145 // 14.5�114mm is bigger than a .50 BMG round.
fire_sound = 'sound/weapons/Gunshot_cannon.ogg' // This is literally an anti-tank rifle caliber. It better sound like a fucking cannon.
@@ -216,6 +245,7 @@
penetrating = 5
armor_penetration = 80
hitscan = 1 //so the PTR isn't useless as a sniper weapon
+ hud_state = "sniper"
icon_state = "bullet_alt"
tracer_type = /obj/effect/projectile/tracer/cannon
@@ -226,10 +256,12 @@
weaken = 0
penetrating = 15
armor_penetration = 90
+ hud_state = "sniper_flak"
/obj/item/projectile/bullet/rifle/a44rifle
fire_sound = 'sound/weapons/gunshot4.ogg'
damage = 50
+ hud_state = "revolver"
/* Miscellaneous */
@@ -237,11 +269,13 @@
name = "co bullet"
damage = 20
damage_type = OXY
+ hud_state = "pistol_tranq"
/obj/item/projectile/bullet/cyanideround
name = "poison bullet"
damage = 40
damage_type = TOX
+ hud_state = "pistol_tranq"
/obj/item/projectile/bullet/burstbullet
name = "exploding bullet"
@@ -249,6 +283,7 @@
damage = 20
embed_chance = 0
edge = TRUE
+ hud_state = "pistol_fire"
/obj/item/projectile/bullet/burstbullet/on_hit(var/atom/target, var/blocked = 0)
if(isturf(target))
@@ -264,6 +299,7 @@
damage_type = BURN
incendiary = 0.5
flammability = 2
+ hud_state = "pistol_fire"
/obj/item/projectile/bullet/incendiary/flamethrower
name = "ball of fire"
@@ -276,12 +312,14 @@
agony = 30
range = 4
vacuum_traversal = 0
+ hud_state = "flame"
/obj/item/projectile/bullet/incendiary/flamethrower/large
damage = 5
incendiary = 3
flammability = 2
range = 6
+ hud_state = "flame"
/obj/item/projectile/bullet/incendiary/flamethrower/tiny
damage = 2
@@ -291,11 +329,13 @@
modifier_duration = 20 SECONDS
range = 6
agony = 0
+ hud_state = "flame"
/* Practice rounds and blanks */
/obj/item/projectile/bullet/practice
damage = 5
+ hud_state = "smg_light"
/obj/item/projectile/bullet/pistol/cap // Just the primer, such as a cap gun.
name = "cap"
@@ -305,6 +345,7 @@
nodamage = 1
embed_chance = 0
sharp = FALSE
+ hud_state = "monkey"
combustion = FALSE
@@ -320,6 +361,7 @@
nodamage = 1
embed_chance = 0
sharp = FALSE
+ hud_state = "smg_light"
/* BB Rounds */
/obj/item/projectile/bullet/bb // Generic single BB
@@ -329,6 +371,7 @@
embed_chance = 0
sharp = FALSE
silenced = TRUE
+ hud_state = "pistol_light"
/obj/item/projectile/bullet/pellet/shotgun/bb // Shotgun
name = "BB"
@@ -340,6 +383,7 @@
range_step = 1
spread_step = 10
silenced = TRUE
+ hud_state = "pistol_light"
/* toy projectiles */
/obj/item/projectile/bullet/cap
@@ -353,6 +397,7 @@
impact_effect_type = null
fire_sound = 'sound/effects/snap.ogg'
combustion = FALSE
+ hud_state = "pistol_light"
/obj/item/projectile/bullet/cap/process()
loc = null
@@ -372,6 +417,7 @@
icon = 'icons/obj/gun_toy.dmi'
icon_state = "foamdart_proj"
range = 15
+ hud_state = "grenade_dummy"
/obj/item/projectile/bullet/foam_dart/on_impact(var/atom/A)
. = ..()
@@ -400,6 +446,7 @@
icon = 'icons/obj/gun_toy.dmi'
icon_state = "foamdart_riot_proj"
range = 15
+ hud_state = "grenade_he"
/obj/item/projectile/bullet/foam_dart_riot/on_impact(var/atom/A)
. = ..()
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index f3f1068110..29e082d672 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -8,6 +8,8 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
hitsound = 'sound/weapons/zapbang.ogg'
+ hud_state = "plasma"
+ hud_state_empty = "battery_empty"
var/flash_strength = 10
@@ -22,6 +24,7 @@
var/flash_range = 0
var/brightness = 7
var/light_colour = "#ffffff"
+ hud_state = "grenade_dummy"
/obj/item/projectile/energy/flash/on_impact(var/atom/A)
var/turf/T = flash_range? src.loc : get_turf(A)
@@ -59,6 +62,7 @@
flash_range = 1
brightness = 15
flash_strength = 20
+ hud_state = "grenade_dummy"
/obj/item/projectile/energy/flash/flare/on_impact(var/atom/A)
light_colour = pick("#e58775", "#ffffff", "#90ff90", "#a09030")
@@ -77,15 +81,18 @@
light_range = 2
light_power = 0.5
light_color = "#FFFFFF"
+ hud_state = "taser"
//Damage will be handled on the MOB side, to prevent window shattering.
/obj/item/projectile/energy/electrode/strong
agony = 55
+ hud_state = "taser"
/obj/item/projectile/energy/electrode/stunshot
name = "stunshot"
damage = 5
agony = 80
+ hud_state = "taser"
/obj/item/projectile/energy/electrode/stunshot/strong
name = "stunshot"
@@ -93,6 +100,7 @@
damage = 10
taser_effect = 1
agony = 100
+ hud_state = "taser"
/obj/item/projectile/energy/declone
name = "declone"
@@ -107,6 +115,7 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
combustion = FALSE
+ hud_state = "plasma_pistol"
/obj/item/projectile/energy/excavate
name = "kinetic blast"
@@ -120,6 +129,7 @@
vacuum_traversal = 0
combustion = FALSE
+ hud_state = "plasma_blast"
/obj/item/projectile/energy/dart
name = "dart"
@@ -128,6 +138,7 @@
damage_type = TOX
agony = 120
check_armour = "energy"
+ hud_state = "pistol_tranq"
combustion = FALSE
@@ -138,23 +149,28 @@
damage_type = TOX
agony = 40
stutter = 10
+ hud_state = "electrothermal"
/obj/item/projectile/energy/bolt/large
name = "largebolt"
damage = 20
+ hud_state = "electrothermal"
/obj/item/projectile/energy/bow
name = "engergy bolt"
icon_state = "cbbolt"
damage = 20
+ hud_state = "electrothermal"
/obj/item/projectile/energy/bow/heavy
damage = 30
icon_state = "cbbolt"
+ hud_state = "electrothermal"
/obj/item/projectile/energy/bow/stun
name = "stun bolt"
agony = 30
+ hud_state = "electrothermal"
/obj/item/projectile/energy/acid //Slightly up-gunned (Read: The thing does agony and checks bio resist) variant of the simple alien mob's projectile, for queens and sentinels.
name = "acidic spit"
@@ -166,6 +182,7 @@
armor_penetration = 25 // It's acid
hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg'
hitsound = 'sound/weapons/effects/alien_spit_wall.ogg'
+ hud_state = "electrothermal"
combustion = FALSE
@@ -179,6 +196,7 @@
armor_penetration = 25 // It's acid-based
hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg'
hitsound = 'sound/weapons/effects/alien_spit_wall.ogg'
+ hud_state = "electrothermal"
combustion = FALSE
@@ -188,6 +206,7 @@
damage = 20
damage_type = BIOACID
agony = 20
+ hud_state = "electrothermal"
check_armour = "bio"
armor_penetration = 25 // It's acid-based
@@ -202,6 +221,7 @@
light_power = 0.5
light_color = "#33CC00"
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
+ hud_state = "plasma_rifle"
combustion = FALSE
@@ -215,6 +235,7 @@
agony = 55
damage_type = BURN
vacuum_traversal = 0 //Projectile disappears in empty space
+ hud_state = "plasma_rifle_blast"
/obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/carbon/M)
@@ -259,6 +280,7 @@
embed_chance = 0
muzzle_type = /obj/effect/projectile/muzzle/pulse
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
+ hud_state = "plasma_sphere"
/obj/item/projectile/energy/phase
name = "phase wave"
@@ -267,28 +289,35 @@
damage = 5
SA_bonus_damage = 45 // 50 total on animals
SA_vulnerability = SA_ANIMAL
+ hud_state = "laser_heat"
/obj/item/projectile/energy/phase/light
range = 4
SA_bonus_damage = 35 // 40 total on animals
+ hud_state = "laser_heat"
/obj/item/projectile/energy/phase/heavy
range = 8
SA_bonus_damage = 55 // 60 total on animals
+ hud_state = "laser_heat"
/obj/item/projectile/energy/phase/heavy/cannon
range = 10
damage = 15
SA_bonus_damage = 60 // 75 total on animals
+ hud_state = "laser_heat"
/obj/item/projectile/energy/electrode/strong
agony = 70
+ hud_state = "taser"
/obj/item/projectile/energy
flash_strength = 10
+ hud_state = "taser"
/obj/item/projectile/energy/flash
flash_range = 1
+ hud_state = "grenade_dummy"
/obj/item/projectile/energy/flash/strong
name = "chemical shell"
@@ -297,6 +326,8 @@
range = 15 //if the shell hasn't hit anything after travelling this far it just explodes.
flash_strength = 15
brightness = 15
+ hud_state = "grenade_dummy"
/obj/item/projectile/energy/flash/flare
- flash_range = 2
\ No newline at end of file
+ flash_range = 2
+ hud_state = "grenade_dummy"
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/explosive.dm b/code/modules/projectiles/projectile/explosive.dm
index 307febc8bc..76da8f3e3a 100644
--- a/code/modules/projectiles/projectile/explosive.dm
+++ b/code/modules/projectiles/projectile/explosive.dm
@@ -7,6 +7,8 @@
icon_state = "missile"
damage = 30 //Meaty whack. *Chuckles*
does_spin = 0
+ hud_state = "rocket_he"
+ hud_state_empty = "rocket_empty"
/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
if(!isliving(target)) //if the target isn't alive, so is a wall or something
@@ -24,6 +26,7 @@
/obj/item/projectile/bullet/srmrocket/weak //Used in the jury rigged one.
damage = 10
+ hud_state = "rocket_he"
/obj/item/projectile/bullet/srmrocket/weak/on_hit(atom/target, blocked=0)
explosion(target, 0, 0, 2, 4)//No need to have a question.
diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm
index 8b003bb6e5..b1041d6d17 100644
--- a/code/modules/projectiles/projectile/magnetic.dm
+++ b/code/modules/projectiles/projectile/magnetic.dm
@@ -8,12 +8,14 @@
weaken = 1
penetrating = 5
armor_penetration = 70
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/slug
name = "slug"
icon_state = "gauss_silenced"
damage = 75
armor_penetration = 90
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/flechette
name = "flechette"
@@ -21,6 +23,7 @@
fire_sound = 'sound/weapons/rapidslice.ogg'
damage = 20
armor_penetration = 100
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/flechette/small
name = "small flechette"
@@ -28,6 +31,7 @@
fire_sound = 'sound/weapons/rapidslice.ogg'
damage = 12
armor_penetration = 100
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/flechette/small/khi
name = "small carbyne flechette"
@@ -36,12 +40,14 @@
damage = 18
armor_penetration = 100
penetrating = 10
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/flechette/hunting
name = "shredder slug"
armor_penetration = 30
SA_bonus_damage = 40
SA_vulnerability = SA_ANIMAL
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/heated
name = "slug"
@@ -53,6 +59,7 @@
embed_chance = 0
armor_penetration = 40
penetrating = 1
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/heated/weak
icon_state = "gauss_silenced"
@@ -61,6 +68,7 @@
embed_chance = 0
armor_penetration = 30
penetrating = 0
+ hud_state = "alloy_spike"
/obj/item/projectile/bullet/magnetic/fuelrod
name = "fuel rod"
@@ -75,6 +83,7 @@
embed_chance = 0
armor_penetration = 40
range = 20
+ hud_state = "rocket_he"
var/searing = 0 //Does this fuelrod ignore shields?
var/detonate_travel = 0 //Will this fuelrod explode when it reaches maximum distance?
@@ -121,6 +130,7 @@
flammability = -1
armor_penetration = 50
penetrating = 3
+ hud_state = "rocket_ap"
/obj/item/projectile/bullet/magnetic/fuelrod/phoron
name = "blazing fuel rod"
@@ -132,6 +142,7 @@
penetrating = 5
irradiate = 20
detonate_mob = 1
+ hud_state = "rocket_fire"
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter
name = "painfully incandescent fuel rod"
@@ -148,6 +159,7 @@
detonate_travel = 1
detonate_mob = 1
energetic_impact = 1
+ hud_state = "rocket_thermobaric"
/obj/item/projectile/bullet/magnetic/fuelrod/supermatter/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) //You cannot touch the supermatter without disentigrating. Assumedly, this is true for condensed rods of it flying at relativistic speeds.
if(istype(target,/turf/simulated/wall) || istype(target,/mob/living))
@@ -168,6 +180,7 @@
check_armour = "melee"
irradiate = 20
range = 6
+ hud_state = "plasma_rifle_blast"
/obj/item/projectile/bullet/magnetic/bore/Initialize(loc, range_mod) // i'm gonna be real honest i dunno how this works but it does
. = ..()
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 142cde4071..e45e4ee3a5 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -9,6 +9,8 @@
light_range = 2
light_power = 0.5
light_color = "#55AAFF"
+ hud_state = "plasma_blast"
+ hud_state_empty = "battery_empty"
combustion = FALSE
impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
@@ -43,6 +45,7 @@
check_armour = "bullet"
sharp = TRUE
edge = TRUE
+ hud_state = "rocket_fire"
/obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0)
explosion(target, -1, 0, 2)
@@ -62,6 +65,7 @@
light_power = 0.5
light_color = "#55AAFF"
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
+ hud_state = "water"
combustion = FALSE
@@ -98,6 +102,7 @@
/obj/item/projectile/temp/hot
name = "heat beam"
target_temperature = 1000
+ hud_state = "flame"
combustion = TRUE
@@ -109,6 +114,7 @@
damage_type = BRUTE
nodamage = 1
check_armour = "bullet"
+ hud_state = "monkey"
/obj/item/projectile/meteor/Bump(atom/A as mob|obj|turf|area)
if(A == firer)
@@ -145,6 +151,7 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
var/lasermod = 0
combustion = FALSE
+ hud_state = "electrothermal"
/obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
@@ -187,6 +194,7 @@
nodamage = 1
check_armour = "energy"
var/decl/plantgene/gene = null
+ hud_state = "electrothermal"
/obj/item/projectile/energy/florayield
name = "beta somatoray"
@@ -201,6 +209,7 @@
light_color = "#FFFFFF"
impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser
var/lasermod = 0
+ hud_state = "electrothermal"
/obj/item/projectile/energy/florayield/on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
@@ -218,6 +227,7 @@
name = "flayer ray"
combustion = FALSE
+ hud_state = "electrothermal"
/obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
@@ -233,6 +243,7 @@
nodamage = 1
damage_type = HALLOSS
muzzle_type = /obj/effect/projectile/muzzle/bullet
+ hud_state = "monkey"
/obj/item/projectile/bola
name = "bola"
@@ -241,6 +252,7 @@
embed_chance = 0 //Nada.
damage_type = HALLOSS
muzzle_type = null
+ hud_state = "monkey"
combustion = FALSE
@@ -260,7 +272,7 @@
embed_chance = 0 //Nada.
damage_type = BRUTE
muzzle_type = null
-
+ hud_state = "monkey"
combustion = FALSE
/obj/item/projectile/webball/on_hit(var/atom/target, var/blocked = 0)
@@ -282,6 +294,7 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+ hud_state = "alloy_spike"
muzzle_type = /obj/effect/projectile/muzzle/tungsten
tracer_type = /obj/effect/projectile/tracer/tungsten
diff --git a/icons/mob/screen_ammo.dmi b/icons/mob/screen_ammo.dmi
new file mode 100644
index 0000000000..57ab8e772e
Binary files /dev/null and b/icons/mob/screen_ammo.dmi differ