/**********************Ore Redemption Unit**************************/ //Turns all the various mining machines into a single unit to speed up mining and establish a point system /obj/machinery/mineral/ore_redemption name = "ore redemption machine" desc = "A machine that accepts ore and instantly transforms it into workable material sheets, but cannot produce alloys such as Plasteel. Points for ore are generated based on type and can be redeemed at a mining equipment locker." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "ore_redemption" density = 1 anchored = 1.0 var/obj/machinery/mineral/input = null var/obj/machinery/mineral/output = null req_one_access = list( access_mining_station, access_chemistry, access_bar, access_research, access_ce, access_virology ) var/datum/materials/materials = new var/stack_amt = 50; //amount to stack before releasing var/obj/item/weapon/card/id/inserted_id var/points = 0 /obj/machinery/mineral/ore_redemption/New() spawn( 5 ) for (var/dir in cardinal) src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) if(src.input) break for (var/dir in cardinal) src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) if(src.output) break /obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O) var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O) if(processed_sheet) var/datum/material/mat = materials.getMaterial(O.oretag) mat.stored += processed_sheet.amount //Stack the sheets O.loc = null //Let the old sheet garbage collect while(mat.stored > stack_amt) //Get rid of excessive stackage var/obj/item/stack/sheet/out = new mat.sheettype(output.loc) out.amount = stack_amt-mat.stored mat.stored -= out.amount /obj/machinery/mineral/ore_redemption/process() var/turf/T = get_turf(input) if(T) var/obj/item/weapon/ore/O for(O in T) process_sheet(O) for(var/obj/structure/ore_box/B in T) for(O in B.contents) process_sheet(O) /obj/machinery/mineral/ore_redemption/proc/SmeltMineral(var/obj/item/weapon/ore/O) if(O.oretag) var/datum/material/mat = materials.getMaterial(O.oretag) var/obj/item/stack/sheet/M = new mat.sheettype(src) points += mat.value return M del(O)//No refined type? Purge it. return /obj/machinery/mineral/ore_redemption/attack_hand(user as mob) if(..()) return interact(user) /obj/machinery/mineral/ore_redemption/interact(mob/user) var/dat dat += text("Ore Redemption Machine

") dat += text("This machine only accepts ore. Gibtonite and Slag are not accepted.

") dat += text("Current unclaimed points: [points]
") if(istype(inserted_id)) dat += text("You have [inserted_id.mining_points] mining points collected. Eject ID.
") dat += text("Claim points.
") else dat += text("No ID inserted. Insert ID.
") for(var/O in materials.storage) var/datum/material/mat = materials.getMaterial(O) if(mat.stored > 0) dat += text("[capitalize(mat.processed_name)]: [mat.stored] Release
") dat += text("
This unit can hold stacks of [stack_amt] sheets of each mineral type.

") dat += text("
Mineral Value List:
[get_ore_values()]") user << browse("[dat]", "window=console_stacking_machine") return /obj/machinery/mineral/ore_redemption/proc/get_ore_values() var/dat = "" for(var/mat_id in materials.storage) var/datum/material/mat = materials.getMaterial(mat_id) dat += "" dat += "
[capitalize(mat.processed_name)][mat.value]
" return dat /obj/machinery/mineral/ore_redemption/Topic(href, href_list) if(..()) return if(href_list["choice"]) if(istype(inserted_id)) if(href_list["choice"] == "eject") inserted_id.loc = loc inserted_id.verb_pickup() inserted_id = null if(href_list["choice"] == "claim") inserted_id.mining_points += points points = 0 src << "Points transferred." else if(href_list["choice"] == "insert") var/obj/item/weapon/card/id/I = usr.get_active_hand() if(istype(I)) usr.drop_item() I.loc = src inserted_id = I else usr << "\red No valid ID." if(href_list["release"] && istype(inserted_id)) if(check_access(inserted_id)) var/release=href_list["release"] var/datum/material/mat = materials.getMaterial(release) if(!mat) return var/desired = input("How much?","How much [mat.processed_name] to eject?",mat.stored) as num if(desired==0) return var/obj/item/stack/sheet/out = new mat.sheettype() out.amount = min(mat.stored,desired) mat.stored=desired updateUsrDialog() return /obj/machinery/mineral/ore_redemption/ex_act() return //So some chucklefuck doesn't ruin miners reward with an explosion /**********************Mining Equipment Locker**************************/ /obj/machinery/mineral/equipment_locker name = "mining equipment locker" desc = "An equipment locker for miners, points collected at an ore redemption machine can be spent here." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "mining" density = 1 anchored = 1.0 var/obj/item/weapon/card/id/inserted_id var/list/prize_list = list( new /datum/data/mining_equipment("Chili", /obj/item/weapon/reagent_containers/food/snacks/hotchili, 100), new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 100), new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 150), new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 150), //new /datum/data/mining_equipment("Stimulant pills", /obj/item/weapon/storage/pill_bottle/stimulant, 350), //new /datum/data/mining_equipment("Alien toy", /obj/item/clothing/mask/facehugger/toy, 250), //new /datum/data/mining_equipment("Laser pointer", /obj/item/device/laser_pointer, 250), new /datum/data/mining_equipment("Point card", /obj/item/weapon/card/mining_point_card, 500), new /datum/data/mining_equipment("Lazarus injector", /obj/item/weapon/lazarus_injector, 1000), new /datum/data/mining_equipment("Space cash", /obj/item/weapon/spacecash/c1000, 5000), new /datum/data/mining_equipment("Sonic jackhammer", /obj/item/weapon/pickaxe/jackhammer, 500), new /datum/data/mining_equipment("Mining drone", /mob/living/simple_animal/hostile/mining_drone/, 500), new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 250), new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 750), new /datum/data/mining_equipment("Kinetic accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000), new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide, 2000), ) /datum/data/mining_equipment/ var/equipment_name = "generic" var/equipment_path = null var/cost = 0 /datum/data/mining_equipment/New(name, path, cost) src.equipment_name = name src.equipment_path = path src.cost = cost /obj/machinery/mineral/equipment_locker/attack_hand(user as mob) if(..()) return interact(user) /obj/machinery/mineral/equipment_locker/interact(mob/user) var/dat dat += text("Mining Equipment Locker

") if(istype(inserted_id)) dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
" else dat += "No ID inserted. Insert ID.
" dat += "
Equipment point cost list:
" for(var/datum/data/mining_equipment/prize in prize_list) dat += "" dat += "
[prize.equipment_name][prize.cost]Purchase
" user << browse("[dat]", "window=mining_equipment_locker") return /obj/machinery/mineral/equipment_locker/Topic(href, href_list) if(..()) return if(href_list["choice"]) if(istype(inserted_id)) if(href_list["choice"] == "eject") inserted_id.loc = loc inserted_id.verb_pickup() inserted_id = null else if(href_list["choice"] == "insert") var/obj/item/weapon/card/id/I = usr.get_active_hand() if(istype(I)) usr.drop_item() I.loc = src inserted_id = I else usr << "\red No valid ID." if(href_list["purchase"]) if(istype(inserted_id)) var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) if (!prize || !(prize in prize_list)) return if(prize.cost > inserted_id.mining_points) else inserted_id.mining_points -= prize.cost new prize.equipment_path(src.loc) updateUsrDialog() return /obj/machinery/mineral/equipment_locker/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/mining_voucher)) RedeemVoucher(I, user) return ..() /obj/machinery/mineral/equipment_locker/proc/RedeemVoucher(voucher, redeemer) var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") in list("Resonator kit", "Kinetic Accelerator", "Mining Drone", "Cancel") if(!selection || !Adjacent(redeemer)) return switch(selection) if("Resonator kit") new /obj/item/weapon/resonator(src.loc) //new /obj/item/weapon/storage/pill_bottle/stimulant(src.loc) if("Kinetic Accelerator") new /obj/item/weapon/gun/energy/kinetic_accelerator(src.loc) if("Mining Drone") new /mob/living/simple_animal/hostile/mining_drone(src.loc) if("Cancel") return del(voucher) /obj/machinery/mineral/equipment_locker/ex_act() return /**********************Mining Equipment Locker Items**************************/ /**********************Mining Equipment Voucher**********************/ /obj/item/weapon/mining_voucher name = "mining voucher" desc = "A token to redeem a piece of equipment. Use it on a mining equipment locker." icon = 'icons/obj/items.dmi' icon_state = "mining_voucher" w_class = 1 /**********************Mining Point Card**********************/ /obj/item/weapon/card/mining_point_card name = "mining point 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 as obj, mob/user as mob) 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() ..() usr << "There's [points] points on the card." /**********************Jaunter**********************/ /obj/item/device/wormhole_jaunter name = "wormhole jaunter" desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least." icon = 'icons/obj/items.dmi' icon_state = "Jaunter" item_state = "electronic" throwforce = 0 w_class = 2.0 throw_speed = 3 throw_range = 5 origin_tech = "bluespace=2" /obj/item/device/wormhole_jaunter/attack_self(mob/user as mob) var/turf/device_turf = get_turf(user) if(!device_turf||device_turf.z==2||device_turf.z>=7) user << "You're having difficulties getting the [src.name] to work." return else user.visible_message("[user.name] activates the [src.name]!") var/list/L = list() for(var/obj/item/device/radio/beacon/B in world) var/turf/T = get_turf(B) if(T.z == 1) L += B if(!L.len) user << "The [src.name] failed to create a wormhole." 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 try_move_adjacent(J) playsound(src,'sound/effects/sparks4.ogg',50,1) del(src) /obj/effect/portal/wormhole/jaunt_tunnel name = "jaunt tunnel" icon = 'icons/effects/effects.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(istype(M, /obj/effect)) return if(istype(M, /atom/movable)) do_teleport(M, target, 6) if(isliving(M)) var/mob/living/L = M L.Weaken(3) if(ishuman(L)) shake_camera(L, 20, 1) spawn(20) L.visible_message("[L.name] vomits from travelling through the [src.name]!") L.nutrition -= 20 L.adjustToxLoss(-3) var/turf/T = get_turf(L) T.add_vomit_floor(L) playsound(L, 'sound/effects/splat.ogg', 50, 1) /**********************Resonator**********************/ /obj/item/weapon/resonator name = "resonator" icon = 'icons/obj/items.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 vaccuum." w_class = 3 force = 10 throwforce = 10 var/cooldown = 0 /obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator) if(cooldown <= 0) playsound(src,'sound/effects/stealthoff.ogg',50,1) var/obj/effect/resonance/R = new /obj/effect/resonance(get_turf(target)) R.creator = creator cooldown = 1 spawn(20) cooldown = 0 /obj/item/weapon/resonator/attack_self(mob/user as mob) CreateResonance(src, user) ..() /obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) if(target in user.contents) return if(proximity_flag) 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 = "shield1" layer = 4.1 mouse_opacity = 0 var/resonance_damage = 30 var/creator = null /obj/effect/resonance/New() var/turf/proj_turf = get_turf(src) if(!istype(proj_turf)) return if(istype(proj_turf, /turf/simulated/mineral)) var/turf/simulated/mineral/M = proj_turf playsound(src,'sound/effects/sparks4.ogg',50,1) M.GetDrilled() spawn(5) del(src) else var/datum/gas_mixture/environment = proj_turf.return_air() var/pressure = environment.return_pressure() if(pressure < 50) name = "strong resonance field" resonance_damage = 60 spawn(50) playsound(src,'sound/effects/sparks4.ogg',50,1) if(creator) for(var/mob/living/L in src.loc) add_logs(creator, L, "used a resonator field on", object="resonator") L << "The [src.name] ruptured with you in it!" L.adjustBruteLoss(resonance_damage) else for(var/mob/living/L in src.loc) L << "The [src.name] ruptured with you in it!" L.adjustBruteLoss(resonance_damage) del(src) /**********************Mining drone**********************/ /mob/living/simple_animal/hostile/mining_drone/ name = "nanotrasen minebot" desc = "A small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife." icon = 'icons/obj/aibots.dmi' icon_state = "mining_drone" icon_living = "mining_drone" status_flags = CANSTUN|CANWEAKEN|CANPUSH mouse_opacity = 1 faction = list("neutral") a_intent = "harm" min_oxy = 0 max_oxy = 0 min_tox = 0 max_tox = 0 min_co2 = 0 max_co2 = 0 min_n2 = 0 max_n2 = 0 minbodytemp = 0 wander = 0 idle_vision_range = 5 move_to_delay = 10 retreat_distance = 1 minimum_distance = 2 health = 100 maxHealth = 100 melee_damage_lower = 15 melee_damage_upper = 15 environment_smash = 0 attacktext = "drills" attack_sound = 'sound/weapons/circsawhit.ogg' ranged = 1 ranged_message = "shoots" ranged_cooldown_cap = 3 projectiletype = /obj/item/projectile/beam projectilesound = 'sound/weapons/Laser.ogg' wanted_objects = list(/obj/item/weapon/ore) /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = I if(W.welding && !stat) if(stance != HOSTILE_STANCE_IDLE) user << "[src] is moving around too much to repair!" return if(maxHealth == health) user << "[src] is at full integrity." else health += 10 user << "You repair some of the armor on [src]." return if(istype(I, /obj/item/device/mining_scanner)) user << "You instruct [src] to drop any collected ore." DropOre() return ..() /mob/living/simple_animal/hostile/mining_drone/Die() ..() visible_message("[src] is destroyed!") new /obj/effect/decal/remains/robot(src.loc) DropOre() del src return /mob/living/simple_animal/hostile/mining_drone/New() ..() SetCollectBehavior() /mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M) if(M.a_intent == "help") switch(search_objects) if(0) SetCollectBehavior() M << "[src] has been set to search and store loose ore." if(2) SetOffenseBehavior() M << "[src] has been set to attack hostile wildlife." return ..() /mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() stop_automated_movement_when_pulled = 1 idle_vision_range = 9 search_objects = 2 wander = 1 ranged = 0 minimum_distance = 1 retreat_distance = null icon_state = "mining_drone" /mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior() stop_automated_movement_when_pulled = 0 idle_vision_range = 5 search_objects = 0 wander = 0 ranged = 1 retreat_distance = 1 minimum_distance = 2 icon_state = "mining_drone_offense" /mob/living/simple_animal/hostile/mining_drone/AttackingTarget() if(istype(target, /obj/item/weapon/ore)) CollectOre() return ..() /mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() var/obj/item/weapon/ore/O for(O in src.loc) O.loc = src for(var/dir in alldirs) var/turf/T = get_step(src,dir) for(O in T) O.loc = src return /mob/living/simple_animal/hostile/mining_drone/proc/DropOre() if(!contents.len) return for(var/obj/item/weapon/ore/O in contents) contents -= O O.loc = src.loc return /mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss() if(search_objects) SetOffenseBehavior() ..() /**********************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, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees." icon = 'icons/obj/syringe.dmi' icon_state = "lazarus_hypo" item_state = "hypo" throwforce = 0 w_class = 2.0 throw_speed = 3 throw_range = 5 var/loaded = 1 /obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) if(!loaded) return if(istype(target, /mob/living) && proximity_flag) if(istype(target, /mob/living/simple_animal)) var/mob/living/simple_animal/M = target if(M.stat == DEAD) M.faction = list("lazarus") M.revive() if(istype(target, /mob/living/simple_animal/hostile)) var/mob/living/simple_animal/hostile/H = M H.friends += user log_game("[user] has revived hostile mob [target] with a lazarus injector") loaded = 0 user.visible_message("[user] injects [M] with [src], reviving it.") playsound(src,'sound/effects/refill.ogg',50,1) icon_state = "lazarus_empty" 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/examine() ..() if(!loaded) usr << "[src] is empty." /**********************Mining Scanner**********************/ /obj/item/device/mining_scanner desc = "A scanner that checks surrounding rock for useful minerals, it can also be used to stop gibtonite detonations. Requires you to wear mesons to work properly." name = "mining scanner" icon_state = "mining" item_state = "analyzer" w_class = 2.0 flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 /obj/item/device/mining_scanner/attack_self(mob/user) if(!user.client) return if(!cooldown) cooldown = 1 spawn(40) cooldown = 0 var/client/C = user.client var/list/L = list() var/turf/simulated/mineral/M for(M in range(7, user)) if(M.scan_state) L += M if(!L.len) user << "[src] reports that nothing was detected nearby." return else for(M in L) var/turf/T = get_turf(M) var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18) C.images += I spawn(30) if(C) C.images -= I //Debug item to identify all ore spread quickly /obj/item/device/mining_scanner/admin /obj/item/device/mining_scanner/admin/attack_self(mob/user) for(var/turf/simulated/mineral/M in world) if(M.scan_state) M.icon_state = M.scan_state del(src) /**********************Xeno Warning Sign**********************/ /obj/structure/sign/xeno_warning_mining name = "DANGEROUS ALIEN LIFE" desc = "A sign that warns would be travellers of hostile alien life in the vicinity." icon = 'icons/obj/mining.dmi' icon_state = "xeno_warning"