mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-30 12:13:02 +00:00
Added sprites for stationary drilling gear. Added skeleton ores for coal, adamantine, mythril. Updated some icons. Expanded mining rig functionality. Changed adamantine and mythril to osmium and metallic hydrogen. Added ore distribution map generation to master controller. Added upgrading to stationary drills, tweaked other stuff. Rewriting the ore processor and how ores handle information. Also rewrote the ore stacker. Conflicts: baystation12.dme code/controllers/master_controller.dm code/modules/mining/coins.dm code/modules/mining/machine_processing.dm code/modules/mining/machine_stacking.dm code/modules/mining/minerals.dm code/modules/mining/satchel_ore_boxdm.dm
248 lines
7.7 KiB
Plaintext
248 lines
7.7 KiB
Plaintext
//If anyone can think of a less shitty way to work out x,y points on a linear string of integers please tell me.
|
|
#define MAP_CELL ((y-1)*real_size)+x
|
|
#define MAP_CENTRE (((y-1)+size/2)*real_size)+(x+size/2)
|
|
#define MAP_TOP_LEFT ((y-1)*real_size)+x
|
|
#define MAP_TOP_RIGHT ((y-1)*real_size)+(x+size)
|
|
#define MAP_BOTTOM_LEFT (((y+size)-1)*real_size)+x
|
|
#define MAP_BOTTOM_RIGHT ((((y+size)-1)*real_size)+(x+size))
|
|
#define MAP_MID_TOP MAP_TOP_LEFT + (size/2)
|
|
#define MAP_MID_BOTTOM MAP_BOTTOM_LEFT + (size/2)
|
|
#define MAP_MID_LEFT (((y-1)+size/2)*real_size)+x
|
|
#define MAP_MID_RIGHT (((y-1)+size/2)*real_size)+(x+size)
|
|
|
|
#define MIN_SURFACE_COUNT 1000
|
|
#define MAX_SURFACE_COUNT 5000
|
|
#define MIN_RARE_COUNT 1000
|
|
#define MAX_RARE_COUNT 5000
|
|
#define MIN_DEEP_COUNT 100
|
|
#define MAX_DEEP_COUNT 300
|
|
#define ITERATE_BEFORE_FAIL 200
|
|
|
|
#define RESOURCE_HIGH_MAX 8
|
|
#define RESOURCE_HIGH_MIN 5
|
|
#define RESOURCE_MID_MAX 4
|
|
#define RESOURCE_MID_MIN 2
|
|
#define RESOURCE_LOW_MAX 1
|
|
#define RESOURCE_LOW_MIN 0
|
|
|
|
/*
|
|
Surface minerals:
|
|
silicates
|
|
iron
|
|
gold
|
|
silver
|
|
|
|
Rare minerals:
|
|
uranium
|
|
diamond
|
|
|
|
Deep minerals:
|
|
phoron
|
|
xerxium (adamantine)
|
|
fulgurium (mythril)
|
|
*/
|
|
|
|
/datum/ore_distribution
|
|
|
|
var/real_size = 65 //Overall map size ((must be power of 2)+1)
|
|
var/chunk_size = 4 //Size each cell represents on map (like hell we're generating up to 100 256^2 grids at roundstart)
|
|
var/list/map[4225] //The actual map. real_size squared.
|
|
var/range = 255 //Max random range of cells in map.
|
|
|
|
var/random_variance_chance = 25
|
|
var/random_element = 0.5
|
|
|
|
//Called by the drilling rigs each process().
|
|
/datum/ore_distribution/proc/get_ore(var/x,var/y)
|
|
return "Nope."
|
|
|
|
/datum/ore_distribution/proc/map_is_sane()
|
|
if(!map) return 0
|
|
|
|
var/rare_count = 0
|
|
var/surface_count = 0
|
|
var/deep_count = 0
|
|
|
|
for(var/cell in map)
|
|
if(cell>(range*0.60))
|
|
deep_count++
|
|
else if(cell>(range*0.40))
|
|
rare_count++
|
|
else
|
|
surface_count++
|
|
|
|
if(surface_count < MIN_SURFACE_COUNT || surface_count > MAX_SURFACE_COUNT) return 0
|
|
if(rare_count < MIN_RARE_COUNT || rare_count > MAX_RARE_COUNT) return 0
|
|
if(deep_count < MIN_DEEP_COUNT || deep_count > MAX_DEEP_COUNT) return 0
|
|
return 1
|
|
|
|
//Halfassed diamond-square algorithm with some fuckery since it's a single dimension array.
|
|
/datum/ore_distribution/proc/populate_distribution_map()
|
|
|
|
//Seed beginning values.
|
|
|
|
var/x = 1
|
|
var/y = 1
|
|
var/size = real_size-1
|
|
|
|
map[MAP_TOP_LEFT] = (range/3)+rand(range/5)
|
|
map[MAP_TOP_RIGHT] = (range/3)+rand(range/5)
|
|
map[MAP_BOTTOM_LEFT] = (range/3)+rand(range/5)
|
|
map[MAP_BOTTOM_RIGHT] = (range/3)+rand(range/5)
|
|
|
|
//Fill in and smooth it out.
|
|
var/attempts = 0
|
|
do
|
|
attempts++
|
|
generate_distribution_map(1,1,size)
|
|
while(attempts < ITERATE_BEFORE_FAIL && !map_is_sane())
|
|
|
|
if(attempts >= ITERATE_BEFORE_FAIL)
|
|
world << "<b><font color='red'>Could not generate a sane distribution map. Aborting.</font></b>"
|
|
map = null
|
|
return
|
|
else
|
|
apply_to_asteroid()
|
|
|
|
/datum/ore_distribution/proc/clear_distribution_map()
|
|
for(var/x = 1, x <= real_size, x++)
|
|
for(var/y = 1, y <= real_size, y++)
|
|
map[MAP_CELL] = 0
|
|
|
|
/datum/ore_distribution/proc/generate_distribution_map(var/x,var/y,var/input_size)
|
|
|
|
var/size = input_size
|
|
|
|
map[MAP_MID_TOP] = (map[MAP_TOP_LEFT] + map[MAP_TOP_RIGHT])/2
|
|
map[MAP_MID_RIGHT] = (map[MAP_BOTTOM_RIGHT] + map[MAP_TOP_RIGHT])/2
|
|
map[MAP_MID_BOTTOM] = (map[MAP_BOTTOM_LEFT] + map[MAP_BOTTOM_RIGHT])/2
|
|
map[MAP_MID_LEFT] = (map[MAP_TOP_LEFT] + map[MAP_BOTTOM_RIGHT])/2
|
|
map[MAP_CENTRE] = (map[MAP_MID_LEFT]+map[MAP_MID_RIGHT]+map[MAP_MID_BOTTOM]+map[MAP_MID_TOP])/4
|
|
|
|
if(prob(random_variance_chance))
|
|
map[MAP_CENTRE] *= (rand(1) ? (1.0-random_element) : (1.0+random_element))
|
|
map[MAP_CENTRE] = max(0,min(range,map[MAP_CENTRE]))
|
|
|
|
if(size>3)
|
|
generate_distribution_map(x,y,input_size/2)
|
|
generate_distribution_map(x+(input_size/2),y,input_size/2)
|
|
generate_distribution_map(x,y+(input_size/2),input_size/2)
|
|
generate_distribution_map(x+(input_size/2),y+(input_size/2),input_size/2)
|
|
|
|
/datum/ore_distribution/proc/apply_to_asteroid()
|
|
|
|
var/origin_x = 13
|
|
var/origin_y = 32
|
|
var/limit_x = 217
|
|
var/limit_y = 223
|
|
var/asteroid_z = 5
|
|
|
|
var/tx = origin_x
|
|
var/ty = origin_y
|
|
|
|
for(var/y = 1, y <= real_size, y++)
|
|
|
|
for(var/x = 1, x <= real_size, x++)
|
|
|
|
var/turf/target_turf
|
|
|
|
for(var/i=0,i<chunk_size,i++)
|
|
|
|
for(var/j=0,j<chunk_size,j++)
|
|
|
|
if(tx+j > limit_x || ty+i > limit_y)
|
|
continue
|
|
|
|
target_turf = locate(tx+j, ty+i, asteroid_z)
|
|
|
|
if(target_turf.has_resources)
|
|
|
|
var/printcolor
|
|
if(map[MAP_CELL] > (range*0.60))
|
|
printcolor = "#FF0000"
|
|
else if(map[MAP_CELL] > (range*0.40))
|
|
printcolor = "#00FF00"
|
|
else
|
|
printcolor = "#0000FF"
|
|
target_turf.color = "#[printcolor]"
|
|
target_turf.resources = list()
|
|
|
|
target_turf.resources["silicates"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX)
|
|
target_turf.resources["carbonaceous rock"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX)
|
|
|
|
if(map[MAP_CELL] > (range*0.60))
|
|
target_turf.resources["iron"] = 0
|
|
target_turf.resources["gold"] = 0
|
|
target_turf.resources["silver"] = 0
|
|
target_turf.resources["uranium"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX)
|
|
target_turf.resources["diamond"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX)
|
|
target_turf.resources["phoron"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["osmium"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["hydrogen"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
else if(map[MAP_CELL] > (range*0.40))
|
|
target_turf.resources["iron"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["gold"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["silver"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["uranium"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["diamond"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX)
|
|
target_turf.resources["phoron"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["osmium"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["hydrogen"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
else
|
|
target_turf.resources["iron"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["gold"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["silver"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["uranium"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["diamond"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX)
|
|
target_turf.resources["phoron"] = 0
|
|
target_turf.resources["osmium"] = 0
|
|
target_turf.resources["hydrogen"] = 0
|
|
|
|
tx += chunk_size
|
|
tx = origin_x
|
|
ty += chunk_size
|
|
|
|
/datum/ore_distribution/proc/print_map()
|
|
world << "---"
|
|
var/string = ""
|
|
for(var/y = 1, y <= real_size, y++)
|
|
for(var/x = 1, x <= real_size, x++)
|
|
|
|
var/printcolor
|
|
if(map[MAP_CELL] > (range*0.60))
|
|
printcolor = "#FF0000"
|
|
else if(map[MAP_CELL] > (range*0.40))
|
|
printcolor = "#00FF00"
|
|
else
|
|
printcolor = "#0000FF"
|
|
string += "<font color='[printcolor]'>#</font>"
|
|
|
|
world << string
|
|
string = ""
|
|
world << "---"
|
|
|
|
#undef MAP_CELL
|
|
#undef MAP_CENTRE
|
|
#undef MAP_TOP_LEFT
|
|
#undef MAP_TOP_RIGHT
|
|
#undef MAP_BOTTOM_LEFT
|
|
#undef MAP_BOTTOM_RIGHT
|
|
#undef MAP_MID_TOP
|
|
#undef MAP_MID_BOTTOM
|
|
#undef MAP_MID_LEFT
|
|
#undef MAP_MID_RIGHT
|
|
|
|
#undef MIN_SURFACE_COUNT
|
|
#undef MAX_SURFACE_COUNT
|
|
#undef MIN_RARE_COUNT
|
|
#undef MAX_RARE_COUNT
|
|
#undef MIN_DEEP_COUNT
|
|
#undef MAX_DEEP_COUNT
|
|
#undef ITERATE_BEFORE_FAIL
|
|
|
|
#undef RESOURCE_HIGH_MAX
|
|
#undef RESOURCE_HIGH_MIN
|
|
#undef RESOURCE_MID_MAX
|
|
#undef RESOURCE_MID_MIN
|
|
#undef RESOURCE_LOW_MAX
|
|
#undef RESOURCE_LOW_MIN |