Refactor ammo icon handling so that they show on map (#17807)

* Refactor ammo icon handling so that they show on map

.. and are not terrible to maintain.

* Small prettification

* .len -> length()

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>

* Other .len -> length()

* And the rest of the .len -> length() in the touched files

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
This commit is contained in:
moxian
2022-05-27 19:35:05 +00:00
committed by GitHub
parent eaf8e0c736
commit a02187e08e
5 changed files with 72 additions and 100 deletions

View File

@@ -53,7 +53,7 @@
if(isturf(loc))
var/boolets = 0
for(var/obj/item/ammo_casing/bullet in loc)
if(box.stored_ammo.len >= box.max_ammo)
if(length(box.stored_ammo) >= box.max_ammo)
break
if(bullet.BB)
if(box.give_round(bullet, 0))
@@ -62,7 +62,7 @@
continue
if(boolets > 0)
box.update_icon()
to_chat(user, "<span class='notice'>You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.</span>")
to_chat(user, "<span class='notice'>You collect [boolets] shell\s. [box] now contains [length(box.stored_ammo)] shell\s.</span>")
playsound(src, 'sound/weapons/gun_interactions/bulletinsert.ogg', 50, 1)
else
to_chat(user, "<span class='warning'>You fail to collect anything!</span>")
@@ -95,12 +95,15 @@
return TRUE
return ..()
#define AMMO_MULTI_SPRITE_STEP_NONE null
#define AMMO_MULTI_SPRITE_STEP_ON_OFF -1
//Boxes of ammo
/obj/item/ammo_box
name = "ammo box (generic)"
desc = "A box of ammo?"
icon_state = "357"
icon = 'icons/obj/ammo.dmi'
icon_state = "10mmbox" // placeholder icon
flags = CONDUCT
slot_flags = SLOT_BELT
item_state = "syringe_kit"
@@ -112,8 +115,7 @@
var/list/stored_ammo = list()
var/ammo_type = /obj/item/ammo_casing
var/max_ammo = 7
var/multiple_sprites = 0
var/icon_prefix // boxes with multiple sprites use this as their base
var/multi_sprite_step = AMMO_MULTI_SPRITE_STEP_NONE // see update_icon() for details
var/caliber
var/multiload = 1
var/list/initial_mats //For calculating refund values.
@@ -130,10 +132,10 @@
return ..()
/obj/item/ammo_box/proc/get_round(keep = 0)
if(!stored_ammo.len)
if(!length(stored_ammo))
return null
else
var/b = stored_ammo[stored_ammo.len]
var/b = stored_ammo[length(stored_ammo)]
stored_ammo -= b
if(keep)
stored_ammo.Insert(1,b)
@@ -148,7 +150,7 @@
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
return 0
if(stored_ammo.len < max_ammo)
if(length(stored_ammo) < max_ammo)
stored_ammo += R
R.loc = src
playsound(src, 'sound/weapons/gun_interactions/bulletinsert.ogg', 50, 1)
@@ -208,14 +210,26 @@
to_chat(user, "<span class='notice'>You remove a round from \the [src]!</span>")
update_icon()
// `multi_sprite_step` governs whether there are different sprites for different degrees of being loaded.
// AMMO_MULTI_SPRITE_STEP_NONE - just a single `icon_state`, no shenanigans
// AMMO_MULTI_SPRITE_STEP_ON_OFF - empty sprite `[icon_state]-0`, full sprite `[icon_state]`, no inbetween
// (positive integer) - sprites for intermediate degrees of being loaded are present in the .dmi
// and are named `[icon_state]-[ammo_count]`, with `ammo_count` being incremented in steps of `multi_sprite_step`
// ... except the very final full mag sprite with is just `[icon_state]`
/obj/item/ammo_box/update_icon()
var/icon_base = initial(icon_prefix) ? initial(icon_prefix) : initial(icon_state)
switch(multiple_sprites)
if(1)
icon_state = "[icon_base]-[stored_ammo.len]"
if(2)
icon_state = "[icon_base]-[stored_ammo.len ? "[max_ammo]" : "0"]"
desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
var/icon_base = initial(icon_state)
switch(multi_sprite_step)
if(AMMO_MULTI_SPRITE_STEP_NONE)
icon_state = icon_base
if(AMMO_MULTI_SPRITE_STEP_ON_OFF)
icon_state = "[icon_base][length(stored_ammo) ? "" : "-0"]"
else
var/shown_ammo = CEILING(length(stored_ammo), multi_sprite_step)
if(shown_ammo == CEILING(max_ammo, multi_sprite_step))
icon_state = icon_base
else
icon_state = "[icon_base]-[shown_ammo]"
desc = "[initial(desc)] There are [length(stored_ammo)] shell\s left!"
/obj/item/ammo_box/proc/update_mat_value()
var/num_ammo = 0
@@ -232,7 +246,7 @@
//Behavior for magazines
/obj/item/ammo_box/magazine/proc/ammo_count()
return stored_ammo.len
return length(stored_ammo)
/obj/item/ammo_box/magazine/proc/empty_magazine()
var/turf_mag = get_turf(src)

View File

@@ -3,19 +3,16 @@
desc = "Designed to quickly reload revolvers."
ammo_type = /obj/item/ammo_casing/a357
max_ammo = 7
icon_state = "357-7" // DEFAULT icon, composed of prefix + "-" + max_ammo for multiple_sprites == 1 boxes
multiple_sprites = 1 // see: /obj/item/ammo_box/update_icon()
icon_prefix = "357" // icon prefix, used in above formula to generate dynamic icons
multi_sprite_step = 1 // see: /obj/item/ammo_box/update_icon()
icon_state = "357"
/obj/item/ammo_box/c38
name = "speed loader (.38)"
desc = "Designed to quickly reload revolvers."
icon_state = "38"
ammo_type = /obj/item/ammo_casing/c38
max_ammo = 6
icon_state = "38-6" // see previous entry for explanation of these vars
multiple_sprites = 1
icon_prefix = "38"
multi_sprite_step = 1
icon_state = "38"
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
@@ -49,7 +46,7 @@
icon_state = "40mm"
ammo_type = /obj/item/ammo_casing/a40mm
max_ammo = 4
multiple_sprites = 1
multi_sprite_step = 1
/obj/item/ammo_box/a762
name = "stripper clip (7.62mm)"
@@ -57,7 +54,7 @@
icon_state = "762"
ammo_type = /obj/item/ammo_casing/a762
max_ammo = 5
multiple_sprites = 1
multi_sprite_step = 1
/obj/item/ammo_box/n762
name = "ammo box (7.62x38mmR)"
@@ -66,6 +63,7 @@
ammo_type = /obj/item/ammo_casing/n762
max_ammo = 14
/obj/item/ammo_box/shotgun
name = "shotgun speedloader (Slug)"
icon_state = "slugloader"
@@ -73,40 +71,35 @@
ammo_type = /obj/item/ammo_casing/shotgun
max_ammo = 7
materials = list(MAT_METAL=28000)
multiple_sprites = 1
multi_sprite_step = 1
/obj/item/ammo_box/shotgun/buck
name = "shotgun speedloader (Buckshot)"
icon_state = "buckloader"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
/obj/item/ammo_box/shotgun/dragonsbreath
name = "shotgun speedloader (Dragonsbreath)"
icon_state = "dragonsbreathloader"
ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
/obj/item/ammo_box/shotgun/stun
name = "shotgun speedloader (Stun shells)"
icon_state = "stunloader"
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
/obj/item/ammo_box/shotgun/beanbag
name = "shotgun speedloader (Beanbag shells)"
icon_state = "beanbagloader"
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
materials = list(MAT_METAL=1750)
/obj/item/ammo_box/shotgun/rubbershot
name = "shotgun speedloader (Rubbershot shells)"
icon_state = "rubbershotloader"
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
materials = list(MAT_METAL=1750)
/obj/item/ammo_box/shotgun/tranquilizer
name = "shotgun speedloader (Tranquilizer darts)"
icon_state = "tranqloader"
@@ -142,10 +135,9 @@
materials = list(MAT_METAL = 90000)
/obj/item/ammo_box/caps
name = "speed loader (caps)"
icon_state = "357"
ammo_type = /obj/item/ammo_casing/cap
max_ammo = 7
multiple_sprites = 1
multi_sprite_step = 1

View File

@@ -1,3 +1,6 @@
/obj/item/ammo_box/magazine
icon_state = "enforcer" // placeholder icon
////////////////INTERNAL MAGAZINES//////////////////////
/obj/item/ammo_box/magazine/internal
desc = "Oh god, this shouldn't be here"
@@ -43,7 +46,7 @@
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
return 0
for(var/i in 1 to stored_ammo.len)
for(var/i in 1 to length(stored_ammo))
var/obj/item/ammo_casing/bullet = stored_ammo[i]
if(!bullet || !bullet.BB) // found a spent ammo
stored_ammo[i] = R
@@ -195,7 +198,7 @@
ammo_type = /obj/item/ammo_casing/c10mm
caliber = "10mm"
max_ammo = 8
multiple_sprites = 2
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
/obj/item/ammo_box/magazine/m10mm/fire
name = "pistol magazine (10mm incendiary)"
@@ -221,14 +224,14 @@
ammo_type = /obj/item/ammo_casing/c45
caliber = ".45"
max_ammo = 8
multiple_sprites = 1
multi_sprite_step = 1
/obj/item/ammo_box/magazine/enforcer
name = "handgun magazine (9mm rubber)"
icon_state = "enforcer"
ammo_type = /obj/item/ammo_casing/rubber9mm
max_ammo = 8
multiple_sprites = 1
multi_sprite_step = 1
caliber = "9mm"
/obj/item/ammo_box/magazine/enforcer/update_icon()
@@ -248,7 +251,7 @@
var/ammo = ammo_count()
if(!ammo)
return 0
if(istype(contents[contents.len], /obj/item/ammo_casing/rubber9mm))
if(istype(contents[length(contents)], /obj/item/ammo_casing/rubber9mm))
return 1
return 0
@@ -258,14 +261,11 @@
/obj/item/ammo_box/magazine/wt550m9
name = "wt550 magazine (4.6x30mm)"
icon_state = "46x30mmt-20"
icon_state = "46x30mmt"
ammo_type = /obj/item/ammo_casing/c46x30mm
caliber = "4.6x30mm"
max_ammo = 20
/obj/item/ammo_box/magazine/wt550m9/update_icon()
..()
icon_state = "46x30mmt-[round(ammo_count(),4)]"
multi_sprite_step = 4
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
@@ -281,14 +281,11 @@
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
icon_state = "uzi9mm-32"
icon_state = "uzi9mm"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 32
/obj/item/ammo_box/magazine/uzim9mm/update_icon()
..()
icon_state = "uzi9mm-[round(ammo_count(),4)]"
multi_sprite_step = 4
/obj/item/ammo_box/magazine/smgm9mm
name = "\improper SMG magazine (9mm)"
@@ -297,6 +294,7 @@
caliber = "9mm"
max_ammo = 21
materials = list(MAT_METAL = 2000)
multi_sprite_step = 4
/obj/item/ammo_box/magazine/smgm9mm/ap
name = "\improper SMG magazine (Armour Piercing 9mm)"
@@ -313,20 +311,13 @@
ammo_type = /obj/item/ammo_casing/c9mm/inc
materials = list(MAT_METAL = 3000)
/obj/item/ammo_box/magazine/smgm9mm/update_icon()
..()
icon_state = "[initial(icon_state)]-[round(ammo_count()+1,4)]"
/obj/item/ammo_box/magazine/pistolm9mm
name = "pistol magazine (9mm)"
icon_state = "9x19p-8"
icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 15
/obj/item/ammo_box/magazine/pistolm9mm/update_icon()
..()
icon_state = "9x19p-[ammo_count() ? "8" : "0"]"
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
/obj/item/ammo_box/magazine/smgm45
name = "\improper SMG magazine (.45)"
@@ -335,10 +326,7 @@
ammo_type = /obj/item/ammo_casing/c45
caliber = ".45"
max_ammo = 20
/obj/item/ammo_box/magazine/smgm45/update_icon()
..()
icon_state = "[initial(icon_state)]-[round(ammo_count(),2)]"
multi_sprite_step = 2
/obj/item/ammo_box/magazine/tommygunm45
name = "drum magazine (.45)"
@@ -354,14 +342,14 @@
ammo_type = /obj/item/ammo_casing/a50
caliber = ".50"
max_ammo = 7
multiple_sprites = 1
multi_sprite_step = 1
/obj/item/ammo_box/magazine/m75
name = "specialized magazine (.75)"
icon_state = "75"
ammo_type = /obj/item/ammo_casing/caseless/a75
caliber = "75"
multiple_sprites = 2
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
max_ammo = 8
/obj/item/ammo_box/magazine/m556
@@ -371,7 +359,7 @@
ammo_type = /obj/item/ammo_casing/a556
caliber = "a556"
max_ammo = 30
multiple_sprites = 2
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
/obj/item/ammo_box/magazine/m556/arg
name = "\improper ARG magazine (5.56mm)"
@@ -385,7 +373,7 @@
origin_tech = "combat=3;syndicate=1"
caliber = "shotgun"
max_ammo = 8
multiple_sprites = 2
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
/obj/item/ammo_box/magazine/m12g/buckshot
name = "shotgun magazine (12g buckshot slugs)"
@@ -397,7 +385,6 @@
icon_state = "m12gs"
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
/obj/item/ammo_box/magazine/m12g/dragon
name = "shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
@@ -413,6 +400,7 @@
icon_state = "m12gbc"
ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
/obj/item/ammo_box/magazine/m12g/XtrLrg
name = "\improper XL shotgun magazine (12g slugs)"
desc = "An extra large drum magazine."
@@ -438,12 +426,9 @@
/obj/item/ammo_box/magazine/toy/smg
name = "foam force SMG magazine"
icon_state = "smg9mm-20"
icon_state = "smg9mm"
max_ammo = 20
/obj/item/ammo_box/magazine/toy/smg/update_icon()
..()
icon_state = "smg9mm-[round(ammo_count()+1,4)]"
multi_sprite_step = 4
/obj/item/ammo_box/magazine/toy/smg/riot
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
@@ -452,7 +437,7 @@
name = "foam force pistol magazine"
icon_state = "9x19p"
max_ammo = 8
multiple_sprites = 2
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
/obj/item/ammo_box/magazine/toy/pistol/riot
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
@@ -461,7 +446,7 @@
name = "\improper Enforcer foam magazine"
icon_state = "enforcer"
max_ammo = 8
multiple_sprites = 1
multi_sprite_step = 1
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
/obj/item/ammo_box/magazine/toy/enforcer/update_icon()
@@ -478,27 +463,16 @@
var/ammo = ammo_count()
if(!ammo)
return 0
if(istype(contents[contents.len], /obj/item/ammo_casing/caseless/foam_dart/riot))
if(istype(contents[length(contents)], /obj/item/ammo_casing/caseless/foam_dart/riot))
return 1
return 0
/obj/item/ammo_box/magazine/toy/smgm45
name = "donksoft SMG magazine"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
max_ammo = 20
/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
..()
icon_state = "c20r45-[round(ammo_count(),2)]"
/obj/item/ammo_box/magazine/toy/m762
name = "donksoft box magazine"
icon_state = "a762"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
max_ammo = 50
/obj/item/ammo_box/magazine/toy/m762/update_icon()
..()
icon_state = "a762-[round(ammo_count(),10)]"
multi_sprite_step = 10
/obj/item/ammo_box/magazine/toy/m762/riot
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
@@ -511,19 +485,14 @@
origin_tech = "combat=3"
caliber = "laser"
max_ammo = 20
/obj/item/ammo_box/magazine/laser/update_icon()
..()
icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/20, 1)*20]"
multi_sprite_step = AMMO_MULTI_SPRITE_STEP_ON_OFF
/obj/item/ammo_box/magazine/toy/smgm45
name = "donksoft SMG magazine"
icon_state = "c20r45"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
max_ammo = 20
/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
..()
icon_state = "c20r45-[round(ammo_count(),2)]"
multi_sprite_step = 2
/obj/item/ammo_box/magazine/toy/smgm45/riot
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot

View File

@@ -105,11 +105,12 @@
/obj/item/ammo_box/magazine/mm556x45
name = "box magazine (5.56x45mm)"
icon_state = "a762-50"
icon_state = "a762"
origin_tech = "combat=2"
ammo_type = /obj/item/ammo_casing/mm556x45
caliber = "mm55645"
max_ammo = 50
multi_sprite_step = 10
/obj/item/ammo_box/magazine/mm556x45/bleeding
name = "box magazine (Bleeding 5.56x45mm)"
@@ -131,10 +132,6 @@
origin_tech = "combat=4"
ammo_type = /obj/item/ammo_casing/mm556x45/incen
/obj/item/ammo_box/magazine/mm556x45/update_icon()
..()
icon_state = "a762-[round(ammo_count(),10)]"
//casings//
/obj/item/ammo_casing/mm556x45