Files
Aurora.3/code/modules/mining/mine_turfs.dm
Geeves d19cf6e3d6 KA Leftovers Fix (#10165)
KAs no longer leave behind phantom projectiles that injure people.
    KAs no longer recursively destroy rocks when one breaks, but still retain AoE effects.
    KAs now have at least one tile of AoE on all modules.

Also fixes a runtime with pin attackby.
2020-10-06 15:06:10 +03:00

827 lines
23 KiB
Plaintext

/**********************Mineral deposits**************************/
/turf/unsimulated/mineral
name = "impassable rock"
icon = 'icons/turf/walls.dmi'
icon_state = "rock-dark"
blocks_air = TRUE
density = TRUE
gender = PLURAL
opacity = TRUE
// This is a global list so we can share the same list with all mineral turfs; it's the same for all of them anyways.
var/list/mineral_can_smooth_with = list(
/turf/simulated/mineral,
/turf/simulated/wall,
/turf/unsimulated/wall
)
// Some extra types for the surface to keep things pretty.
/turf/simulated/mineral/surface
mined_turf = /turf/unsimulated/floor/asteroid/ash
/turf/simulated/mineral //wall piece
name = "rock"
icon = 'icons/turf/map_placeholders.dmi'
icon_state = "rock"
desc = "It's a greyish rock. Exciting."
gender = PLURAL
var/icon/actual_icon = 'icons/turf/smooth/rock_wall.dmi'
layer = 2.01
// canSmoothWith is set in Initialize().
smooth = SMOOTH_MORE | SMOOTH_BORDER | SMOOTH_NO_CLEAR_ICON
smoothing_hints = SMOOTHHINT_CUT_F | SMOOTHHINT_ONLY_MATCH_TURF | SMOOTHHINT_TARGETS_NOT_UNIQUE
oxygen = 0
nitrogen = 0
opacity = TRUE
density = TRUE
blocks_air = TRUE
temperature = T0C
var/mined_turf = /turf/unsimulated/floor/asteroid/ash/rocky
var/ore/mineral
var/mined_ore = 0
var/last_act = 0
var/emitter_blasts_taken = 0 // EMITTER MINING! Muhehe.
var/datum/geosample/geologic_data
var/excavation_level = 0
var/list/finds
var/archaeo_overlay = ""
var/obj/item/last_find
var/datum/artifact_find/artifact_find
var/obj/effect/mineral/my_mineral
var/rock_health = 20 //10 to 20, in initialize
has_resources = TRUE
/turf/simulated/mineral/proc/kinetic_hit(var/damage)
rock_health -= damage
if(rock_health <= 0)
GetDrilled(TRUE)
// Copypaste parent call for performance.
/turf/simulated/mineral/Initialize(mapload)
if(initialized)
crash_with("Warning: [src]([type]) initialized multiple times!")
if(icon != actual_icon)
icon = actual_icon
initialized = TRUE
turfs += src
if(dynamic_lighting)
luminosity = 0
else
luminosity = 1
has_opaque_atom = TRUE
if(smooth)
canSmoothWith = mineral_can_smooth_with
pixel_x = -4
pixel_y = -4
queue_smooth(src)
if(!mapload)
queue_smooth_neighbors(src)
rock_health = rand(10,20)
return INITIALIZE_HINT_NORMAL
/turf/simulated/mineral/examine(mob/user)
..()
if(mineral)
switch(mined_ore)
if(0)
to_chat(user, SPAN_INFO("It is ripe with [mineral.display_name]."))
if(1)
to_chat(user, SPAN_INFO("Its [mineral.display_name] looks a little depleted."))
if(2)
to_chat(user, SPAN_INFO("Its [mineral.display_name] looks very depleted!"))
else
to_chat(user, SPAN_INFO("It is devoid of any valuable minerals."))
switch(emitter_blasts_taken)
if(0)
to_chat(user, SPAN_INFO("It is in pristine condition."))
if(1)
to_chat(user, SPAN_INFO("It appears a little damaged."))
if(2)
to_chat(user, SPAN_INFO("It is crumbling!"))
if(3)
to_chat(user, SPAN_INFO("It looks ready to collapse at any moment!"))
/turf/simulated/mineral/ex_act(severity)
switch(severity)
if(2.0)
if (prob(70))
mined_ore = 1 //some of the stuff gets blown up
GetDrilled()
else
emitter_blasts_taken += 2
if(1.0)
mined_ore = 2 //some of the stuff gets blown up
GetDrilled()
/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj)
// Emitter blasts
if(istype(Proj, /obj/item/projectile/beam/emitter))
emitter_blasts_taken++
if(emitter_blasts_taken > 2) // 3 blasts per tile
GetDrilled()
/turf/simulated/mineral/CollidedWith(AM)
. = ..()
if(istype(AM,/mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand))
var/obj/item/pickaxe/P = H.l_hand
if(P.autodrill)
attackby(H.l_hand,H)
else if((istype(H.r_hand,/obj/item/pickaxe)) && H.hand)
var/obj/item/pickaxe/P = H.r_hand
if(P.autodrill)
attackby(H.r_hand,H)
else if(istype(AM,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = AM
if(istype(R.module_active,/obj/item/pickaxe))
attackby(R.module_active,R)
//For use in non-station z-levels as decoration.
/turf/unsimulated/mineral/asteroid
name = "rock"
icon = 'icons/turf/map_placeholders.dmi'
icon_state = "rock"
desc = "It's a greyish rock. Exciting."
opacity = TRUE
var/icon/actual_icon = 'icons/turf/smooth/rock_wall.dmi'
layer = 2.01
var/list/asteroid_can_smooth_with = list(
/turf/unsimulated/mineral,
/turf/unsimulated/mineral/asteroid
)
smooth = SMOOTH_MORE | SMOOTH_BORDER | SMOOTH_NO_CLEAR_ICON
smoothing_hints = SMOOTHHINT_CUT_F | SMOOTHHINT_ONLY_MATCH_TURF | SMOOTHHINT_TARGETS_NOT_UNIQUE
/turf/unsimulated/mineral/asteroid/Initialize(mapload)
if(initialized)
crash_with("Warning: [src]([type]) initialized multiple times!")
if(icon != actual_icon)
icon = actual_icon
initialized = TRUE
turfs += src
if(dynamic_lighting)
luminosity = 0
else
luminosity = 1
has_opaque_atom = TRUE
if(smooth)
canSmoothWith = asteroid_can_smooth_with
pixel_x = -4
pixel_y = -4
queue_smooth(src)
if(!mapload)
queue_smooth_neighbors(src)
return INITIALIZE_HINT_NORMAL
#define SPREAD(the_dir) \
if (prob(mineral.spread_chance)) { \
var/turf/simulated/mineral/target = get_step(src, the_dir); \
if (istype(target) && !target.mineral) { \
target.mineral = mineral; \
target.UpdateMineral(); \
target.MineralSpread(); \
} \
}
/turf/simulated/mineral/proc/MineralSpread()
if(mineral && mineral.spread)
SPREAD(NORTH)
SPREAD(SOUTH)
SPREAD(EAST)
SPREAD(WEST)
#undef SPREAD
/turf/simulated/mineral/proc/UpdateMineral()
clear_ore_effects()
if(!mineral)
name = "\improper Rock"
icon_state = "rock"
return
name = "\improper [mineral.display_name] deposit"
new /obj/effect/mineral(src, mineral)
//Not even going to touch this pile of spaghetti //motherfucker - geeves
/turf/simulated/mineral/attackby(obj/item/W, mob/user)
if(!user.IsAdvancedToolUser())
to_chat(user, SPAN_WARNING("You don't have the dexterity to do this!"))
return
if(istype(W, /obj/item/device/core_sampler))
geologic_data.UpdateNearbyArtifactInfo(src) // good god
var/obj/item/device/core_sampler/C = W
C.sample_item(src, user)
return
if(istype(W, /obj/item/device/depth_scanner))
var/obj/item/device/depth_scanner/C = W
C.scan_atom(user, src)
return
if(istype(W, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = W
user.visible_message(SPAN_NOTICE("\The [user] extends \the [P] towards \the [src].") , SPAN_NOTICE("You extend \the [P] towards \the [src]."))
if(do_after(user,25))
if(!istype(src, /turf/simulated/mineral))
return
to_chat(user, SPAN_NOTICE("[icon2html(P, user)] \The [src] has been excavated to a depth of [2 * excavation_level]cm."))
return
if(istype(W, /obj/item/pickaxe) && W.simulated) // Pickaxe offhand is not simulated.
var/turf/T = user.loc
if(!(istype(T, /turf)))
return
var/obj/item/pickaxe/P = W
if(last_act + P.digspeed > world.time)//prevents message spam
return
if(P.drilling)
return
last_act = world.time
playsound(user, P.drill_sound, 20, TRUE)
P.drilling = TRUE
//handle any archaeological finds we might uncover
var/fail_message
if(finds?.len)
var/datum/find/F = finds[1]
if(excavation_level + P.excavation_amount > F.excavation_required)
//Chance to destroy / extract any finds here
fail_message = ". <b>[pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]</b>"
if(fail_message)
to_chat(user, SPAN_WARNING("You start [P.drill_verb][fail_message ? fail_message : ""]."))
if(fail_message && prob(90))
if(prob(25))
excavate_find(5, finds[1])
else if(prob(50))
finds.Remove(finds[1])
if(prob(50))
artifact_debris()
if(do_after(user,P.digspeed))
if(!istype(src, /turf/simulated/mineral))
return
P.drilling = FALSE
if(prob(50))
var/obj/item/ore/O
if(prob(25) && (mineral) && (P.excavation_amount >= 30))
O = new mineral.ore(src)
else
O = new /obj/item/ore(src)
if(istype(O))
geologic_data.UpdateNearbyArtifactInfo(src)
O.geologic_data = geologic_data
addtimer(CALLBACK(O, /atom/movable/.proc/forceMove, user.loc), 1)
if(finds?.len)
var/datum/find/F = finds[1]
if(round(excavation_level + P.excavation_amount) == F.excavation_required)
//Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them
if(excavation_level + P.excavation_amount > F.excavation_required)
//if you can get slightly over, perfect extraction
excavate_find(100, F)
else
excavate_find(80, F)
else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range)
//just pull the surrounding rock out
excavate_find(0, F)
if(excavation_level + P.excavation_amount >= 100)
//if players have been excavating this turf, leave some rocky debris behind
var/obj/structure/boulder/B
if(artifact_find)
if(excavation_level > 0 || prob(15))
//boulder with an artifact inside
B = new(src)
if(artifact_find)
B.artifact_find = artifact_find
else
artifact_debris(1)
else if(prob(15))
//empty boulder
B = new(src)
if(B)
GetDrilled(0)
else
GetDrilled(1)
return
excavation_level += P.excavation_amount
else
to_chat(user, SPAN_NOTICE("You stop [P.drill_verb] \the [src]."))
P.drilling = FALSE
if(istype(W, /obj/item/autochisel))
if(last_act + 80 > world.time)//prevents message spam
return
last_act = world.time
to_chat(user, SPAN_NOTICE("You start chiselling \the [src] into a sculptable block."))
if(!do_after(user, 80 / W.toolspeed))
return
if(!istype(src, /turf/simulated/mineral))
return
to_chat(user, SPAN_NOTICE("You finish chiselling [src] into a sculptable block."))
new /obj/structure/sculpting_block(src)
GetDrilled(1)
/turf/simulated/mineral/proc/clear_ore_effects()
if(my_mineral)
qdel(my_mineral)
/turf/simulated/mineral/proc/DropMineral()
if(!mineral)
return
clear_ore_effects()
var/obj/item/ore/O = new mineral.ore(src)
if(istype(O))
geologic_data.UpdateNearbyArtifactInfo(src) //whoever named this proc must be shot - geeves
O.geologic_data = geologic_data
return O
/turf/simulated/mineral/proc/GetDrilled(var/artifact_fail = 0)
if(mineral?.result_amount)
//if the turf has already been excavated, some of it's ore has been removed
for(var/i = 1 to mineral.result_amount - mined_ore)
DropMineral()
//Add some rubble, you did just clear out a big chunk of rock.
if(prob(25))
var/datum/reagents/R = new/datum/reagents(20)
R.my_atom = src
R.add_reagent(/datum/reagent/stone_dust,20)
var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem(/datum/reagent/stone_dust) // have to explicitly say the type to avoid issues with warnings
S.show_log = 0
S.set_up(R, 10, 0, src, 40)
S.start()
qdel(R)
ChangeTurf(mined_turf)
if(rand(1,500) == 1)
visible_message(SPAN_NOTICE("An old dusty crate was buried within!"))
new /obj/structure/closet/crate/secure/loot(src)
/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F)
//with skill and luck, players can cleanly extract finds
//otherwise, they come out inside a chunk of rock
var/obj/item/X
if(prob_clean)
X = new /obj/item/archaeological_find(src, new_item_type = F.find_type)
else
X = new /obj/item/ore/strangerock(src, inside_item_type = F.find_type)
geologic_data.UpdateNearbyArtifactInfo(src) //AAAAAAAAAAAAAAAAAAAAAAAAAA
X:geologic_data = geologic_data //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//some find types delete the /obj/item/archaeological_find and replace it with something else, this handles when that happens
//yuck //yuck indeed.
var/display_name = "something"
if(!X)
X = last_find
if(X)
display_name = X.name
//many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted
if(prob(F.prob_delicate))
var/obj/effect/suspension_field/S = locate() in src
if(!S || S.field_type != get_responsive_reagent(F.find_type))
if(X)
visible_message(SPAN_DANGER("[pick("[display_name] crumbles away into dust","[display_name] breaks apart")]."))
qdel(X)
finds.Remove(F)
/turf/simulated/mineral/proc/artifact_debris(var/severity = 0)
//Give a random amount of loot from 1 to 3 or 5, varying on severity.
for(var/j in 1 to rand(1, 3 + max(min(severity, 1), 0) * 2))
switch(rand(1,7))
if(1)
var/obj/item/stack/rods/R = new(src)
R.amount = rand(5, 25)
if(2)
var/obj/item/stack/material/plasteel/R = new(src)
R.amount = rand(5, 25)
if(3)
var/obj/item/stack/material/steel/R = new(src)
R.amount = rand(5, 25)
if(4)
var/obj/item/stack/material/plasteel/R = new(src)
R.amount = rand(5, 25)
if(5)
var/quantity = rand(1, 3)
for(var/i = 0, i < quantity, i++)
new /obj/item/material/shard/shrapnel(src)
if(6)
var/quantity = rand(1, 3)
for(var/i = 0, i < quantity, i++)
new /obj/item/material/shard/phoron(src)
if(7)
var/obj/item/stack/material/uranium/R = new(src)
R.amount = rand(5, 25)
/turf/simulated/mineral/random
name = "mineral deposit"
var/mineralSpawnChanceList = list(
ORE_URANIUM = 2,
ORE_PLATINUM = 2,
ORE_IRON = 8,
ORE_COAL = 8,
ORE_DIAMOND = 1,
ORE_GOLD = 2,
ORE_SILVER = 2,
ORE_PHORON = 5
)
var/mineralChance = 55
/turf/simulated/mineral/random/Initialize()
if(prob(mineralChance) && !mineral)
var/mineral_name = pickweight(mineralSpawnChanceList) //temp mineral name
if(mineral_name && (mineral_name in ore_data))
mineral = ore_data[mineral_name]
UpdateMineral()
MineralSpread()
. = ..()
/turf/simulated/mineral/random/high_chance
mineralSpawnChanceList = list(
ORE_URANIUM = 2,
ORE_PLATINUM = 2,
ORE_IRON = 2,
ORE_COAL = 2,
ORE_DIAMOND = 1,
ORE_GOLD = 2,
ORE_SILVER = 2,
ORE_PHORON = 3
)
mineralChance = 55
/turf/simulated/mineral/random/higher_chance
mineralSpawnChanceList = list(
ORE_URANIUM = 3,
ORE_PLATINUM = 3,
ORE_IRON = 1,
ORE_COAL = 1,
ORE_DIAMOND = 1,
ORE_GOLD = 3,
ORE_SILVER = 3,
ORE_PHORON = 2
)
mineralChance = 75
/turf/simulated/mineral/attack_hand(var/mob/user)
add_fingerprint(user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(ishuman(user) && user.a_intent == I_GRAB)
var/mob/living/carbon/human/H = user
var/turf/destination = GetAbove(H)
if(destination)
var/turf/start = get_turf(H)
if(start.CanZPass(H, UP))
if(destination.CanZPass(H, UP))
H.climb(UP, src, 20)
/**********************Asteroid**************************/
// Setting icon/icon_state initially will use these values when the turf is built on/replaced.
// This means you can put grass on the asteroid etc.
/turf/unsimulated/floor/asteroid
name = "coder's blight"
icon = 'icons/turf/map_placeholders.dmi'
icon_state = ""
desc = "An exposed developer texture. Someone wasn't paying attention."
smooth = SMOOTH_FALSE
smoothing_hints = SMOOTHHINT_CUT_F | SMOOTHHINT_ONLY_MATCH_TURF | SMOOTHHINT_TARGETS_NOT_UNIQUE
gender = PLURAL
base_icon = 'icons/turf/map_placeholders.dmi'
base_icon_state = "ash"
oxygen = 0
nitrogen = 0
temperature = TCMB
var/dug = 0 //Increments by 1 everytime it's dug. 11 is the last integer that should ever be here.
var/digging
has_resources = 1
footstep_sound = /decl/sound_category/asteroid_footstep
roof_type = null
// Same as the other, this is a global so we don't have a lot of pointless lists floating around.
// Basalt is explicitly omitted so ash will spill onto basalt turfs.
var/list/asteroid_floor_smooth = list(
/turf/unsimulated/floor/asteroid/ash,
/turf/simulated/mineral,
/turf/simulated/wall
)
// Copypaste parent for performance.
/turf/unsimulated/floor/asteroid/Initialize(mapload)
if(initialized)
crash_with("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
if(icon != base_icon) // Setting icon is an appearance change, so avoid it if we can.
icon = base_icon
base_desc = desc
base_name = name
turfs += src
if(dynamic_lighting)
luminosity = 0
else
luminosity = 1
if(mapload && permit_ao)
queue_ao()
if(smooth)
canSmoothWith = asteroid_floor_smooth
pixel_x = -4
pixel_y = -4
queue_smooth(src)
if(!mapload)
queue_smooth_neighbors(src)
if(light_range && light_power)
update_light()
return INITIALIZE_HINT_NORMAL
/turf/unsimulated/floor/asteroid/ex_act(severity)
switch(severity)
if(3.0)
return
if(2.0)
if(prob(70))
dug += rand(4, 10)
gets_dug() // who's dug
else
dug += rand(1, 3)
gets_dug()
if(1.0)
if(prob(30))
dug = 11
gets_dug()
else
dug += rand(4,11)
gets_dug()
return
/turf/unsimulated/floor/asteroid/is_plating()
return FALSE
/turf/unsimulated/floor/asteroid/attackby(obj/item/W, mob/user)
if(!W || !user)
return FALSE
if(istype(W, /obj/item/stack/rods))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
return
var/obj/item/stack/rods/R = W
if(R.use(1))
to_chat(user, SPAN_NOTICE("Constructing support lattice..."))
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
ReplaceWithLattice()
return
if(istype(W, /obj/item/stack/tile/floor))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L)
var/obj/item/stack/tile/floor/S = W
if(S.get_amount() < 1)
return
qdel(L)
playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE)
S.use(1)
ChangeTurf(/turf/simulated/floor/airless)
return
else
to_chat(user, SPAN_WARNING("The plating is going to need some support.")) //turf psychiatrist lmaooo
return
var/static/list/usable_tools = typecacheof(list(
/obj/item/shovel,
/obj/item/pickaxe/diamonddrill,
/obj/item/pickaxe/drill,
/obj/item/pickaxe/borgdrill
))
if(is_type_in_typecache(W, usable_tools))
var/turf/T = get_turf(user)
if(!istype(T))
return
if(digging)
return
if(dug)
if(!GetBelow(src))
return
to_chat(user, SPAN_NOTICE("You start digging deeper."))
playsound(get_turf(user), 'sound/effects/stonedoor_openclose.ogg', 50, TRUE)
digging = TRUE
if(!do_after(user, 60 / W.toolspeed))
if(istype(src, /turf/unsimulated/floor/asteroid))
digging = FALSE
return
// Turfs are special. They don't delete. So we need to check if it's
// still the same turf as before the sleep.
if(!istype(src, /turf/unsimulated/floor/asteroid))
return
playsound(get_turf(user), 'sound/effects/stonedoor_openclose.ogg', 50, TRUE)
if(prob(33))
switch(dug)
if(1)
to_chat(user, SPAN_NOTICE("You've made a little progress."))
if(2)
to_chat(user, SPAN_NOTICE("You notice the hole is a little deeper."))
if(3)
to_chat(user, SPAN_NOTICE("You think you're about halfway there."))
if(4)
to_chat(user, SPAN_NOTICE("You finish up lifting another pile of dirt."))
if(5)
to_chat(user, SPAN_NOTICE("You dig a bit deeper. You're definitely halfway there now."))
if(6)
to_chat(user, SPAN_NOTICE("You still have a ways to go."))
if(7)
to_chat(user, SPAN_NOTICE("The hole looks pretty deep now."))
if(8)
to_chat(user, SPAN_NOTICE("The ground is starting to feel a lot looser."))
if(9)
to_chat(user, SPAN_NOTICE("You can almost see the other side."))
if(10)
to_chat(user, SPAN_NOTICE("Just a little deeper..."))
else
to_chat(user, SPAN_NOTICE("You penetrate the virgin earth!"))
else
if(dug <= 10)
to_chat(user, SPAN_NOTICE("You dig a little deeper."))
else
to_chat(user, SPAN_NOTICE("You dug a big hole.")) // how ceremonious
gets_dug(user)
digging = 0
return
to_chat(user, SPAN_WARNING("You start digging."))
playsound(get_turf(user), 'sound/effects/stonedoor_openclose.ogg', 50, TRUE)
digging = TRUE
if(!do_after(user, 40))
if(istype(src, /turf/unsimulated/floor/asteroid))
digging = FALSE
return
// Turfs are special. They don't delete. So we need to check if it's
// still the same turf as before the sleep.
if(!istype(src, /turf/unsimulated/floor/asteroid))
return
to_chat(user, SPAN_NOTICE("You dug a hole."))
digging = FALSE
gets_dug(user)
else if(istype(W,/obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = W
if(S.collection_mode)
for(var/obj/item/ore/O in contents)
O.attackby(W, user)
return
else if(istype(W,/obj/item/storage/bag/fossils))
var/obj/item/storage/bag/fossils/S = W
if(S.collection_mode)
for(var/obj/item/fossil/F in contents)
F.attackby(W, user)
return
else
..(W, user)
return
/turf/unsimulated/floor/asteroid/proc/gets_dug(mob/user)
add_overlay("asteroid_dug", TRUE)
if(prob(75))
new /obj/item/ore/glass(src)
if(prob(25) && has_resources)
var/list/ore = list()
for(var/metal in resources)
switch(metal)
if("silicates")
ore += /obj/item/ore/glass
if("carbonaceous rock")
ore += /obj/item/ore/coal
if("iron")
ore += /obj/item/ore/iron
if("gold")
ore += /obj/item/ore/gold
if("silver")
ore += /obj/item/ore/silver
if("diamond")
ore += /obj/item/ore/diamond
if("uranium")
ore += /obj/item/ore/uranium
if("phoron")
ore += /obj/item/ore/phoron
if("osmium")
ore += /obj/item/ore/osmium
if("hydrogen")
ore += /obj/item/ore/hydrogen
else
if(prob(25))
switch(rand(1,5))
if(1)
ore += /obj/random/junk
if(2)
ore += /obj/random/powercell
if(3)
ore += /obj/random/coin
if(4)
ore += /obj/random/loot
if(5)
ore += /obj/item/ore/glass
else
ore += /obj/item/ore/glass
if(length(ore))
var/ore_path = pick(ore)
if(ore)
new ore_path(src)
if(dug <= 10)
dug += 1
add_overlay("asteroid_dug", TRUE)
else
var/turf/below = GetBelow(src)
if(below)
var/area/below_area = get_area(below) // Let's just assume that the turf is not in nullspace.
if(below_area.station_area)
if(user)
to_chat(user, SPAN_ALERT("You strike metal!"))
below.spawn_roof(ROOF_FORCE_SPAWN)
else
ChangeTurf(/turf/space)
/turf/unsimulated/floor/asteroid/Entered(atom/movable/M as mob|obj)
..()
if(istype(M,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = M
if(R.module) // bro wtf this is criminal
if(istype(R.module_state_1, /obj/item/storage/bag/ore))
attackby(R.module_state_1, R)
else if(istype(R.module_state_2, /obj/item/storage/bag/ore))
attackby(R.module_state_2, R)
else if(istype(R.module_state_3, /obj/item/storage/bag/ore))
attackby(R.module_state_3, R)
else
return
/turf/simulated/mineral/Destroy()
clear_ore_effects()
. = ..()