Portable Ladders (#2434)

Add portable ladders as items.
Deploy on floors that have an open space above them, and in open spaces that have floors beneath them.
Fold them, to reuse them.

Need item,structure base and structure body sprites. Probably an in hand sprite too.
This commit is contained in:
VikingPingvin
2017-06-05 11:19:12 +03:00
committed by skull132
parent a28fbd1415
commit 68415f6cf5
4 changed files with 86 additions and 0 deletions
+4
View File
@@ -188,6 +188,10 @@
// Lattices and stairs stop things from falling.
if(locate(/obj/structure/lattice, dest) || locate(/obj/structure/stairs, dest))
return FALSE
//Ladders too
if(below && locate(/obj/structure/ladder) in below)
return FALSE
// The var/climbers API is implemented here.
if (LAZYLEN(dest.climbers) && (src in dest.climbers))
+60
View File
@@ -0,0 +1,60 @@
/obj/item/weapon/ladder_mobile
name = "mobile ladder"
desc = "A lightweight deployable ladder, which you can use to move up or down. Or alternatively, you can bash some faces in."
icon_state = "ladder01"
icon = 'icons/obj/structures.dmi'
throw_range = 3
force = 10
w_class = 4.0
slot_flags = SLOT_BACK
/obj/item/weapon/ladder_mobile/proc/place_ladder(atom/A,mob/user)
if(istype(A, /turf/simulated/open)) //Place into open space
var/turf/below_loc = GetBelow(A)
if (!below_loc || (istype(/turf/space,below_loc)))
user << "<span class='notice'>Why would you do that?! There is only infinite space there...</span>"
return
user.visible_message("<span class='warning'>[user] begins to lower \the [src] into \the [A].</span>")
if(!handle_action(A,user))
return
var/obj/structure/ladder/mobile/body/R = new(A)
var/obj/structure/ladder/mobile/base/D = new(A)
D.forceMove(below_loc)
R.target_down = D
D.target_up = R
user.drop_item()
qdel(src)
if(istype(A, /turf/simulated/floor)) //Place onto Floor
var/turf/upper_loc = GetAbove(A)
if (!upper_loc || !istype(upper_loc,/turf/simulated/open))
user << "<span class='notice'>There is something above. You can't deploy!</span>"
return
user.visible_message("<span class='warning'>[user] begins deploying \the [src] on \the [A].</span>")
if(!handle_action(A,user))
return
var/obj/structure/ladder/mobile/base/R = new(A)
var/obj/structure/ladder/mobile/body/D = new(A)
D.forceMove(upper_loc) // moves A up to upper_loc.
R.target_up = D
D.target_down = R
user.drop_item()
qdel(src)
/obj/item/weapon/ladder_mobile/afterattack(atom/A, mob/user,proximity)
if(!proximity)
return
//addtimer(CALLBACK(src, .proc/place_ladder, A, user), 5000)
place_ladder(A,user)
/obj/item/weapon/ladder_mobile/proc/handle_action(atom/A, mob/user)
if (!do_after(user, 30, act_target = user))
to_chat(user, "Can't place ladder! You were interrupted!")
return FALSE
if (!A || QDELETED(src) || QDELETED(user))
// Shit was deleted during delay, call is no longer valid.
return FALSE
return TRUE
+21
View File
@@ -123,6 +123,27 @@
allowed_directions = UP|DOWN
icon_state = "ladder11"
/obj/structure/ladder/mobile/base
allowed_directions = UP
icon_state = "ladder11"
/obj/structure/ladder/mobile/body
allowed_directions = DOWN
icon_state = "ladder11"
/obj/structure/ladder/mobile/verb/fold()
set name = "Fold Ladder"
set category = "Object"
set src in oview(1)
var/obj/item/weapon/ladder_mobile/R = new(src.loc)
src.transfer_fingerprints_to(R)
if(src.target_down == null)
QDEL_NULL(src.target_up)
qdel(src)
else
QDEL_NULL(src.target_down)
qdel(src)
/obj/structure/stairs
name = "Stairs"
desc = "Stairs leading to another deck. Not too useful if the gravity goes out."