mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-25 00:51:55 +00:00
Crafting fireaxe cabinets, mech removal cabinets, and mirrors (#72856) Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
231 lines
6.7 KiB
Plaintext
231 lines
6.7 KiB
Plaintext
/obj/structure/fireaxecabinet
|
|
name = "fire axe cabinet"
|
|
desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
|
|
icon = 'icons/obj/wallmounts.dmi'
|
|
icon_state = "fireaxe"
|
|
anchored = TRUE
|
|
density = FALSE
|
|
armor_type = /datum/armor/structure_fireaxecabinet
|
|
max_integrity = 150
|
|
integrity_failure = 0.33
|
|
/// Do we need to be unlocked to be opened.
|
|
var/locked = TRUE
|
|
/// Are we opened, can someone take the held item out.
|
|
var/open = FALSE
|
|
/// The item we're holding.
|
|
var/obj/item/held_item
|
|
/// The path of the item we spawn and can hold.
|
|
var/item_path = /obj/item/fireaxe
|
|
/// Overlay we get when the item is inside us.
|
|
var/item_overlay = "axe"
|
|
/// Whether we should populate our own contents on Initialize()
|
|
var/populate_contents = TRUE
|
|
|
|
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32)
|
|
|
|
/datum/armor/structure_fireaxecabinet
|
|
melee = 50
|
|
bullet = 20
|
|
energy = 100
|
|
bomb = 10
|
|
fire = 90
|
|
acid = 50
|
|
|
|
/obj/structure/fireaxecabinet/Initialize(mapload)
|
|
. = ..()
|
|
if(populate_contents)
|
|
held_item = new item_path(src)
|
|
update_appearance()
|
|
|
|
/obj/structure/fireaxecabinet/Destroy()
|
|
if(held_item)
|
|
QDEL_NULL(held_item)
|
|
return ..()
|
|
|
|
/obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, params)
|
|
if(iscyborg(user) || attacking_item.tool_behaviour == TOOL_MULTITOOL)
|
|
toggle_lock(user)
|
|
else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken)
|
|
if(atom_integrity < max_integrity)
|
|
if(!attacking_item.tool_start_check(user, amount = 2))
|
|
return
|
|
balloon_alert(user, "repairing...")
|
|
if(attacking_item.use_tool(src, user, 4 SECONDS, volume= 50, amount = 2))
|
|
repair_damage(max_integrity - get_integrity())
|
|
update_appearance()
|
|
balloon_alert(user, "repaired")
|
|
else
|
|
balloon_alert(user, "already repaired!")
|
|
return
|
|
else if(istype(attacking_item, /obj/item/stack/sheet/glass) && broken)
|
|
var/obj/item/stack/sheet/glass/glass_stack = attacking_item
|
|
if(glass_stack.get_amount() < 2)
|
|
balloon_alert(user, "need more glass!")
|
|
return
|
|
balloon_alert(user, "repairing")
|
|
if(do_after(user, 2 SECONDS, target = src) && glass_stack.use(2))
|
|
broken = FALSE
|
|
repair_damage(max_integrity - get_integrity())
|
|
update_appearance()
|
|
else if(open || broken)
|
|
if(istype(attacking_item, item_path) && !held_item)
|
|
if(HAS_TRAIT(attacking_item, TRAIT_WIELDED))
|
|
balloon_alert(user, "unwield it!")
|
|
return
|
|
if(!user.transferItemToLoc(attacking_item, src))
|
|
return
|
|
held_item = attacking_item
|
|
update_appearance()
|
|
return
|
|
else if(!broken)
|
|
toggle_open()
|
|
else
|
|
return ..()
|
|
|
|
/obj/structure/fireaxecabinet/Exited(atom/movable/gone, direction)
|
|
if(gone == held_item)
|
|
held_item = null
|
|
update_appearance()
|
|
return ..()
|
|
|
|
/obj/structure/fireaxecabinet/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
|
switch(damage_type)
|
|
if(BRUTE)
|
|
if(broken)
|
|
playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, TRUE)
|
|
else
|
|
playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE)
|
|
if(BURN)
|
|
playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
|
|
|
|
/obj/structure/fireaxecabinet/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir)
|
|
if(open)
|
|
return
|
|
. = ..()
|
|
if(.)
|
|
update_appearance()
|
|
|
|
/obj/structure/fireaxecabinet/atom_break(damage_flag)
|
|
. = ..()
|
|
if(!broken && !(flags_1 & NODECONSTRUCT_1))
|
|
update_appearance()
|
|
broken = TRUE
|
|
playsound(src, 'sound/effects/glassbr3.ogg', 100, TRUE)
|
|
new /obj/item/shard(loc)
|
|
new /obj/item/shard(loc)
|
|
|
|
/obj/structure/fireaxecabinet/deconstruct(disassembled = TRUE)
|
|
if(!(flags_1 & NODECONSTRUCT_1))
|
|
if(held_item && loc)
|
|
held_item.forceMove(loc)
|
|
new /obj/item/wallframe/fireaxecabinet(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/fireaxecabinet/blob_act(obj/structure/blob/B)
|
|
if(held_item)
|
|
held_item.forceMove(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/fireaxecabinet/attack_hand(mob/user, list/modifiers)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
if((open || broken) && held_item)
|
|
user.put_in_hands(held_item)
|
|
add_fingerprint(user)
|
|
update_appearance()
|
|
return
|
|
toggle_open(user)
|
|
|
|
/obj/structure/fireaxecabinet/attack_hand_secondary(mob/user, list/modifiers)
|
|
toggle_open(user)
|
|
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
|
|
|
|
/obj/structure/fireaxecabinet/attack_paw(mob/living/user, list/modifiers)
|
|
return attack_hand(user, modifiers)
|
|
|
|
/obj/structure/fireaxecabinet/attack_ai(mob/user)
|
|
toggle_lock(user)
|
|
return
|
|
|
|
/obj/structure/fireaxecabinet/attack_tk(mob/user)
|
|
. = COMPONENT_CANCEL_ATTACK_CHAIN
|
|
toggle_open(user)
|
|
|
|
/obj/structure/fireaxecabinet/update_overlays()
|
|
. = ..()
|
|
if(held_item)
|
|
. += item_overlay
|
|
if(open)
|
|
. += "glass_raised"
|
|
return
|
|
var/hp_percent = atom_integrity/max_integrity * 100
|
|
if(broken)
|
|
. += "glass4"
|
|
else
|
|
switch(hp_percent)
|
|
if(-INFINITY to 40)
|
|
. += "glass3"
|
|
if(40 to 60)
|
|
. += "glass2"
|
|
if(60 to 80)
|
|
. += "glass1"
|
|
if(80 to INFINITY)
|
|
. += "glass"
|
|
|
|
. += locked ? "locked" : "unlocked"
|
|
|
|
/obj/structure/fireaxecabinet/proc/toggle_lock(mob/user)
|
|
to_chat(user, span_notice("Resetting circuitry..."))
|
|
playsound(src, 'sound/machines/locktoggle.ogg', 50, TRUE)
|
|
if(do_after(user, 2 SECONDS, target = src))
|
|
to_chat(user, span_notice("You [locked ? "disable" : "re-enable"] the locking modules."))
|
|
locked = !locked
|
|
update_appearance()
|
|
|
|
/obj/structure/fireaxecabinet/proc/toggle_open(mob/user)
|
|
if(locked)
|
|
balloon_alert(user, "won't budge!")
|
|
return
|
|
else
|
|
open = !open
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
update_appearance()
|
|
return
|
|
|
|
/obj/structure/fireaxecabinet/empty
|
|
populate_contents = FALSE
|
|
|
|
/obj/item/wallframe/fireaxecabinet
|
|
name = "fire axe cabinet"
|
|
desc = "Home to a window's greatest nightmare. Apply to wall to use."
|
|
icon = 'icons/obj/wallmounts.dmi'
|
|
icon_state = "fireaxe"
|
|
result_path = /obj/structure/fireaxecabinet/empty
|
|
pixel_shift = 32
|
|
|
|
/obj/structure/fireaxecabinet/mechremoval
|
|
name = "mech removal tool cabinet"
|
|
desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the tool. As if."
|
|
icon_state = "mechremoval"
|
|
item_path = /obj/item/crowbar/mechremoval
|
|
item_overlay = "crowbar"
|
|
|
|
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval, 32)
|
|
|
|
/obj/structure/fireaxecabinet/mechremoval/deconstruct(disassembled = TRUE)
|
|
if(!(flags_1 & NODECONSTRUCT_1))
|
|
if(held_item && loc)
|
|
held_item.forceMove(loc)
|
|
new /obj/item/wallframe/fireaxecabinet/mechremoval(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/fireaxecabinet/mechremoval/empty
|
|
populate_contents = FALSE
|
|
|
|
/obj/item/wallframe/fireaxecabinet/mechremoval
|
|
name = "mech removal tool cabinet"
|
|
desc = "Home to a very special crowbar. Apply to wall to use."
|
|
icon_state = "mechremoval"
|
|
result_path = /obj/structure/fireaxecabinet/mechremoval/empty
|