diff --git a/baystation12.dme b/baystation12.dme index ed96270696..4851c962cb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -746,6 +746,7 @@ #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_factions.dm" #include "code\modules\client\preferences_gear.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 9a097030d5..0777c6aa41 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -113,6 +113,11 @@ datum/controller/game_controller/proc/setup_objects() asteroid_ore_map = new /datum/ore_distribution() asteroid_ore_map.populate_distribution_map() + //Shitty hack to fix mining turf overlays, for some reason New() is not being called. + for(var/turf/simulated/floor/plating/airless/asteroid/T in world) + T.updateMineralOverlays() + T.name = "asteroid" + //Set up spawn points. populate_spawn_points() @@ -301,7 +306,7 @@ datum/controller/game_controller/proc/process_machines_power() //check if the area has power for M's channel //this will keep stat updated in case the machine is moved from one area to another. M.power_change(A) //we've already made sure A is a master area, above. - + if(!(M.stat & NOPOWER) && M.use_power) M.auto_use_power() diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 0c8a7aa8bd..797afab1d4 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -297,6 +297,7 @@ var/global/datum/controller/gameticker/ticker captainless=0 if(player.mind.assigned_role != "MODE") job_master.EquipRank(player, player.mind.assigned_role, 0) + UpdateFactionList(player) EquipCustomItems(player) if(captainless) for(var/mob/M in player_list) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index ee0a20a33a..3d83666a46 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -171,7 +171,7 @@ selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting) - + alt_titles = list("Drill Technician","Prospector") equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a471aeba39..38ef31dbf1 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -77,6 +77,12 @@ datum/preferences var/language = "None" //Secondary language var/list/gear //Custom/fluff item loadout. + //Some faction information. + var/home_system = "Unset" //System of birth. + var/citizenship = "None" //Current home system. + var/faction = "None" //Antag faction/general associated faction. + var/religion = "None" //Religious association. + //Mob preview var/icon/preview_icon = null var/icon/preview_icon_front = null @@ -406,7 +412,14 @@ datum/preferences dat += "
Body Color
" dat += "Change Color
__
" + dat += "

Background Information
" + dat += "Home system: [home_system]
" + dat += "Citizenship: [citizenship]
" + dat += "Faction: [faction]
" + dat += "Religion: [religion]
" + dat += "

" + if(jobban_isbanned(user, "Syndicate")) dat += "You are banned from antagonist roles." src.be_special = 0 @@ -1343,6 +1356,46 @@ datum/preferences return spawnpoint = choice + if("home_system") + var/choice = input(user, "Please choose a home system.") as null|anything in home_system_choices + list("Unset","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter a home system.") as text|null + if(raw_choice) + home_system = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + home_system = choice + if("citizenship") + var/choice = input(user, "Please choose your current citizenship.") as null|anything in citizenship_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter your current citizenship.", "Character Preference") as text|null + if(raw_choice) + citizenship = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + citizenship = choice + if("faction") + var/choice = input(user, "Please choose a faction to work for.") as null|anything in faction_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter a faction.") as text|null + if(raw_choice) + faction = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + faction = choice + if("religion") + var/choice = input(user, "Please choose a religion.") as null|anything in religion_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter a religon.") as text|null + if(raw_choice) + religion = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + religion = choice else switch(href_list["preference"]) if("gender") diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm new file mode 100644 index 0000000000..2293be7dd6 --- /dev/null +++ b/code/modules/client/preferences_factions.dm @@ -0,0 +1,53 @@ +var/global/list/seen_citizenships = list() +var/global/list/seen_systems = list() +var/global/list/seen_factions = list() +var/global/list/seen_religions = list() + +//Commenting this out for now until I work the lists it into the event generator/journalist/chaplain. +/proc/UpdateFactionList(mob/living/carbon/human/M) + /*if(M && M.client && M.client.prefs) + seen_citizenships |= M.client.prefs.citizenship + seen_systems |= M.client.prefs.home_system + seen_factions |= M.client.prefs.faction + seen_religions |= M.client.prefs.religion*/ + return + +var/global/list/citizenship_choices = list( + "Earth", + "Mars", + "Moghes", + "Ahdomai", + "Qerrbalak" + ) + +var/global/list/home_system_choices = list( + "Sol", + "Nyx", + "Tau Ceti", + "Epsilon Ursae Majoris", + "S'randarr" + ) + +var/global/list/faction_choices = list( + "Sol Central", + "Vey Med", + "Einstein Engines", + "Free Trade Union", + "NanoTrasen", + "Ward-Takahashi GMB", + "Gilthari Exports", + "Grayson Manufactories Ltd.", + "Aether Atmospherics", + "Zeng-Hu Pharmaceuticals", + "Hesphaistos Industries" + ) + +var/global/list/religion_choices = list( + "Unitarianism", + "Hinduism", + "Buddhist", + "Islamic", + "Christian", + "Agnostic", + "Deist" + ) \ No newline at end of file diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 896be32bac..dd205c3862 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -166,6 +166,10 @@ S["skill_specialization"] >> skill_specialization S["organ_data"] >> organ_data S["gear"] >> gear + S["home_system"] >> home_system + S["citizenship"] >> citizenship + S["faction"] >> faction + S["religion"] >> religion S["nanotrasen_relation"] >> nanotrasen_relation //S["skin_style"] >> skin_style @@ -225,6 +229,11 @@ if(!gear) src.gear = list() //if(!skin_style) skin_style = "Default" + if(!home_system) home_system = "Unset" + if(!citizenship) citizenship = "None" + if(!faction) faction = "None" + if(!religion) religion = "None" + return 1 /datum/preferences/proc/save_character() @@ -297,6 +306,10 @@ S["skill_specialization"] << skill_specialization S["organ_data"] << organ_data S["gear"] << gear + S["home_system"] << home_system + S["citizenship"] << citizenship + S["faction"] << faction + S["religion"] << religion S["nanotrasen_relation"] << nanotrasen_relation //S["skin_style"] << skin_style diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index bf32d417cd..e152a60b34 100644 --- a/code/modules/mining/drilling/distribution.dm +++ b/code/modules/mining/drilling/distribution.dm @@ -163,7 +163,6 @@ Deep minerals: target_turf = locate(tx+j, ty+i, asteroid_z) if(target_turf && target_turf.has_resources) - target_turf.resources = list() target_turf.resources["silicates"] = rand(3,5) target_turf.resources["carbonaceous rock"] = rand(3,5) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c54853355e..f695621d97 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -181,3 +181,70 @@ icon_opened = "miningcaropen" icon_closed = "miningcar" +// Flags. + +/obj/item/stack/flag + name = "flags" + desc = "Some colourful flags." + singular_name = "flag" + amount = 10 + max_amount = 10 + icon = 'icons/obj/mining.dmi' + var/upright = 0 + var/base_state + +/obj/item/stack/flag/New() + ..() + base_state = icon_state + +/obj/item/stack/flag/red + name = "red flags" + singular_name = "red flag" + icon_state = "redflag" + +/obj/item/stack/flag/yellow + name = "yellow flags" + singular_name = "yellow flag" + icon_state = "yellowflag" + +/obj/item/stack/flag/green + name = "green flags" + singular_name = "green flag" + icon_state = "greenflag" + +/obj/item/stack/flag/attackby(obj/item/W as obj, mob/user as mob) + if(upright && istype(W,src.type)) + src.attack_hand(user) + else + ..() + +/obj/item/stack/flag/attack_hand(user as mob) + if(upright) + upright = 0 + icon_state = base_state + anchored = 0 + src.visible_message("[user] knocks down [src].") + else + ..() + +/obj/item/stack/flag/attack_self(mob/user as mob) + + var/obj/item/stack/flag/F = locate() in get_turf(src) + + var/turf/T = get_turf(src) + if(!T || !istype(T,/turf/simulated/floor/plating/airless/asteroid)) + user << "The flag won't stand up in this terrain." + return + + if(F && F.upright) + user << "There is already a flag here." + return + + var/obj/item/stack/flag/newflag = new src.type(T) + newflag.amount = 1 + newflag.upright = 1 + anchored = 1 + newflag.name = newflag.singular_name + newflag.icon_state = "[newflag.base_state]_open" + newflag.visible_message("[user] plants [newflag] firmly in the ground.") + src.use(1) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 207b331535..bf70bb5c76 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -26,353 +26,333 @@ has_resources = 1 - New() - . = ..() +/turf/simulated/mineral/New() - MineralSpread() + . = ..() - spawn(1) - var/turf/T - if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space)) || (istype(get_step(src, NORTH), /turf/simulated/shuttle/floor))) - T = get_step(src, NORTH) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_s", layer=2) - if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space)) || (istype(get_step(src, SOUTH), /turf/simulated/shuttle/floor))) - T = get_step(src, SOUTH) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_n", layer=2) - if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space)) || (istype(get_step(src, EAST), /turf/simulated/shuttle/floor))) - T = get_step(src, EAST) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=2) - if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space)) || (istype(get_step(src, WEST), /turf/simulated/shuttle/floor))) - T = get_step(src, WEST) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=2) + MineralSpread() + spawn(2) + var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST) + for(var/direction in step_overlays) + var/turf/turf_to_check = get_step(src,step_overlays[direction]) - ex_act(severity) - switch(severity) - if(2.0) - if (prob(70)) - mined_ore = 1 //some of the stuff gets blown up - GetDrilled() - if(1.0) - mined_ore = 2 //some of the stuff gets blown up + if(istype(turf_to_check,/turf/simulated/floor/plating/airless/asteroid)) + var/turf/simulated/floor/plating/airless/asteroid/T = turf_to_check + T.updateMineralOverlays() + + else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) + turf_to_check.overlays += image('icons/turf/walls.dmi', "rock_side_[direction]") + +/turf/simulated/mineral/ex_act(severity) + switch(severity) + if(2.0) + if (prob(70)) + mined_ore = 1 //some of the stuff gets blown up GetDrilled() + if(1.0) + mined_ore = 2 //some of the stuff gets blown up + GetDrilled() + +/turf/simulated/mineral/Bumped(AM) + . = ..() + if(istype(AM,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) + attackby(H.l_hand,H) + else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) + attackby(H.r_hand,H) + + else if(istype(AM,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = AM + if(istype(R.module_active,/obj/item/weapon/pickaxe)) + attackby(R.module_active,R) + + else if(istype(AM,/obj/mecha)) + var/obj/mecha/M = AM + if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) + M.selected.action(src) + +/turf/simulated/mineral/proc/MineralSpread() + if(mineral && mineral.spread) + for(var/trydir in cardinal) + if(prob(mineral.spread_chance)) + var/turf/simulated/mineral/random/target_turf = get_step(src, trydir) + if(istype(target_turf) && !target_turf.mineral) + target_turf.mineral = mineral + target_turf.UpdateMineral() + target_turf.MineralSpread() - Bumped(AM) - . = ..() - if(istype(AM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) - attackby(H.l_hand,H) - else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) - attackby(H.r_hand,H) +/turf/simulated/mineral/proc/UpdateMineral() + if(!mineral) + name = "\improper Rock" + icon_state = "rock" + return + name = "\improper [mineral.display_name] deposit" + overlays.Cut() + overlays += "rock_[mineral.name]" - else if(istype(AM,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = AM - if(istype(R.module_active,/obj/item/weapon/pickaxe)) - attackby(R.module_active,R) +//Not even going to touch this pile of spaghetti +/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) - else if(istype(AM,/obj/mecha)) - var/obj/mecha/M = AM - if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) - M.selected.action(src) + if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + usr << "\red You don't have the dexterity to do this!" + return + if (istype(W, /obj/item/device/core_sampler)) + geologic_data.UpdateNearbyArtifactInfo(src) + var/obj/item/device/core_sampler/C = W + C.sample_item(src, user) + return - proc/MineralSpread() - if(mineral && mineral.spread) - for(var/trydir in cardinal) - if(prob(mineral.spread_chance)) - var/turf/simulated/mineral/random/target_turf = get_step(src, trydir) - if(istype(target_turf) && !target_turf.mineral) - target_turf.mineral = mineral - target_turf.UpdateMineral() - target_turf.MineralSpread() + if (istype(W, /obj/item/device/depth_scanner)) + var/obj/item/device/depth_scanner/C = W + C.scan_atom(user, src) + return + if (istype(W, /obj/item/device/measuring_tape)) + var/obj/item/device/measuring_tape/P = W + user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") + if(do_after(user,25)) + user << "\blue \icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." + return - proc/UpdateMineral() - if(!mineral) - name = "\improper Rock" - icon_state = "rock" - return - name = "\improper [mineral.display_name] deposit" - overlays.Cut() - overlays += "rock_[mineral.name]" - - - //Not even going to touch this pile of spaghetti - attackby(obj/item/weapon/W as obj, mob/user as mob) - - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + if (istype(W, /obj/item/weapon/pickaxe)) + var/turf/T = user.loc + if (!( istype(T, /turf) )) return - if (istype(W, /obj/item/device/core_sampler)) - geologic_data.UpdateNearbyArtifactInfo(src) - var/obj/item/device/core_sampler/C = W - C.sample_item(src, user) + var/obj/item/weapon/pickaxe/P = W + if(last_act + P.digspeed > world.time)//prevents message spam return + last_act = world.time - if (istype(W, /obj/item/device/depth_scanner)) - var/obj/item/device/depth_scanner/C = W - C.scan_atom(user, src) - return + playsound(user, P.drill_sound, 20, 1) - if (istype(W, /obj/item/device/measuring_tape)) - var/obj/item/device/measuring_tape/P = W - user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") - if(do_after(user,25)) - user << "\blue \icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." - return + //handle any archaeological finds we might uncover + var/fail_message + if(finds && finds.len) + var/datum/find/F = finds[1] + if(excavation_level + P.excavation_amount > F.excavation_required) + //Chance to destroy / extract any finds here + fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" - if (istype(W, /obj/item/weapon/pickaxe)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return + user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]." - var/obj/item/weapon/pickaxe/P = W - if(last_act + P.digspeed > world.time)//prevents message spam - return - last_act = world.time + if(fail_message && prob(90)) + if(prob(25)) + excavate_find(5, finds[1]) + else if(prob(50)) + finds.Remove(finds[1]) + if(prob(50)) + artifact_debris() - playsound(user, P.drill_sound, 20, 1) + if(do_after(user,P.digspeed)) + user << "\blue You finish [P.drill_verb] the rock." - //handle any archaeological finds we might uncover - var/fail_message if(finds && finds.len) var/datum/find/F = finds[1] - if(excavation_level + P.excavation_amount > F.excavation_required) - //Chance to destroy / extract any finds here - fail_message = ", [pick("there is a crunching noise","[W] collides with some different rock","part of the rock face crumbles away","something breaks under [W]")]" - - user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]." - - if(fail_message && prob(90)) - if(prob(25)) - excavate_find(5, finds[1]) - else if(prob(50)) - finds.Remove(finds[1]) - if(prob(50)) - artifact_debris() - - if(do_after(user,P.digspeed)) - user << "\blue You finish [P.drill_verb] the rock." - - if(finds && finds.len) - var/datum/find/F = finds[1] - if(round(excavation_level + P.excavation_amount) == F.excavation_required) - //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them - if(excavation_level + P.excavation_amount > F.excavation_required) - //if you can get slightly over, perfect extraction - excavate_find(100, F) - else - excavate_find(80, F) - - else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) - //just pull the surrounding rock out - excavate_find(0, F) - - if( excavation_level + P.excavation_amount >= 100 ) - //if players have been excavating this turf, leave some rocky debris behind - var/obj/structure/boulder/B - if(artifact_find) - if( excavation_level > 0 || prob(15) ) - //boulder with an artifact inside - B = new(src) - if(artifact_find) - B.artifact_find = artifact_find - else - artifact_debris(1) - else if(prob(15)) - //empty boulder - B = new(src) - - if(B) - GetDrilled(0) + if(round(excavation_level + P.excavation_amount) == F.excavation_required) + //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them + if(excavation_level + P.excavation_amount > F.excavation_required) + //if you can get slightly over, perfect extraction + excavate_find(100, F) else - GetDrilled(1) - return + excavate_find(80, F) - excavation_level += P.excavation_amount + else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) + //just pull the surrounding rock out + excavate_find(0, F) - //archaeo overlays - if(!archaeo_overlay && finds && finds.len) - var/datum/find/F = finds[1] - if(F.excavation_required <= excavation_level + F.view_range) - archaeo_overlay = "overlay_archaeo[rand(1,3)]" - overlays += archaeo_overlay + if( excavation_level + P.excavation_amount >= 100 ) + //if players have been excavating this turf, leave some rocky debris behind + var/obj/structure/boulder/B + if(artifact_find) + if( excavation_level > 0 || prob(15) ) + //boulder with an artifact inside + B = new(src) + if(artifact_find) + B.artifact_find = artifact_find + else + artifact_debris(1) + else if(prob(15)) + //empty boulder + B = new(src) - //there's got to be a better way to do this - var/update_excav_overlay = 0 - if(excavation_level >= 75) - if(excavation_level - P.excavation_amount < 75) - update_excav_overlay = 1 - else if(excavation_level >= 50) - if(excavation_level - P.excavation_amount < 50) - update_excav_overlay = 1 - else if(excavation_level >= 25) - if(excavation_level - P.excavation_amount < 25) - update_excav_overlay = 1 - - //update overlays displaying excavation level - if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) - var/excav_quadrant = round(excavation_level / 25) + 1 - excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" - overlays += excav_overlay - - /* Nope. - //extract pesky minerals while we're excavating - while(excavation_minerals.len && excavation_level > excavation_minerals[excavation_minerals.len]) - DropMineral() - pop(excavation_minerals) - mineralAmt-- */ - - //drop some rocks - next_rock += P.excavation_amount * 10 - while(next_rock > 100) - next_rock -= 100 - var/obj/item/weapon/ore/O = new(src) - geologic_data.UpdateNearbyArtifactInfo(src) - O.geologic_data = geologic_data - - else - return attack_hand(user) - - - proc/DropMineral() - if(!mineral) - return - - var/obj/item/weapon/ore/O = new mineral.ore (src) - if(istype(O)) - geologic_data.UpdateNearbyArtifactInfo(src) - O.geologic_data = geologic_data - return O - - - proc/GetDrilled(var/artifact_fail = 0) - //var/destroyed = 0 //used for breaking strange rocks - if (mineral && mineral.result_amount) - - //if the turf has already been excavated, some of it's ore has been removed - for (var/i = 1 to mineral.result_amount - mined_ore) - DropMineral() - - //destroyed artifacts have weird, unpleasant effects - //make sure to destroy them before changing the turf though - if(artifact_find && artifact_fail) - var/pain = 0 - if(prob(50)) - pain = 1 - for(var/mob/living/M in range(src, 200)) - M << "[pick("A high pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" - if(pain) - flick("pain",M.pain) - if(prob(50)) - M.adjustBruteLoss(5) + if(B) + GetDrilled(0) else - flick("flash",M.flash) - if(prob(50)) - M.Stun(5) - M.apply_effect(25, IRRADIATE) + GetDrilled(1) + return - var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) - N.fullUpdateMineralOverlays() + excavation_level += P.excavation_amount - if(rand(1,500) == 1) - visible_message("An old dusty crate was buried within!") - new /obj/structure/closet/crate/secure/loot(src) + //archaeo overlays + if(!archaeo_overlay && finds && finds.len) + var/datum/find/F = finds[1] + if(F.excavation_required <= excavation_level + F.view_range) + archaeo_overlay = "overlay_archaeo[rand(1,3)]" + overlays += archaeo_overlay + + //there's got to be a better way to do this + var/update_excav_overlay = 0 + if(excavation_level >= 75) + if(excavation_level - P.excavation_amount < 75) + update_excav_overlay = 1 + else if(excavation_level >= 50) + if(excavation_level - P.excavation_amount < 50) + update_excav_overlay = 1 + else if(excavation_level >= 25) + if(excavation_level - P.excavation_amount < 25) + update_excav_overlay = 1 + + //update overlays displaying excavation level + if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) + var/excav_quadrant = round(excavation_level / 25) + 1 + excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" + overlays += excav_overlay + + //drop some rocks + next_rock += P.excavation_amount * 10 + while(next_rock > 100) + next_rock -= 100 + var/obj/item/weapon/ore/O = new(src) + geologic_data.UpdateNearbyArtifactInfo(src) + O.geologic_data = geologic_data + + else + return attack_hand(user) + +/turf/simulated/mineral/proc/DropMineral() + if(!mineral) + return + + var/obj/item/weapon/ore/O = new mineral.ore (src) + if(istype(O)) + geologic_data.UpdateNearbyArtifactInfo(src) + O.geologic_data = geologic_data + return O + +/turf/simulated/mineral/proc/GetDrilled(var/artifact_fail = 0) + //var/destroyed = 0 //used for breaking strange rocks + if (mineral && mineral.result_amount) + + //if the turf has already been excavated, some of it's ore has been removed + for (var/i = 1 to mineral.result_amount - mined_ore) + DropMineral() + + //destroyed artifacts have weird, unpleasant effects + //make sure to destroy them before changing the turf though + if(artifact_find && artifact_fail) + var/pain = 0 + if(prob(50)) + pain = 1 + for(var/mob/living/M in range(src, 200)) + M << "[pick("A high pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" + if(pain) + flick("pain",M.pain) + if(prob(50)) + M.adjustBruteLoss(5) + else + flick("flash",M.flash) + if(prob(50)) + M.Stun(5) + M.apply_effect(25, IRRADIATE) + + var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) + for(var/i=0;iAn old dusty crate was buried within!") + new /obj/structure/closet/crate/secure/loot(src) - proc/excavate_find(var/prob_clean = 0, var/datum/find/F) - //with skill and luck, players can cleanly extract finds - //otherwise, they come out inside a chunk of rock - var/obj/item/weapon/X - if(prob_clean) - X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) - else - X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) - geologic_data.UpdateNearbyArtifactInfo(src) - X:geologic_data = geologic_data +/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) + //with skill and luck, players can cleanly extract finds + //otherwise, they come out inside a chunk of rock + var/obj/item/weapon/X + if(prob_clean) + X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) + else + X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) + geologic_data.UpdateNearbyArtifactInfo(src) + X:geologic_data = geologic_data - //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens - //yuck - var/display_name = "something" - if(!X) - X = last_find - if(X) - display_name = X.name + //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens + //yuck + var/display_name = "something" + if(!X) + X = last_find + if(X) + display_name = X.name - //many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted - if(prob(F.prob_delicate)) - var/obj/effect/suspension_field/S = locate() in src - if(!S || S.field_type != get_responsive_reagent(F.find_type)) - if(X) - visible_message("\red[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") - del(X) + //many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted + if(prob(F.prob_delicate)) + var/obj/effect/suspension_field/S = locate() in src + if(!S || S.field_type != get_responsive_reagent(F.find_type)) + if(X) + visible_message("\red[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") + del(X) - finds.Remove(F) + finds.Remove(F) - proc/artifact_debris(var/severity = 0) - //cael's patented random limited drop componentized loot system! - //sky's patented not-fucking-retarded overhaul! +/turf/simulated/mineral/proc/artifact_debris(var/severity = 0) + //cael's patented random limited drop componentized loot system! + //sky's patented not-fucking-retarded overhaul! - //Give a random amount of loot from 1 to 3 or 5, varying on severity. - for(var/j in 1 to rand(1, 3 + max(min(severity, 1), 0) * 2)) - switch(rand(1,7)) - if(1) - var/obj/item/stack/rods/R = new(src) - R.amount = rand(5,25) + //Give a random amount of loot from 1 to 3 or 5, varying on severity. + for(var/j in 1 to rand(1, 3 + max(min(severity, 1), 0) * 2)) + switch(rand(1,7)) + if(1) + var/obj/item/stack/rods/R = new(src) + R.amount = rand(5,25) - if(2) - var/obj/item/stack/tile/R = new(src) - R.amount = rand(1,5) + if(2) + var/obj/item/stack/tile/R = new(src) + R.amount = rand(1,5) - if(3) - var/obj/item/stack/sheet/metal/R = new(src) - R.amount = rand(5,25) + if(3) + var/obj/item/stack/sheet/metal/R = new(src) + R.amount = rand(5,25) - if(4) - var/obj/item/stack/sheet/plasteel/R = new(src) - R.amount = rand(5,25) + if(4) + var/obj/item/stack/sheet/plasteel/R = new(src) + R.amount = rand(5,25) - if(5) - var/quantity = rand(1,3) - for(var/i=0, i