mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-29 19:42:42 +00:00
Ports totally; https://github.com/Baystation12/Baystation12/pull/12389/files Baystation12#14599 Ports partially; Baystation12#14216 (only blob-related functions) All the failure messages have been replaced with failure events in industrial drills, that range from probably lethal to certainly lethal and in one case just moderately annoying.
457 lines
12 KiB
Plaintext
457 lines
12 KiB
Plaintext
/obj/machinery/mining
|
|
icon = 'icons/obj/mining_drill.dmi'
|
|
anchored = 0
|
|
use_power = 0 //The drill takes power directly from a cell.
|
|
density = 1
|
|
layer = MOB_LAYER+0.1 //So it draws over mobs in the tile north of it.
|
|
|
|
/obj/machinery/mining/drill
|
|
name = "mining drill head"
|
|
desc = "An enormous drill."
|
|
icon_state = "mining_drill"
|
|
var/braces_needed = 2
|
|
var/list/supports = list()
|
|
var/supported = 0
|
|
var/active = 0
|
|
var/list/resource_field = list()
|
|
|
|
var/ore_types = list(
|
|
"iron" = /obj/item/weapon/ore/iron,
|
|
"uranium" = /obj/item/weapon/ore/uranium,
|
|
"gold" = /obj/item/weapon/ore/gold,
|
|
"silver" = /obj/item/weapon/ore/silver,
|
|
"diamond" = /obj/item/weapon/ore/diamond,
|
|
"phoron" = /obj/item/weapon/ore/phoron,
|
|
"osmium" = /obj/item/weapon/ore/osmium,
|
|
"hydrogen" = /obj/item/weapon/ore/hydrogen,
|
|
"silicates" = /obj/item/weapon/ore/glass,
|
|
"carbonaceous rock" = /obj/item/weapon/ore/coal
|
|
)
|
|
|
|
//Upgrades
|
|
var/harvest_speed
|
|
var/capacity
|
|
var/charge_use
|
|
var/obj/item/weapon/cell/cell = null
|
|
|
|
//Flags
|
|
var/need_update_field = 0
|
|
var/need_player_check = 0
|
|
|
|
/obj/machinery/mining/drill/New()
|
|
|
|
..()
|
|
|
|
component_parts = list()
|
|
component_parts += new /obj/item/weapon/circuitboard/miningdrill(src)
|
|
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
|
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
|
|
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
|
|
component_parts += new /obj/item/weapon/cell/high(src)
|
|
|
|
RefreshParts()
|
|
|
|
/obj/machinery/mining/drill/process()
|
|
|
|
if(need_player_check)
|
|
return
|
|
|
|
check_supports()
|
|
|
|
if(!active) return
|
|
|
|
if(!anchored || !use_cell_power())
|
|
system_error("system configuration or charge error")
|
|
return
|
|
|
|
if(need_update_field)
|
|
get_resource_field()
|
|
|
|
if(world.time % 10 == 0)
|
|
update_icon()
|
|
|
|
if(!active)
|
|
return
|
|
|
|
//Drill through the flooring, if any.
|
|
if(istype(get_turf(src), /turf/simulated/floor/asteroid))
|
|
var/turf/simulated/floor/asteroid/T = get_turf(src)
|
|
if(!T.dug)
|
|
T.gets_dug()
|
|
else if(istype(get_turf(src), /turf/simulated/floor))
|
|
var/turf/simulated/floor/T = get_turf(src)
|
|
T.ex_act(2.0)
|
|
|
|
//Dig out the tasty ores.
|
|
if(resource_field.len)
|
|
var/turf/simulated/harvesting = pick(resource_field)
|
|
|
|
while(resource_field.len && !harvesting.resources)
|
|
harvesting.has_resources = 0
|
|
harvesting.resources = null
|
|
resource_field -= harvesting
|
|
harvesting = pick(resource_field)
|
|
|
|
if(!harvesting) return
|
|
|
|
var/total_harvest = harvest_speed //Ore harvest-per-tick.
|
|
var/found_resource = 0 //If this doesn't get set, the area is depleted and the drill errors out.
|
|
|
|
for(var/metal in ore_types)
|
|
|
|
if(contents.len >= capacity)
|
|
system_error("insufficient storage space")
|
|
active = 0
|
|
need_player_check = 1
|
|
update_icon()
|
|
return
|
|
|
|
if(contents.len + total_harvest >= capacity)
|
|
total_harvest = capacity - contents.len
|
|
|
|
if(total_harvest <= 0) break
|
|
if(harvesting.resources[metal])
|
|
|
|
found_resource = 1
|
|
|
|
var/create_ore = 0
|
|
if(harvesting.resources[metal] >= total_harvest)
|
|
harvesting.resources[metal] -= total_harvest
|
|
create_ore = total_harvest
|
|
total_harvest = 0
|
|
else
|
|
total_harvest -= harvesting.resources[metal]
|
|
create_ore = harvesting.resources[metal]
|
|
harvesting.resources[metal] = 0
|
|
|
|
for(var/i=1, i <= create_ore, i++)
|
|
var/oretype = ore_types[metal]
|
|
new oretype(src)
|
|
|
|
if(!found_resource)
|
|
harvesting.has_resources = 0
|
|
harvesting.resources = null
|
|
resource_field -= harvesting
|
|
else
|
|
active = 0
|
|
need_player_check = 1
|
|
update_icon()
|
|
|
|
/obj/machinery/mining/drill/attack_ai(var/mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/mining/drill/attackby(obj/item/O as obj, mob/user as mob)
|
|
if(!active && !panel_open)
|
|
if(default_deconstruction_screwdriver(user, O))
|
|
return
|
|
if(default_deconstruction_crowbar(user, O))
|
|
return
|
|
if(default_part_replacement(user, O))
|
|
return
|
|
if(active) return ..()
|
|
|
|
if(istype(O, /obj/item/weapon/crowbar))
|
|
if (panel_open && cell)
|
|
user << "You wrench out \the [cell]."
|
|
cell.forceMove(get_turf(user))
|
|
component_parts -= cell
|
|
cell = null
|
|
return
|
|
|
|
if(istype(O, /obj/item/weapon/cell))
|
|
if(cell)
|
|
user << "The drill already has a cell installed."
|
|
else
|
|
user.drop_item()
|
|
O.loc = src
|
|
cell = O
|
|
component_parts += O
|
|
user << "You install \the [O]."
|
|
return
|
|
..()
|
|
|
|
/obj/machinery/mining/drill/attack_hand(mob/user as mob)
|
|
check_supports()
|
|
|
|
if(need_player_check)
|
|
user << "You hit the manual override and reset the drill's error checking."
|
|
need_player_check = 0
|
|
if(anchored)
|
|
get_resource_field()
|
|
update_icon()
|
|
return
|
|
else if(supported && !panel_open)
|
|
if(use_cell_power())
|
|
active = !active
|
|
if(active)
|
|
visible_message("<span class='notice'>\The [src] lurches downwards, grinding noisily.</span>")
|
|
need_update_field = 1
|
|
else
|
|
visible_message("<span class='notice'>\The [src] shudders to a grinding halt.</span>")
|
|
else
|
|
user << "<span class='notice'>The drill is unpowered.</span>"
|
|
else
|
|
if(use_cell_power())
|
|
if(!supported && !panel_open)
|
|
system_error("unbraced drill error")
|
|
sleep(30)
|
|
if(!supported) //if you can resolve it manually in three seconds then power to you good-sir.
|
|
if(prob(50))
|
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\"</span>")
|
|
else
|
|
visible_message("<span class='danger'>\The [src] explodes!</span>")
|
|
fragem(src,10,35,2,1,5,1,0)
|
|
qdel(src)
|
|
else
|
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unbraced drill error manually resolved. Operations may resume normally.\"</span>")
|
|
if(supported && panel_open)
|
|
if(cell)
|
|
system_error("unsealed cell fitting error")
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
s.set_up(3, 1, src.loc)
|
|
s.start()
|
|
sleep(20)
|
|
s.set_up(3, 1, src.loc)
|
|
s.start()
|
|
sleep(10)
|
|
s.set_up(3, 1, src.loc)
|
|
s.start()
|
|
sleep(10)
|
|
if(panel_open)
|
|
if(prob(70))
|
|
visible_message("<span class='danger'>\The [src]'s cell shorts out!</span>")
|
|
cell.use(cell.charge)
|
|
else
|
|
visible_message("<span class='danger'>\The [src]'s cell detonates!</span>")
|
|
explosion(src.loc, -1, -1, 2, 1)
|
|
qdel(cell)
|
|
component_parts -= cell
|
|
cell = null
|
|
else
|
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unsealed cell fitting error manually resolved. Operations may resume normally.\"</span>")
|
|
else
|
|
user << "<span class='notice'>The drill is unpowered.</span>"
|
|
update_icon()
|
|
|
|
/obj/machinery/mining/drill/update_icon()
|
|
if(need_player_check)
|
|
icon_state = "mining_drill_error"
|
|
else if(active)
|
|
icon_state = "mining_drill_active"
|
|
else if(supported)
|
|
icon_state = "mining_drill_braced"
|
|
else
|
|
icon_state = "mining_drill"
|
|
return
|
|
|
|
/obj/machinery/mining/drill/RefreshParts()
|
|
..()
|
|
harvest_speed = 0
|
|
capacity = 0
|
|
charge_use = 50
|
|
|
|
for(var/obj/item/weapon/stock_parts/P in component_parts)
|
|
if(istype(P, /obj/item/weapon/stock_parts/micro_laser))
|
|
harvest_speed = P.rating
|
|
if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
|
|
capacity = 200 * P.rating
|
|
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
|
|
charge_use -= 10 * P.rating
|
|
cell = locate(/obj/item/weapon/cell) in component_parts
|
|
|
|
/obj/machinery/mining/drill/proc/check_supports()
|
|
|
|
supported = 0
|
|
|
|
if((!supports || !supports.len) && initial(anchored) == 0)
|
|
icon_state = "mining_drill"
|
|
anchored = 0
|
|
active = 0
|
|
else
|
|
anchored = 1
|
|
|
|
if(supports && supports.len >= braces_needed)
|
|
supported = 1
|
|
|
|
update_icon()
|
|
|
|
/obj/machinery/mining/drill/proc/system_error(var/error)
|
|
|
|
if(error)
|
|
visible_message("<span class='warning'>\icon[src] [src.name] flashes a system warning: [error].</span>")
|
|
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 100, 1)
|
|
need_player_check = 1
|
|
active = 0
|
|
update_icon()
|
|
|
|
/obj/machinery/mining/drill/proc/get_resource_field()
|
|
|
|
resource_field = list()
|
|
need_update_field = 0
|
|
|
|
var/turf/T = get_turf(src)
|
|
if(!istype(T)) return
|
|
|
|
var/tx = T.x - 2
|
|
var/ty = T.y - 2
|
|
var/turf/simulated/mine_turf
|
|
for(var/iy = 0,iy < 5, iy++)
|
|
for(var/ix = 0, ix < 5, ix++)
|
|
mine_turf = locate(tx + ix, ty + iy, T.z)
|
|
if(mine_turf && mine_turf.has_resources)
|
|
resource_field += mine_turf
|
|
|
|
if(!resource_field.len)
|
|
system_error("resources depleted")
|
|
|
|
/obj/machinery/mining/drill/proc/use_cell_power()
|
|
if(!cell) return 0
|
|
if(cell.charge >= charge_use)
|
|
cell.use(charge_use)
|
|
return 1
|
|
return 0
|
|
|
|
/obj/machinery/mining/drill/verb/unload()
|
|
set name = "Unload Drill"
|
|
set category = "Object"
|
|
set src in oview(1)
|
|
|
|
if(usr.stat) return
|
|
|
|
var/obj/structure/ore_box/B = locate() in orange(1)
|
|
if(B)
|
|
for(var/obj/item/weapon/ore/O in contents)
|
|
O.loc = B
|
|
usr << "<span class='notice'>You unload the drill's storage cache into the ore box.</span>"
|
|
else
|
|
for(var/obj/item/weapon/ore/O in contents)
|
|
O.forceMove(src.loc)
|
|
usr << "<span class='notice'>You spill the content's of the drill's storage box all over the ground. Idiot.</span>"
|
|
|
|
|
|
/obj/machinery/mining/brace
|
|
name = "mining drill brace"
|
|
desc = "A machinery brace for an industrial drill. It looks easily two feet thick."
|
|
icon_state = "mining_brace"
|
|
var/obj/machinery/mining/drill/connected
|
|
|
|
/obj/machinery/mining/brace/New()
|
|
..()
|
|
|
|
component_parts = list()
|
|
component_parts += new /obj/item/weapon/circuitboard/miningdrillbrace(src)
|
|
|
|
/obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
if(connected && connected.active)
|
|
user << "<span class='notice'>You know you ought not work with the brace of a <i>running</i> drill, but you do anyways.</span>"
|
|
sleep(5)
|
|
if(istype(user, /mob/living/carbon/human))
|
|
//Save the users active hand
|
|
var/mob/living/carbon/human/H = user
|
|
var/obj/item/organ/external/LA = H.get_organ("l_hand")
|
|
var/obj/item/organ/external/RA = H.get_organ("r_hand")
|
|
var/active_hand = H.hand
|
|
if(prob(20))
|
|
if(active_hand)
|
|
LA.droplimb(0,DROPLIMB_BLUNT)
|
|
else
|
|
RA.droplimb(0,DROPLIMB_BLUNT)
|
|
connected.system_error("unexpected user interface error")
|
|
return
|
|
else
|
|
H.apply_damage(25,BRUTE, sharp=1, edge=1)
|
|
connected.system_error("unexpected user interface error")
|
|
return
|
|
else
|
|
var/mob/living/M = user
|
|
M.apply_damage(25,BRUTE, sharp=1, edge=1)
|
|
|
|
if(default_deconstruction_screwdriver(user, W))
|
|
return
|
|
if(default_deconstruction_crowbar(user, W))
|
|
return
|
|
|
|
if(istype(W,/obj/item/weapon/wrench))
|
|
|
|
if(istype(get_turf(src), /turf/space))
|
|
user << "<span class='notice'>You send the [src] careening into space. Idiot.</span>"
|
|
var/inertia = rand(10,30)
|
|
for(var/i in 1 to inertia)
|
|
step_away(src,user,15,8)
|
|
if(!(istype(get_turf(src), /turf/space)))
|
|
break
|
|
sleep(1)
|
|
return
|
|
|
|
if(connected && connected.active)
|
|
if(prob(50))
|
|
sleep(10)
|
|
connected.system_error("unbraced drill error")
|
|
sleep(30)
|
|
if(connected && connected.active) //if you can resolve it manually in three seconds then power to you good-sir.
|
|
if(prob(50))
|
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\"</span>")
|
|
else
|
|
visible_message("<span class='danger'>\The [src] explodes!</span>")
|
|
fragem(src,10,35,2,1,5,1,0)
|
|
qdel(src)
|
|
return
|
|
else
|
|
connected.system_error("unexpected user interface error")
|
|
return
|
|
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
|
|
user << "<span class='notice'>You [anchored ? "un" : ""]anchor the brace.</span>"
|
|
|
|
anchored = !anchored
|
|
if(anchored)
|
|
connect()
|
|
else
|
|
disconnect()
|
|
|
|
/obj/machinery/mining/brace/proc/connect()
|
|
|
|
var/turf/T = get_step(get_turf(src), src.dir)
|
|
|
|
for(var/thing in T.contents)
|
|
if(istype(thing, /obj/machinery/mining/drill))
|
|
connected = thing
|
|
break
|
|
|
|
if(!connected)
|
|
return
|
|
|
|
if(!connected.supports)
|
|
connected.supports = list()
|
|
|
|
icon_state = "mining_brace_active"
|
|
|
|
connected.supports += src
|
|
connected.check_supports()
|
|
|
|
/obj/machinery/mining/brace/proc/disconnect()
|
|
|
|
if(!connected) return
|
|
|
|
if(!connected.supports) connected.supports = list()
|
|
|
|
icon_state = "mining_brace"
|
|
|
|
connected.supports -= src
|
|
connected.check_supports()
|
|
connected = null
|
|
|
|
/obj/machinery/mining/brace/verb/rotate()
|
|
set name = "Rotate"
|
|
set category = "Object"
|
|
set src in oview(1)
|
|
|
|
if(usr.stat) return
|
|
|
|
if (src.anchored)
|
|
usr << "It is anchored in place!"
|
|
return 0
|
|
|
|
src.set_dir(turn(src.dir, 90))
|
|
return 1
|