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