diff --git a/code/game/objects/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm new file mode 100644 index 00000000000..c26f96d1349 --- /dev/null +++ b/code/game/objects/items/climbingrope.dm @@ -0,0 +1,86 @@ +/obj/item/climbing_hook + name = "climbing hook" + desc = "Standard hook with rope to scale up holes. The rope is of average quality, but due to your weight amongst other factors, may not withstand extreme use." + icon = 'icons/obj/mining.dmi' + icon_state = "climbingrope" + inhand_icon_state = "crowbar_brass" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + force = 5 + throwforce = 10 + reach = 2 + throw_range = 4 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("whacks", "flails", "bludgeons") + attack_verb_simple = list("whack", "flail", "bludgeon") + resistance_flags = FLAMMABLE + ///how many times can we climb with this rope + var/uses = 5 + ///climb time + var/climb_time = 2.5 SECONDS + +/obj/item/climbing_hook/examine(mob/user) + . = ..() + var/list/look_binds = user.client.prefs.key_bindings["look up"] + . += span_notice("Firstly, look upwards by holding [english_list(look_binds, nothing_text = "(nothing bound)", and_text = " or ", comma_text = ", or ")]!") + . += span_notice("Then, click solid ground adjacent to the hole above you.") + . += span_notice("The rope looks like you could use it [uses] times before it falls apart.") + +/obj/item/climbing_hook/afterattack(turf/open/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(target.z == user.z) + return + if(!istype(target) || isopenspaceturf(target)) + return + if(target.is_blocked_turf(exclude_mobs = TRUE)) + return + var/turf/above = GET_TURF_ABOVE(user) + if(!isopenspaceturf(above) || !above.Adjacent(target)) //are we below a hole, is the target blocked, is the target adjacent to our hole + balloon_alert(user, "blocked!") + return + var/turf/user_turf = get_turf(user) + var/away_dir = get_dir(above, target) + user.visible_message(span_notice("[user] begins climbing upwards with [src]."), span_notice("You get to work on properly hooking [src] and going upwards.")) + playsound(target, 'sound/effects/picaxe1.ogg', 50) //plays twice so people above and below can hear + playsound(user_turf, 'sound/effects/picaxe1.ogg', 50) + var/list/effects = list(new /obj/effect/temp_visual/climbing_hook(target, away_dir), new /obj/effect/temp_visual/climbing_hook(user_turf, away_dir)) + if(do_after(user, climb_time, target)) + user.Move(target) + uses-- + + if(uses <= 0) + user.visible_message(span_warning("[src] snaps and tears apart!")) + qdel(src) + + QDEL_LIST(effects) + +/obj/item/climbing_hook/emergency + name = "emergency climbing hook" + desc = "An emergency climbing hook to scale up holes. The rope is EXTREMELY cheap and may not withstand extended use." + uses = 2 + climb_time = 4 SECONDS + w_class = WEIGHT_CLASS_SMALL + +/obj/item/climbing_hook/syndicate + name = "suspicious climbing hook" + desc = "REALLY suspicious climbing hook to scale up holes. The hook has a syndicate logo engraved on it, and the rope appears rather durable." + icon_state = "climbingrope_s" + uses = 10 + climb_time = 1.5 SECONDS + +/obj/item/climbing_hook/infinite //debug stuff + name = "infinite climbing hook" + desc = "A plasteel hook, with rope. Upon closer inspection, the rope appears to be made out of plasteel woven into regular rope, amongst many other reinforcements." + uses = INFINITY + climb_time = 1 SECONDS + +/obj/effect/temp_visual/climbing_hook + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "path_indicator" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + duration = 4 SECONDS + +/obj/effect/temp_visual/climbing_hook/Initialize(mapload, direction) + . = ..() + dir = direction diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 658b07a3980..335ccbe7185 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -48,6 +48,9 @@ if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) new /obj/item/storage/pill_bottle/potassiodide(src) + + if(SSmapping.is_planetary() && LAZYLEN(SSmapping.multiz_levels)) + new /obj/item/climbing_hook/emergency(src) new /obj/item/oxygen_candle(src) //SKYRAT EDIT ADDITION diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index fdba3e10adb..aab8e4b8582 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -29,6 +29,7 @@ new /obj/item/clothing/under/syndicate/skirt(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/mod/module/plasma_stabilizer(src) + new /obj/item/climbing_hook/syndicate(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index f309f725774..69677e87df5 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -271,3 +271,9 @@ desc = "A standard-sized coffeepot, for use with a coffeemaker." cost = PAYCHECK_CREW contains = list(/obj/item/reagent_containers/cup/coffeepot) + +/datum/supply_pack/goody/climbing_hook + name = "Climbing hook" + desc = "A less cheap imported climbing hook. Absolutely no use outside of planetary stations." + cost = PAYCHECK_CREW * 5 + contains = list(/obj/item/climbing_hook) diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index a163c7cf6a8..8a83e7450c5 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -267,3 +267,9 @@ bright lights. Effective, affordable, and nigh undetectable." item = /obj/item/syndicate_contacts cost = 3 + +/datum/uplink_item/device_tools/syndicate_climbing_hook + name = "Syndicate Climbing Hook" + desc = "High-tech rope, a refined hook structure, the peak of climbing technology. Only useful for climbing up holes, provided the operation site has any." + item = /obj/item/climbing_hook/syndicate + cost = 1 diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 6c5560438c6..54b19553b84 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 3438b182eee..9cc240da4cf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2070,6 +2070,7 @@ #include "code\game\objects\items\choice_beacon.dm" #include "code\game\objects\items\chromosome.dm" #include "code\game\objects\items\cigs_lighters.dm" +#include "code\game\objects\items\climbingrope.dm" #include "code\game\objects\items\clown_items.dm" #include "code\game\objects\items\control_wand.dm" #include "code\game\objects\items\cosmetics.dm"