mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 03:52:31 +00:00
Fence doors used a var to track if they were opened or not, but it doesn't sync consistently with the density var. Density was getting set when updating icon state instead of when toggling the door. This removes the unneeded open var and flips density only during toggle.
149 lines
3.8 KiB
Plaintext
149 lines
3.8 KiB
Plaintext
//Chain link fences
|
|
//Sprites ported from /VG/
|
|
|
|
|
|
#define CUT_TIME 100
|
|
#define CLIMB_TIME 150
|
|
|
|
#define NO_HOLE 0 //section is intact
|
|
#define MEDIUM_HOLE 1 //medium hole in the section - can climb through
|
|
#define LARGE_HOLE 2 //large hole in the section - can walk through
|
|
#define MAX_HOLE_SIZE LARGE_HOLE
|
|
|
|
/obj/structure/fence
|
|
name = "fence"
|
|
desc = "A chain link fence. Not as effective as a wall, but generally it keeps people out."
|
|
density = TRUE
|
|
anchored = TRUE
|
|
|
|
icon = 'icons/obj/fence.dmi'
|
|
icon_state = "straight"
|
|
|
|
var/cuttable = TRUE
|
|
var/hole_size= NO_HOLE
|
|
var/invulnerable = FALSE
|
|
|
|
/obj/structure/fence/Initialize(mapload)
|
|
. = ..()
|
|
|
|
update_cut_status()
|
|
|
|
/obj/structure/fence/examine(mob/user)
|
|
. = ..()
|
|
|
|
switch(hole_size)
|
|
if(MEDIUM_HOLE)
|
|
. += "There is a large hole in \the [src]."
|
|
if(LARGE_HOLE)
|
|
. += "\The [src] has been completely cut through."
|
|
|
|
/obj/structure/fence/end
|
|
icon_state = "end"
|
|
cuttable = FALSE
|
|
|
|
/obj/structure/fence/corner
|
|
icon_state = "corner"
|
|
cuttable = FALSE
|
|
|
|
/obj/structure/fence/post
|
|
icon_state = "post"
|
|
cuttable = FALSE
|
|
|
|
/obj/structure/fence/cut/medium
|
|
icon_state = "straight_cut2"
|
|
hole_size = MEDIUM_HOLE
|
|
|
|
/obj/structure/fence/cut/large
|
|
icon_state = "straight_cut3"
|
|
hole_size = LARGE_HOLE
|
|
|
|
/obj/structure/fence/attackby(obj/item/W, mob/user)
|
|
if(W.tool_behaviour == TOOL_WIRECUTTER)
|
|
if(!cuttable)
|
|
to_chat(user, span_warning("This section of the fence can't be cut!"))
|
|
return
|
|
if(invulnerable)
|
|
to_chat(user, span_warning("This fence is too strong to cut through!"))
|
|
return
|
|
var/current_stage = hole_size
|
|
if(current_stage >= MAX_HOLE_SIZE)
|
|
to_chat(user, span_warning("This fence has too much cut out of it already!"))
|
|
return
|
|
|
|
user.visible_message(span_danger("\The [user] starts cutting through \the [src] with \the [W]."),\
|
|
span_danger("You start cutting through \the [src] with \the [W]."))
|
|
|
|
if(do_after(user, CUT_TIME*W.toolspeed, target = src))
|
|
if(current_stage == hole_size)
|
|
switch(++hole_size)
|
|
if(MEDIUM_HOLE)
|
|
visible_message(span_notice("\The [user] cuts into \the [src] some more."))
|
|
to_chat(user, span_info("You could probably fit yourself through that hole now. Although climbing through would be much faster if you made it even bigger."))
|
|
AddElement(/datum/element/climbable)
|
|
if(LARGE_HOLE)
|
|
visible_message(span_notice("\The [user] completely cuts through \the [src]."))
|
|
to_chat(user, span_info("The hole in \the [src] is now big enough to walk through."))
|
|
RemoveElement(/datum/element/climbable)
|
|
|
|
update_cut_status()
|
|
|
|
return TRUE
|
|
|
|
/obj/structure/fence/proc/update_cut_status()
|
|
if(!cuttable)
|
|
return
|
|
var/new_density = TRUE
|
|
switch(hole_size)
|
|
if(NO_HOLE)
|
|
icon_state = initial(icon_state)
|
|
if(MEDIUM_HOLE)
|
|
icon_state = "straight_cut2"
|
|
if(LARGE_HOLE)
|
|
icon_state = "straight_cut3"
|
|
new_density = FALSE
|
|
set_density(new_density)
|
|
|
|
//FENCE DOORS
|
|
|
|
/obj/structure/fence/door
|
|
name = "fence door"
|
|
desc = "Not very useful without a real lock."
|
|
icon_state = "door_closed"
|
|
cuttable = FALSE
|
|
|
|
/obj/structure/fence/door/Initialize(mapload)
|
|
. = ..()
|
|
|
|
update_icon_state()
|
|
|
|
/obj/structure/fence/door/opened
|
|
icon_state = "door_opened"
|
|
density = FALSE
|
|
|
|
/obj/structure/fence/door/attack_hand(mob/user, list/modifiers)
|
|
if(can_open(user))
|
|
toggle(user)
|
|
|
|
return TRUE
|
|
|
|
/obj/structure/fence/door/proc/toggle(mob/user)
|
|
visible_message(span_notice("\The [user] [density ? "opens" : "closes"] \the [src]."))
|
|
set_density(!density)
|
|
update_icon_state()
|
|
playsound(src, 'sound/machines/click.ogg', 100, TRUE)
|
|
|
|
/obj/structure/fence/door/update_icon_state()
|
|
icon_state = density ? "door_closed" : "door_opened"
|
|
return ..()
|
|
|
|
/obj/structure/fence/door/proc/can_open(mob/user)
|
|
return TRUE
|
|
|
|
#undef CUT_TIME
|
|
#undef CLIMB_TIME
|
|
|
|
#undef NO_HOLE
|
|
#undef MEDIUM_HOLE
|
|
#undef LARGE_HOLE
|
|
#undef MAX_HOLE_SIZE
|