/datum/mining_encounter var/name = null var/info = null var/rarity_tier = 0 var/no_pick = 0 //If 1, encounter will not be randomly picked and will not be sorted into rarity lists. Will still appear in "all" list. Used for telescope encounters. proc/generate(var/obj/magnet_target_marker/target) return 0 /datum/mining_encounter/asteroid_small name = "Small Asteroid" rarity_tier = -1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = 3 var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedOre(generated_turfs,rand(2,6),rand(0,40)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,6)) /datum/mining_encounter/asteroid name = "Asteroid" rarity_tier = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null var/rand_num = rand(1,3) switch(rand_num) if (1) generated_turfs = Turfspawn_Asteroid_DegradeFromCenter(magnetic_center, /turf/simulated/wall/asteroid, size, 10, area_restriction) if (2) var/list/turfs_near_center = list() for(var/turf/space/S in orange(4,magnetic_center)) turfs_near_center += S if (length(turfs_near_center) > 0) //Wire note: Fix for pick() from empty list var/chunks = rand(2,6) while(chunks > 0) chunks-- generated_turfs = generated_turfs + Turfspawn_Asteroid_Round(pick(turfs_near_center), /turf/simulated/wall/asteroid, rand(2,4), 0, area_restriction) else generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedOre(generated_turfs,rand(2,6),0) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,6)) /datum/mining_encounter/comet_chunk name = "Comet Chunk" rarity_tier = 2 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid/ice, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedOre(generated_turfs,rand(1,2),40) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(4,12)) /datum/mining_encounter/wreckage name = "Wreckage" rarity_tier = 2 generate(var/obj/magnet_target_marker/target) if (..()) return var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) Turfspawn_Wreckage(magnetic_center, size, 0, area_restriction) /datum/mining_encounter/geode name = "Geode" rarity_tier = 3 generate(var/obj/magnet_target_marker/target) if (..()) return var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null var/list/generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid/geode, 7, 1, area_restriction) var/quality = rand(0,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() var/list/floors = list() var/list/gems = list(/obj/item/raw_material/uqill,/obj/item/raw_material/miracle,/obj/item/raw_material/gemstone, /obj/item/raw_material/telecrystal,/obj/item/raw_material/fibrilith) for (var/turf/simulated/floor/plating/airless/asteroid/T in generated_turfs) floors += T var/amount = rand(20,40) var/the_gem = null while (amount > 0) amount-- the_gem = pick(gems) if (floors.len) //ZeWaka: Fix for pick() from empty list var/obj/item/G = unpool(the_gem) G.set_loc(pick(floors)) /////////////TELESCOPE ENCOUNTERS BELOW /datum/mining_encounter/tel_miraclium name = "Miraclium asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"miraclium",rand(2,9)) /datum/mining_encounter/tel_mauxite name = "Mauxite asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"mauxite",rand(2,5)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,9)) /datum/mining_encounter/tel_valuable name = "Valuable asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() var/list/left = Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"gold",rand(2,4)) Turfspawn_Asteroid_SeedSpecificOre(left,"syreline",rand(3,6)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,9)) /datum/mining_encounter/tel_molitz name = "Molitz asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"molitz",rand(2,5)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,9)) /datum/mining_encounter/tel_pharosium name = "Pharosium asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"pharosium",rand(2,5)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,9)) /datum/mining_encounter/tel_bohrum name = "Bohrum asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"bohrum",rand(2,5)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,9)) /datum/mining_encounter/tel_char name = "Char asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"char",rand(2,5)) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs),rand(1,9)) /datum/mining_encounter/tel_nanite name = "Nanite asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"nanite cluster",rand(2,5)) /datum/mining_encounter/tel_erebite name = "Erebite asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"erebite",rand(2,8)) /datum/mining_encounter/tel_cerenkite name = "Cerenkite asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"cerenkite",rand(2,8)) /datum/mining_encounter/tel_koshmarite name = "Koshmarite asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"koshmarite",rand(2,8)) /datum/mining_encounter/tel_viscerite name = "Viscerite asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"viscerite",rand(2,8)) /datum/mining_encounter/tel_starstone name = "Starstone asteroid" rarity_tier = 1 no_pick = 1 generate(var/obj/magnet_target_marker/target) if (..()) return var/list/generated_turfs var/size = rand(mining_controls.min_magnet_spawn_size, mining_controls.max_magnet_spawn_size) var/magnetic_center = mining_controls.magnetic_center var/area_restriction = /area/mining/magnet if (target) magnetic_center = target.magnetic_center area_restriction = null generated_turfs = Turfspawn_Asteroid_Round(magnetic_center, /turf/simulated/wall/asteroid, size, 0, area_restriction) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() AST.build_icon() for (var/turf/simulated/floor/plating/airless/asteroid/AST in generated_turfs) AST.update_icon() Turfspawn_Asteroid_SeedSpecificOre(generated_turfs,"starstone",rand(1,2)) // Terrain Gen Procs /// ASTEROIDS /// /obj/landmark/asteroid_spawn_blocker //Blocks the creation of an asteroid on this tile, as you would expect name = "asteroid blocker" icon_state = "x4" /turf/proc/GenerateAsteroid(var/size, var/alt_stones = 1) // Sanity Checks if (!size || !isnum(size) || size < 1 || size > 15) size = rand(4,15) var/list/turfcheck = Turfspawn_CheckForFreeSpace(src,size) if (turfcheck.len < 1) return var/list/generated_turfs var/roidpath = /turf/simulated/wall/asteroid if (alt_stones && prob(15)) roidpath = pick(typesof(/turf/simulated/wall/asteroid)) if (rand(0,1)) size = max(size,9) generated_turfs = Turfspawn_Asteroid_Round(src, roidpath, size) else generated_turfs = Turfspawn_Asteroid_DegradeFromCenter(src, roidpath, size, 10) var/quality = rand(-101,101) for (var/turf/simulated/wall/asteroid/AST in generated_turfs) AST.quality = quality AST.space_overlays() Turfspawn_Asteroid_SeedOre(generated_turfs) Turfspawn_Asteroid_SeedEvents(Turfspawn_Asteroid_CheckForModifiableTurfs(generated_turfs)) return generated_turfs // Checks /proc/Turfspawn_CheckForNearbyTurfsOfType(var/turf/center,var/turfpath,var/include_diagonals = 1) if (!center || !istype(center,/turf/) || !ispath(turfpath)) return 0 if (include_diagonals) for (var/turf/A in range(1,center)) if (A.type == turfpath) return 1 else var/turf/checked for (var/dir in cardinal) checked = get_step(center, dir) if (istype(checked,turfpath)) return 1 return 0 /proc/Turfspawn_CheckForFreeSpace(var/turf/space/center,var/size) if (!istype(center)) return list() if (!isnum(size)) return list() var/list/acceptable_turfs = list() var/loopbroken = 0 for (var/turf/space/TF in range(center,size)) loopbroken = 0 if (TF.loc.type != /area) asteroid_blocked_turfs += TF continue if (TF.x <= turf_spawn_edge_limit || TF.x >= world.maxx - turf_spawn_edge_limit) asteroid_blocked_turfs += TF continue if (TF.y <= turf_spawn_edge_limit || TF.y >= world.maxy - turf_spawn_edge_limit) asteroid_blocked_turfs += TF continue for (var/obj/O in TF.contents) if (O.density) asteroid_blocked_turfs += TF loopbroken = 1 break if (istype(O, /obj/landmark/asteroid_spawn_blocker)) qdel(O) asteroid_blocked_turfs += TF loopbroken = 1 break if (!loopbroken) acceptable_turfs += TF return acceptable_turfs /proc/Turfspawn_Asteroid_CheckForModifiableTurfs(var/list/turfs) if (!turfs || turfs.len < 1) return list() var/list/acceptable_turfs = list() for (var/turf/simulated/wall/asteroid/AST in turfs) if (AST.ore || AST.event) continue acceptable_turfs += AST return acceptable_turfs // Generators /proc/Turfspawn_Asteroid_DegradeFromCenter(var/turf/space/center, var/base_rock = /turf/simulated/wall/asteroid, var/size = 8, var/degradation = 10, var/area/area_restriction = null) if (!istype(center)) return list() if (!isnum(size) || size < 1) size = rand(5,15) if (!ispath(base_rock,/turf/simulated/wall/asteroid)) return list() var/current_chance = 100 var/current_range = 0 var/list/generated_turfs = list() var/turf/simulated/wall/asteroid/A A = new base_rock(locate(center.x, center.y, center.z),0) generated_turfs += A var/turf/simulated/wall/asteroid/B while (current_range < size - 1) current_range++ current_chance -= degradation for (var/turf/space/S in range(current_range,A)) if (get_dist(S,A) == current_range) if (S in asteroid_blocked_turfs) continue if (!Turfspawn_CheckForNearbyTurfsOfType(S,base_rock,1)) continue if (!prob(current_chance)) continue if (area_restriction && S.loc.type != area_restriction) continue B = new base_rock(locate(S.x, S.y, S.z),0) generated_turfs += B return generated_turfs /proc/Turfspawn_Asteroid_Round(var/turf/space/center, var/base_rock = /turf/simulated/wall/asteroid, var/size = 8, var/hollow = 0, var/area/area_restriction = null) if (!istype(center)) return list() if (!isnum(size) || size < 1) size = rand(5,15) if (!ispath(base_rock,/turf/simulated/wall/asteroid)) return list() var/current_range = 0 var/list/generated_turfs = list() var/turf/A if (hollow) A = new /turf/simulated/floor/plating/airless/asteroid(locate(center.x, center.y, center.z),0) else A = new base_rock(locate(center.x, center.y, center.z),0) generated_turfs += A var/turf/simulated/wall/asteroid/B var/turf/simulated/floor/plating/airless/asteroid/F var/corner_range = round(size * 1.5) var/total_distance = 0 var/stone_color while (current_range < size - 1) current_range++ total_distance = 0 for (var/turf/space/S in range(current_range,A)) if (get_dist(S,A) == current_range) if (S in asteroid_blocked_turfs) continue total_distance = abs(A.x - S.x) + abs(A.y - S.y) + (current_range / 2) if (total_distance > corner_range) continue if (area_restriction && S.loc.type != area_restriction) continue if (hollow && total_distance < size / 2) F = new /turf/simulated/floor/plating/airless/asteroid(locate(S.x, S.y, S.z),0) //F.stone_color = B.stone_color generated_turfs += F else B = new base_rock(locate(S.x, S.y, S.z),0) stone_color = B.stone_color generated_turfs += B for (var/turf/simulated/floor/plating/airless/asteroid/FLOOR in generated_turfs) FLOOR.color = stone_color return generated_turfs /proc/Turfspawn_Wreckage(var/turf/space/center,var/size = 6,var/area/area_restriction = null) if (!istype(center)) return list() if (!isnum(size) || size < 1) size = rand(3,6) var/current_chance = 100 var/current_range = 0 var/list/generated_turfs = list() var/turf/A = new /turf/simulated/floor/plating/airless(locate(center.x, center.y, center.z),0) generated_turfs += A var/turf/B = null while (current_range < size - 1) current_range++ current_chance = max(2,min(current_chance - 25,100)) for (var/turf/space/S in range(current_range,A)) if (get_dist(S,A) == current_range) if (S in asteroid_blocked_turfs) continue if (!Turfspawn_CheckForNearbyTurfsOfType(S,/turf/simulated/floor/plating/airless,1)) continue if (area_restriction && S.loc.type != area_restriction) continue if (prob(current_chance)) B = new /turf/simulated/floor/plating/airless(locate(S.x, S.y, S.z),0) generated_turfs += B else if (prob(round(current_chance / 2))) switch(rand(1,6)) if(4) make_cleanable(/obj/decal/cleanable/robot_debris/gib, locate(S.x, S.y, S.z),0) if(5) make_cleanable(/obj/decal/cleanable/machine_debris, locate(S.x, S.y, S.z),0) if(6) new /obj/grille/steel/broken(locate(S.x, S.y, S.z),0) else new /obj/lattice(locate(S.x, S.y, S.z),0) var/num_items = rand(4,20) var/datum/material/scrap_material = null switch(RarityClassRoll(100,0,list(90,50))) if(1) scrap_material = copyMaterial(getMaterial(pick("steel","mauxite"))) if(2) scrap_material = copyMaterial(getMaterial(pick("cobryl","bohrum"))) if(3) scrap_material = copyMaterial(getMaterial(pick("gold","syreline"))) var/list/turfs_near_center = list() for(var/turf/T in range(size - 1,center)) turfs_near_center += T var/picker = 0 var/obj/item/I = null while(num_items > 0) num_items-- picker = rand(1,6) switch(picker) if (1 to 3) I = unpool(/obj/item/raw_material/scrap_metal) I.set_loc(pick(turfs_near_center)) I.setMaterial(scrap_material) if (4) I = new /obj/item/sheet(pick(turfs_near_center)) I.amount = rand(1,5) I.setMaterial(scrap_material) if (5) if (prob(15)) Artifact_Spawn(pick(turfs_near_center)) else I = new /obj/item/rods(pick(turfs_near_center)) I.amount = rand(2,10) I.setMaterial(scrap_material) if (6) if (prob(15)) new /obj/storage/crate/loot(pick(turfs_near_center)) else new /obj/item/cable_coil/cut(pick(turfs_near_center)) return generated_turfs // Modifiers /proc/Turfspawn_Asteroid_SeedSpecificOre(var/list/turfs,var/ore_name = "mauxite",var/veins = 0) if (!turfs || turfs.len < 1) return list() if (!isnum(veins) && veins <= 1) veins = rand(2,6) while (veins > 0) veins-- if (turfs.len < 1) break var/datum/ore/O = mining_controls.get_ore_from_string(ore_name) var/ore_tiles = rand(O.tiles_per_rock_min,O.tiles_per_rock_max) while (ore_tiles > 0) if (turfs.len < 1) break ore_tiles-- var/turf/simulated/wall/asteroid/AST = pick(turfs) if (!istype(AST)) turfs -= AST ore_tiles++ continue AST.ore = O AST.hardness += O.hardness_mod AST.amount = rand(O.amount_per_tile_min,O.amount_per_tile_max) var/image/ore_overlay = image('icons/turf/asteroid.dmi',O.name) ore_overlay.transform = turn(ore_overlay.transform, pick(0,90,180,-90)) ore_overlay.pixel_x += rand(-6,6) ore_overlay.pixel_y += rand(-6,6) AST.overlays += ore_overlay O.onGenerate(AST) AST.mining_health = O.mining_health AST.mining_max_health = O.mining_health if (prob(O.event_chance) && O.events.len > 0) var/new_event = pick(O.events) var/datum/ore/event/E = new new_event E.set_up(O) AST.set_event(E) turfs -= AST return turfs /proc/Turfspawn_Asteroid_SeedOre(var/list/turfs,var/veins,var/rarity_mod = 0) if (!turfs || turfs.len < 1) return list() if (!isnum(veins) && veins <= 1) veins = rand(2,6) if (!isnum(rarity_mod)) rarity_mod = 0 while (veins > 0) veins-- if (turfs.len < 1) break var/rarity_roller = RarityClassRoll(100,rarity_mod,list(90,50)) var/list/ores_to_pick = list() switch(rarity_roller) if(3) // rare tier ores_to_pick = mining_controls.ore_types_rare if(2) // uncommon tier ores_to_pick = mining_controls.ore_types_uncommon else // common tier ores_to_pick = mining_controls.ore_types_common var/datum/ore/O = pick(ores_to_pick) var/ore_tiles = rand(O.tiles_per_rock_min,O.tiles_per_rock_max) while (ore_tiles > 0) if (turfs.len < 1) break ore_tiles-- var/turf/simulated/wall/asteroid/AST = pick(turfs) if (!istype(AST)) turfs -= AST ore_tiles++ continue AST.ore = O AST.hardness += O.hardness_mod AST.amount = rand(O.amount_per_tile_min,O.amount_per_tile_max) var/image/ore_overlay = image('icons/turf/asteroid.dmi',O.name) ore_overlay.transform = turn(ore_overlay.transform, pick(0,90,180,-90)) ore_overlay.pixel_x += rand(-6,6) ore_overlay.pixel_y += rand(-6,6) AST.overlays += ore_overlay O.onGenerate(AST) AST.mining_health = O.mining_health AST.mining_max_health = O.mining_health if (prob(O.event_chance) && O.events.len > 0) var/new_event = pick(O.events) var/datum/ore/event/E = new new_event E.set_up(O) AST.set_event(E) turfs -= AST return turfs /proc/Turfspawn_Asteroid_SeedEvents(var/list/turfs,var/amount) if (!turfs || turfs.len < 1) return list() if (!isnum(amount) || amount <= 0) amount = rand(1,6) var/datum/ore/event/E var/turf/simulated/wall/asteroid/AST while (amount > 0) amount-- if (turfs.len < 1) break E = pick(mining_controls.events) AST = pick(turfs) if (!istype(AST) || (E.restrict_to_turf_type && AST.type != E.restrict_to_turf_type)) turfs -= AST amount++ continue AST.set_event(E)