/**********************Miner Lockers**************************/ /obj/structure/closet/secure_closet/miner name = "miner's equipment" icon_state = "miningsec1" icon_closed = "miningsec" icon_locked = "miningsec1" icon_opened = "miningsecopen" icon_broken = "miningsecbroken" icon_off = "miningsecoff" req_access = list(access_mining) /obj/structure/closet/secure_closet/miner/fill() ..() if(prob(50)) new /obj/item/weapon/storage/backpack/industrial(src) else new /obj/item/weapon/storage/backpack/satchel_eng(src) new /obj/item/device/radio/headset/headset_cargo(src) new /obj/item/clothing/under/rank/miner(src) new /obj/item/clothing/gloves/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/device/analyzer(src) new /obj/item/weapon/storage/bag/ore(src) new /obj/item/weapon/shovel(src) new /obj/item/weapon/pickaxe(src) new /obj/item/weapon/ore_radar(src) /******************************Lantern*******************************/ /obj/item/device/flashlight/lantern name = "lantern" icon_state = "lantern" item_state = "lantern" desc = "A mining lantern." light_power = 1 brightness_on = 6 light_wedge = LIGHT_OMNI light_color = LIGHT_COLOR_FIRE /*****************************Pickaxe********************************/ /obj/item/weapon/pickaxe name = "pickaxe" desc = "The most basic of mining implements. Surely this is a joke?" icon = 'icons/obj/items.dmi' flags = CONDUCT slot_flags = SLOT_BELT throwforce = 4.0 force = 10.0 icon_state = "pickaxe" item_state = "pickaxe" w_class = 4.0 matter = list(DEFAULT_WALL_MATERIAL = 3750) var/digspeed //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) attack_verb = list("hit", "pierced", "sliced", "attacked") var/drill_sound = 'sound/weapons/chisel1.ogg' var/drill_verb = "excavating" var/autodrill = 0 //pickaxes must be manually swung to mine, drills can mine rocks via bump sharp = 1 var/can_wield = 1 var/excavation_amount = 30 var/wielded = 0 var/force_unwielded = 5.0 var/force_wielded = 15.0 var/digspeed_unwielded = 30 var/digspeed_wielded = 10 var/drilling = 0 action_button_name = "Wield pick/drill" /obj/item/weapon/pickaxe/proc/unwield() wielded = 0 force = force_unwielded digspeed = digspeed_unwielded name = initial(name) update_icon() /obj/item/weapon/pickaxe/proc/wield() wielded = 1 force = force_wielded digspeed = digspeed_wielded name = "[name] (Wielded)" update_icon() /obj/item/weapon/pickaxe/mob_can_equip(M as mob, slot) //Cannot equip wielded items. if(wielded) M << "Unwield the [initial(name)] first!" return 0 return ..() /obj/item/weapon/pickaxe/dropped(mob/user as mob) //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand if(user) var/obj/item/weapon/pickaxe/O = user.get_inactive_hand() if(istype(O)) O.unwield() return unwield() /obj/item/weapon/pickaxe/pickup(mob/user) unwield() /obj/item/weapon/pickaxe/attack_self(mob/user as mob) ..() if(!can_wield) return if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(issmall(H)) user << "It's too heavy for you to wield fully." return else return if(wielded) //Trying to unwield it unwield() user << "You are now carrying the [initial(name)] with one hand." var/obj/item/weapon/pickaxe/offhand/O = user.get_inactive_hand() if(O && istype(O)) O.unwield() else //Trying to wield it if(user.get_inactive_hand()) user << "You need your other hand to be empty" return wield() user << "You grab the [initial(name)] with both hands." var/obj/item/weapon/pickaxe/offhand/O = new(user) ////Let's reserve his other hand~ O.name = "[initial(name)] - offhand" O.desc = "Your second grip on the [initial(name)]." user.put_in_inactive_hand(O) if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() H.update_inv_r_hand() return /obj/item/weapon/pickaxe/ui_action_click() if(src in usr) attack_self(usr) /obj/item/weapon/pickaxe/verb/wield_pick() if(can_wield) set name = "Wield pick/drill" set category = "Object" set src in usr attack_self(usr) /obj/item/weapon/pickaxe/offhand w_class = 5 icon = 'icons/obj/weapons.dmi' icon_state = "offhand" item_state = null name = "offhand" simulated = FALSE action_button_name = null /obj/item/weapon/pickaxe/proc/copy_stats(obj/item/weapon/pickaxe/parent) digspeed_wielded = parent.digspeed_wielded excavation_amount = parent.excavation_amount force = parent.force_wielded /obj/item/weapon/pickaxe/offhand/unwield() if (ismob(loc)) var/mob/living/our_mob = loc our_mob.remove_from_mob(src) qdel(src) /obj/item/weapon/pickaxe/offhand/wield() if (ismob(loc)) var/mob/living/our_mob = loc our_mob.remove_from_mob(src) qdel(src) /obj/item/weapon/pickaxe/hammer name = "sledgehammer" //icon_state = "sledgehammer" Waiting on sprite desc = "A mining hammer made of reinforced metal. You feel like smashing your boss in the face with this." /obj/item/weapon/pickaxe/silver name = "silver pickaxe" icon_state = "spickaxe" item_state = "spickaxe" origin_tech = list(TECH_MATERIAL = 3) desc = "This makes no metallurgic sense." excavation_amount = 30 digspeed_unwielded = 30 digspeed_wielded = 5 /obj/item/weapon/pickaxe/drill name = "mining drill" // Can dig sand as well! icon_state = "handdrill" item_state = "jackhammer" origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) desc = "Yours is the drill that will pierce through the rock walls." drill_verb = "drilling" autodrill = 1 drill_sound = 'sound/weapons/drill.ogg' digspeed = 20 digspeed_unwielded = 30 force_unwielded = 15.0 excavation_amount = 100 can_wield = 0 force = 15.0 action_button_name = null /obj/item/weapon/pickaxe/jackhammer name = "sonic jackhammer" icon_state = "jackhammer" item_state = "jackhammer" origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards." drill_verb = "hammering" autodrill = 1 drill_sound = 'sound/weapons/sonic_jackhammer.ogg' digspeed = 15 digspeed_unwielded = 15 force_unwielded = 15.0 excavation_amount = 100 can_wield = 0 force = 25.0 action_button_name = null /obj/item/weapon/pickaxe/gold name = "golden pickaxe" icon_state = "gpickaxe" item_state = "gpickaxe" digspeed = 10 origin_tech = list(TECH_MATERIAL = 4) desc = "This makes no metallurgic sense." excavation_amount = 50 digspeed_unwielded = 30 digspeed_wielded = 5 /obj/item/weapon/pickaxe/diamond name = "diamond pickaxe" icon_state = "dpickaxe" item_state = "dpickaxe" origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4) desc = "A pickaxe with a diamond pick head." excavation_amount = 30 digspeed_unwielded = 20 digspeed_wielded = 1 force_wielded = 25.0 /obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME! name = "diamond mining drill" icon_state = "diamonddrill" item_state = "jackhammer" digspeed = 5 //Digs through walls, girders, and can dig up sand origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5) desc = "Yours is the drill that will pierce the heavens!" drill_verb = "drilling" autodrill = 1 drill_sound = 'sound/weapons/drill.ogg' excavation_amount = 100 can_wield = 0 force = 20.0 digspeed = 5 digspeed_unwielded = 5 force_unwielded = 20.0 action_button_name = null /obj/item/weapon/pickaxe/borgdrill name = "cyborg mining drill" icon_state = "diamonddrill" item_state = "jackhammer" digspeed = 15 digspeed_unwielded = 15 force_unwielded = 25.0 desc = "" drill_verb = "drilling" autodrill = 1 drill_sound = 'sound/weapons/drill.ogg' can_wield = 0 force = 15.0 excavation_amount = 100 action_button_name = null /*****************************Shovel********************************/ /obj/item/weapon/shovel name = "shovel" desc = "A large tool for digging and moving dirt." icon = 'icons/obj/items.dmi' icon_state = "shovel" flags = CONDUCT slot_flags = SLOT_BELT force = 8.0 throwforce = 4.0 item_state = "shovel" w_class = 3.0 origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 50) attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") sharp = 0 edge = 1 /obj/item/weapon/shovel/spade name = "spade" desc = "A small tool for digging and moving dirt." icon_state = "spade" item_state = "spade" force = 5.0 throwforce = 7.0 w_class = 2.0 // Flags. /obj/item/stack/flag name = "beacons" desc = "A stack of light emitting beacons." singular_name = "flag" amount = 5 max_amount = 5 w_class = 2 icon = 'icons/obj/mining.dmi' var/upright = 0 var/base_state light_color = LIGHT_COLOR_TUNGSTEN light_power = 1.8 /obj/item/stack/flag/Initialize() . = ..() base_state = icon_state /obj/item/stack/flag/red name = "red beacons" singular_name = "red beacon" icon_state = "redflag" light_color = LIGHT_COLOR_RED /obj/item/stack/flag/yellow name = "yellow beacons" singular_name = "yellow beacon" icon_state = "yellowflag" light_color = LIGHT_COLOR_YELLOW /obj/item/stack/flag/green name = "green beacons" singular_name = "green beacon" icon_state = "greenflag" light_color = LIGHT_COLOR_GREEN /obj/item/stack/flag/purple name = "purple beacons" singular_name = "purple beacon" icon_state = "purpflag" light_color = LIGHT_COLOR_PURPLE /obj/item/stack/flag/attackby(obj/item/W as obj, mob/user as mob) if(upright && istype(W,src.type)) src.attack_hand(user) else ..() /obj/item/stack/flag/attack_hand(user as mob) if(upright) upright = 0 icon_state = base_state anchored = 0 set_light(0) src.visible_message("[user] turns [src] off.") else ..() /obj/item/stack/flag/attack_self(mob/user as mob) var/obj/item/stack/flag/F = locate() in get_turf(src) var/turf/T = get_turf(src) if(!T || !istype(T, /turf/simulated/floor/asteroid)) user << "The beacon won't stand up in this terrain." return if(F && F.upright) user << "There is already a beacon here." return var/obj/item/stack/flag/newflag = new src.type(T) newflag.amount = 1 newflag.upright = 1 newflag.anchored = 1 newflag.name = newflag.singular_name newflag.icon_state = "[newflag.base_state]_open" newflag.visible_message("[user] plants [newflag] firmly in the ground.") newflag.set_light(2) src.use(1) /**********************Miner Carts***********************/ /obj/item/weapon/rrf_ammo name = "compressed railway cartridge" desc = "Highly compressed matter for the RRF." icon = 'icons/obj/ammo.dmi' icon_state = "rcd" item_state = "rcdammo" w_class = 2 origin_tech = list(TECH_MATERIAL = 2) matter = list(DEFAULT_WALL_MATERIAL = 15000,"glass" = 7500) /obj/item/weapon/rrf name = "\improper Rapid-Railway-Fabricator" desc = "A device used to rapidly deploy mine tracks." icon = 'icons/obj/items.dmi' icon_state = "rcd" opacity = 0 density = 0 anchored = 0.0 var/stored_matter = 30 w_class = 3.0 /obj/item/weapon/rrf/examine(mob/user) if(..(user, 0)) user << "It currently holds [stored_matter]/30 fabrication-units." /obj/item/weapon/rrf/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if (istype(W, /obj/item/weapon/rcd_ammo)) if ((stored_matter + 30) > 30) user << "The RRF can't hold any more matter." return qdel(W) stored_matter += 30 playsound(src.loc, 'sound/machines/click.ogg', 10, 1) user << "The RRF now holds [stored_matter]/30 fabrication-units." return if (istype(W, /obj/item/weapon/rrf_ammo)) if ((stored_matter + 15) > 30) user << "The RRF can't hold any more matter." return qdel(W) stored_matter += 15 playsound(src.loc, 'sound/machines/click.ogg', 10, 1) user << "The RRF now holds [stored_matter]/30 fabrication-units." return /obj/item/weapon/rrf/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return if(istype(user,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user if(R.stat || !R.cell || R.cell.charge <= 0) return else if(stored_matter <= 0) return if(!istype(A, /turf/simulated/floor)) return if(locate(/obj/structure/track) in A) return playsound(src.loc, 'sound/machines/click.ogg', 10, 1) var/used_energy = 0 used_energy = 10 new /obj/structure/track(get_turf(A)) user << "Dispensing track..." if(isrobot(user)) var/mob/living/silicon/robot/R = user if(R.cell) R.cell.use(used_energy) else stored_matter-- user << "The RRF now holds [stored_matter]/30 fabrication-units." /obj/structure/track name = "mine track" desc = "Just like your grandpappy used to lay 'em in 1862." icon = 'icons/obj/smoothtrack.dmi' icon_state = "track15" density = 0 anchored = 1.0 w_class = 3 layer = 2.44 /obj/structure/track/Initialize() . = ..() var/obj/structure/track/track = locate() in loc if (track && track != src) qdel(src) return updateOverlays() for (var/dir in cardinal) var/obj/structure/track/R = locate(/obj/structure/track, get_step(src, dir)) if(R) R.updateOverlays() /obj/structure/track/Destroy() for (var/dir in cardinal) var/obj/structure/track/R = locate(/obj/structure/track, get_step(src, dir)) if(R) R.updateOverlays() return ..() /obj/structure/track/ex_act(severity) switch(severity) if(1.0) qdel(src) if(2.0) qdel(src) return /obj/structure/track/attackby(obj/item/C as obj, mob/user as mob) if (istype(C, /obj/item/stack/tile/floor)) var/turf/T = get_turf(src) T.attackby(C, user) return if (iswelder(C)) var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) user << "Slicing apart connectors ..." new /obj/item/stack/rods(src.loc) qdel(src) return /obj/structure/track/proc/updateOverlays() set waitfor = FALSE overlays = list() var/dir_sum = 0 for (var/direction in cardinal) if(locate(/obj/structure/track, get_step(src, direction))) dir_sum += direction icon_state = "track[dir_sum]" return /obj/vehicle/train/cargo/engine/mining name = "mine cart engine" desc = "A ridable electric minecart designed for pulling other mine carts." icon = 'icons/obj/cart.dmi' icon_state = "mining_engine" on = 0 powered = 1 move_delay = -1 load_item_visible = 1 load_offset_x = 0 mob_offset_y = 15 active_engines = 1 light_power = 1 light_range = 6 light_wedge = LIGHT_WIDE light_color = LIGHT_COLOR_FIRE /obj/vehicle/train/cargo/engine/mining/Initialize() . = ..() cell = new /obj/item/weapon/cell/high(src) key = null var/image/I = new(icon = 'icons/obj/cart.dmi', icon_state = "[icon_state]_overlay", layer = src.layer + 0.2) //over mobs overlays += I turn_off() //so engine verbs are correctly set /obj/vehicle/train/cargo/engine/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/key/minecarts)) if(!key) user.drop_item() W.forceMove(src) key = W verbs += /obj/vehicle/train/cargo/engine/verb/remove_key return ..() /obj/vehicle/train/cargo/engine/mining/Move(var/turf/destination) return ((locate(/obj/structure/track) in destination)) ? ..() : FALSE /obj/vehicle/train/cargo/engine/mining/update_car(var/train_length, var/active_engines) return /obj/vehicle/train/cargo/trolley/mining name = "mine-cart" desc = "A modern day twist to an ancient classic." icon = 'icons/obj/cart.dmi' icon_state = "mining_trailer" anchored = 0 passenger_allowed = 0 move_delay = -1 load_item_visible = 1 load_offset_x = 1 load_offset_y = 15 mob_offset_y = 16 light_power = 1 light_range = 3 light_wedge = LIGHT_OMNI light_color = LIGHT_COLOR_FIRE /obj/vehicle/train/cargo/trolley/mining/Move(var/turf/destination) return ((locate(/obj/structure/track) in destination)) ? ..() : FALSE /obj/item/weapon/key/minecarts name = "key" desc = "A keyring with a small steel key, and a pickaxe shaped fob." icon = 'icons/obj/vehicles.dmi' icon_state = "mine_keys" w_class = 1 /**********************Pinpointer**********************/ /obj/item/weapon/ore_radar name = "scanner pad" desc = "An antiquated device that can detect ore in a wide radius around the user." icon = 'icons/obj/device.dmi' icon_state = "pinoff" flags = CONDUCT slot_flags = SLOT_BELT w_class = 2.0 item_state = "electronic" throw_speed = 4 throw_range = 20 matter = list(DEFAULT_WALL_MATERIAL = 500) var/turf/simulated/mineral/random/sonar = null var/active = 0 /obj/item/weapon/ore_radar/attack_self(mob/user) if(!active) active = 1 usr << "You activate the pinpointer" START_PROCESSING(SSfast_process, src) else active = 0 icon_state = "pinoff" usr << "You deactivate the pinpointer" STOP_PROCESSING(SSfast_process, src) /obj/item/weapon/ore_radar/process() if (active) workdisk() else STOP_PROCESSING(SSfast_process, src) /obj/item/weapon/ore_radar/proc/workdisk() if(!src.loc) active = 0 if(!active) return var/closest = 15 for(var/turf/simulated/mineral/random/R in orange(14,loc)) if(!R.mineral) continue var/dist = get_dist(loc, R) if(dist < closest) closest = dist sonar = R if(!sonar) icon_state = "pinonnull" return set_dir(get_dir(loc,sonar)) switch(get_dist(loc,sonar)) if(0) icon_state = "pinondirect" if(1 to 8) icon_state = "pinonclose" if(9 to 16) icon_state = "pinonmedium" if(16 to INFINITY) icon_state = "pinonfar" /**********************Jaunter**********************/ /obj/item/device/wormhole_jaunter name = "wormhole jaunter" desc = "A single use device harnessing outdated warp technology. The wormholes it creates are unpleasant to travel through, to say the least." contained_sprite = 1 icon = 'icons/obj/mining_contained.dmi' icon_state = "jaunter" item_state = "jaunter" throwforce = 0 w_class = 2 throw_speed = 3 throw_range = 5 slot_flags = SLOT_BELT origin_tech = list(TECH_BLUESPACE = 2, TECH_PHORON = 4, TECH_ENGINEERING = 4) /obj/item/device/wormhole_jaunter/attack_self(mob/user) user.visible_message("[user.name] activates the [src.name]!") feedback_add_details("jaunter", "U") // user activated activate(user) /obj/item/device/wormhole_jaunter/proc/turf_check(mob/user) var/turf/device_turf = get_turf(user) if(!device_turf||device_turf.z==0) user << "You're having difficulties getting the [src.name] to work." return FALSE return TRUE /obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user) var/list/destinations = list() for(var/obj/item/device/radio/beacon/B in teleportbeacons) var/turf/T = get_turf(B) if(T.z in current_map.station_levels) destinations += B return destinations /obj/item/device/wormhole_jaunter/proc/activate(mob/user) if(!turf_check(user)) return var/list/L = get_destinations(user) if(!L.len) user << "The [src.name] found no beacons in the world to anchor a wormhole to." return var/chosen_beacon = pick(L) var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100) J.target = chosen_beacon playsound(src,'sound/effects/sparks4.ogg',50,1) qdel(src) /obj/item/device/wormhole_jaunter/emp_act(power) var/triggered = FALSE if(power == 1) triggered = TRUE else if(power == 2 && prob(50)) triggered = TRUE if(triggered) usr.visible_message("The [src] overloads and activates!") feedback_add_details("jaunter","E") // EMP accidental activation activate(usr) /obj/effect/portal/wormhole/jaunt_tunnel name = "jaunt tunnel" icon = 'icons/obj/objects.dmi' icon_state = "bhole3" desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." /obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M) if(M.anchored || istype(M, /obj/effect)) return single_spark(M.loc) if(istype(M)) if(do_teleport(M, target, 6)) single_spark(M.loc) playsound(M,'sound/weapons/resonator_blast.ogg',50,1) if(iscarbon(M)) var/mob/living/carbon/L = M L.Weaken(3) if(ishuman(L)) shake_camera(L, 20, 1) addtimer(CALLBACK(L, /mob/living/carbon/.proc/vomit), 20) /**********************Lazarus Injector**********************/ /obj/item/weapon/lazarus_injector name = "lazarus injector" desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead. If no effect in 3 days please call customer support." icon = 'icons/obj/syringe.dmi' icon_state = "borghypo" item_state = "hypo" throwforce = 0 w_class = 2 throw_speed = 3 throw_range = 5 var/loaded = 1 var/malfunctioning = 0 var/revive_type = TYPE_ORGANIC //So you can't revive boss monsters or robots with it origin_tech = list(TECH_BIO = 7, TECH_MATERIAL = 4) /obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) if(!loaded) return if(isliving(target) && proximity_flag) if(istype(target, /mob/living/simple_animal)) var/mob/living/simple_animal/M = target if(!(M.find_type() & revive_type)) user << "[src] does not work on this sort of creature." return if(M.stat == DEAD) if(!malfunctioning) M.faction = "neutral" M.revive() M.icon_state = M.icon_living loaded = 0 user.visible_message("[user] injects [M] with [src], reviving it.") feedback_add_details("lazarus_injector", "[M.type]") playsound(src,'sound/effects/refill.ogg',50,1) return else user << "[src] is only effective on the dead." return else user << "[src] is only effective on lesser beings." return /obj/item/weapon/lazarus_injector/emp_act() if(!malfunctioning) malfunctioning = 1 /obj/item/weapon/lazarus_injector/examine(mob/user) ..() if(!loaded) user << "[src] is empty." if(malfunctioning) user << "The display on [src] seems to be flickering." /**********************Point Transfer Card**********************/ /obj/item/weapon/card/mining_point_card name = "mining points card" desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard." icon_state = "data" var/points = 500 /obj/item/weapon/card/mining_point_card/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/card/id)) if(points) var/obj/item/weapon/card/id/C = I C.mining_points += points user << "You transfer [points] points to [C]." points = 0 else user << "There's no points left on [src]." ..() /obj/item/weapon/card/mining_point_card/examine(mob/user) ..() user << "There's [points] point\s on the card." /**********************"Fultons"**********************/ var/list/total_extraction_beacons = list() /obj/item/weapon/extraction_pack name = "warp extraction pack" desc = "A complex device that warps nonliving matter to nearby locations." contained_sprite = 1 icon = 'icons/obj/mining_contained.dmi' icon_state = "fulton" w_class = 3 var/obj/structure/extraction_point/beacon var/list/beacon_networks = list("station") var/uses_left = 3 origin_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4, TECH_ENGINEERING = 4) /obj/item/weapon/extraction_pack/examine() . = ..() usr.show_message("It has [uses_left] uses remaining.", 1) /obj/item/weapon/extraction_pack/attack_self(mob/user) var/list/possible_beacons = list() for(var/B in total_extraction_beacons) var/obj/structure/extraction_point/EP = B if(EP.beacon_network in beacon_networks) possible_beacons += EP if(!possible_beacons.len) user << "There are no extraction beacons in existence!" return else var/A A = input("Select a beacon to connect to", "Warp Extraction Pack", A) in possible_beacons if(!A) return beacon = A /obj/item/weapon/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user) if(!beacon) user << "[src] is not linked to a beacon, and cannot be used." return if(!istype(A)) return else if(istype(A,/mob/living)) user << "[src] is not safe for use with living creatures, they wouldn't survive the trip back!" return if(A.loc == user) // no extracting stuff you're holding return if(A.anchored) return user << "You start attaching the pack to [A]..." if(do_after(user,50)) user << "You attach the pack to [A] and activate it." uses_left-- if(uses_left <= 0) user.drop_item(src) loc = A single_spark(A.loc) var/list/flooring_near_beacon = list() for(var/turf/simulated/floor/floor in orange(1, beacon)) flooring_near_beacon += floor A.loc = pick(flooring_near_beacon) single_spark(A.loc) if(uses_left <= 0) qdel(src) /obj/item/warp_core name = "warp extraction beacon signaller" desc = "Emits a signal which Warp-Item recovery devices can lock onto. Activate in hand to create a beacon." icon = 'icons/obj/stock_parts.dmi' icon_state = "subspace_amplifier" origin_tech = list(TECH_BLUESPACE = 1, TECH_PHORON = 1, TECH_ENGINEERING = 2) /obj/item/warp_core/attack_self(mob/user) user << "You start placing down the beacon. . ." if(do_after(user,15)) new /obj/structure/extraction_point(get_turf(user)) qdel(src) /obj/structure/extraction_point name = "warp recovery beacon" desc = "A beacon for the Warp-Item recovery system. Hit a beacon with a pack to link the pack to a beacon." icon = 'icons/obj/mining.dmi' icon_state = "extraction_point" anchored = 1 density = 0 var/beacon_network = "station" /obj/structure/extraction_point/New() var/area/area_name = get_area(src) name += " ([rand(100,999)]) ([area_name.name])" total_extraction_beacons += src ..() /obj/structure/extraction_point/Destroy() total_extraction_beacons -= src ..() /**********************Resonator**********************/ /obj/item/weapon/resonator name = "resonator" contained_sprite = 1 icon = 'icons/obj/mining_contained.dmi' icon_state = "resonator" item_state = "resonator" desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum." w_class = 3 force = 15 throwforce = 10 var/burst_time = 30 var/fieldlimit = 4 var/list/fields = list() var/quick_burst_mod = 0.8 origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) /obj/item/weapon/resonator/upgraded name = "upgraded resonator" desc = "An upgraded version of the resonator that can produce more fields at once." icon_state = "resonatoru" item_state = "resonatoru" origin_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4, TECH_POWER = 2, TECH_ENGINEERING = 3) fieldlimit = 8 quick_burst_mod = 1 burst_time = 15 /obj/item/weapon/resonator/proc/CreateResonance(target, creator) var/turf/T = get_turf(target) var/obj/effect/resonance/R = locate(/obj/effect/resonance) in T if(R) R.resonance_damage *= quick_burst_mod R.burst(T) return if(fields.len < fieldlimit) playsound(src,'sound/weapons/resonator_fire.ogg',50,1) var/obj/effect/resonance/RE = new /obj/effect/resonance(T, creator, burst_time, src) fields += RE /obj/item/weapon/resonator/attack_self(mob/user) if(burst_time == 50) burst_time = 30 user << "You set the resonator's fields to detonate after 3 seconds." else burst_time = 50 user << "You set the resonator's fields to detonate after 5 seconds." /obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) ..() if(user.Adjacent(target)) if(isturf(target)) CreateResonance(target, user) /obj/effect/resonance name = "resonance field" desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures." icon = 'icons/effects/effects.dmi' icon_state = "shield2" layer = 5 anchored = TRUE mouse_opacity = 0 var/resonance_damage = 20 var/creator var/obj/item/weapon/resonator/res /obj/effect/resonance/New(loc, set_creator, timetoburst, set_resonator) ..() creator = set_creator res = set_resonator var/turf/proj_turf = get_turf(src) if(!istype(proj_turf)) return var/datum/gas_mixture/environment = proj_turf.return_air() var/pressure = environment.return_pressure() if(pressure < 50) name = "strong resonance field" resonance_damage = 60 addtimer(CALLBACK(src, .proc/burst, loc), timetoburst) /obj/effect/resonance/Destroy() if(res) res.fields -= src return ..() /obj/effect/resonance/proc/burst(turf/T) playsound(src,'sound/weapons/resonator_blast.ogg',50,1) if(istype(T, /turf/simulated/mineral)) var/turf/simulated/mineral/M = T M.GetDrilled(1) for(var/mob/living/L in T) if(creator) add_logs(creator, L, "used a resonator field on", "resonator") L << "The [src.name] ruptured with you in it!" L.apply_damage(resonance_damage, BRUTE) qdel(src) /******************************Ore Magnet*******************************/ /obj/item/weapon/oremagnet name = "ore magnet" contained_sprite = 1 icon = 'icons/obj/mining_contained.dmi' icon_state = "magneto" item_state = "magneto" desc = "A handheld device that creates a well of negative force that attracts minerals of a very specific type, size, and state to its user." w_class = 3 force = 10 throwforce = 5 origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 3) /obj/item/weapon/oremagnet/attack_self(mob/user) if (use_check(user)) return toggle_on(user) /obj/item/weapon/oremagnet/process() for(var/obj/item/weapon/ore/O in oview(7, loc)) if(prob(80)) step_to(O, src.loc, 0) if (TICK_CHECK) return /obj/item/weapon/oremagnet/proc/toggle_on(mob/user) if (!isprocessing) START_PROCESSING(SSprocessing, src) else STOP_PROCESSING(SSprocessing, src) if (user) to_chat(user, "You switch [isprocessing ? "on" : "off"] [src].") /obj/item/weapon/oremagnet/Destroy() STOP_PROCESSING(SSprocessing, src) return ..() /******************************Ore Summoner*******************************/ /obj/item/weapon/oreportal name = "ore summoner" contained_sprite = 1 icon = 'icons/obj/mining_contained.dmi' icon_state = "supermagneto" item_state = "jaunter" desc = "A handheld device that creates a well of warp energy that teleports minerals of a very specific type, size, and state to its user." w_class = 3 force = 15 throwforce = 5 origin_tech = list(TECH_BLUESPACE = 4, TECH_ENGINEERING = 3) /obj/item/weapon/oreportal/attack_self(mob/user) user << "You pulse the ore summoner." for(var/obj/item/weapon/ore/O in orange(7,user)) single_spark(O.loc) do_teleport(O, user, 0) CHECK_TICK /******************************Sculpting*******************************/ /obj/item/weapon/autochisel name = "auto-chisel" icon = 'icons/obj/items.dmi' icon_state = "jackhammer" item_state = "jackhammer" origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) desc = "With an integrated AI chip and hair-trigger precision, this baby makes sculpting almost automatic!" /obj/structure/sculpting_block name = "sculpting block" desc = "A finely chiselled sculpting block, it is ready to be your canvas." icon = 'icons/obj/mining.dmi' icon_state = "sculpting_block" density = 1 opacity = 1 anchored = 0 var/sculpted = 0 var/mob/living/T var/times_carved = 0 var/last_struck = 0 /obj/structure/sculpting_block/verb/rotate() set name = "Rotate" set category = "Object" set src in oview(1) if (src.anchored || usr:stat) usr << "It is fastened to the floor!" return 0 src.set_dir(turn(src.dir, 90)) return 1 /obj/structure/sculpting_block/attackby(obj/item/C as obj, mob/user as mob) if (iswrench(C)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user << "You [anchored ? "un" : ""]anchor the [name]." anchored = !anchored if (istype(C, /obj/item/weapon/autochisel)) if(!sculpted) if(last_struck) return if(!T) var/list/choices = list() for(var/mob/living/M in view(7,user)) choices += M T = input(user,"Who do you wish to sculpt?") as null|anything in choices user.visible_message("[user] begins sculpting.", "You begin sculpting.") var/sculpting_coefficient = get_dist(user,T) if(sculpting_coefficient <= 0) sculpting_coefficient = 1 if(sculpting_coefficient >= 7) user << "You hardly remember what [T] really looks like! Bah!" T = null user.visible_message("[user] carves away at the sculpting block!", "You continue sculpting.") if(prob(25)) playsound(user, 'sound/items/Screwdriver.ogg', 20, 1) else playsound(user, "sound/weapons/chisel[rand(1,2)].ogg", 20, 1) spawn(3) playsound(user, "sound/weapons/chisel[rand(1,2)].ogg", 20, 1) spawn(3) playsound(user, "sound/weapons/chisel[rand(1,2)].ogg", 20, 1) last_struck = 1 if(do_after(user,(20))) last_struck = 0 if(times_carved <= 9) times_carved += 1 if(times_carved < 1) user << "You review your work and see there is more to do." return else sculpted = 1 user.visible_message("[user] finishes sculpting their magnum opus!", "You finish sculpting a masterpiece.") src.appearance = T src.color = list( 0.35, 0.3, 0.25, 0.35, 0.3, 0.25, 0.35, 0.3, 0.25 ) src.pixel_y += 8 var/image/pedestal_underlay = image('icons/obj/mining.dmi', icon_state = "pedestal") pedestal_underlay.appearance_flags = RESET_COLOR pedestal_underlay.pixel_y -= 8 src.underlays += pedestal_underlay var/title = sanitize(input(usr, "If you would like to name your art, do so here.", "Christen Your Sculpture", "") as text|null) if(title) name = title else name = "*[T.name]*" var/legend = sanitize(input(usr, "If you would like to describe your art, do so here.", "Story Your Sculpture", "") as message|null) if(legend) desc = legend else desc = "This is a sculpture of [T.name]. All craftsmanship is of the highest quality. It is decorated with rock and more rock. It is covered with rock. On the item is an image of a rock. The rock is [T.name]." else last_struck = 0 return /******************************Gains Boroughs*******************************/ /obj/structure/punching_bag name = "punching bag" desc = "A punching bag. Better this than the Quartermaster." icon = 'icons/obj/mining.dmi' icon_state = "punchingbag" anchored = 1 layer = 5.1 var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\ 'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg') /obj/structure/punching_bag/attack_hand(mob/user as mob) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) flick("[icon_state]2", src) playsound(src.loc, pick(src.hit_sounds), 25, 1, -1) /obj/structure/weightlifter name = "Weight Machine" desc = "Just looking at this thing makes you feel tired." icon = 'icons/obj/mining.dmi' icon_state = "fitnessweight" density = 1 anchored = 1 /obj/structure/weightlifter/attack_hand(var/mob/living/carbon/human/user) if(!istype(user)) return if(in_use) user << "It's already in use - wait a bit." return else in_use = 1 icon_state = "fitnessweight-c" user.dir = SOUTH user.Stun(4) user.loc = src.loc var/image/W = image('icons/obj/mining.dmi',"fitnessweight-w") W.layer = 5.1 overlays += W var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") user.visible_message("[user] is [bragmessage]!") var/reps = 0 user.pixel_y = 5 while (reps++ < 6) if (user.loc != src.loc) break for (var/innerReps = max(reps, 1), innerReps > 0, innerReps--) sleep(3) animate(user, pixel_y = (user.pixel_y == 3) ? 5 : 3, time = 3) playsound(user,'sound/effects/spring.ogg', 60, 1) sleep(3) animate(user, pixel_y = 2, time = 3) sleep(3) playsound(user, 'sound/machines/click.ogg', 60, 1) in_use = 0 animate(user, pixel_y = 0, time = 3) var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") icon_state = "fitnessweight" overlays -= W user << "[finishmessage]" user.nutrition = user.nutrition - 10 /******************************Seismic Charge*******************************/ /obj/item/weapon/plastique/seismic name = "seismic charge" desc = "A complex mining device that utilizes a seismic detonation to eliminate weak asteroid turf in a wide radius." origin_tech = list(TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_PHORON = 2) timer = 15 /obj/item/weapon/plastique/seismic/explode(var/turf/location) if(!target) target = get_atom_on_turf(src) if(!target) target = src if(location) new /obj/effect/overlay/temp/explosion(location) playsound(location, 'sound/effects/Explosion1.ogg', 100, 1) for(var/atom/A in range(4,location)) if(istype(A,/turf/simulated/mineral)) var/turf/simulated/mineral/M = A M.GetDrilled(1) else if(istype(A, /turf/simulated/wall) && prob(66)) var/turf/simulated/wall/W = A W.ex_act(2) else if(istype(A, /obj/structure/window)) var/obj/structure/window/WI = A WI.ex_act(3) else if(istype(A,/mob/living)) var/mob/living/LI = A LI << 'sound/weapons/resonator_blast.ogg' if(iscarbon(LI)) var/mob/living/carbon/L = A L.Weaken(3) if(ishuman(L)) shake_camera(L, 20, 1) addtimer(CALLBACK(L, /mob/living/carbon/.proc/vomit), 20) spawn(2) for(var/turf/simulated/mineral/M in range(7,location)) if(prob(75)) M.GetDrilled(1) if(target) target.overlays -= image_overlay qdel(src)