230 lines
7.2 KiB
Plaintext
230 lines
7.2 KiB
Plaintext
/obj/item/weapon/bombcore/pizza
|
|
parent_type = /obj/item/weapon/bombcore/miniature
|
|
name = "pizza bomb"
|
|
desc = "Special delivery!"
|
|
icon_state = "pizzabomb_inactive"
|
|
item_state = "eshield0"
|
|
origin_tech = "syndicate=4"
|
|
|
|
/obj/item/pizzabox
|
|
name = "pizza box"
|
|
desc = "A box suited for pizzas."
|
|
icon = 'icons/obj/food/containers.dmi'
|
|
icon_state = "pizzabox1"
|
|
item_state = "pizzabox"
|
|
|
|
var/open = 0
|
|
var/boxtag = ""
|
|
var/list/boxes = list()
|
|
|
|
var/obj/item/weapon/reagent_containers/food/snacks/pizza/pizza
|
|
|
|
var/obj/item/weapon/bombcore/pizza/bomb
|
|
var/bomb_active = FALSE // If the bomb is counting down.
|
|
var/bomb_defused = TRUE // If the bomb is inert.
|
|
var/bomb_timer = 1 // How long before blowing the bomb.
|
|
var/const/BOMB_TIMER_MIN = 1
|
|
var/const/BOMB_TIMER_MAX = 10
|
|
|
|
/obj/item/pizzabox/New()
|
|
update_icon()
|
|
|
|
/obj/item/pizzabox/Destroy()
|
|
unprocess()
|
|
|
|
/obj/item/pizzabox/update_icon()
|
|
// Description
|
|
desc = initial(desc)
|
|
if(open)
|
|
if(pizza)
|
|
desc = "[desc] It appears to have \a [pizza] inside."
|
|
if(bomb)
|
|
desc = "[desc] Wait, what?! It has \a [bomb] inside!"
|
|
if(bomb_defused)
|
|
desc = "[desc] The bomb seems inert."
|
|
if(bomb_active)
|
|
desc = "[desc] It looks like its about to go off!"
|
|
else
|
|
var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src
|
|
if(boxes.len)
|
|
desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile."
|
|
if(box.boxtag != "")
|
|
desc = "[desc] The [boxes.len ? "top box" : "box"]'s tag reads: [box.boxtag]"
|
|
|
|
// Icon/Overlays
|
|
overlays.Cut()
|
|
if(open)
|
|
icon_state = "pizzabox_open"
|
|
if(pizza)
|
|
icon_state = "pizzabox_messy"
|
|
var/image/pizzaimg = image(pizza.icon, icon_state = pizza.icon_state)
|
|
pizzaimg.pixel_y = -3
|
|
overlays += pizzaimg
|
|
if(bomb)
|
|
bomb.icon_state = "pizzabomb_[bomb_active ? "active" : "inactive"]"
|
|
var/image/bombimg = image(bomb.icon, icon_state = bomb.icon_state)
|
|
bombimg.pixel_y = 5
|
|
overlays += bombimg
|
|
else
|
|
icon_state = "pizzabox[boxes.len + 1]"
|
|
var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src
|
|
if(box.boxtag != "")
|
|
var/image/tagimg = image(icon, icon_state = "pizzabox_tag")
|
|
tagimg.pixel_y = boxes.len * 3
|
|
overlays += tagimg
|
|
|
|
/obj/item/pizzabox/attack_self(mob/user)
|
|
if(boxes.len > 0)
|
|
return
|
|
open = !open
|
|
if(open && !bomb_defused)
|
|
audible_message("<span class='warning'>\icon[src] *beep*</span>")
|
|
bomb_active = TRUE
|
|
SSobj.processing |= src
|
|
update_icon()
|
|
|
|
/obj/item/pizzabox/attack_hand(mob/user)
|
|
if(user.get_inactive_hand() != src)
|
|
..()
|
|
return
|
|
if(open)
|
|
if(pizza)
|
|
user.put_in_hands(pizza)
|
|
user << "<span class='notice'>You take [pizza] out of [src].</span>"
|
|
pizza = null
|
|
update_icon()
|
|
return
|
|
else if(bomb)
|
|
if(wires.is_all_cut() && bomb_defused)
|
|
user.put_in_hands(bomb)
|
|
user << "<span class='notice'>You carefully remove the [bomb] from [src].</span>"
|
|
bomb = null
|
|
update_icon()
|
|
return
|
|
else
|
|
bomb_timer = input(user, "Set the [bomb] timer from [BOMB_TIMER_MIN] to [BOMB_TIMER_MAX].", bomb, bomb_timer) as num
|
|
bomb_timer = Clamp(Ceiling(bomb_timer / 2), BOMB_TIMER_MIN, BOMB_TIMER_MAX)
|
|
bomb_defused = FALSE
|
|
|
|
message_admins("[key_name_admin(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has trapped a [src] with [bomb] set to [bomb_timer * 2] seconds.")
|
|
log_game("[key_name(user)] has trapped a [src] with [bomb] set to [bomb_timer * 2] seconds.")
|
|
bomb.adminlog = "The [bomb.name] in [src.name] that [key_name(user)] activated has detonated!"
|
|
|
|
user << "<span class='warning'>You trap [src] with [bomb].</span>"
|
|
update_icon()
|
|
return
|
|
else if(boxes.len)
|
|
var/obj/item/pizzabox/topbox = boxes[boxes.len]
|
|
boxes -= topbox
|
|
user.put_in_hands(topbox)
|
|
user << "<span class='notice'>You remove the topmost [name] from the stack.</span>"
|
|
topbox.update_icon()
|
|
update_icon()
|
|
return
|
|
..()
|
|
|
|
/obj/item/pizzabox/attackby(obj/item/I, mob/user, params)
|
|
if(istype(I, /obj/item/pizzabox))
|
|
var/obj/item/pizzabox/newbox = I
|
|
if(!open && !newbox.open)
|
|
var/list/add = list()
|
|
add += newbox
|
|
add += newbox.boxes
|
|
|
|
if((boxes.len + 1) + add.len <= 5)
|
|
if(!user.drop_item())
|
|
return
|
|
boxes += add
|
|
newbox.boxes.Cut()
|
|
newbox.loc = src
|
|
user << "<span class='notice'>You put [newbox] on top of [src]!</span>"
|
|
newbox.update_icon()
|
|
update_icon()
|
|
return
|
|
else
|
|
user << "<span class='notice'>The stack is dangerously high!</span>"
|
|
else
|
|
user << "<span class='notice'>Close [open ? src : newbox] first!</span>"
|
|
else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/pizza) || istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable/pizza))
|
|
if(open)
|
|
if(!user.drop_item())
|
|
return
|
|
pizza = I
|
|
I.loc = src
|
|
user << "<span class='notice'>You put [I] in [src].</span>"
|
|
update_icon()
|
|
return
|
|
else if(istype(I, /obj/item/weapon/bombcore/pizza))
|
|
if(open && !bomb)
|
|
if(!user.drop_item())
|
|
return
|
|
wires = new /datum/wires/explosive/pizza(src)
|
|
bomb = I
|
|
I.loc = src
|
|
user << "<span class='notice'>You put [I] in [src]. Sneeki breeki...</span>"
|
|
update_icon()
|
|
return
|
|
else if(bomb)
|
|
user << "<span class='notice'>[src] already has a bomb in it!</span>"
|
|
else if(istype(I, /obj/item/weapon/pen))
|
|
if(!open)
|
|
var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src
|
|
box.boxtag += stripped_input(user, "Write on [box]'s tag:", box, "", 30)
|
|
user << "<span class='notice'>You write with [I] on [src].</span>"
|
|
update_icon()
|
|
return
|
|
else if(is_wire_tool(I))
|
|
if(wires && bomb)
|
|
wires.interact(user)
|
|
else if(istype(I, /obj/item/weapon/reagent_containers/food))
|
|
user << "<span class='notice'>That's not a pizza!</span>"
|
|
..()
|
|
|
|
/obj/item/pizzabox/process()
|
|
if(bomb_active && !bomb_defused && (bomb_timer > 0))
|
|
playsound(loc, 'sound/items/timer.ogg', 50, 0)
|
|
bomb_timer--
|
|
if(bomb_active && !bomb_defused && (bomb_timer <= 0))
|
|
if(bomb in src)
|
|
bomb.detonate()
|
|
unprocess()
|
|
if(!bomb_active || bomb_defused)
|
|
if(bomb_defused && bomb in src)
|
|
bomb.defuse()
|
|
bomb_active = FALSE
|
|
unprocess()
|
|
return
|
|
|
|
/obj/item/pizzabox/proc/unprocess()
|
|
SSobj.processing -= src
|
|
qdel(wires)
|
|
wires = null
|
|
update_icon()
|
|
|
|
/obj/item/pizzabox/bomb/New()
|
|
var/randompizza = pick(subtypesof(/obj/item/weapon/reagent_containers/food/snacks/pizza))
|
|
pizza = new randompizza(src)
|
|
bomb = new(src)
|
|
wires = new /datum/wires/explosive/pizza(src)
|
|
..()
|
|
|
|
/obj/item/pizzabox/margherita/New()
|
|
pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/margherita(src)
|
|
boxtag = "Margherita Deluxe"
|
|
..()
|
|
|
|
/obj/item/pizzabox/vegetable/New()
|
|
pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable(src)
|
|
boxtag = "Gourmet Vegatable"
|
|
..()
|
|
|
|
/obj/item/pizzabox/mushroom/New()
|
|
pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom(src)
|
|
boxtag = "Mushroom Special"
|
|
..()
|
|
|
|
/obj/item/pizzabox/meat/New()
|
|
pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/meat(src)
|
|
boxtag = "Meatlover's Supreme"
|
|
..()
|