From c554a761230c0d864be6b096fdf538b207cb2d77 Mon Sep 17 00:00:00 2001
From: Contrabang <91113370+Contrabang@users.noreply.github.com>
Date: Mon, 28 Oct 2024 07:52:11 -0400
Subject: [PATCH] Makes Disarmed Pizzabombs closeable, refactors their code
(#27009)
* Makes Pizzabombs closeable, refactors their code
* oops
* Update code/modules/food_and_drinks/food/foods/pizza.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
---------
Signed-off-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
---
.../food_and_drinks/food/foods/pizza.dm | 204 ++++++++++--------
1 file changed, 119 insertions(+), 85 deletions(-)
diff --git a/code/modules/food_and_drinks/food/foods/pizza.dm b/code/modules/food_and_drinks/food/foods/pizza.dm
index 3b9c7a5d13c..7da7c8fb194 100644
--- a/code/modules/food_and_drinks/food/foods/pizza.dm
+++ b/code/modules/food_and_drinks/food/foods/pizza.dm
@@ -310,24 +310,23 @@
/obj/item/pizzabox/update_overlays()
. = ..()
if(open && pizza)
- var/image/pizzaimg = image("food/pizza.dmi", icon_state = pizza.icon_state)
+ var/image/pizzaimg = image('icons/obj/food/pizza.dmi', src, pizza.icon_state)
pizzaimg.pixel_y = -3
. += pizzaimg
return
+ // Stupid code because byondcode sucks
+ var/set_tag = FALSE
+ if(length(boxes) > 0)
+ var/obj/item/pizzabox/top_box = boxes[length(boxes)]
+ if(top_box.box_tag != "")
+ set_tag = TRUE
else
- // Stupid code because byondcode sucks
- var/set_tag = TRUE
- if(length(boxes) > 0)
- var/obj/item/pizzabox/top_box = boxes[length(boxes)]
- if(top_box.box_tag != "")
- set_tag = TRUE
- else
- if(box_tag != "")
- set_tag = TRUE
- if(!open && set_tag)
- var/image/tag = image("food/pizza.dmi", icon_state = "pizzabox_tag")
- tag.pixel_y = length(boxes) * 3
- . += tag
+ if(box_tag != "")
+ set_tag = TRUE
+ if(!open && set_tag)
+ var/image/tag = image('icons/obj/food/pizza.dmi', src, "pizzabox_tag")
+ tag.pixel_y = length(boxes) * 3
+ . += tag
/obj/item/pizzabox/attack_hand(mob/user)
if(open && pizza)
@@ -447,91 +446,128 @@
pizza_type = /obj/item/food/sliceable/pizza/firecrackerpizza
box_tag = "extra spicy pie"
+#define PIZZA_BOMB_NOT_ARMED 0
+#define PIZZA_BOMB_TIMER_SET 1
+#define PIZZA_BOMB_PRIMED 2
+#define PIZZA_BOMB_DISARMED 3
+
//////////////////////////
// Pizza bombs //
//////////////////////////
/obj/item/pizzabox/pizza_bomb
/// Adjustable timer
var/timer = 1 SECONDS
- var/timer_set = FALSE
- var/primed = FALSE
- var/disarmed = FALSE
+ var/pizza_bomb_status = PIZZA_BOMB_NOT_ARMED
var/wires = list("orange", "green", "blue", "yellow", "aqua", "purple")
var/correct_wire
- var/armer //Used for admin purposes
- var/opener //Ditto
+ var/mob/armer //Used for admin purposes
+ var/mob/opener //Ditto
+
+/obj/item/pizzabox/pizza_bomb/Initialize(mapload)
+ correct_wire = pick(wires)
+ var/obj/item/pizzabox/mimic_box = pick(subtypesof(/obj/item/pizzabox) - typesof(/obj/item/pizzabox/pizza_bomb))
+ box_tag = mimic_box.box_tag
+ return ..()
+
+/obj/item/pizzabox/pizza_bomb/Destroy()
+ armer = null
+ opener = null
+ return ..()
+
+/obj/item/pizzabox/pizza_bomb/update_name()
+ . = ..()
+ if(!open)
+ name = "pizza box"
+ return
+ name = "pizza bomb"
/obj/item/pizzabox/pizza_bomb/update_desc()
- if(primed)
- return
- return ..()
+ if(!open)
+ return ..()
+
+ switch(pizza_bomb_status)
+ if(PIZZA_BOMB_DISARMED)
+ desc = "A devious contraption, made of a small explosive payload hooked up to pressure-sensitive wires. It's disarmed."
+ if(PIZZA_BOMB_PRIMED)
+ desc = "OH GOD THAT'S NOT A PIZZA"
+ else
+ desc = "It seems inactive."
/obj/item/pizzabox/pizza_bomb/update_icon_state()
- if(primed)
- return
- return ..()
+ if(!open)
+ return ..()
+
+ switch(pizza_bomb_status)
+ if(PIZZA_BOMB_DISARMED)
+ icon_state = "pizzabox_bomb_[correct_wire]"
+ if(PIZZA_BOMB_PRIMED)
+ icon_state = "pizzabox_bomb_active"
+ else
+ icon_state = "pizzabox_bomb"
/obj/item/pizzabox/pizza_bomb/AltClick(mob/user)
attack_self(user)
/obj/item/pizzabox/pizza_bomb/attack_self(mob/user)
- if(disarmed)
- to_chat(user, "[src] is disarmed.")
- return
- if(!timer_set)
- name = "pizza bomb"
- desc = "It seems inactive."
- icon_state = "pizzabox_bomb"
- timer_set = TRUE
+ if(pizza_bomb_status == PIZZA_BOMB_NOT_ARMED)
+ open = TRUE
+ update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON)
+
var/new_timer = tgui_input_number(user, "Set a timer, from one second to ten seconds.", "Timer", timer / 10, 10, 1)
- if(isnull(new_timer))
- return
- if(!in_range(src, user) || issilicon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || user.restrained())
- timer_set = FALSE
- name = "pizza box"
- desc = "A box suited for pizzas."
- icon_state = "pizzabox1"
+ if(isnull(new_timer) || !in_range(src, user) || issilicon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || user.restrained())
+ open = FALSE
+ update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON)
return
+
timer = new_timer SECONDS
- icon_state = "pizzabox1"
+ pizza_bomb_status = PIZZA_BOMB_TIMER_SET
+ armer = user
to_chat(user, "You set the timer to [timer / 10] before activating the payload and closing [src].")
- message_admins("[key_name_admin(usr)] has set a timer on a pizza bomb to [timer/10] seconds at (JMP).")
+
+ message_admins("[key_name_admin(usr)] has set a timer on a pizza bomb to [timer/10] seconds at [ADMIN_JMP(loc)].")
log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer / 10] seconds ([loc.x],[loc.y],[loc.z]).")
investigate_log("[key_name(usr)] has armed a [name] for detonation at ([loc.x],[loc.y],[loc.z])", INVESTIGATE_BOMB)
add_attack_logs(user, src, "has armed for detonation", ATKLOG_FEW)
- armer = user
- name = "pizza box"
- desc = "A box suited for pizzas."
+
+ open = FALSE
+ update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON)
return
- if(!primed)
- name = "pizza bomb"
- desc = "OH GOD THAT'S NOT A PIZZA"
- icon_state = "pizzabox_bomb_active"
- audible_message("[bicon(src)] *beep* *beep*")
- to_chat(user, "That's no pizza! That's a bomb!")
- if(HAS_TRAIT(src, TRAIT_CMAGGED))
- atom_say("Pizza time!")
- playsound(src, 'sound/voice/pizza_time.ogg', 50, FALSE) ///Sound effect made by BlackDog
- message_admins("[key_name_admin(usr)] has triggered a pizza bomb armed by [key_name_admin(armer)] at (JMP).")
- log_game("[key_name(usr)] has triggered a pizza bomb armed by [key_name(armer)] ([loc.x],[loc.y],[loc.z]).")
- investigate_log("[key_name(usr)] has opened a [name] for detonation at ([loc.x],[loc.y],[loc.z])", INVESTIGATE_BOMB)
- add_attack_logs(user, src, "has opened for detonation", ATKLOG_FEW)
- opener = user
- primed = TRUE
- sleep(timer)
- return go_boom()
+
+ if(pizza_bomb_status != PIZZA_BOMB_TIMER_SET)
+ if(pizza_bomb_status != PIZZA_BOMB_PRIMED)
+ // Can only toggle disarmed boxes
+ open = !open
+ update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON)
+ return
+
+ open = TRUE
+ opener = user
+
+ audible_message("[bicon(src)] *beep* *beep*")
+ to_chat(user, "That's no pizza! That's a bomb!")
+ if(HAS_TRAIT(src, TRAIT_CMAGGED))
+ atom_say("Pizza time!")
+ playsound(src, 'sound/voice/pizza_time.ogg', 50, FALSE) ///Sound effect made by BlackDog
+
+ message_admins("[key_name_admin(usr)] has triggered a pizza bomb armed by [key_name_admin(armer)] at [ADMIN_JMP(loc)].")
+ log_game("[key_name(usr)] has triggered a pizza bomb armed by [key_name(armer)] ([loc.x],[loc.y],[loc.z]).")
+ investigate_log("[key_name(usr)] has opened a [name] for detonation at ([loc.x],[loc.y],[loc.z])", INVESTIGATE_BOMB)
+ add_attack_logs(user, src, "has opened for detonation", ATKLOG_FEW)
+
+ pizza_bomb_status = PIZZA_BOMB_PRIMED
+ update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON)
+ addtimer(CALLBACK(src, PROC_REF(go_boom)), timer)
+
/obj/item/pizzabox/pizza_bomb/proc/go_boom()
- if(disarmed)
+ if(pizza_bomb_status == PIZZA_BOMB_DISARMED)
visible_message("[bicon(src)] Sparks briefly jump out of the [correct_wire] wire on [src], but it's disarmed!")
return
atom_say("Enjoy the pizza!")
visible_message("[src] violently explodes!")
- message_admins("A pizza bomb set by [key_name_admin(armer)] and opened by [key_name_admin(opener)] has detonated at (JMP).")
+ message_admins("A pizza bomb set by [key_name_admin(armer)] and opened by [key_name_admin(opener)] has detonated at [ADMIN_JMP(loc)].")
log_game("Pizza bomb set by [key_name(armer)] and opened by [key_name(opener)]) detonated at ([loc.x],[loc.y],[loc.z]).")
explosion(loc, 1, 2, 4, flame_range = 2) //Identical to a minibomb
- armer = null
- opener = null
qdel(src)
/obj/item/pizzabox/pizza_bomb/cmag_act(mob/user)
@@ -539,8 +575,11 @@
to_chat(user, "You smear the bananium ooze all over the pizza bomb's internals! You think you smell a bit of tomato sauce.")
ADD_TRAIT(src, TRAIT_CMAGGED, CLOWN_EMAG)
-/obj/item/pizzabox/pizza_bomb/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/wirecutters) && primed)
+/obj/item/pizzabox/pizza_bomb/wirecutter_act(mob/living/user, obj/item/I)
+ if(!open)
+ return
+ . = TRUE
+ if(pizza_bomb_status == PIZZA_BOMB_PRIMED)
to_chat(user, "Oh God, what wire do you cut?!")
var/chosen_wire = tgui_input_list(user, "OH GOD OH GOD", "WHAT WIRE?!", wires)
if(!in_range(src, user) || issilicon(usr) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || user.restrained() || !chosen_wire)
@@ -550,23 +589,21 @@
if(chosen_wire == correct_wire)
audible_message("[bicon(src)] [src] suddenly stops beeping and seems lifeless.")
to_chat(user, "You did it!")
- icon_state = "pizzabox_bomb_[correct_wire]"
- name = "pizza bomb"
- desc = "A devious contraption, made of a small explosive payload hooked up to pressure-sensitive wires. It's disarmed."
- disarmed = TRUE
- primed = FALSE
+
+ pizza_bomb_status = PIZZA_BOMB_DISARMED
+ update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON)
return
else
to_chat(user, "WRONG WIRE!")
go_boom()
return
- if(istype(I, /obj/item/wirecutters) && disarmed)
+
+ if(pizza_bomb_status == PIZZA_BOMB_DISARMED)
if(!in_range(user, src))
to_chat(user, "You can't see the box well enough to cut the wires out.")
return
user.visible_message("[user] starts removing the payload and wires from [src].")
- if(do_after(user, 40 * I.toolspeed, target = src))
- playsound(src, I.usesound, 50, TRUE, 1)
+ if(I.use_tool(src, user, 4 SECONDS, volume = 50))
user.unEquip(src)
user.visible_message("[user] removes the insides of [src]!")
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(src.loc)
@@ -574,15 +611,12 @@
new /obj/item/bombcore/miniature(loc)
new /obj/item/pizzabox(loc)
qdel(src)
- return
- ..()
-
-/obj/item/pizzabox/pizza_bomb/Initialize(mapload)
- correct_wire = pick(wires)
- var/obj/item/pizzabox/mimic_box = pick(subtypesof(/obj/item/pizzabox) - typesof(/obj/item/pizzabox/pizza_bomb))
- box_tag = mimic_box.box_tag
- . = ..()
/obj/item/pizzabox/pizza_bomb/autoarm
- timer_set = TRUE
+ pizza_bomb_status = PIZZA_BOMB_TIMER_SET
timer = 3 SECONDS
+
+#undef PIZZA_BOMB_NOT_ARMED
+#undef PIZZA_BOMB_TIMER_SET
+#undef PIZZA_BOMB_PRIMED
+#undef PIZZA_BOMB_DISARMED