// Magnet Stuff
/area/station/quartermaster/magnet
name = "Magnet Control Room"
icon_state = "green"
sound_environment = 10
/area/station/quartermaster/refinery
name = "Refinery"
icon_state = "green"
sound_environment = 10
/obj/machinery/magnet_chassis
name = "magnet chassis"
desc = "A strong metal rig designed to hold and link up magnet apparatus with other technology."
icon = 'icons/obj/64x64.dmi'
icon_state = "chassis"
opacity = 0
density = 1
anchored = 1
var/obj/machinery/mining_magnet/linked_magnet = null
New()
..()
spawn(0)
src.update_dir()
for (var/obj/machinery/mining_magnet/MM in range(1,src))
linked_magnet = MM
MM.linked_chassis = src
break
disposing()
if (linked_magnet)
qdel(linked_magnet)
linked_magnet = null
..()
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W,/obj/item/magnet_parts))
if (istype(src.linked_magnet))
boutput(user, "There's already a magnet installed.")
return
user.visible_message("[user] begins constructing a new magnet.")
var/turf/T = get_turf(user)
sleep(240)
if (user.loc == T && user.equipped() == W && !user.stat)
var/obj/magnet = new W:constructed_magnet(get_turf(src))
magnet.dir = src.dir
qdel(W)
else
..()
ex_act()
return
meteorhit()
return
blob_act(var/power)
return
bullet_act(var/obj/projectile/P)
return
proc/update_dir()
if (src.dir & (EAST|WEST))
src.bound_height = 64
src.bound_width = 32
else
src.bound_height = 32
src.bound_width = 64
/obj/item/magnet_parts
name = "mineral magnet parts"
desc = "Used to construct a new magnet on a magnet chassis."
icon = 'icons/obj/electronics.dmi'
icon_state = "dbox"
var/constructed_magnet = /obj/machinery/mining_magnet
/obj/item/magnet_parts/construction
constructed_magnet = /obj/machinery/mining_magnet/construction
small
name = "small mineral magnet parts"
constructed_magnet = /obj/machinery/mining_magnet/construction/small
/obj/magnet_target_marker
name = "mineral magnet target"
desc = "Marks the location of an area of asteroid magnetting."
invisibility = 101
var/width = 15
var/height = 15
var/scan_range = 7
var/turf/magnetic_center
alpha = 128
small
width = 7
height = 7
scan_range = 3
ex_act()
return
meteorhit()
return
bullet_act()
return
proc/erase_area()
var/turf/origin = get_turf(src)
for (var/turf/T in block(origin, locate(origin.x + width - 1, origin.y + height - 1, origin.z)))
for (var/obj/O in T)
if (!(O.type in mining_controls.magnet_do_not_erase) && !istype(O, /obj/magnet_target_marker))
qdel(O)
T.overlays.len = 0
if (!istype(T, /turf/space))
new /turf/space(T)
proc/generate_walls()
var/list/walls = list()
var/turf/origin = get_turf(src)
for (var/cx = origin.x - 1, cx <= origin.x + width, cx++)
var/turf/S = locate(cx, origin.y - 1, origin.z)
if (S)
var/Q = new /obj/forcefield/mining(S)
walls += Q
S = locate(cx, origin.y + width, origin.z)
if (S)
var/Q = new /obj/forcefield/mining(S)
walls += Q
for (var/cy = origin.y, cy <= origin.y + height - 1, cy++)
var/turf/S = locate(origin.x - 1, cy, origin.z)
if (S)
var/Q = new /obj/forcefield/mining(S)
walls += Q
S = locate(origin.x + width, cy, origin.z)
if (S)
var/Q = new /obj/forcefield/mining(S)
walls += Q
return walls
proc/check_for_unacceptable_content()
var/turf/origin = get_turf(src)
for (var/turf/T in block(locate(origin.x - 1, origin.y - 1, origin.z), locate(origin.x + width, origin.y + height, origin.z)))
var/mob/living/M = locate() in T
if (M)
return 1
var/obj/machinery/vehicle/V = locate() in T
if (V)
return 1
return 0
proc/UL()
var/turf/origin = get_turf(src)
var/turf/ul = locate(origin.x, origin.y + height - 1, origin.z)
return ul
proc/UR()
var/turf/origin = get_turf(src)
var/turf/ur = locate(origin.x + width - 1, origin.y + height - 1, origin.z)
return ur
proc/DL()
return get_turf(src)
proc/DR()
var/turf/origin = get_turf(src)
var/turf/dr = locate(origin.x + width - 1, origin.y, origin.z)
return dr
proc/construct()
var/turf/origin = get_turf(src)
for (var/turf/T in block(origin, locate(origin.x + width - 1, origin.y + height - 1, origin.z)))
if (!T)
boutput(usr, "Error: magnet area spans over construction area bounds.")
return 0
if (!istype(T, /turf/space) && !istype(T, /turf/simulated/floor/plating/airless/asteroid) && !istype(T, /turf/simulated/wall/asteroid))
boutput(usr, "Error: [T] detected in [width]x[height] magnet area. Cannot magnetize.")
return 0
var/borders = list()
for (var/cx = origin.x - 1, cx <= origin.x + width, cx++)
var/turf/S = locate(cx, origin.y - 1, origin.z)
if (!S || istype(S, /turf/space))
boutput(usr, "Error: bordering tile has a gap, cannot magnetize area.")
return 0
borders += S
S = locate(cx, origin.y + height, origin.z)
if (!S || istype(S, /turf/space))
boutput(usr, "Error: bordering tile has a gap, cannot magnetize area.")
return 0
borders += S
for (var/cy = origin.y, cy <= origin.y + height - 1, cy++)
var/turf/S = locate(origin.x - 1, cy, origin.z)
if (!S || istype(S, /turf/space))
boutput(usr, "Error: bordering tile has a gap, cannot magnetize area.")
return 0
borders += S
S = locate(origin.x + width, cy, origin.z)
if (!S || istype(S, /turf/space))
boutput(usr, "Error: bordering tile has a gap, cannot magnetize area.")
return 0
borders += S
magnetic_center = locate(origin.x + round(width/2), origin.y + round(height/2), origin.z)
for (var/turf/simulated/floor/T in borders)
T.allows_vehicles = 1
return 1
/obj/item/magnetizer
name = "Magnetizer"
desc = "A gun that manipulates the magnetic flux of an area. The designated area can then be activated or deactivated with a mineral magnet."
icon = 'icons/obj/construction.dmi'
icon_state = "magnet"
var/loaded = 0
force = 0
var/obj/machinery/mining_magnet/construction/magnet = null
examine()
..()
if (loaded)
boutput(usr, "The magnetizer is loaded with a plasmastone. Designate the mineral magnet to attach, then designate the lower left tile of the area to magnetize.")
boutput(usr, "The magnetized area must be a clean shot of space, surrounded by bordering tiles on all sides.")
boutput(usr, "A small mineral magnet requires an 7x7 area of space, a large one requires a 15x15 area of space.")
else
boutput(usr, "The magnetizer must be loaded with a chunk of plasmastone to use.")
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/raw_material/plasmastone) && !loaded)
loaded = 1
boutput(user, "You charge the magnetizer with the plasmastone.")
qdel(W)
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (!magnet)
if (istype(target, /obj/machinery/magnet_chassis))
magnet = target:linked_magnet
else
magnet = target
if (!istype(magnet))
magnet = null
else
if (!loaded)
boutput(user, "The magnetizer needs to be loaded with a plasmastone chunk first.")
magnet = null
else if (magnet.target)
boutput(user, "That magnet is already locked onto a location.")
magnet = null
else
boutput(user, "Magnet locked. Designate lower left tile of target area (excluding the borders).")
else if (istype(target, /turf/space) && magnet)
if (!loaded)
boutput(user, "The magnetizer needs to be loaded with a plasmastone chunk first.")
if (magnet.target)
boutput(user, "Magnet target already designated. Unlocking.")
magnet = null
return
var/turf/T = target
var/obj/magnet_target_marker/M = new magnet.marker_type(T)
var/turf/A = M.DL()
var/turf/B = M.DR()
var/turf/C = M.UL()
var/turf/D = M.UR()
var/turf/O = get_turf(magnet)
var/dist = min(min(get_dist(A, O), get_dist(B, O)), min(get_dist(C, O), get_dist(D, O)))
if (dist > 10)
boutput(user, "Designation failed: designated tile is outside magnet range.")
qdel(M)
else if (!M.construct())
boutput(user, "Designation failed.")
qdel(M)
else
boutput(user, "Designation successful. The magnet is now fully operational.")
magnet.target = M
loaded = 0
magnet = null
/obj/machinery/mining_magnet
name = "mineral magnet"
desc = "A piece of machinery able to generate a strong magnetic field to attract mineral sources."
icon = 'icons/obj/64x64.dmi'
icon_state = "magnet"
opacity = 0
density = 0 // collision is dealt with by the chassis
anchored = 1
var/obj/machinery/magnet_chassis/linked_chassis = null
var/health = 100
var/attract_time = 300
var/cooldown_time = 1200
var/active = 0
var/last_used = 0
var/automatic_mode = 0
var/auto_delay = 100
var/last_delay = 0
var/cooldown_override = 0
var/malfunctioning = 0
var/rarity_mod = 0
var/image/active_overlay = null
var/list/damage_overlays = list()
var/sound_activate = 'sound/machines/ArtifactAnc1.ogg'
var/sound_destroyed = 'sound/effects/robogib.ogg'
var/obj/machinery/power/apc/mining_apc = null
proc/get_magnetic_center()
return mining_controls.magnetic_center
proc/get_scan_range()
return 6
proc/check_for_unacceptable_content()
return mining_controls.magnet_area.check_for_unacceptable_content()
construction
var/marker_type = /obj/magnet_target_marker
var/obj/magnet_target_marker/target = null
var/list/wall_bits = list()
get_magnetic_center()
if (target)
return target.magnetic_center
return null
get_scan_range()
if (target)
return target.scan_range
return 0
check_for_unacceptable_content()
if (target)
return target.check_for_unacceptable_content()
return 1
New()
..()
if (mining_apc)
mining_apc = null // Don't want random apcs across the map going haywire.
process()
if (!target)
return
if (automatic_mode && last_used < world.time && last_delay < world.time)
if (target.check_for_unacceptable_content())
last_delay = world.time + auto_delay
return
else
spawn
pull_new_source()
proc/get_encounter(var/rarity_mod)
return mining_controls.select_encounter(rarity_mod)
pull_new_source()
if (!target)
return
if (!wall_bits.len)
wall_bits = target.generate_walls()
for (var/obj/forcefield/mining/M in wall_bits)
M.opacity = 1
M.density = 1
M.invisibility = 0
active = 1
if (last_used > world.time)
damage(rand(2,6))
last_used = world.time + cooldown_time
playsound(src.loc, sound_activate, 100, 0, 3, 0.25)
build_icon()
target.erase_area()
var/sleep_time = attract_time
if (sleep_time < 1)
sleep_time = 20
sleep_time /= 2
if (malfunctioning && prob(20))
do_malfunction()
sleep(sleep_time)
var/datum/mining_encounter/MC = get_encounter(rarity_mod)
MC.generate(target)
sleep(sleep_time)
if (malfunctioning && prob(20))
do_malfunction()
active = 0
build_icon()
for (var/obj/forcefield/mining/M in wall_bits)
M.opacity = 0
M.density = 0
M.invisibility = 101
src.updateUsrDialog()
return
small
marker_type = /obj/magnet_target_marker/small
get_encounter(rarity_mod)
return mining_controls.select_small_encounter(rarity_mod)
New()
..()
active_overlay = image(src.icon, "active")
damage_overlays += image(src.icon, "damage-1")
damage_overlays += image(src.icon, "damage-2")
damage_overlays += image(src.icon, "damage-3")
damage_overlays += image(src.icon, "damage-4")
spawn(0)
for (var/obj/machinery/magnet_chassis/MC in range(1,src))
linked_chassis = MC
MC.linked_magnet = src
break
for (var/obj/machinery/power/apc/APC in range(20,src))
var/area/the_area = get_area(APC)
if (the_area.type == /area/station/quartermaster/magnet)
mining_apc = APC
break
process()
..()
if (automatic_mode && last_used < world.time && last_delay < world.time)
if (mining_controls.magnet_area.check_for_unacceptable_content())
last_delay = world.time + auto_delay
return
else
spawn(0) //Did you know that if you sleep directly in process() you are the old lady at the mall who only pays in quarters.
//Do not be quarter lady.
pull_new_source()
disposing()
src.visible_message("[src] breaks apart!")
robogibs(src.loc,null)
playsound(src.loc, src.sound_destroyed, 50, 2)
overlays = list()
damage_overlays = list()
linked_chassis = null
active_overlay = null
sound_activate = null
..()
examine()
..()
if (src.health < 100)
if (src.health < 50)
boutput(usr, "It's rather badly damaged. It probably needs some wiring replaced inside.")
else
boutput(usr, "It's a bit damaged. It looks like it needs some welding done.")
ex_act(severity)
switch(severity)
if(1)
src.damage(rand(75,120))
if(2)
src.damage(rand(25,75))
if(3)
src.damage(rand(10,25))
meteorhit()
src.damage(rand(10,25))
return
blob_act(var/power)
return
bullet_act(var/obj/projectile/P)
return
attackby(obj/item/W as obj, mob/user as mob)
if (src.active)
boutput(user, "It's way too dangerous to do that while it's active!")
return
if (istype(W,/obj/item/weldingtool/))
var/obj/item/weldingtool/WELD = W
if (src.health < 50)
boutput(usr, "You need to use wire to fix the cabling first.")
return
if (WELD.get_fuel() > 1)
src.damage(-10)
src.malfunctioning = 0
WELD.use_fuel(1)
user.visible_message("[user] uses [WELD] to repair some of [src]'s damage.")
playsound(src.loc, "sound/items/Welder.ogg", 50, 1)
if (src.health >= 100)
boutput(user, "[src] looks fully repaired!")
else
boutput(user, "[WELD] needs more fuel to do that.")
else if (istype(W,/obj/item/cable_coil/))
var/obj/item/cable_coil/C = W
if (src.health > 50)
boutput(usr, "The cabling looks fine. Use a welder to repair the rest of the damage.")
return
C.use(1)
src.damage(-10)
user.visible_message("[user] uses [C] to repair some of [src]'s cabling.")
playsound(src.loc, "sound/items/Deconstruct.ogg", 50, 1)
if (src.health >= 50)
boutput(user, "The wiring is fully repaired. Now you need to weld the external plating.")
src.malfunctioning = 0
else
..()
if (W.hitsound)
playsound(src.loc, W.hitsound, 50, 1)
if (W.force)
var/damage = W.force
damage /= 3
if (istype(user,/mob/living/carbon/))
var/mob/living/carbon/C = user
if (C.bioHolder)
if (C.bioHolder.HasEffect("hulk"))
damage *= 4
if (C.bioHolder.HasEffect("strong"))
damage *= 2
if (damage >= 10)
src.damage(damage)
proc/build_icon()
src.overlays = list()
if (damage_overlays.len == 4)
switch(src.health)
if (70 to 94)
src.overlays += damage_overlays[1]
if (40 to 69)
src.overlays += damage_overlays[2]
if (10 to 39)
src.overlays += damage_overlays[3]
if (-INFINITY to 10)
src.overlays += damage_overlays[4]
if (src.active)
src.overlays += src.active_overlay
proc/damage(var/amount)
if (!isnum(amount))
return
src.health -= amount
src.health = max(0,min(src.health,100))
if (src.health < 1 && !src.active)
qdel(src)
return
build_icon()
if (!prob(src.health) && amount > 0)
src.malfunctioning = 1
return
proc/do_malfunction()
var/picker = rand(1,2)
switch(picker)
if (1)
src.visible_message("[src] makes a loud bang! That didn't sound too good...")
playsound(src.loc, "sound/misc/meteorimpact.ogg", 50, 1)
src.damage(rand(5,10))
if (2)
if (istype(mining_apc))
mining_apc.visible_message("Magnetic feedback causes [mining_apc] to go haywire!")
mining_apc.zapStuff()
proc/pull_new_source()
for (var/obj/forcefield/mining/M in mining_controls.magnet_shields)
M.opacity = 1
M.density = 1
M.invisibility = 0
active = 1
if (last_used > world.time)
damage(rand(2,6))
last_used = world.time + cooldown_time
playsound(src.loc, sound_activate, 100, 0, 3, 0.25)
build_icon()
for (var/obj/O in mining_controls.magnet_area.contents)
if (!(O.type in mining_controls.magnet_do_not_erase))
qdel(O)
for (var/turf/simulated/T in mining_controls.magnet_area.contents)
if (!istype(T,/turf/simulated/floor/plating/airless/catwalk/))
qdel(T)
for (var/turf/space/S in mining_controls.magnet_area.contents)
S.overlays = list()
var/sleep_time = attract_time
if (sleep_time < 1)
sleep_time = 20
sleep_time /= 2
if (malfunctioning && prob(20))
do_malfunction()
sleep(sleep_time)
var/datum/mining_encounter/MC = mining_controls.select_encounter(rarity_mod)
MC.generate(null)
sleep(sleep_time)
if (malfunctioning && prob(20))
do_malfunction()
active = 0
build_icon()
for (var/obj/forcefield/mining/M in mining_controls.magnet_shields)
M.opacity = 0
M.density = 0
M.invisibility = 101
src.updateUsrDialog()
return
proc/generate_interface(var/mob/user as mob)
user.machine = src
var/dat = "
Magnet Status:
"
dat += "Condition: "
switch(src.health)
if (95 to INFINITY)
dat += "Optimal"
if (70 to 94)
dat += "Mild Structural Damage"
if (40 to 69)
dat += "Heavy Structural Damage"
if (10 to 39)
dat += "Extreme Structural Damage"
if (-INFINITY to 10)
dat += "Destruction Imminent"
dat += "
Status: "
if (src.active)
dat += "Pulling New Mineral Source"
else
if (src.last_used > world.time)
dat += "Cooling Down: Ready in T-[max(0,round((src.last_used - world.time) / 10))]"
if (src.cooldown_override)
dat += "
Cooldown Override Engaged"
else
dat += "Idle"
dat += "
"
if (src.active)
dat += "Magnet Active
"
else
if (src.last_used > world.time)
if (src.cooldown_override)
dat += "Activate Magnet (On Cooldown!)
"
else
dat += "Magnet Cooling Down
"
else
dat += "Activate Magnet
"
dat += "Scan Mining Area
"
var/auto_mode = "Enable Automatic Mode"
if (src.automatic_mode)
auto_mode = "Disable Automatic Mode"
dat += "[auto_mode]
"
var/override_text = "Override Cooldown"
if (src.cooldown_override)
override_text = "Disable Cooldown Override"
dat += "[override_text]
"
dat += "
Close"
usr << browse(dat, "window=computer;size=300x400")
onclose(usr, "computer")
return null
Topic(href, href_list)
if(stat & (NOPOWER|BROKEN))
boutput(usr, "That machine is not powered.")
return 1
if(usr.restrained() || usr.lying || usr.stat)
boutput(usr, "You are currently unable to do that.")
return 1
var/rangecheck = 0
if (istype(usr, /mob/living/silicon))
rangecheck = 1
if (istype(usr.loc,/obj/machinery/vehicle/))
var/obj/machinery/vehicle/V = usr.loc
if (istype(V.com_system,/obj/item/shipcomponent/communications/mining) && V.com_system.active)
rangecheck = 1
for(var/obj/machinery/computer/magnet/M in range(usr,1))
rangecheck = 1
break
if (!rangecheck)
boutput(usr, "You aren't in range of the controls.")
return
usr.machine = src
if (!istype(src))
boutput(usr, "Error. Magnet not detected.")
src.updateUsrDialog()
return
else if (href_list["activate_magnet"])
if (ticker.mode && !istype(ticker.mode, /datum/game_mode/construction) && !istype(mining_controls.magnet_area))
boutput(usr, "Uh oh, something's gotten really fucked up with the magnet system. Please report this to a coder!")
return
if (src.check_for_unacceptable_content())
src.visible_message("[src.name] states, \"Safety lock engaged. Please remove all personnel and vehicles from the magnet area.\"")
else
spawn (0)
if (src) src.pull_new_source()
else if (href_list["override_cooldown"])
if (!istype(usr,/mob/living/carbon/human/))
boutput(usr, "AI and robotic personnel may not access the override.")
else
var/mob/living/carbon/human/H = usr
if(!src.allowed(H, req_only_one_required))
boutput(usr, "Access denied. Please contact the Chief Engineer or Captain to access the override.")
else
src.cooldown_override = !src.cooldown_override
else if (href_list["auto_mode"])
src.automatic_mode = !src.automatic_mode
else if (href_list["geo_scan"])
var/MC = src.get_magnetic_center()
if (!MC)
boutput(usr, "Error. Magnet is not magnetized.")
src.updateUsrDialog()
return
mining_scan(MC, usr, src.get_scan_range())
src.generate_interface(usr)
return
/obj/machinery/computer/magnet
name = "mineral magnet controls"
icon = 'icons/obj/computer.dmi'
icon_state = "mmagnet"
var/temp = null
var/list/linked_magnets = list()
var/obj/machinery/mining_magnet/linked_magnet = null
req_access = list(access_engineering_chief)
New()
..()
spawn(0)
src.connection_scan()
attackby(obj/I as obj, mob/user as mob)
if (istype(I, /obj/item/screwdriver))
playsound(src.loc, "sound/items/Screwdriver.ogg", 50, 1)
if (do_after(user, 20))
if (src.stat & BROKEN)
user.show_text("The broken glass falls out.", "blue")
var/obj/computerframe/A = new /obj/computerframe(src.loc)
if (src.material)
A.setMaterial(src.material)
new /obj/item/raw_material/shard/glass(src.loc)
var/obj/item/circuitboard/mining_magnet/M = new /obj/item/circuitboard/mining_magnet(A)
for (var/obj/C in src)
C.set_loc(src.loc)
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
qdel(src)
else
user.show_text("You disconnect the monitor.", "blue")
var/obj/computerframe/A = new /obj/computerframe(src.loc)
if (src.material)
A.setMaterial(src.material)
var/obj/item/circuitboard/mining_magnet/M = new /obj/item/circuitboard/mining_magnet(A)
for (var/obj/C in src)
C.set_loc(src.loc)
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
qdel(src)
else
src.attack_hand(user)
return
attack_hand(var/mob/user as mob)
if(..())
return
if (istype(linked_magnet))
linked_magnet.generate_interface(user)
else
user.machine = src
var/dat = "Mineral Mining Magnet Terminal
"
dat += "Scan for Magnets
"
dat += "Choose linked magnet:
"
for (var/obj/M in linked_magnets)
dat += "[M] at ([M.x], [M.y])
"
dat += "
Selected magnet:
"
if (linked_magnet)
dat += "[linked_magnet] at ([linked_magnet.x], [linked_magnet.y])
"
else
dat += "None
"
//dat += "
Disconnect Terminal from Magnet"
dat += "
Close"
user << browse(dat, "window=computer;size=300x400")
onclose(user, "computer")
return
Topic(href, href_list)
if(..())
return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.machine = src
src.add_fingerprint(usr)
if (href_list["choosemagnet"])
linked_magnet = locate(href_list["choosemagnet"])
if (!linked_magnet)
linked_magnet = null
src.visible_message("[src.name] states, \"Designated magnet is no longer operational.\"")
else if (href_list["scan_for_connection"])
switch(src.connection_scan())
if(1)
src.visible_message("[src.name] states, \"Unoccupied Magnet Chassis located. Please connect magnet system to chassis.\"")
if(2)
src.visible_message("[src.name] states, \"Magnet equipment not found within range.\"")
else
src.visible_message("[src.name] states, \"Magnet equipment located. Link established.\"")
else if (href_list["unlink"])
src.linked_magnet = null
src.updateUsrDialog()
return
proc/connection_scan()
linked_magnets = list()
var/badmagnets = 0
for (var/obj/machinery/magnet_chassis/MC in range(20,src))
if (MC.linked_magnet)
linked_magnets += MC.linked_magnet
else
badmagnets++
if (linked_magnets.len)
return 0
if (badmagnets)
return 1
return 2
// Turf Defines
/turf/simulated/wall/asteroid
name = "asteroid"
desc = "A free-floating mineral deposit from space."
icon = 'icons/turf/asteroid.dmi'
icon_state = "ast1"
var/stone_color = "#CCCCCC"
var/hardness = 0
var/weakened = 0
var/amount = 2
var/invincible = 0
var/quality = 0
var/default_ore = /obj/item/raw_material/rock
var/datum/ore/ore = null
var/datum/ore/event/event = null
var/list/space_overlays = list()
RL_Ignore = 1
ice
name = "comet chunk"
desc = "That's some cold stuff right there."
stone_color = "#D1E6FF"
default_ore = /obj/item/raw_material/ice
geode
name = "compacted stone"
desc = "This rock looks really hard to dig out."
stone_color = "#575A5E"
default_ore = null
hardness = 10
New(var/loc,var/do_overlays_now = 1)
src.icon_state = pick("ast1","ast2","ast3")
..()
if (do_overlays_now)
src.space_overlays()
ex_act(severity)
switch(severity)
if(1.0)
src.damage_asteroid(7)
if(2.0)
src.damage_asteroid(5)
if(3.0)
src.damage_asteroid(3)
return
meteorhit(obj/M as obj)
src.damage_asteroid(5)
blob_act(var/power)
if(prob(power))
src.damage_asteroid(7)
dismantle_wall()
return src.destroy_asteroid()
get_desc(dist)
if (dist > 1)
return
if (istype(usr, /mob/living/carbon/human))
if (usr.bioHolder && usr.bioHolder.HasEffect("training_miner"))
if (istype (src.ore,/datum/ore/))
var/datum/ore/O = src.ore
. = "It looks like it contains [O.name]."
else
. = "Doesn't look like there's any valuable ore here."
if (src.event)
. += "
There's something not quite right here..."
attack_hand(var/mob/user as mob)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if (istype(H.gloves, /obj/item/clothing/gloves/concussive))
var/obj/item/clothing/gloves/concussive/C = H.gloves
src.dig_asteroid(user,C.tool)
return
else if (H.bioHolder && H.bioHolder.HasEffect("hulk"))
H.visible_message("[H.name] punches [src] with great strength!")
playsound(H.loc, "sound/misc/meteorimpact.ogg", 100, 1)
src.damage_asteroid(3)
return
..()
attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/mining_tool/))
var/obj/item/mining_tool/T = W
src.dig_asteroid(user,T)
if (T.status)
T.process_charges(1)
else if (istype(W, /obj/item/oreprospector))
var/message = "----------------------------------
"
message += "Geological Report:
"
var/datum/ore/O = src.ore
var/datum/ore/event/E = src.event
if (O)
message += "This stone contains [O.name].
"
message += "Analysis suggests [src.amount] units of viable ore are present.
"
else
message += "This rock contains no known ores.
"
message += "The rock here has a hardness rating of [src.hardness].
"
if (src.weakened)
message += "The rock here has been weakened.
"
if (E)
if (E.analysis_string)
message += "[E.analysis_string]
"
message += "----------------------------------"
boutput(user, message)
else
boutput(user, "You hit the [src.name] with [W], but nothing happens!")
return
proc/build_icon(var/wipe_overlays = 0)
if (wipe_overlays)
src.overlays = list()
var/image/coloration = image(src.icon,"color_overlay")
coloration.blend_mode = 4
coloration.color = src.stone_color
src.overlays += coloration
proc/space_overlays()
for (var/turf/space/A in orange(src,1))
var/image/edge_overlay = image('icons/turf/asteroid.dmi', "edge[GetOppositeDirection(get_dir(src,A))]")
edge_overlay.layer = src.layer + 1
edge_overlay.color = src.stone_color
A.overlays += edge_overlay
src.space_overlays += edge_overlay
proc/dig_asteroid(var/mob/living/user, var/obj/item/mining_tool/tool)
if (!user || !tool) return
var/datum/ore/event/E = src.event
if (tool.status)
playsound(user.loc, tool.hitsound_charged, 50, 1)
else
playsound(user.loc, tool.hitsound_uncharged, 50, 1)
if (tool.weakener)
src.weaken_asteroid()
var/strength = tool.dig_strength
if (istype(user,/mob/living/carbon/))
var/mob/living/carbon/C = user
if (C.bioHolder && C.bioHolder.HasOneOfTheseEffects("strong","hulk"))
strength++
var/minedifference = src.hardness - strength
if (E)
E.onHit(src)
//user.visible_message("[user.name] strikes [src] with [tool].")
var/dig_chance = 100
var/dig_feedback = null
switch(minedifference)
if (1)
dig_chance = 30
dig_feedback = "This rock is tough. You may need a stronger tool."
if (2)
dig_chance = 10
dig_feedback = "This rock is very tough. You need a stronger tool."
if (3 to INFINITY)
dig_chance = 0
dig_feedback = "You can't even make a dent! You need a stronger tool."
if (prob(dig_chance))
destroy_asteroid()
else
if (dig_feedback)
boutput(user, "[dig_feedback]")
return
proc/weaken_asteroid()
if (src.weakened)
return
src.weakened = 1
if (src.hardness >= 1)
src.hardness /= 2
else
src.hardness = 0
src.overlays += image('icons/turf/asteroid.dmi', "weakened")
proc/damage_asteroid(var/power)
// use this for stuff that arent mining tools but still attack asteroids
if (!isnum(power) || power <= 0)
return
var/difference = src.hardness - power
if (difference <= 0)
destroy_asteroid()
else
if (rand(1,difference) == 1)
weaken_asteroid()
return
proc/destroy_asteroid()
var/datum/ore/O = src.ore
var/datum/ore/event/E = src.event
if (src.invincible)
return
if (E)
if (E.excavation_string)
src.visible_message("[E.excavation_string]")
E.onExcavate(src)
var/ore_to_create = src.default_ore
if (ispath(ore_to_create))
if (O)
ore_to_create = O.output
var/makeores
for(makeores = src.amount, makeores > 0, makeores--)
var/obj/item/raw_material/MAT = new ore_to_create(src)
if(MAT.material)
if(MAT.material.quality != 0) //If it's 0 then that's probably the default, so let's use the asteroids quality only if it's higher. That way materials that have a quality by default will not occur at any quality less than the set one. And materials that do not have a quality by default, use the asteroids quality instead.
var/newQual = max(MAT.material.quality, src.quality)
MAT.material.quality = newQual
MAT.quality = newQual
else
MAT.material.quality = src.quality
MAT.quality = src.quality
MAT.name = getOreQualityName(MAT.quality) + " [MAT.name]"
score_oremined += 1
if(!icon_old)
icon_old = icon_state
var/turf/simulated/floor/plating/airless/asteroid/W
var/old_dir = dir
var/new_color = src.stone_color
W = new /turf/simulated/floor/plating/airless/asteroid(locate(src.x, src.y, src.z))
W.stone_color = new_color
W.dir = old_dir
W.opacity = 1
W.RL_SetOpacity(0)
W.levelupdate()
for (var/turf/simulated/floor/plating/airless/asteroid/A in range(W,1))
A.update_icon()
return W
proc/set_event(var/datum/ore/event/E)
if (!istype(E))
return
src.event = E
E.onGenerate(src)
if (E.prevent_excavation)
src.invincible = 1
if (E.nearby_tile_distribution_min > 0 && E.nearby_tile_distribution_max > 0)
var/distributions = rand(E.nearby_tile_distribution_min,E.nearby_tile_distribution_max)
var/list/usable_turfs = list()
for (var/turf/simulated/wall/asteroid/AST in range(E.distribution_range,src))
if (!isnull(AST.event))
continue
usable_turfs += AST
var/turf/simulated/wall/asteroid/AST
while (distributions > 0)
distributions--
if (usable_turfs.len < 1)
break
AST = pick(usable_turfs)
AST.event = E
E.onGenerate(AST)
usable_turfs -= AST
/turf/simulated/floor/plating/airless/asteroid
name = "asteroid"
icon = 'icons/turf/asteroid.dmi'
icon_state = "astfloor1"
oxygen = 0.01
nitrogen = 0.01
temperature = TCMB
luminosity = 1
RL_Ignore = 1
var/sprite_variation = 1
var/stone_color = null
var/image/coloration_overlay = null
New()
..()
src.sprite_variation = rand(1,3)
icon_state = "astfloor" + "[sprite_variation]"
coloration_overlay = image(src.icon,"color_overlay")
coloration_overlay.blend_mode = 4
ex_act(severity)
return
proc/destroy_asteroid()
return
proc/damage_asteroid(var/power)
return
proc/weaken_asteroid()
return
update_icon()
src.overlays = list()
if (!coloration_overlay)
coloration_overlay = image(src.icon, "color_overlay")
coloration_overlay.color = src.stone_color
src.overlays += coloration_overlay
for (var/turf/simulated/wall/asteroid/A in orange(src,1))
src.apply_edge_overlay(get_dir(src, A))
for (var/turf/space/A in orange(src,1))
src.apply_edge_overlay(get_dir(src, A))
proc/apply_edge_overlay(var/thedir)
var/image/dig_overlay = image('icons/turf/asteroid.dmi', "edge[thedir]")
dig_overlay.color = src.stone_color
dig_overlay.layer = src.layer + 1
src.overlays += dig_overlay
// Tool Defines
/obj/item/mining_tool
name = "pickaxe"
desc = "A thing to bash rocks with until they become smaller rocks."
icon = 'icons/obj/mining.dmi'
icon_state = "pickaxe"
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
item_state = "pick"
w_class = 2
flags = ONBELT
force = 7
var/dig_strength = 1
var/charges = 0
var/maximum_charges = 0
var/status = 0
var/weakener = 0
var/image/powered_overlay = null
var/sound/hitsound_charged = 'sound/effects/pickaxe.ogg'
var/sound/hitsound_uncharged = 'sound/effects/pickaxe.ogg'
module_research = list("tools" = 3, "engineering" = 1, "mining" = 1)
// Seems like a basic bit of user feedback to me (Convair880).
examine()
..()
if (src.maximum_charges <= 0) return
if (isrobot(usr)) return // Drains battery instead.
boutput(usr, "The [src.name] is turned [src.status ? "on" : "off"]. There are [src.charges]/[src.maximum_charges] charges left!")
return
proc/process_charges(var/use)
if (!isnum(use) || use < 0)
return 0
if (src.charges < 1)
return 0
src.charges -= use
src.charges = max(0,min(src.charges,src.maximum_charges))
if (charges == 0)
src.power_down()
var/turf/T = get_turf(src)
T.visible_message("[src] runs out of charge and powers down!")
return 1
proc/power_up()
src.status = 1
if (powered_overlay)
src.overlays += powered_overlay
return
proc/power_down()
src.status = 0
if (powered_overlay)
src.overlays = null
return
obj/item/clothing/gloves/concussive
name = "concussion gauntlets"
desc = "These gloves enable miners to punch through solid rock with their hands instead of using tools."
icon_state = "cgaunts"
item_state = "bgloves"
material_prints = "industrial-grade mineral fibers"
var/obj/item/mining_tool/tool = null
New()
..()
var/obj/item/mining_tool/T = new /obj/item/mining_tool(src)
src.tool = T
T.name = src.name
T.desc = src.desc
T.dig_strength = 4
T.hitsound_charged = 'sound/effects/bang.ogg'
T.hitsound_uncharged = 'sound/effects/bang.ogg'
/obj/item/mining_tool/power_pick
name = "power pick"
desc = "An energised mining tool."
icon = 'icons/obj/mining.dmi'
icon_state = "powerpick"
item_state = "ppick"
flags = ONBELT
w_class = 2
dig_strength = 2
maximum_charges = 50
hitsound_charged = 'sound/effects/bang.ogg'
hitsound_uncharged = 'sound/effects/pickaxe.ogg'
module_research = list("tools" = 5, "engineering" = 2, "mining" = 3)
New()
..()
powered_overlay = image('icons/obj/mining.dmi', "pp-glow")
charges = maximum_charges
src.power_up()
attack_self(var/mob/user as mob)
if (src.process_charges(0))
if (!src.status)
boutput(user, "You power up [src].")
src.power_up()
else
boutput(user, "You power down [src].")
src.power_down()
else
boutput(user, "No charge left in [src].")
attack(target as mob, mob/user as mob)
if(src.status)
src.process_charges(1)
..()
power_up()
..()
src.force = 15
src.dig_strength = 2
power_down()
..()
src.force = 7
src.dig_strength = 1
borg
process_charges(var/use)
var/mob/living/silicon/robot/R = usr
if (istype(R))
if (R.cell.charge > use * 200)
R.cell.use(200 * use)
return 1
return 0
else
. = ..()
/obj/item/mining_tool/drill
name = "laser drill"
desc = "Safe mining tool that doesn't require recharging."
icon = 'icons/obj/mining.dmi'
icon_state = "lasdrill"
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
item_state = "drill"
w_class = 2
flags = ONBELT
force = 10
mats = 4
dig_strength = 2
hitsound_charged = 'sound/items/Welder.ogg'
hitsound_uncharged = 'sound/items/Welder.ogg'
module_research = list("tools" = 5, "engineering" = 3, "mining" = 5)
/obj/item/mining_tool/powerhammer
name = "power hammer"
desc = "An energised mining tool."
icon = 'icons/obj/mining.dmi'
icon_state = "powerhammer"
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
item_state = "hammer"
w_class = 2
maximum_charges = 30
force = 10
dig_strength = 3
hitsound_charged = 'sound/effects/bang.ogg'
hitsound_uncharged = 'sound/effects/pickaxe.ogg'
module_research = list("tools" = 5, "engineering" = 1, "mining" = 5)
New()
..()
src.powered_overlay = image('icons/obj/mining.dmi', "ph-glow")
charges = maximum_charges
src.power_up()
power_up()
..()
src.force = 10
dig_strength = 3
weakener = 1
power_down()
..()
src.force = 20
dig_strength = 1
weakener = 0
attack_self(var/mob/user as mob)
if (src.process_charges(0))
if (!src.status)
boutput(user, "You power up [src].")
src.power_up()
else
boutput(user, "You power down [src].")
src.power_down()
else
boutput(user, "No charge left in [src].")
attack(target as mob, mob/user as mob)
..()
if (src.status)
src.process_charges(1)
borg
process_charges(var/use)
var/mob/living/silicon/robot/R = usr
if (istype(R))
if (R.cell.charge > use * 200)
R.cell.use(200 * use)
return 1
return 0
else
. = ..()
/obj/item/breaching_charge/mining
name = "concussive charge"
desc = "It is set to detonate in 5 seconds."
flags = ONBELT
w_class = 1
var/emagged = 0
var/hacked = 0
expl_devas = 0
expl_heavy = 1
expl_light = 2
expl_flash = 4
light
name = "low-yield concussive charge"
desc = "It is set to detonate in 5 seconds."
expl_devas = 0
expl_heavy = 0
expl_light = 1
expl_flash = 2
light/hacked
hacked = 1
desc = "It is set to detonate in 5 seconds. The safety light is off."
hacked
hacked = 1
desc = "It is set to detonate in 5 seconds. The safety light is off."
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (user.equipped() == src)
if (!src.state)
if(user.bioHolder.HasEffect("clumsy") || src.emagged)
if(src.emagged)
user.visible_message("CLICK")
boutput(user, "The timing mechanism malfunctions!")
else
boutput(user, "Huh? How does this thing work?!")
logTheThing("combat", user, null, "accidentally triggers [src] (clumsy bioeffect) at [log_loc(user)].")
spawn(5)
concussive_blast()
qdel (src)
return
else
if (istype(target, /turf/simulated/wall/asteroid/) && !src.hacked)
boutput(user, "You slap the charge on [target], [det_time/10] seconds!")
user.visible_message("[user] has attached [src] to [target].")
src.icon_state = "bcharge2"
user.drop_item()
// Yes, please (Convair880).
if (src && src.hacked)
logTheThing("combat", user, null, "attaches a hacked [src] to [target] at [log_loc(target)].")
user.dir = get_dir(user, target)
user.drop_item()
var/t = (isturf(target) ? target : target.loc)
step_towards(src, t)
spawn( src.det_time )
concussive_blast()
if(target)
if(istype(target,/obj/machinery))
qdel(target)
qdel(src)
return
else if (src.hacked) ..()
else boutput(user, "These will only work on asteroids.")
return
emag_act(var/mob/user, var/obj/item/card/emag/E)
if(!src.emagged && !src.hacked)
if (user)
boutput(user, "You short out the timing mechanism!")
src.desc += " It has been tampered with."
src.emagged = 1
return 1
else
if (user)
boutput(user, "This has already been tampered with.")
return 0
demag(var/mob/user)
if (!src.emagged)
return 0
if (user)
boutput(user, "You repair the timing mechanism!")
src.emagged = 0
src.desc = null
src.desc = "It is set to detonate in 5 seconds."
return 1
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/device/chargehacker))
if(!src.emagged && !src.hacked)
boutput(user, "You short out the attachment mechanism, removing its restrictions!")
src.desc += " It has been tampered with."
src.hacked = 1
else
boutput(user, "This has already been tampered with.")
else ..()
proc/concussive_blast()
playsound(src.loc, "sound/weapons/flashbang.ogg", 50, 1)
for (var/turf/simulated/wall/asteroid/A in range(src.expl_flash,src))
if(get_dist(src,A) <= src.expl_heavy)
A.damage_asteroid(4)
if(get_dist(src,A) <= src.expl_light)
A.damage_asteroid(3)
if(get_dist(src,A) <= src.expl_flash)
A.damage_asteroid(2)
for(var/mob/living/carbon/C in range(src.expl_flash, src))
if (C.stat != 2 && C.client) shake_camera(C, 3, 2)
if(get_dist(src,C) <= src.expl_light)
C.stunned += 8
C.weakened += 10
C.stuttering += 15
boutput(C, "The concussive blast knocks you off your feet!")
if(get_dist(src,C) <= src.expl_heavy)
C.TakeDamage("All",rand(15,25),0)
boutput(C, "You are battered by the concussive shockwave!")
/obj/item/cargotele
name = "cargo transporter"
desc = "A device for teleporting crated goods."
icon = 'icons/obj/mining.dmi'
icon_state = "cargotele"
var/charges = 10
var/maximum_charges = 10.0
var/robocharge = 250
var/target = null
w_class = 2
flags = ONBELT
mats = 4
examine()
..()
if (isrobot(usr)) return // Drains battery instead.
boutput(usr, "There are [src.charges]/[src.maximum_charges] charges left!")
return
attack_self() // Fixed --melon
if (src.charges < 1)
boutput(usr, "The transporter is out of charge.")
return
if (!cargopads.len) boutput(usr, "No receivers available.")
else
//here i set up an empty var that can take any object, and tell it to look for absolutely anything in the list
var/selection = input("Select Cargo Pad Location:", "Cargo Pads", null, null) as null|anything in cargopads
if(!selection)
return
var/turf/T = get_turf(selection)
//get the turf of the pad itself
if (!T)
boutput(usr, "Target not set!")
return
boutput(usr, "Target set to [T.loc].")
//blammo! works!
src.target = T
proc/cargoteleport(var/obj/T, var/mob/user)
if (!src.target)
boutput(user, "You need to set a target first!")
return
if (src.charges < 1)
boutput(user, "The transporter is out of charge.")
return
if (isrobot(user))
var/mob/living/silicon/robot/R = user
if (R.cell.charge < src.robocharge)
boutput(user, "There is not enough charge left in your cell to use this.")
return
// Why didn't you implement checks for these in the first place, sigh (Convair880).
if (ismob(T.loc) && T.loc == user && issilicon(user))
user.show_text("The [T.name] is securely bolted to your chassis.", "red")
return
boutput(user, "Teleporting [T]...")
playsound(user.loc, "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
// And these too (Convair880).
if (ismob(T.loc) && T.loc == user)
user.u_equip(T)
if (istype(T.loc, /obj/item/storage))
var/obj/item/storage/S_temp = T.loc
var/datum/hud/storage/H_temp = S_temp.hud
H_temp.remove_object(T)
// And logs for good measure (Convair880).
var/is_locked = 0
var/is_welded = 0
if (istype(T, /obj/storage)) // Other containers (e.g. prison artifacts) can hold mobs too.
var/obj/storage/S = T
if (S.locked) is_locked = 1
if (S.welded) is_welded = 1
for (var/mob/M in T.contents)
if (M)
logTheThing("station", user, M, "uses a cargo transporter to send [T.name][is_locked ? " (locked)" : ""][is_welded ? " (welded)" : ""] with %target% inside to [log_loc(src.target)].")
T.set_loc(src.target)
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
s.set_up(5, 1, src)
s.start()
if (istype(user,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
R.cell.charge -= src.robocharge
else
src.charges -= 1
if (src.charges < 0)
src.charges = 0
if (src.charges == 0)
boutput(user, "Transfer successful. The transporter is now out of charge.")
else
boutput(user, "Transfer successful. [src.charges] charges remain.")
return
/obj/item/cargotele/traitor
var/list/possible_targets = list()
New()
for(var/turf/T in world) //hate to do this but it's only once per spawn vOv
if(istype(T,/turf/space) && T.z != 1 && !isrestrictedz(T.z))
possible_targets += T
attack_self() // Fixed --melon
return
cargoteleport(var/obj/T, var/mob/user)
src.target = pick(src.possible_targets)
if (!src.target)
boutput(user, "No target found!")
return
if (src.charges < 1)
boutput(user, "The transporter is out of charge.")
return
boutput(user, "Teleporting [T]...")
playsound(user.loc, "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
// Logs for good measure (Convair880).
for (var/mob/M in T.contents)
if (M)
logTheThing("station", user, M, "uses a Syndicate cargo transporter to send [T.name] with %target% inside to [log_loc(src.target)].")
T.set_loc(src.target)
if(hasvar(T, "welded")) T:welded = 1
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
s.set_up(5, 1, src)
s.start()
src.charges -= 1
if (src.charges < 0)
src.charges = 0
if (src.charges == 0)
boutput(user, "Transfer successful. The transporter is now out of charge.")
else
boutput(user, "Transfer successful. [src.charges] charges remain.")
return
/obj/item/oreprospector
name = "geological scanner"
desc = "A device capable of detecting nearby mineral deposits."
icon = 'icons/obj/mining.dmi'
icon_state = "minanal"
flags = ONBELT
w_class = 1.0
attack_self(var/mob/user as mob)
mining_scan(get_turf(user), user, 6)
/proc/mining_scan(var/turf/T, var/mob/living/L, var/range)
if (!istype(T) || !istype(L))
return
if (!isnum(range) || range < 1)
range = 6
var/stone = 0
var/anomaly = 0
var/list/ores_found = list()
var/datum/ore/O
var/datum/ore/event/E
for (var/turf/simulated/wall/asteroid/AST in range(T,range))
stone++
O = AST.ore
E = AST.event
if (O && !(O.name in ores_found))
ores_found += O.name
if (E)
anomaly++
if (E.scan_decal)
mining_scandecal(L, AST, E.scan_decal)
var/found_string = ""
if (ores_found.len > 0)
var/list_counter = 1
for (var/X in ores_found)
found_string += X
if (list_counter != ores_found.len)
found_string += " * "
list_counter++
else
found_string = "None"
var/rendered = "----------------------------------
"
rendered += "Geological Report:
"
rendered += "Scan Range: [range] meters
"
rendered += "M^2 of Mineral in Range: [stone]
"
rendered += "Ores Found: [found_string]
"
rendered += "Anomalous Readings: [anomaly]
"
rendered += "----------------------------------"
boutput(L, rendered)
/proc/mining_scandecal(var/mob/living/user, var/turf/T, var/decalicon)
if(!user || !T || !decalicon) return
var/image/O = image('icons/obj/mining.dmi',T,decalicon,AREA_LAYER+1)
user << O
spawn(1200)
del O
/obj/machinery/oreaccumulator
name = "mineral accumulator"
desc = "A powerful device for quick ore and salvage collection and movement."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "gravgen-off"
density = 1
opacity = 0
anchored = 0
var/active = 0
var/cell = null
var/target = null
New()
var/obj/item/cell/P = new/obj/item/cell(src)
P.charge = P.maxcharge
src.cell = P
..()
attack_hand(var/mob/user as mob)
if (!src.cell) boutput(user, "It won't work without a power cell!")
else
var/action = input("What do you want to do?", "Mineral Accumulator") in list("Flip the power switch","Change the destination","Remove the power cell")
if (action == "Remove the power cell")
var/obj/item/cell/PCEL = src.cell
user.put_in_hand_or_drop(PCEL)
boutput(user, "You remove [cell].")
PCEL.updateicon()
src.cell = null
else if (action == "Change the destination")
if (!cargopads.len) boutput(usr, "No receivers available.")
else
var/selection = input("Select Cargo Pad Location:", "Cargo Pads", null, null) as null|anything in cargopads
if(!selection)
return
var/turf/T = get_turf(selection)
if (!T)
boutput(usr, "Target not set!")
return
boutput(usr, "Target set to [T.loc].")
src.target = T
else if (action == "Flip the power switch")
if (!src.active)
user.visible_message("[user] powers up [src].", "You power up [src].")
src.active = 1
src.anchored = 1
icon_state = "gravgen-on"
else
user.visible_message("[user] shuts down [src].", "You shut down [src].")
src.active = 0
src.anchored = 0
icon_state = "gravgen-off"
else
user.visible_message("[user] stares at [src] in confusion!", "You're not sure what that did.")
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W,/obj/item/cell/))
if (src.cell) boutput(user, "It already has a power cell inserted!")
else
user.drop_item()
W.set_loc(src)
cell = W
user.visible_message("[user] inserts [W] into [src].", "You insert [W] into [src].")
else ..()
process()
var/moved = 0
if (src.active)
if (!src.cell)
src.visible_message("[src] instantly shuts itself down.")
src.active = 0
src.anchored = 0
icon_state = "gravgen-off"
return
var/obj/item/cell/PCEL = src.cell
if (PCEL.charge <= 0)
src.visible_message("[src] runs out of power and shuts down.")
src.active = 0
src.anchored = 0
icon_state = "gravgen-off"
return
PCEL.charge -= 5
if (src.target)
for(var/obj/item/raw_material/O in orange(1,src))
if (istype(O,/obj/item/raw_material/rock)) continue
PCEL.charge -= 2
O.set_loc(src.target)
for(var/obj/item/scrap/S in orange(1,src))
PCEL.charge -= 2
S.set_loc(src.target)
for(var/obj/decal/cleanable/machine_debris/D in orange(1,src))
PCEL.charge -= 2
D.set_loc(src.target)
for(var/obj/decal/cleanable/robot_debris/R in orange(1,src))
PCEL.charge -= 2
R.set_loc(src.target)
for(var/obj/item/raw_material/O in range(6,src))
if (moved >= 10)
break
if (istype(O,/obj/item/raw_material/rock)) continue
step_towards(O, src.loc)
moved++
for(var/obj/item/scrap/S in range(6,src))
if (moved >= 10)
break
step_towards(S, src.loc)
moved++
for(var/obj/decal/cleanable/machine_debris/D in range(6,src))
if (moved >= 10)
break
step_towards(D, src.loc)
moved++
for(var/obj/decal/cleanable/robot_debris/R in range(6, src))
if (moved >= 10)
break
step_towards(R, src.loc)
moved++
var/global/list/cargopads = list()
/obj/submachine/cargopad
name = "Cargo Pad"
desc = "Used to receive objects transported by a cargo transporter."
icon = 'icons/obj/objects.dmi'
icon_state = "cargopad"
anchored = 1
var/active = 1
podbay
name = "Pod Bay Pad"
hydroponic
name = "Hydroponics Pad"
robotics
name = "Robotics Pad"
artlab
name = "Artifact Lab Pad"
engineering
name = "Engineering Pad"
mechanics
name = "Mechanics Pad"
magnet
name = "Mineral Magnet Pad"
miningoutpost
name = "Mining Outpost Pad"
qm
name = "QM Pad"
New()
..()
src.overlays += image('icons/obj/objects.dmi', "cpad-rec")
if (src.name == "Cargo Pad")
src.name += " ([rand(100,999)])"
if (src.active && !cargopads.Find(src))
cargopads.Add(src)
disposing()
if (cargopads.Find(src))
cargopads.Remove(src)
..()
attack_hand(var/mob/user as mob)
if (src.active == 1)
boutput(user, "You switch the receiver off.")
src.overlays = null
src.active = 0
if (cargopads.Find(src))
cargopads.Remove(src)
else
boutput(user, "You switch the receiver on.")
src.overlays += image('icons/obj/objects.dmi', "cpad-rec")
src.active = 1
if (!cargopads.Find(src))
cargopads.Add(src)
/obj/item/satchel/mining
name = "mining satchel"
desc = "A leather bag. It holds 0/30 ores."
icon_state = "miningsatchel"
allowed = list(/obj/item/raw_material/)
itemstring = "ores"
large
name = "large mining satchel"
desc = "A leather bag. It holds 0/75 ores."
maxitems = 75
compressed
name = "spatially-compressed mining satchel"
desc = "A leather bag. It holds 0/500 ores."
maxitems = 500
/obj/item/ore_scoop
name = "ore scoop"
desc = "A device that sucks up ore into a satchel automatically. Just load in a satchel and walk over ore to scoop it up."
icon = 'icons/obj/mining.dmi'
icon_state = "scoop"
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
item_state = "buildpipe"
w_class = 2
mats = 6
var/obj/item/satchel/mining/satchel = null
borg
New()
..()
var/obj/item/satchel/mining/large/S = new /obj/item/satchel/mining/large(src)
satchel = S
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W,/obj/item/satchel/mining/))
var/obj/item/satchel/mining/S = W
if (satchel)
boutput(user, "There's already a satchel hooked up to [src].")
return
user.drop_item()
S.set_loc(src)
satchel = S
icon_state = "scoop-bag"
user.visible_message("[user] inserts [S] into [src].", "You insert [S] into [src].")
else
..()
return
attack_self(var/mob/user as mob)
if(!issilicon(user))
if (satchel)
user.visible_message("[user] unloads [satchel] from [src].", "You unload [satchel] from [src].")
satchel.set_loc(get_turf(user))
satchel = null
icon_state = "scoop"
else
boutput(user, "There's no satchel in [src] to unload.")
else
boutput(user, "The satchel is firmly secured.")
afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
if (!isturf(target))
target = get_turf(target)
if (!satchel)
boutput(user, "There's no satchel in [src] to dump out.")
return
if (satchel.contents.len < 1)
boutput(user, "The satchel in [src] is empty.")
return
user.visible_message("[user] dumps out [src]'s satchel contents.", "You dump out [src]'s satchel contents.")
for (var/obj/item/I in satchel.contents)
I.set_loc(target)
satchel.satchel_updateicon()
////// Shit that goes in the asteroid belt, might split it into an exploring.dm later i guess
/turf/simulated/wall/ancient
name = "strange wall"
desc = "A weird jet black metal wall indented with strange grooves and lines."
icon_state = "ancient"
attackby(obj/item/W as obj, mob/user as mob)
boutput(usr, "You attack [src] with [W] but fail to even make a dent!")
return
ex_act(severity)
if (severity == 1.0)
if (prob(8))
src.opacity = 0
src.density = 0
src.icon_state = "ancient-b"
return
else return
/turf/simulated/floor/ancient
name = "strange surface"
desc = "A strange jet black metal floor. There are odd lines carved into it."
icon_state = "ancient"
attackby(obj/item/W as obj, mob/user as mob)
boutput(usr, "You attack [src] with [W] but fail to even make a dent!")
return
ex_act(severity)
return
// mining related critters
/obj/critter/rockworm
name = "rock worm"
desc = "Tough lithovoric worms."
icon_state = "rockworm"
density = 0
health = 80
aggressive = 1
defensive = 0
wanderer = 1
opensdoors = 0
atkcarbon = 0
atksilicon = 0
firevuln = 0.1
brutevuln = 1
angertext = "hisses at"
butcherable = 1
var/eaten = 0
seek_target()
src.anchored = 0
for (var/obj/item/raw_material/C in view(src.seekrange,src))
if (src.target)
src.task = "chasing"
break
if ((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
src.attack = 1
if (src.attack)
src.target = C
src.oldtarget_name = C.name
src.visible_message("[src] sees [C.name]!")
src.task = "chasing"
break
else
continue
CritterAttack(mob/M)
src.attacking = 1
if(istype(M, /obj/item/raw_material/))
src.visible_message("[src] hungrily eats [src.target]!")
playsound(src.loc, "sound/items/eatfood.ogg", 30, 1, -2)
qdel(src.target)
src.eaten++
src.target = null
src.task = "thinking"
src.attacking = 0
return
CritterDeath()
if (!alive) return
src.alive = 0
src.target = null
src.task = "dead"
density = 0
src.icon_state = "rockworm-dead"
walk_to(src,0)
if (eaten >= 10)
src.visible_message("[src] vomits something up and dies!")
else
src.visible_message("[src] dies!")
var/countstones = 0
while (src.eaten)
countstones++
if (countstones == 10)
var/pickgem = rand(1,3)
switch(pickgem)
if(1) new /obj/item/raw_material/gemstone(src.loc)
if(2) new /obj/item/raw_material/uqill(src.loc)
if(3) new /obj/item/raw_material/fibrilith(src.loc)
countstones = 0
src.eaten--
/obj/critter/fermid
name = "fermid"
desc = "Extremely hostile asteroid-dwelling bugs. Best to avoid them wherever possible."
icon_state = "fermid"
density = 1
health = 25
aggressive = 1
defensive = 1
wanderer = 1
opensdoors = 0
atkcarbon = 1
atksilicon = 1
firevuln = 0.1
brutevuln = 1
angertext = "viciously clacks its mandibles at"
butcherable = 1
CritterAttack(mob/M)
if(ismob(M))
src.attacking = 1
if (prob(10) && M.reagents)
src.visible_message("[src] grabs and stings [src.target]!")
M.reagents.add_reagent("haloperidol", 10)
M.reagents.add_reagent("atropine", 10)
else
src.visible_message("[src] bites [src.target]!")
random_brute_damage(src.target, rand(1,4))
spawn(8)
src.attacking = 0
ChaseAttack(mob/M)
if (prob(20))
src.visible_message("[src] dives on [M]!")
playsound(src.loc, pick("sound/weapons/thudswoosh.ogg"), 50, 0)
M.weakened += rand(2,4)
M.stunned += rand(1,3)
random_brute_damage(M, rand(2,5))
else src.visible_message("[src] dives at [M], but misses!")
///// MINER TRAITOR ITEM /////
/obj/item/device/chargehacker
name = "geological scanner"
desc = "The scanner doesn't look right somehow."
icon = 'icons/obj/mining.dmi'
icon_state = "minanal"
flags = ONBELT
w_class = 1.0
attack_self(var/mob/user as mob)
boutput(user, "The screen is clearly painted on. When you press Scan, a short metal spike extends from the top and sparks brightly before retracting again.")