From 49454e1b879385d073b4c80dfe9f1359552252e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=83=D0=BC=D0=B0=D1=81=D0=B0=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=20C=D0=B0=D0=BC=D0=B0=D0=BB=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=91=D0=B0=D0=B1=D0=B0=D0=BD?= Date: Wed, 9 Oct 2024 14:00:00 +0700 Subject: [PATCH] ports Nebula's ammo magazines lazy-initialize --- code/modules/projectiles/ammunition.dm | 37 +++++++++++++++---- code/modules/projectiles/ammunition/boxes.dm | 1 + code/modules/projectiles/guns/projectile.dm | 20 ++++++---- .../projectiles/guns/projectile/automatic.dm | 4 +- .../projectiles/guns/projectile/dartgun.dm | 10 ++--- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index bbdfe62890bd6..75ba24579b11b 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -17,6 +17,19 @@ var/fall_sounds = list('sound/weapons/guns/casingfall1.ogg','sound/weapons/guns/casingfall2.ogg','sound/weapons/guns/casingfall3.ogg') + +/obj/item/ammo_magazine/proc/create_initial_contents() + if(contents_initialized || !initial_ammo || !ammo_type) + return + for(var/i in 1 to initial_ammo) + stored_ammo += new ammo_type(src) + +/obj/item/ammo_magazine/proc/get_stored_ammo_count() + . = length(stored_ammo) + if(!contents_initialized) + . += initial_ammo + + /obj/item/ammo_casing/Initialize() if(ispath(projectile_type)) BB = new projectile_type(src) @@ -126,6 +139,11 @@ var/list/icon_keys = list() //keys var/list/ammo_states = list() //values + /// Determines whether or not we wait until the first time our contents are gotten to initialize contents. May lead to icon bugs if not handled delicately. + var/lazyload_contents = TRUE + /// Whether or not our contents have been initialized or not, used in lazyloaded contents. + var/contents_initialized = FALSE + /obj/item/ammo_magazine/box w_class = ITEM_SIZE_NORMAL @@ -139,9 +157,8 @@ if(isnull(initial_ammo)) initial_ammo = max_ammo - if(initial_ammo) - for(var/i in 1 to initial_ammo) - stored_ammo += new ammo_type(src) + if(!lazyload_contents) + create_initial_contents() if(caliber) LAZYINSERT(labels, caliber, 1) if(LAZYLEN(labels)) @@ -155,7 +172,7 @@ if(C.caliber != caliber) to_chat(user, SPAN_WARNING("\The [C] does not fit into \the [src].")) return TRUE - if(length(stored_ammo) >= max_ammo) + if(get_stored_ammo_count() >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) return TRUE if(!user.unEquip(C, src)) @@ -168,6 +185,7 @@ /obj/item/ammo_magazine/attack_self(mob/user) + create_initial_contents() if(!length(stored_ammo)) to_chat(user, SPAN_NOTICE("[src] is already empty!")) return @@ -181,6 +199,7 @@ /obj/item/ammo_magazine/attack_hand(mob/user) if(user.get_inactive_hand() == src) + create_initial_contents() if(!length(stored_ammo)) to_chat(user, SPAN_NOTICE("[src] is already empty!")) else @@ -214,11 +233,12 @@ icon_state = initial(icon_state) if(multiple_sprites) - //find the lowest key greater than or equal to length(stored_ammo) + //find the lowest key greater than or equal to our ammo count var/new_state = null + var/self_ammo_count = get_stored_ammo_count() for(var/idx in 1 to length(icon_keys)) - var/ammo_count = icon_keys[idx] - if (ammo_count >= length(stored_ammo)) + var/icon_ammo_count = icon_keys[idx] + if (icon_ammo_count >= self_ammo_count) new_state = ammo_states[idx] break icon_state = (new_state)? new_state : initial(icon_state) @@ -226,7 +246,8 @@ /obj/item/ammo_magazine/examine(mob/user) . = ..() - to_chat(user, "There [(length(stored_ammo) == 1)? "is" : "are"] [length(stored_ammo)] round\s left!") + var/self_ammo_count = get_stored_ammo_count() + to_chat(user, "There [(self_ammo_count == 1)? "is" : "are"] [self_ammo_count] round\s left!") //magazine icon state caching diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 8b99c3eca519b..476a80b918514 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -80,6 +80,7 @@ /obj/item/ammo_magazine/shotholder/attack_hand(mob/user) if((user.a_intent == I_HURT) && (length(stored_ammo))) + create_initial_contents() var/obj/item/ammo_casing/C = stored_ammo[length(stored_ammo)] stored_ammo-=C user.put_in_hands(C) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 2321283af05ce..2f4a9e78cc108 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -73,10 +73,16 @@ chambered = loaded[1] //load next casing. if(handle_casings != HOLD_CASINGS) loaded -= chambered - else if(ammo_magazine && length(ammo_magazine.stored_ammo)) - chambered = ammo_magazine.stored_ammo[length(ammo_magazine.stored_ammo)] - if(handle_casings != HOLD_CASINGS) - ammo_magazine.stored_ammo -= chambered + else if(ammo_magazine) + if(!ammo_magazine.contents_initialized && ammo_magazine.initial_ammo > 0) + chambered = new ammo_magazine.ammo_type(src) + if(handle_casings == HOLD_CASINGS) + ammo_magazine.stored_ammo += chambered + ammo_magazine.initial_ammo-- + else if(ammo_magazine.stored_ammo.len) + chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] + if(handle_casings != HOLD_CASINGS) + ammo_magazine.stored_ammo -= chambered if (chambered) return chambered.BB @@ -315,7 +321,7 @@ /obj/item/gun/projectile/afterattack(atom/A, mob/living/user) ..() - if(auto_eject && ammo_magazine && ammo_magazine.stored_ammo && !length(ammo_magazine.stored_ammo)) + if(auto_eject && ammo_magazine && !ammo_magazine.get_stored_ammo_count()) ammo_magazine.dropInto(user.loc) user.visible_message( "[ammo_magazine] falls out and clatters on the floor!", @@ -342,8 +348,8 @@ var/bullets = 0 if(loaded) bullets += length(loaded) - if(ammo_magazine && ammo_magazine.stored_ammo) - bullets += length(ammo_magazine.stored_ammo) + if(ammo_magazine) + bullets += ammo_magazine.get_stored_ammo_count() if(chambered) bullets += 1 return bullets diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 9d566499e507d..0764fb9f2cf6b 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -246,7 +246,7 @@ /obj/item/gun/projectile/automatic/bullpup_rifle/on_update_icon() ..() if(ammo_magazine) - if(length(ammo_magazine.stored_ammo)) + if(length(ammo_magazine.get_stored_ammo_count())) icon_state = "carbine-loaded" else icon_state = "carbine-empty" @@ -351,7 +351,7 @@ /obj/item/gun/projectile/automatic/l6_saw/on_update_icon() ..() if(istype(ammo_magazine, /obj/item/ammo_magazine/box)) - icon_state = "l6[cover_open ? "open" : "closed"][round(length(ammo_magazine.stored_ammo), 10)]" + icon_state = "l6[cover_open ? "open" : "closed"][round(length(ammo_magazine.get_stored_ammo_count()), 10)]" item_state = "l6[cover_open ? "open" : "closed"]" wielded_item_state = "l6[cover_open ? "open" : "closed"]-wielded" else if(ammo_magazine) diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index bb29b584eaba4..dd80f273617f2 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -81,12 +81,12 @@ icon_state = "dartgun-empty" return 1 - if(!ammo_magazine.stored_ammo || length(ammo_magazine.stored_ammo)) + if(!ammo_magazine.get_stored_ammo_count() || length(ammo_magazine.get_stored_ammo_count())) icon_state = "dartgun-0" - else if(length(ammo_magazine.stored_ammo) > 5) + else if(length(ammo_magazine.get_stored_ammo_count()) > 5) icon_state = "dartgun-5" else - icon_state = "dartgun-[length(ammo_magazine.stored_ammo)]" + icon_state = "dartgun-[length(ammo_magazine.get_stored_ammo_count())]" return 1 /obj/item/gun/projectile/dartgun/consume_next_projectile() @@ -166,8 +166,8 @@ dat += " \[Eject\]
" if(ammo_magazine) - if(ammo_magazine.stored_ammo && length(ammo_magazine.stored_ammo)) - dat += "The dart cartridge has [length(ammo_magazine.stored_ammo)] shots remaining." + if(ammo_magazine.stored_ammo && length(ammo_magazine.get_stored_ammo_count())) + dat += "The dart cartridge has [length(ammo_magazine.get_stored_ammo_count())] shots remaining." else dat += SPAN_COLOR("red", "The dart cartridge is empty!") dat += " \[Eject\]
"