diff --git a/baystation12.dme b/baystation12.dme index e34c6f3e7bd..3d3d8361766 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -978,6 +978,8 @@ #include "code\modules\media\machinery.dm" #include "code\modules\media\mediamanager.dm" #include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\alloys.dm" +#include "code\modules\mining\coins.dm" #include "code\modules\mining\equipment_locker.dm" #include "code\modules\mining\machine_input_output_plates.dm" #include "code\modules\mining\machine_processing.dm" @@ -990,9 +992,12 @@ #include "code\modules\mining\minerals.dm" #include "code\modules\mining\mint.dm" #include "code\modules\mining\money_bag.dm" -#include "code\modules\mining\ores_coins.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\ore_datum.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mining\surprise.dm" +#include "code\modules\mining\drilling\distribution.dm" +#include "code\modules\mining\drilling\drill.dm" #include "code\modules\mining\laborcamp\laborminerals.dm" #include "code\modules\mining\laborcamp\laborshuttle.dm" #include "code\modules\mining\laborcamp\laborstacker.dm" diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index d067105a470..0ba0a831276 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -85,6 +85,10 @@ datum/controller/game_controller/proc/setup() color_windows_init() + //Create the mining ore distribution map. + var/datum/ore_distribution/O = new() + O.populate_distribution_map() + spawn(0) if(ticker) ticker.pregame() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 6c922d92ab7..e6233c20d70 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -272,3 +272,31 @@ var/global/list/datum/stack_recipe/clown_recipes = list ( \ throw_range = 3 origin_tech = "materials=4" perunit = 2000 + +/* + * TODO + */ +/obj/item/stack/sheet/mineral/platinum + name = "platinum" + icon_state = "sheet-diamond" //TODO + sheettype = "platinum" + +/obj/item/stack/sheet/mineral/mhydrogen + name = "metallic hydrogen" + icon_state = "sheet-diamond" //TODO + sheettype = "mhydrogen" + +/obj/item/stack/sheet/mineral/tritium + name = "tritium" + icon_state = "sheet-diamond" //TODO + sheettype = "tritium" + +/obj/item/stack/sheet/mineral/osmium + name = "osmium" + icon_state = "sheet-diamond" //TODO + sheettype = "osmium" + +obj/item/stack/sheet/mineral/iron + name = "iron" + icon_state = "sheet-gold" + sheettype = "iron" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 356214dd9a2..4a3fbc6abc9 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -22,6 +22,10 @@ var/icon_old = null var/pathweight = 1 + //Mining resource generation stuff. + var/has_resources + var/list/resources + /turf/New() ..() for(var/atom/movable/AM as mob|obj in src) diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm new file mode 100644 index 00000000000..ce29725d87a --- /dev/null +++ b/code/modules/mining/alloys.dm @@ -0,0 +1,27 @@ +//Alloys that contain subsets of each other's ingredients must be ordered in the desired sequence +//eg. steel comes after plasteel because plasteel's ingredients contain the ingredients for steel and +//it would be impossible to produce. + +/datum/alloy + var/list/requires + var/product_mod = 1 + var/product + var/metaltag + +/datum/alloy/plasteel + metaltag = "plasteel" + requires = list( + "platinum" = 1, + "coal" = 2, + "hematite" = 2 + ) + product_mod = 0.3 + product = /obj/item/stack/sheet/plasteel + +/datum/alloy/steel + metaltag = "steel" + requires = list( + "coal" = 1, + "hematite" = 1 + ) + product = /obj/item/stack/sheet/metal \ No newline at end of file diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm new file mode 100644 index 00000000000..29a685978a1 --- /dev/null +++ b/code/modules/mining/coins.dm @@ -0,0 +1,89 @@ +/*****************************Coin********************************/ + +/obj/item/weapon/coin + icon = 'icons/obj/items.dmi' + name = "Coin" + icon_state = "coin" + flags = FPRINT | TABLEPASS| CONDUCT + force = 0.0 + throwforce = 0.0 + w_class = 1.0 + var/string_attached + var/material="iron" // Ore ID, used with coinbags. + var/credits = 0 // How many credits is this coin worth? + +/obj/item/weapon/coin/New() + pixel_x = rand(0,16)-8 + pixel_y = rand(0,8)-8 + +/obj/item/weapon/coin/gold + name = "Gold coin" + icon_state = "coin_gold" + credits = 10 + +/obj/item/weapon/coin/silver + name = "Silver coin" + icon_state = "coin_silver" + credits = 5 + +/obj/item/weapon/coin/diamond + name = "Diamond coin" + icon_state = "coin_diamond" + credits = 25 + +/obj/item/weapon/coin/iron + name = "Iron coin" + icon_state = "coin_iron" + credits = 1 + +/obj/item/weapon/coin/plasma + name = "Solid plasma coin" + icon_state = "coin_plasma" + credits = 5 + +/obj/item/weapon/coin/uranium + name = "Uranium coin" + icon_state = "coin_uranium" + credits = 25 + +/obj/item/weapon/coin/clown + name = "Bananaium coin" + icon_state = "coin_clown" + credits = 1000 + +/obj/item/weapon/coin/adamantine + name = "Adamantine coin" + icon_state = "coin_adamantine" + +/obj/item/weapon/coin/mythril + name = "Mythril coin" + icon_state = "coin_mythril" + +/obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/stack/cable_coil) ) + var/obj/item/stack/cable_coil/CC = W + if(string_attached) + user << "\blue There already is a string attached to this coin." + return + + if(CC.amount <= 0) + user << "\blue This cable coil appears to be empty." + del(CC) + return + + overlays += image('icons/obj/items.dmi',"coin_string_overlay") + string_attached = 1 + user << "\blue You attach a string to the coin." + CC.use(1) + else if(istype(W,/obj/item/weapon/wirecutters) ) + if(!string_attached) + ..() + return + + var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc) + CC.amount = 1 +// CC.updateicon() + overlays = list() + string_attached = null + user << "\blue You detach the string from the coin." + else ..() diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm new file mode 100644 index 00000000000..7d09c902ec4 --- /dev/null +++ b/code/modules/mining/drilling/distribution.dm @@ -0,0 +1,248 @@ +//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 << "Could not generate a sane distribution map. Aborting." + 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 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 += "#" + + 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 \ No newline at end of file diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm new file mode 100644 index 00000000000..0cc0e068bde --- /dev/null +++ b/code/modules/mining/drilling/drill.dm @@ -0,0 +1,382 @@ +/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/open = 0 + + 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/plasma, + "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/obj/item/weapon/stock_parts/matter_bin/storage + var/obj/item/weapon/stock_parts/micro_laser/cutter + var/obj/item/weapon/stock_parts/capacitor/cellmount + var/obj/item/weapon/cell/cell + + //Flags + var/need_update_field = 0 + var/need_player_check = 0 + +/obj/machinery/mining/drill/New() + + ..() + + storage = new(src) + cutter = new(src) + cellmount = new(src) + + cell = new(src) + cell.maxcharge = 10000 + cell.charge = cell.maxcharge + +/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/plating/airless/asteroid)) + var/turf/simulated/floor/plating/airless/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/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 = get_harvest_capacity() //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 >= get_storage_capacity()) + active = 0 + need_player_check = 1 + update_icon() + return + + if(contents.len + total_harvest >= get_storage_capacity()) + total_harvest = get_storage_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/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/screwdriver)) + if(active) return + open = !open + user << "\blue You [open ? "open" : "close"] the maintenance panel." //TODO: Sprite. + return + else + if(!open || active) return ..() + if(istype(W,/obj/item/weapon/crowbar)) + if(storage) + user << "You slip the bolt and pry out \the [storage]." + storage.loc = get_turf(src) + storage = null + else if(cutter) + user << "You carefully detatch and pry out \the [cutter]." + cutter.loc = get_turf(src) + cutter = null + else if(cellmount) + user << "You yank out a few wires and pry out \the [cellmount]." + cellmount.loc = get_turf(src) + cellmount.loc = null + else if(cell) + user << "You pry out \the [cell]." + cell.loc = get_turf(src) + cell = null + else + user << "There's nothing inside the drilling rig to remove." + return + else if(istype(W,/obj/item/weapon/stock_parts/matter_bin)) + if(storage) + user << "The drill already has a matter bin installed." + else + W.loc = src + storage = W + user << "You install \the [W]." + return + else if(istype(W,/obj/item/weapon/stock_parts/micro_laser)) + if(cutter) + user << "The drill already has a cutting head installed." + else + W.loc = src + cutter = W + user << "You install \the [W]." + return + else if(istype(W,/obj/item/weapon/stock_parts/capacitor)) + if(cellmount) + user << "The drill already has a cell capacitor installed." + else + W.loc = src + cellmount = W + user << "You install \the [W]." + return + else if(istype(W,/obj/item/weapon/cell)) + if(cell) + user << "The drill already has a cell installed." + else + W.loc = src + cell = W + user << "You install \the [W]." + 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) + if(use_cell_power()) + active = !active + if(active) + user << "\blue You engage \the [src] and it lurches downwards, grinding noisily." + need_update_field = 1 + else + user << "\blue You disengage \the [src] and it shudders to a grinding halt." + else + user << "\blue The drill is unpowered." + else + user << "\blue Turning on a piece of industrial machinery without sufficient bracing is a bad idea." + + 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/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) src.visible_message("\red \The [src] flashes a '[error]' warning.") + need_player_check = 1 + active = 0 + update_icon() + +/obj/machinery/mining/drill/proc/get_harvest_capacity() + return 3 * (cutter ? cutter.rating : 0) + +/obj/machinery/mining/drill/proc/get_storage_capacity() + return 100 * (storage ? storage.rating : 0) + +/obj/machinery/mining/drill/proc/get_charge_use() + return 100 - (20 * (cellmount ? cellmount.rating : 0)) + +/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/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 && istype(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 + var/req = get_charge_use() + if(cell.charge >= req) + cell.use(req) + 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 << "\red You unload the drill's storage cache into the ore box." + else + usr << "\red You must move an ore box up to the drill before you can unload it." + + +/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/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/wrench)) + + if(istype(get_turf(src),/turf/space)) + user << "\blue You can't anchor something to empty space. Idiot." + return + + if(connected && connected.active) + user << "\blue You can't unanchor the brace of a running drill!" + return + + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "\blue You [anchored ? "un" : ""]anchor the brace." + + 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.dir = turn(src.dir, 90) + return 1 \ No newline at end of file diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index dd0c659923f..5a99a98552e 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -35,7 +35,7 @@ /obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O) var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O) if(processed_sheet) - var/datum/material/mat = materials.getMaterial(O.material) + var/datum/material/mat = materials.getMaterial(O.oretag) mat.stored += processed_sheet.amount //Stack the sheets O.loc = null //Let the old sheet garbage collect while(mat.stored > stack_amt) //Get rid of excessive stackage @@ -54,8 +54,8 @@ process_sheet(O) /obj/machinery/mineral/ore_redemption/proc/SmeltMineral(var/obj/item/weapon/ore/O) - if(O.material) - var/datum/material/mat = materials.getMaterial(O.material) + if(O.oretag) + var/datum/material/mat = materials.getMaterial(O.oretag) var/obj/item/stack/sheet/M = new mat.sheettype(src) points += mat.value return M diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 01091751f8c..2e71cbd9e79 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -23,7 +23,7 @@ if(t == src.door_tag) src.release_door = d if (machine && release_door) - machine.CONSOLE = src + machine.console = src else del(src) @@ -104,12 +104,20 @@ /obj/machinery/mineral/stacking_machine/laborstacker var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. Iron = 1; Diamond = 25. - var/list/ore_values = list(("metal" = 1), ("diamond" = 25), ("solid plasma" = 2), ("gold" = 5), ("silver" = 5), ("bananium" = 9999), ("uranium" = 5), ("glass" = 1), ("reinforced glass" = 2), ("plasteel" = 3)) + var/list/ore_values = list(("iron" = 1), ("diamond" = 25), ("solid plasma" = 2), ("gold" = 5), ("silver" = 5), ("bananium" = 9999), ("uranium" = 5), ("glass" = 1), ("reinforced glass" = 2), ("plasteel" = 3)) -/obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a - ..() \ No newline at end of file + +/obj/machinery/mineral/stacking_machine/laborstacker/process() + if (src.output && src.input) + var/turf/T = get_turf(input) + for(var/obj/item/O in T.contents) + if(!O) return + if(istype(O,/obj/item/stack)) + var/obj/item/stack/S = O + if(S.name in ore_values) + points += ore_values[S.name] * S.amount + S.loc = null + else + S.loc = output.loc + else + O.loc = output.loc \ No newline at end of file diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 26dcb7cdf3f..cbd2d648db4 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -6,175 +6,92 @@ icon_state = "console" density = 1 anchored = 1 + var/obj/machinery/mineral/processing_unit/machine = null var/machinedir = EAST + var/show_all_ores = 0 /obj/machinery/mineral/processing_unit_console/New() ..() spawn(7) src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) if (machine) - machine.CONSOLE = src + machine.console = src else del(src) -/obj/machinery/mineral/processing_unit_console/process() - updateDialog() - /obj/machinery/mineral/processing_unit_console/attack_hand(mob/user) add_fingerprint(user) interact(user) /obj/machinery/mineral/processing_unit_console/interact(mob/user) + + if(..()) + return + + if(!allowed(user)) + user << "\red Access denied." + return + user.set_machine(src) - var/dat = "Smelter control console

" - //iron - if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine) - if(machine.ore_iron) - if (machine.selected_iron==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Iron: [machine.ore_iron]
") + var/dat = "

Ore processor console

" + + dat += "
" + + for(var/ore in machine.ores_processing) + + if(!machine.ores_stored[ore] && !show_all_ores) continue + + dat += "" + dat += "
[capitalize(ore)][machine.ores_stored[ore]]not processing" + if(1) + dat += "orange'>smelting" + if(2) + dat += "blue'>compressing" + if(3) + dat += "gray'>alloying" else - machine.selected_iron = 0 - - //sand - glass - if(machine.ore_glass) - if (machine.selected_glass==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Sand: [machine.ore_glass]
") - else - machine.selected_glass = 0 - - //plasma - if(machine.ore_plasma) - if (machine.selected_plasma==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Plasma: [machine.ore_plasma]
") - else - machine.selected_plasma = 0 - - //uranium - if(machine.ore_uranium) - if (machine.selected_uranium==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Uranium: [machine.ore_uranium]
") - else - machine.selected_uranium = 0 - - //gold - if(machine.ore_gold) - if (machine.selected_gold==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Gold: [machine.ore_gold]
") - else - machine.selected_gold = 0 - - //silver - if(machine.ore_silver) - if (machine.selected_silver==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Silver: [machine.ore_silver]
") - else - machine.selected_silver = 0 - - //diamond - if(machine.ore_diamond) - if (machine.selected_diamond==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Diamond: [machine.ore_diamond]
") - else - machine.selected_diamond = 0 - - //bananium - if(machine.ore_clown) - if (machine.selected_clown==1) - dat += text("Smelting ") - else - dat += text("Not smelting ") - dat += text("Bananium: [machine.ore_clown]
") - else - machine.selected_clown = 0 - - - //On or off - dat += text("Machine is currently ") - if (machine.on==1) - dat += text("On ") - else - dat += text("Off ") - else - dat+="---No Materials Loaded---" - - - user << browse("[dat]", "window=console_processing_unit") - onclose(user, "console_processing_unit") + dat += "red'>not processing" + dat += "
.
\[change\]

" + dat += "Currently displaying [show_all_ores ? "all ore types" : "only available ore types"]. \[[show_all_ores ? "show less" : "show more"]\]
" + dat += "The ore processor is currently [(machine.active ? "processing" : "disabled")]." + user << browse(dat, "window=processor_console;size=400x500") + onclose(user, "computer") + return /obj/machinery/mineral/processing_unit_console/Topic(href, href_list) if(..()) return usr.set_machine(src) src.add_fingerprint(usr) - if(href_list["sel_iron"]) - if (href_list["sel_iron"] == "yes") - machine.selected_iron = 1 - else - machine.selected_iron = 0 - if(href_list["sel_glass"]) - if (href_list["sel_glass"] == "yes") - machine.selected_glass = 1 - else - machine.selected_glass = 0 - if(href_list["sel_plasma"]) - if (href_list["sel_plasma"] == "yes") - machine.selected_plasma = 1 - else - machine.selected_plasma = 0 - if(href_list["sel_uranium"]) - if (href_list["sel_uranium"] == "yes") - machine.selected_uranium = 1 - else - machine.selected_uranium = 0 - if(href_list["sel_gold"]) - if (href_list["sel_gold"] == "yes") - machine.selected_gold = 1 - else - machine.selected_gold = 0 - if(href_list["sel_silver"]) - if (href_list["sel_silver"] == "yes") - machine.selected_silver = 1 - else - machine.selected_silver = 0 - if(href_list["sel_diamond"]) - if (href_list["sel_diamond"] == "yes") - machine.selected_diamond = 1 - else - machine.selected_diamond = 0 - if(href_list["sel_clown"]) - if (href_list["sel_clown"] == "yes") - machine.selected_clown = 1 - else - machine.selected_clown = 0 - if(href_list["set_on"]) - if (href_list["set_on"] == "on") - machine.on = 1 - else - machine.on = 0 + + if(href_list["toggle_smelting"]) + + var/choice = input("What setting do you wish to use for processing [href_list["toggle_smelting"]]?") as null|anything in list("Smelting","Compressing","Alloying","Nothing") + if(!choice) return + + switch(choice) + if("Nothing") choice = 0 + if("Smelting") choice = 1 + if("Compressing") choice = 2 + if("Alloying") choice = 3 + + machine.ores_processing[href_list["toggle_smelting"]] = choice + + if(href_list["toggle_power"]) + + machine.active = !machine.active + + if(href_list["toggle_ores"]) + + show_all_ores = !show_all_ores + src.updateUsrDialog() return @@ -182,258 +99,142 @@ /obj/machinery/mineral/processing_unit - name = "furnace" + name = "material processor" //This isn't actually a goddamn furnace, we're in space and it's processing platinum and flammable phoron... icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "furnace" density = 1 - anchored = 1.0 + anchored = 1 + luminosity = 3 var/obj/machinery/mineral/input = null var/obj/machinery/mineral/output = null - var/obj/machinery/mineral/CONSOLE = null - var/ore_gold = 0; - var/ore_silver = 0; - var/ore_diamond = 0; - var/ore_glass = 0; - var/ore_plasma = 0; - var/ore_uranium = 0; - var/ore_iron = 0; - var/ore_clown = 0; - var/ore_adamantine = 0; - var/selected_gold = 0 - var/selected_silver = 0 - var/selected_diamond = 0 - var/selected_glass = 0 - var/selected_plasma = 0 - var/selected_uranium = 0 - var/selected_iron = 0 - var/selected_clown = 0 - var/on = 0 //0 = off, 1 =... oh you know! + var/obj/machinery/mineral/console = null + var/sheets_per_tick = 10 + var/list/ores_processing[0] + var/list/ores_stored[0] + var/list/ore_data[0] + var/list/alloy_data[0] + var/active = 0 /obj/machinery/mineral/processing_unit/New() + ..() - spawn( 5 ) + + //TODO: Ore and alloy global storage datum. + for(var/alloytype in typesof(/datum/alloy)-/datum/alloy) + alloy_data += new alloytype() + + for(var/oretype in typesof(/datum/ore)-/datum/ore) + var/datum/ore/OD = new oretype() + ore_data[OD.oretag] = OD + ores_processing[OD.oretag] = 0 + ores_stored[OD.oretag] = 0 + + //Locate our output and input machinery. + spawn(5) for (var/dir in cardinal) src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) if(src.input) break for (var/dir in cardinal) src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) if(src.output) break - processing_objects.Add(src) return return /obj/machinery/mineral/processing_unit/process() - if (src.output && src.input) - var/i - for (i = 0; i < 10; i++) - if (on) - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_glass > 0) - ore_glass--; - new /obj/item/stack/sheet/glass(output.loc) - else - on = 0 - continue - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) - if (ore_glass > 0 && ore_iron > 0) - ore_glass--; - ore_iron--; - new /obj/item/stack/sheet/rglass(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 1 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_gold > 0) - ore_gold--; - new /obj/item/stack/sheet/mineral/gold(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_silver > 0) - ore_silver--; - new /obj/item/stack/sheet/mineral/silver(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_diamond > 0) - ore_diamond--; - new /obj/item/stack/sheet/mineral/diamond(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_plasma > 0) - ore_plasma--; - new /obj/item/stack/sheet/mineral/plasma(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0) - if (ore_uranium > 0) - ore_uranium--; - new /obj/item/stack/sheet/mineral/uranium(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) - if (ore_iron > 0) - ore_iron--; - new /obj/item/stack/sheet/metal(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) - if (ore_iron > 0 && ore_plasma > 0) - ore_iron--; - ore_plasma--; - new /obj/item/stack/sheet/plasteel(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 1) - if (ore_clown > 0) - ore_clown--; - new /obj/item/stack/sheet/mineral/clown(output.loc) - else - on = 0 - continue - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_glass > 0 && ore_plasma > 0) - ore_glass--; - ore_plasma--; - new /obj/item/stack/sheet/plasmaglass(output.loc) - else - on = 0 - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) - if (ore_glass > 0 && ore_plasma > 0 && ore_iron > 0) - ore_glass--; - ore_iron--; - ore_plasma--; - new /obj/item/stack/sheet/plasmarglass(output.loc) - else - on = 0 - //THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT. - //They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage - /*if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0) - if (ore_uranium >= 2 && ore_diamond >= 1) - ore_uranium -= 2 - ore_diamond -= 1 - new /obj/item/stack/sheet/mineral/adamantine(output.loc) - else - on = 0 - continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) - if (ore_silver >= 1 && ore_plasma >= 3) - ore_silver -= 1 - ore_plasma -= 3 - new /obj/item/stack/sheet/mineral/mythril(output.loc) - else - on = 0 - continue*/ + if (!active || !src.output || !src.input) return - //if a non valid combination is selected + var/list/tick_alloys = list() - var/b = 1 //this part checks if all required ores are available + //Process our stored ores and spit out sheets. + var/sheets = 0 + for(var/metal in ores_stored) - if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron)) - b = 0 + if(sheets >= sheets_per_tick) break - if (selected_gold == 1) - if (ore_gold <= 0) - b = 0 - if (selected_silver == 1) - if (ore_silver <= 0) - b = 0 - if (selected_diamond == 1) - if (ore_diamond <= 0) - b = 0 - if (selected_uranium == 1) - if (ore_uranium <= 0) - b = 0 - if (selected_plasma == 1) - if (ore_plasma <= 0) - b = 0 - if (selected_iron == 1) - if (ore_iron <= 0) - b = 0 - if (selected_glass == 1) - if (ore_glass <= 0) - b = 0 - if (selected_clown == 1) - if (ore_clown <= 0) - b = 0 + if(ores_stored[metal] > 0 && ores_processing[metal] != 0) - if (b) //if they are, deduct one from each, produce slag and shut the machine off - if (selected_gold == 1) - ore_gold-- - if (selected_silver == 1) - ore_silver-- - if (selected_diamond == 1) - ore_diamond-- - if (selected_uranium == 1) - ore_uranium-- - if (selected_plasma == 1) - ore_plasma-- - if (selected_iron == 1) - ore_iron-- - if (selected_clown == 1) - ore_clown-- - new /obj/item/weapon/ore/slag(output.loc) - on = 0 - else - on = 0 - break - break + var/datum/ore/O = ore_data[metal] + + if(!O) continue + + if(ores_processing[metal] == 3 && O.alloy) //Alloying. + var/can_make_alloy = 0 + var/datum/alloy/alloying + + for(var/datum/alloy/A in alloy_data) + if(A.metaltag in tick_alloys) continue + tick_alloys += A.metaltag + + if(!isnull(A.requires[metal]) && ores_stored[metal] >= A.requires[metal]) //We have enough of our first metal, we're off to a good start. + alloying = A + can_make_alloy = 0 + var/enough_metal = 1 + + for(var/needs_metal in A.requires) + + //Check if we're alloying the needed metal and have it stored. + if(ores_processing[needs_metal] != 3 || ores_stored[needs_metal] < A.requires[needs_metal]) + enough_metal = 0 + break + + if(!enough_metal) + can_make_alloy = 0 + else + can_make_alloy = 1 + break + + if(!alloying) + sheets++ + return + + if(!can_make_alloy) + continue + else + var/total + for(var/needs_metal in alloying.requires) + ores_stored[needs_metal] -= alloying.requires[needs_metal] + total += alloying.requires[needs_metal] + total = round(total*alloying.product_mod) + sheets += total-1 + + for(var/i=0,i0) can_make-- + + if(!can_make || ores_stored[metal] < 1) + continue + + for(var/i=0,iStacking unit console

") + dat += text("

Stacking unit console


") - for(var/O in machine.stack_list) - s = machine.stack_list[O] - if(s.amount > 0) - dat += text("[s.name]: [s.amount] Release
") - - dat += text("
Stacking: [machine.stack_amt]

") + for(var/stacktype in machine.stack_storage) + if(machine.stack_storage[stacktype] > 0) + dat += "" + dat += "
[capitalize(stacktype)]:[machine.stack_storage[stacktype]]\[release\]

" + dat += text("
Stacking: [machine.stack_amt] \[change\]

") user << browse("[dat]", "window=console_stacking_machine") + onclose(user, "console_stacking_machine") - return /obj/machinery/mineral/stacking_unit_console/Topic(href, href_list) if(..()) return - usr.set_machine(src) + + if(href_list["change_stack"]) + var/choice = input("What would you like to set the stack amount to?") as null|anything in list(1,5,10,20,50) + if(!choice) return + machine.stack_amt = choice + + if(href_list["release_stack"]) + if(machine.stack_storage[href_list["release_stack"]] > 0) + var/stacktype = machine.stack_paths[href_list["release_stack"]] + var/obj/item/stack/sheet/S = new stacktype (get_turf(machine.output)) + S.amount = machine.stack_storage[href_list["release_stack"]] + machine.stack_storage[href_list["release_stack"]] = 0 + src.add_fingerprint(usr) - if(href_list["release"]) - var/obj/item/stack/sheet/inp = machine.stack_list[text2path(href_list["release"])] - var/obj/item/stack/sheet/out = new inp.type() - out.amount = inp.amount - inp.amount = 0 - out.loc = machine.output.loc - - src.updateUsrDialog() - return + return /**********************Mineral stacking unit**************************/ @@ -62,16 +71,29 @@ icon_state = "stacker" density = 1 anchored = 1.0 - var/obj/machinery/mineral/stacking_unit_console/CONSOLE - var/stk_types = list() - var/stk_amt = list() + var/obj/machinery/mineral/stacking_unit_console/console var/obj/machinery/mineral/input = null var/obj/machinery/mineral/output = null - var/stack_list[0] //Key: Type. Value: Instance of type. - var/stack_amt = 50; //ammount to stack before releassing + var/list/stack_storage[0] + var/list/stack_paths[0] + var/stack_amt = 50; // Amount to stack before releassing /obj/machinery/mineral/stacking_machine/New() ..() + + for(var/stacktype in typesof(/obj/item/stack/sheet/mineral)-/obj/item/stack/sheet/mineral) + var/obj/item/stack/S = new stacktype(src) + stack_storage[S.name] = 0 + stack_paths[S.name] = stacktype + del(S) + + stack_storage["glass"] = 0 + stack_paths["glass"] = /obj/item/stack/sheet/glass + stack_storage["metal"] = 0 + stack_paths["metal"] = /obj/item/stack/sheet/metal + stack_storage["plasteel"] = 0 + stack_paths["plasteel"] = /obj/item/stack/sheet/plasteel + spawn( 5 ) for (var/dir in cardinal) src.input = locate(/obj/machinery/mineral/input, get_step(src, dir)) @@ -79,34 +101,31 @@ for (var/dir in cardinal) src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) if(src.output) break - if(!istype(output) || !istype(input)) - del(src) - return - processing_objects.Add(src) return return -/obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp) - if(!istype(inp)) //Non-sheets. Yuck. - return - if(!(inp.type in stack_list)) //It's the first of this sheet added - stack_list[inp.type] = new inp.type(src,0) - var/obj/item/stack/sheet/storage = stack_list[inp.type] - storage.amount += inp.amount //Stack the sheets - inp.loc = null //Let the old sheet garbage collect - while(storage.amount > stack_amt) //Get rid of excessive stackage - var/obj/item/stack/sheet/out = new inp.type() - out.amount = stack_amt - out.loc = output.loc - storage.amount -= stack_amt - - /obj/machinery/mineral/stacking_machine/process() - var/obj/item/O - while (locate(/obj/item, input.loc)) - O = locate(/obj/item, input.loc) - if(istype(O,/obj/item/stack/sheet)) - process_sheet(O) - else - O.loc = src.output.loc + if (src.output && src.input) + var/turf/T = get_turf(input) + for(var/obj/item/O in T.contents) + if(!O) return + if(istype(O,/obj/item/stack)) + if(!isnull(stack_storage[O.name])) + stack_storage[O.name]++ + O.loc = null + else + O.loc = output.loc + else + O.loc = output.loc + + //Output amounts that are past stack_amt. + for(var/sheet in stack_storage) + if(stack_storage[sheet] >= stack_amt) + var/stacktype = stack_paths[sheet] + var/obj/item/stack/sheet/S = new stacktype (get_turf(output)) + S.amount = stack_amt + stack_storage[sheet] -= stack_amt + + console.updateUsrDialog() return + diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 4ec1cbbd13f..442a503f773 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -28,6 +28,7 @@ var/list/artifact_spawn = list() // Runtime fix for geometry loading before cont var/datum/artifact_find/artifact_find var/scan_state = null + has_resources = 1 New() . = ..() @@ -405,6 +406,7 @@ var/list/artifact_spawn = list() // Runtime fix for geometry loading before cont temperature = T0C icon_plating = "asteroid" var/dug = 0 //0 = has not yet been dug, 1 = has already been dug + has_resources = 1 /turf/simulated/floor/plating/airless/asteroid/New() var/proper_name = name @@ -572,92 +574,6 @@ var/list/artifact_spawn = list() // Runtime fix for geometry loading before cont else return - -////////////////////////////////Gibtonite -/turf/simulated/mineral/gibtonite - name = "Diamond deposit" //honk - icon_state = "rock_Gibtonite" - mineral = new /mineral/gibtonite - scan_state = "rock_Gibtonite" - var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it - var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction - var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes - var/activated_name = null - -/turf/simulated/mineral/gibtonite/New() - icon_state="rock_Diamond" - det_time = rand(8,10) //So you don't know exactly when the hot potato will explode - ..() - -/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/device/analyzer) && stage == 1) - user.visible_message("You use the analyzer to locate where to cut off the chain reaction and attempt to stop it...") - defuse() - if(istype(I, /obj/item/weapon/pickaxe)) - src.activated_ckey = "[user.ckey]" - src.activated_name = "[user.name]" - ..() - -/turf/simulated/mineral/gibtonite/proc/explosive_reaction() - if(stage == 0) - icon_state = "rock_Gibtonite_active" - name = "Gibtonite deposit" - desc = "An active gibtonite reserve. Run!" - stage = 1 - visible_message("There was gibtonite inside! It's going to explode!") - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - var/log_str = "[src.activated_ckey]? [src.activated_name] has triggered a gibtonite deposit reaction [A.name] (JMP)." - log_game(log_str) - countdown() - -/turf/simulated/mineral/gibtonite/proc/countdown() - spawn(0) - while(stage == 1 && det_time > 0 && mineral.result_amount >= 1) - det_time-- - sleep(5) - if(stage == 1 && det_time <= 0 && mineral.result_amount >= 1) - var/turf/bombturf = get_turf(src) - mineral.result_amount = 0 - explosion(bombturf,1,3,5, adminlog = 0) - if(stage == 0 || stage == 2) - return - -/turf/simulated/mineral/gibtonite/proc/defuse() - if(stage == 1) - icon_state = "rock_Gibtonite_inactive" - desc = "An inactive gibtonite reserve. The ore can be extracted." - stage = 2 - if(det_time < 0) - det_time = 0 - visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!") - -/turf/simulated/mineral/gibtonite/GetDrilled() - if(stage == 0 && mineral.result_amount >= 1) //Gibtonite deposit is activated - playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1) - explosive_reaction() - return - if(stage == 1 && mineral.result_amount >= 1) //Gibtonite deposit goes kaboom - var/turf/bombturf = get_turf(src) - mineral.result_amount = 0 - explosion(bombturf,1,2,5, adminlog = 0) - if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. - var/obj/item/weapon/twohanded/required/gibtonite/G = new /obj/item/weapon/twohanded/required/gibtonite/(src) - if(det_time <= 0) - G.quality = 3 - G.icon_state = "Gibtonite ore 3" - if(det_time >= 1 && det_time <= 2) - G.quality = 2 - G.icon_state = "Gibtonite ore 2" - var/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains/G = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains) - G.fullUpdateMineralOverlays() - -/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains - var/det_time = 0 - var/stage = 0 - -////////////////////////////////End Gibtonite - /turf/simulated/floor/plating/airless/asteroid/cave var/length = 100 var/mob_spawn_list = list( diff --git a/code/modules/mining/minerals.dm b/code/modules/mining/minerals.dm index e4486e559a7..a147927d808 100644 --- a/code/modules/mining/minerals.dm +++ b/code/modules/mining/minerals.dm @@ -74,18 +74,6 @@ mineral/clown spread = 0 ore = /obj/item/weapon/ore/clown -mineral/gibtonite - display_name = "Gibtonite" - name = "Gibtonite" - result_amount = 1 - spread_chance = 10 - ore = /obj/item/weapon/twohanded/required/gibtonite - UpdateTurf(var/turf/T) - if(!istype(T,/turf/simulated/mineral/gibtonite)) - T.ChangeTurf(/turf/simulated/mineral/gibtonite) - else - ..() - mineral/cave display_name = "Cave" name = "Cave" diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm new file mode 100644 index 00000000000..8875c6ee588 --- /dev/null +++ b/code/modules/mining/ore.dm @@ -0,0 +1,87 @@ +/obj/item/weapon/ore + name = "rock" + icon = 'icons/obj/mining.dmi' + icon_state = "ore2" + var/datum/geosample/geologic_data + var/oretag + +/obj/item/weapon/ore/uranium + name = "pitchblende" + icon_state = "Uranium ore" + origin_tech = "materials=5" + oretag = "uranium" + +/obj/item/weapon/ore/iron + name = "hematite" + icon_state = "Iron ore" + origin_tech = "materials=1" + oretag = "hematite" + +/obj/item/weapon/ore/coal + name = "carbonaceous rock" + icon_state = "Iron ore" //TODO + origin_tech = "materials=1" + oretag = "coal" + +/obj/item/weapon/ore/glass + name = "impure silicates" + icon_state = "Glass ore" + origin_tech = "materials=1" + oretag = "sand" + +/obj/item/weapon/ore/plasma + name = "plasma crystals" + icon_state = "Plasa ore" + origin_tech = "materials=2" + oretag = "plasma" + +/obj/item/weapon/ore/silver + name = "native silver ore" + icon_state = "Silver ore" + origin_tech = "materials=3" + oretag = "silver" + +/obj/item/weapon/ore/gold + name = "native gold ore" + icon_state = "Gold ore" + origin_tech = "materials=4" + oretag = "gold" + +/obj/item/weapon/ore/diamond + name = "diamonds" + icon_state = "Diamond ore" + origin_tech = "materials=6" + oretag = "diamond" + +/obj/item/weapon/ore/osmium + name = "raw platinum" + icon_state = "slag" //TODO + oretag = "platinum" + +/obj/item/weapon/ore/hydrogen + name = "raw hydrogen" + icon_state = "slag" //TODO + oretag = "hydrogen" + +/obj/item/weapon/ore/clown + name = "Bananium ore" + icon_state = "Clown ore" + origin_tech = "materials=4" + oretag="clown" + +/obj/item/weapon/ore/slag + name = "Slag" + desc = "Completely useless" + icon_state = "slag" + oretag = "slag" + +/obj/item/weapon/ore/New() + pixel_x = rand(0,16)-8 + pixel_y = rand(0,8)-8 + +/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/device/core_sampler)) + var/obj/item/device/core_sampler/C = W + C.sample_item(src, user) + else + return ..() \ No newline at end of file diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm new file mode 100644 index 00000000000..805731923b0 --- /dev/null +++ b/code/modules/mining/ore_datum.dm @@ -0,0 +1,51 @@ +/datum/ore + var/oretag + var/alloy + var/smelts_to + var/compresses_to + +/datum/ore/uranium + smelts_to = /obj/item/stack/sheet/mineral/uranium + oretag = "uranium" + +/datum/ore/iron + smelts_to = /obj/item/stack/sheet/mineral/iron + alloy = 1 + oretag = "hematite" + +/datum/ore/coal + smelts_to = /obj/item/stack/sheet/mineral/plastic + alloy = 1 + oretag = "coal" + +/datum/ore/glass + smelts_to = /obj/item/stack/sheet/glass + compresses_to = /obj/item/stack/sheet/mineral/sandstone + oretag = "sand" + +/datum/ore/plasma + smelts_to = /obj/item/stack/sheet/mineral/plasma + oretag = "plasma" + +/datum/ore/silver + smelts_to = /obj/item/stack/sheet/mineral/silver + oretag = "silver" + +/datum/ore/gold + smelts_to = /obj/item/stack/sheet/mineral/gold + oretag = "gold" + +/datum/ore/diamond + smelts_to = /obj/item/stack/sheet/mineral/diamond + oretag = "diamond" + +/datum/ore/osmium + smelts_to = /obj/item/stack/sheet/mineral/platinum + compresses_to = /obj/item/stack/sheet/mineral/osmium + alloy = 1 + oretag = "platinum" + +/datum/ore/hydrogen + smelts_to = /obj/item/stack/sheet/mineral/tritium + compresses_to = /obj/item/stack/sheet/mineral/mhydrogen + oretag = "hydrogen" diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm deleted file mode 100644 index d7095629eea..00000000000 --- a/code/modules/mining/ores_coins.dm +++ /dev/null @@ -1,237 +0,0 @@ -/**********************Mineral ores**************************/ - -/obj/item/weapon/ore - name = "Rock" - icon = 'icons/obj/mining.dmi' - icon_state = "ore2" - var/material=null - var/datum/geosample/geologic_data - -/obj/item/weapon/ore/uranium - name = "Uranium ore" - icon_state = "Uranium ore" - origin_tech = "materials=5" - material="uranium" - -/obj/item/weapon/ore/iron - name = "Iron ore" - icon_state = "Iron ore" - origin_tech = "materials=1" - material="iron" - -/obj/item/weapon/ore/glass - name = "Sand" - icon_state = "Glass ore" - origin_tech = "materials=1" - material="glass" - - attack_self(mob/living/user as mob) //It's magic I ain't gonna explain how instant conversion with no tool works. -- Urist - var/location = get_turf(user) - for(var/obj/item/weapon/ore/glass/sandToConvert in location) - new /obj/item/stack/sheet/mineral/sandstone(location) - qdel(sandToConvert) - new /obj/item/stack/sheet/mineral/sandstone(location) - del(src) - -/obj/item/weapon/ore/plasma - name = "Plasma ore" - icon_state = "Plasma ore" - origin_tech = "materials=2" - material="plasma" - -/obj/item/weapon/ore/silver - name = "Silver ore" - icon_state = "Silver ore" - origin_tech = "materials=3" - material="silver" - -/obj/item/weapon/ore/gold - name = "Gold ore" - icon_state = "Gold ore" - origin_tech = "materials=4" - material="gold" - -/obj/item/weapon/ore/diamond - name = "Diamond ore" - icon_state = "Diamond ore" - origin_tech = "materials=6" - material="diamond" - -/obj/item/weapon/ore/clown - name = "Bananium ore" - icon_state = "Clown ore" - origin_tech = "materials=4" - material="clown" - -/obj/item/weapon/ore/slag - name = "Slag" - desc = "Completely useless" - icon_state = "slag" - -/obj/item/weapon/twohanded/required/gibtonite - name = "Gibtonite ore" - desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law." - icon = 'icons/obj/mining.dmi' - icon_state = "Gibtonite ore" - item_state = "Gibtonite ore" - w_class = 4 - throw_range = 0 - anchored = 1 //Forces people to carry it by hand, no pulling! - var/primed = 0 - var/det_time = 100 - var/quality = 1 //How pure this gibtonite is, determines the explosion produced by it and is derived from the det_time of the rock wall it was taken from, higher value = better - -/obj/item/weapon/twohanded/required/gibtonite/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/pickaxe) || istype(I, /obj/item/weapon/resonator)) - GibtoniteReaction(user) - return - if(istype(I, /obj/item/device/mining_scanner) && primed) - primed = 0 - user.visible_message("The chain reaction was stopped! ...The ore's quality went down.") - icon_state = "Gibtonite ore" - quality = 1 - return - ..() - -/obj/item/weapon/twohanded/required/gibtonite/bullet_act(var/obj/item/projectile/P) - if(istype(P, /obj/item/projectile/bullet)) - GibtoniteReaction(P.firer) - ..() - -/obj/item/weapon/twohanded/required/gibtonite/ex_act() - GibtoniteReaction(triggered_by_explosive = 1) - -/obj/item/weapon/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by_explosive = 0) - if(!primed) - playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1) - primed = 1 - icon_state = "Gibtonite active" - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - var/notify_admins = 0 - if(z != 5)//Only annoy the admins ingame if we're triggered off the mining zlevel - notify_admins = 1 - if(notify_admins) - if(triggered_by_explosive) - message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).") - else - message_admins("[key_name(usr)]? has triggered a [name] to detonate at [A.name] (JMP).") - if(triggered_by_explosive) - log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") - else - user.visible_message("[user] strikes the [src], causing a chain reaction!") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") - spawn(det_time) - if(primed) - switch(quality) - if(1) - explosion(src.loc,-1,1,3,adminlog = notify_admins) - if(2) - explosion(src.loc,1,2,5,adminlog = notify_admins) - if(3) - explosion(src.loc,2,4,9,adminlog = notify_admins) - del(src) - -/obj/item/weapon/ore/New() - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 - -/obj/item/weapon/ore/ex_act() - return - -/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/device/core_sampler)) - var/obj/item/device/core_sampler/C = W - C.sample_item(src, user) - else - return ..() - -/*****************************Coin********************************/ - -/obj/item/weapon/coin - icon = 'icons/obj/items.dmi' - name = "Coin" - icon_state = "coin" - flags = FPRINT | TABLEPASS| CONDUCT - force = 0.0 - throwforce = 0.0 - w_class = 1.0 - var/string_attached - var/material="iron" // Ore ID, used with coinbags. - var/credits = 0 // How many credits is this coin worth? - -/obj/item/weapon/coin/New() - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 - -/obj/item/weapon/coin/gold - name = "Gold coin" - icon_state = "coin_gold" - credits = 10 - -/obj/item/weapon/coin/silver - name = "Silver coin" - icon_state = "coin_silver" - credits = 5 - -/obj/item/weapon/coin/diamond - name = "Diamond coin" - icon_state = "coin_diamond" - credits = 25 - -/obj/item/weapon/coin/iron - name = "Iron coin" - icon_state = "coin_iron" - credits = 1 - -/obj/item/weapon/coin/plasma - name = "Solid plasma coin" - icon_state = "coin_plasma" - credits = 5 - -/obj/item/weapon/coin/uranium - name = "Uranium coin" - icon_state = "coin_uranium" - credits = 25 - -/obj/item/weapon/coin/clown - name = "Bananaium coin" - icon_state = "coin_clown" - credits = 1000 - -/obj/item/weapon/coin/adamantine - name = "Adamantine coin" - icon_state = "coin_adamantine" - -/obj/item/weapon/coin/mythril - name = "Mythril coin" - icon_state = "coin_mythril" - -/obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/stack/cable_coil) ) - var/obj/item/stack/cable_coil/CC = W - if(string_attached) - user << "\blue There already is a string attached to this coin." - return - - if(CC.amount <= 0) - user << "\blue This cable coil appears to be empty." - del(CC) - return - - overlays += image('icons/obj/items.dmi',"coin_string_overlay") - string_attached = 1 - user << "\blue You attach a string to the coin." - CC.use(1) - else if(istype(W,/obj/item/weapon/wirecutters) ) - if(!string_attached) - ..() - return - - var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc) - CC.amount = 1 -// CC.updateicon() - overlays = list() - string_attached = null - user << "\blue You detach the string from the coin." - else ..() diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 4a0c9a61039..d3ecc25ec92 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -7,19 +7,6 @@ name = "Ore Box" desc = "A heavy box used for storing ore." density = 1 - -/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/ore)) - src.contents += W; - if (istype(W, /obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = W - S.hide_from(usr) - for(var/obj/item/weapon/ore/O in S.contents) - S.remove_from_storage(O, src) //This will move the item to this item's contents - user << "\blue You empty the satchel into the box." - return - -/obj/structure/ore_box/attack_hand(obj, mob/user as mob) var/amt_gold = 0 var/amt_silver = 0 var/amt_diamond = 0 @@ -29,62 +16,142 @@ var/amt_uranium = 0 var/amt_clown = 0 var/amt_strange = 0 + var/last_update = 0 - - for (var/obj/item/weapon/ore/C in contents) - if (istype(C,/obj/item/weapon/ore/diamond)) - amt_diamond++; - if (istype(C,/obj/item/weapon/ore/glass)) - amt_glass++; - if (istype(C,/obj/item/weapon/ore/plasma)) - amt_plasma++; - if (istype(C,/obj/item/weapon/ore/iron)) - amt_iron++; - if (istype(C,/obj/item/weapon/ore/silver)) - amt_silver++; - if (istype(C,/obj/item/weapon/ore/gold)) - amt_gold++; - if (istype(C,/obj/item/weapon/ore/uranium)) - amt_uranium++; - if (istype(C,/obj/item/weapon/ore/clown)) - amt_clown++; - if (istype(C,/obj/item/weapon/ore/strangerock)) - amt_strange++; - - var/dat = text("The contents of the ore box reveal...
") - if (amt_gold) - dat += text("Gold ore: [amt_gold]
") - if (amt_silver) - dat += text("Silver ore: [amt_silver]
") - if (amt_iron) - dat += text("Metal ore: [amt_iron]
") - if (amt_glass) - dat += text("Sand: [amt_glass]
") - if (amt_diamond) - dat += text("Diamond ore: [amt_diamond]
") - if (amt_plasma) - dat += text("Plasma ore: [amt_plasma]
") - if (amt_uranium) - dat += text("Uranium ore: [amt_uranium]
") - if (amt_clown) - dat += text("Bananium ore: [amt_clown]
") - if (amt_strange) - dat += text("Strange rocks: [amt_strange]
") - - dat += text("

Empty box") - user << browse("[dat]", "window=orebox") +/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/ore)) + user.u_equip(W) + src.contents += W + if (istype(W, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = W + S.hide_from(usr) + for(var/obj/item/weapon/ore/O in S.contents) + S.remove_from_storage(O, src) //This will move the item to this item's contents + user << "\blue You empty the satchel into the box." return -/obj/structure/ore_box/Topic(href, href_list) - if(..()) +/obj/structure/ore_box/examine() + set name = "Examine" + set category = "IC" + set src in view(usr.client) //If it can be seen, it can be examined. + + if (!( usr )) return - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["removeall"]) - for (var/obj/item/weapon/ore/O in contents) - contents -= O - O.loc = src.loc - usr << "\blue You empty the box" - src.updateUsrDialog() + usr << "That's an [src]." + usr << desc + + if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can check the contents of ore boxes. + return + + if(!Adjacent(usr)) //Can only check the contents of ore boxes if you can physically reach them. + return + + add_fingerprint(usr) + + if(contents.len < 1) + usr << "It is empty." + return + + if(world.time > last_update + 10) + update_orecount() + last_update = world.time + + var/dat = text("The contents of the ore box reveal...") + if (amt_iron) + dat += text("
Metal ore: [amt_iron]") + if (amt_glass) + dat += text("
Sand: [amt_glass]") + if (amt_plasma) + dat += text("
Plasma ore: [amt_plasma]") + if (amt_uranium) + dat += text("
Uranium ore: [amt_uranium]") + if (amt_silver) + dat += text("
Silver ore: [amt_silver]") + if (amt_gold) + dat += text("
Gold ore: [amt_gold]") + if (amt_diamond) + dat += text("
Diamond ore: [amt_diamond]") + if (amt_strange) + dat += text("
Strange rocks: [amt_strange]") + if (amt_clown) + dat += text("
Bananium ore: [amt_clown]") + + usr << dat + return + +/obj/structure/ore_box/verb/empty_box() + set name = "Empty Ore Box" + set category = "Object" + set src in view(1) + + if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes. + usr << "\red You are physically incapable of emptying the ore box." + return + + if( usr.stat || usr.restrained() ) + return + + if(!Adjacent(usr)) //You can only empty the box if you can physically reach it + usr << "You cannot reach the ore box." + return + + add_fingerprint(usr) + + if(contents.len < 1) + usr << "\red The ore box is empty" + return + + for (var/obj/item/weapon/ore/O in contents) + contents -= O + O.loc = src.loc + usr << "\blue You empty the ore box" + + return + + +// Updates ore tally +/obj/structure/ore_box/proc/update_orecount() + amt_iron = 0 + amt_glass = 0 + amt_plasma = 0 + amt_uranium = 0 + amt_silver = 0 + amt_gold = 0 + amt_diamond = 0 + amt_strange = 0 + amt_clown = 0 + + for(var/obj/item/weapon/ore/O in contents) + if(!istype(O)) + continue + + if (istype(O, /obj/item/weapon/ore/iron)) + amt_iron++ + continue + if (istype(O, /obj/item/weapon/ore/glass)) + amt_glass++ + continue + if (istype(O, /obj/item/weapon/ore/plasma)) + amt_plasma++ + continue + if (istype(O, /obj/item/weapon/ore/uranium)) + amt_uranium++ + continue + if (istype(O, /obj/item/weapon/ore/silver)) + amt_silver++ + continue + if (istype(O, /obj/item/weapon/ore/gold)) + amt_gold++ + continue + if (istype(O, /obj/item/weapon/ore/diamond)) + amt_diamond++ + continue + if (istype(O, /obj/item/weapon/ore/strangerock)) + amt_strange++ + continue + if (istype(O, /obj/item/weapon/ore/clown)) + amt_clown++ + continue + return diff --git a/icons/obj/mining_drill.dmi b/icons/obj/mining_drill.dmi new file mode 100644 index 00000000000..7a9ad6b057f Binary files /dev/null and b/icons/obj/mining_drill.dmi differ