From 5439b04241c6dbf50e7fc026c021a7d79bf7b04f Mon Sep 17 00:00:00 2001 From: Cael Aislinn Date: Thu, 19 Jun 2014 10:56:23 +1000 Subject: [PATCH] reconstitutor has a chance to extract multiple genomes per fossil (50% for two genomes, 37.5% chance for three genomes), moved xenoarchaeology initialisation code into the master controller, added upper and lower spawn vals for digsite turf number and artifact machine number, added circuitboards for the reconstitutors, fixes missing clonepod for flora reconstitutors Signed-off-by: Cael Aislinn Conflicts: code/global.dm code/modules/mining/mine_turfs.dm code/modules/research/xenoarchaeology/misc.dm --- .../items/weapons/grenades/flashbang.dm | 3 +- code/global.dm | 3 + code/modules/mining/mine_turfs.dm | 3 - .../xenoarchaeology/genetics/reconstitutor.dm | 132 ++++++++---------- code/modules/research/xenoarchaeology/misc.dm | 131 ++++++++++++++--- 5 files changed, 170 insertions(+), 102 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 4962f51a337..61a17650904 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -20,7 +20,7 @@ var/damage = round(30/(get_dist(B,get_turf(src))+1)) B.health -= damage B.update_icon() - + new/obj/effect/effect/smoke/flashbang(src.loc) del(src) return @@ -102,7 +102,6 @@ /obj/effect/effect/smoke/flashbang name = "illumination" - time_to_live = 10 opacity = 0 icon_state = "sparks" diff --git a/code/global.dm b/code/global.dm index 2348a8cef07..dd5538c6262 100644 --- a/code/global.dm +++ b/code/global.dm @@ -304,3 +304,6 @@ var/score_dmgestkey = null // Recall time limit: 2 hours var/recall_time_limit=72000 + +//added for Xenoarchaeology, might be useful for other stuff +var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 3c37f92a91a..b315ae31e5b 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -1,8 +1,5 @@ /**********************Mineral deposits**************************/ -/datum/controller/game_controller - var/list/artifact_spawning_turfs = list() - /turf/simulated/mineral //wall piece name = "Rock" icon = 'icons/turf/walls.dmi' diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm index 6bd699483dd..b4afc4ff0cc 100644 --- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm +++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm @@ -1,69 +1,14 @@ -var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") -var/list/genome_prefixes = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") - -var/list/spawn_types_animal = list("/mob/living/carbon/slime",\ -"/mob/living/simple_animal/hostile/alien",\ -"/mob/living/simple_animal/hostile/alien/drone",\ -"/mob/living/simple_animal/hostile/alien/sentinel",\ -"/mob/living/simple_animal/hostile/giant_spider",\ -"/mob/living/simple_animal/hostile/giant_spider/hunter",\ -"/mob/living/simple_animal/hostile/giant_spider/nurse",\ -"/mob/living/simple_animal/hostile/creature",\ -"/mob/living/simple_animal/hostile/samak",\ -"/mob/living/simple_animal/hostile/diyaab",\ -"/mob/living/simple_animal/hostile/shantak",\ -"/mob/living/simple_animal/tindalos",\ -"/mob/living/simple_animal/yithian") - -var/list/spawn_types_plant = list("/obj/item/seeds/walkingmushroommycelium",\ -"/obj/item/seeds/killertomatoseed",\ -"/obj/item/seeds/shandseed", -"/obj/item/seeds/mtearseed", -"/obj/item/seeds/thaadra",\ -"/obj/item/seeds/telriis",\ -"/obj/item/seeds/jurlmah",\ -"/obj/item/seeds/amauri",\ -"/obj/item/seeds/gelthi",\ -"/obj/item/seeds/vale",\ -"/obj/item/seeds/surik") - -var/list/all_animal_genesequences = list() -var/list/all_plant_genesequences = list() - +//gene sequence datum datum/genesequence var/spawned_type var/spawned_type_text var/list/full_genome_sequence = list() -/proc/create_all_genesequences() - //create animal gene sequences - while(spawn_types_animal.len && genome_prefixes.len) - var/datum/genesequence/new_sequence = new/datum/genesequence() - new_sequence.spawned_type_text = pick(spawn_types_animal) - new_sequence.spawned_type = text2path(new_sequence.spawned_type_text) - spawn_types_animal -= new_sequence.spawned_type - - var/prefixletter = pick(genome_prefixes) - genome_prefixes -= prefixletter - while(new_sequence.full_genome_sequence.len < 7) - new_sequence.full_genome_sequence.Add("[prefixletter][pick(alphabet_uppercase)][pick(alphabet_uppercase)][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)]") - - all_animal_genesequences.Add(new_sequence) - - //create plant gene sequences - while(spawn_types_plant.len && genome_prefixes.len) - var/datum/genesequence/new_sequence = new/datum/genesequence() - new_sequence.spawned_type = pick(spawn_types_plant) - spawn_types_plant -= new_sequence.spawned_type - - var/prefixletter = pick(genome_prefixes) - genome_prefixes -= prefixletter - while(new_sequence.full_genome_sequence.len < 7) - new_sequence.full_genome_sequence.Add("[prefixletter][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)][pick(alphabet_uppercase)][pick(alphabet_uppercase)]") - - all_plant_genesequences.Add(new_sequence) +#define SCANFOSSIL_RETVAL_WRONGTYPE 1 +#define SCANFOSSIL_RETVAL_NOMOREGENESEQ 2 +#define SCANFOSSIL_RETVAL_SUCCESS 4 /obj/machinery/computer/reconstitutor name = "Flora reconstitution console" @@ -71,7 +16,7 @@ datum/genesequence icon_state = "dna" circuit = "/obj/item/weapon/circuitboard/reconstitutor" req_access = list(access_heads) //Only used for record deletion right now. - var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. + var/obj/machinery/clonepod/pod1 = 1 //Linked cloning pod. var/temp = "" var/menu = 1 //Which menu screen to display var/list/records = list() @@ -86,19 +31,20 @@ datum/genesequence var/list/discovered_genomes = list("! Clear !") var/list/accepted_fossil_types = list(/obj/item/weapon/fossil/plant) + /obj/machinery/computer/reconstitutor/New() - create_all_genesequences() if(!undiscovered_genesequences) - undiscovered_genesequences = all_plant_genesequences.Copy() + undiscovered_genesequences = master_controller.all_plant_genesequences.Copy() ..() /obj/machinery/computer/reconstitutor/animal name = "Fauna reconstitution console" accepted_fossil_types = list(/obj/item/weapon/fossil/bone,/obj/item/weapon/fossil/shell,/obj/item/weapon/fossil/skull) + pod1 = null + circuit = "/obj/item/weapon/circuitboard/reconstitutor/animal" /obj/machinery/computer/reconstitutor/animal/New() - create_all_genesequences() - undiscovered_genesequences = all_animal_genesequences.Copy() + undiscovered_genesequences = master_controller.all_animal_genesequences.Copy() ..() /obj/machinery/computer/reconstitutor/attackby(obj/item/W, mob/user) @@ -109,9 +55,9 @@ datum/genesequence if(1) src.visible_message("\red \icon[src] [src] scans the fossil and rejects it.") if(2) - visible_message("\red \icon[src] can not extract any more genetic data from new fossils.") + visible_message("\red \icon[src] [src] can not extract any more genetic data from new fossils.") if(4) - src.visible_message("\blue \icon[src] [user] inserts [W] into [src], the fossil is consumed.") + src.visible_message("\blue \icon[src] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it.") del(W) updateDialog() else if (istype(W, /obj/item/weapon/storage)) @@ -122,18 +68,18 @@ datum/genesequence var/full = 0 for(var/obj/item/weapon/fossil/F in S.contents) switch(scan_fossil(F)) - if(1) + if(SCANFOSSIL_RETVAL_WRONGTYPE) numrejected += 1 - if(2) + if(SCANFOSSIL_RETVAL_NOMOREGENESEQ) full = 1 - if(4) + if(SCANFOSSIL_RETVAL_SUCCESS) numaccepted += 1 S.remove_from_storage(F, src) //This will move the item to this item's contents del(F) updateDialog() var/outmsg = "\blue You empty all the fossils from [S] into [src]." if(numaccepted) - outmsg += " \blue[numaccepted] fossils were accepted." + outmsg += " \blue[numaccepted] fossils were accepted and consumed as [src] extracts genetic data from them." if(numrejected) outmsg += " \red[numrejected] fossils were rejected." if(full) @@ -159,7 +105,7 @@ datum/genesequence if(!pod1) dat += "Unable to locate cloning pod.
" - else + else if(istype(pod1)) dat += "Cloning pod connected.
" dat += "" @@ -307,7 +253,7 @@ datum/genesequence /obj/machinery/computer/reconstitutor/proc/scan_fossil(var/obj/item/weapon/fossil/scan_fossil) //see whether we accept these kind of fossils if(accepted_fossil_types.len && !accepted_fossil_types.Find(scan_fossil.type)) - return 1 + return SCANFOSSIL_RETVAL_WRONGTYPE //see whether we are going to discover a new sequence, new genome for existing sequence or nothing var/new_genome_prob = discovered_genesequences.len * 50 @@ -318,6 +264,17 @@ datum/genesequence undiscovered_genomes -= newly_discovered_genome discovered_genomes.Add(newly_discovered_genome) + //chance to discover a second genome + if(prob(75)) + newly_discovered_genome = pick(undiscovered_genomes) + undiscovered_genomes -= newly_discovered_genome + discovered_genomes.Add(newly_discovered_genome) + //chance to discover a third genome + if(prob(50)) + newly_discovered_genome = pick(undiscovered_genomes) + undiscovered_genomes -= newly_discovered_genome + discovered_genomes.Add(newly_discovered_genome) + else if(undiscovered_genesequences.len) //discover new gene sequence var/datum/genesequence/newly_discovered_genesequence = pick(undiscovered_genesequences) @@ -330,6 +287,33 @@ datum/genesequence else //there's no point scanning any more fossils, we've already discovered everything - return 2 + return SCANFOSSIL_RETVAL_NOMOREGENESEQ - return 4 + return SCANFOSSIL_RETVAL_SUCCESS + +#undef SCANFOSSIL_RETVAL_WRONGTYPE +#undef SCANFOSSIL_RETVAL_NOMOREGENESEQ +#undef SCANFOSSIL_RETVAL_SUCCESS + + +/obj/item/weapon/circuitboard/reconstitutor + name = "Circuit board (Flora Reconstitution Console)" + build_path = "/obj/machinery/computer/reconstitutor" + origin_tech = "programming=2;biotech=4;materials=6" + frame_desc = "Requires 2 Advanced Scanning Module, 1 Nano Manipulator, 1 Matter Bin and 1 Advanced Capacitor." + req_components = list( + "/obj/item/weapon/stock_parts/scanning_module/adv" = 2, + "/obj/item/weapon/stock_parts/manipulator/nano" = 1, + "/obj/item/weapon/stock_parts/matter_bin" = 1, + "/obj/item/weapon/stock_parts/capacitor/adv" = 1) + +/obj/item/weapon/circuitboard/reconstitutor/animal + name = "Circuit board (Fauna Reconstitution Console)" + build_path = "/obj/machinery/computer/reconstitutor/animal" + origin_tech = "programming=2;biotech=4;materials=6" + frame_desc = "Requires 2 Advanced Scanning Module, 1 Nano Manipulator, 1 Matter Bin and 1 Advanced Capacitor." + req_components = list( + "/obj/item/weapon/stock_parts/scanning_module/adv" = 2, + "/obj/item/weapon/stock_parts/manipulator/nano" = 1, + "/obj/item/weapon/stock_parts/matter_bin" = 1, + "/obj/item/weapon/stock_parts/capacitor/adv" = 1) diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index 19336a07199..e525e0966f2 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -1,32 +1,75 @@ -#define XENOARCH_SPAWN_CHANCE 0.5 -#define XENOARCH_SPREAD_CHANCE 15 -#define ARTIFACT_SPAWN_CHANCE 20 -proc/SetupXenoarch() +/datum/controller/game_controller + var/list/all_animal_genesequences = list() + var/list/all_plant_genesequences = list() + var/list/genome_prefixes = null + var/list/artifact_spawning_turfs = list() + var/list/digsite_spawning_turfs = list() + + var/list/spawn_types_animal = list("/mob/living/carbon/slime",\ + "/mob/living/simple_animal/hostile/alien",\ + "/mob/living/simple_animal/hostile/alien/drone",\ + "/mob/living/simple_animal/hostile/alien/sentinel",\ + "/mob/living/simple_animal/hostile/giant_spider",\ + "/mob/living/simple_animal/hostile/giant_spider/hunter",\ + "/mob/living/simple_animal/hostile/giant_spider/nurse",\ + "/mob/living/simple_animal/hostile/creature",\ + "/mob/living/simple_animal/hostile/samak",\ + "/mob/living/simple_animal/hostile/diyaab",\ + "/mob/living/simple_animal/hostile/shantak",\ + "/mob/living/simple_animal/tindalos",\ + "/mob/living/simple_animal/yithian") + + var/list/spawn_types_plant = list("/obj/item/seeds/walkingmushroommycelium",\ + "/obj/item/seeds/killertomatoseed",\ + "/obj/item/seeds/shandseed", + "/obj/item/seeds/mtearseed", + "/obj/item/seeds/thaadra",\ + "/obj/item/seeds/telriis",\ + "/obj/item/seeds/jurlmah",\ + "/obj/item/seeds/amauri",\ + "/obj/item/seeds/gelthi",\ + "/obj/item/seeds/vale",\ + "/obj/item/seeds/surik") + +#define XENOARCH_SPAWN_CHANCE 0.5 +#define DIGSITESIZE_LOWER 4 +#define DIGSITESIZE_UPPER 12 +#define ARTIFACTSPAWNNUM_LOWER 6 +#define ARTIFACTSPAWNNUM_UPPER 12 + +datum/controller/game_controller/proc/SetupXenoarch() + //create digsites for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz))) if(!prob(XENOARCH_SPAWN_CHANCE)) continue + digsite_spawning_turfs.Add(M) var/digsite = get_random_digsite_type() + var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER) var/list/processed_turfs = list() var/list/turfs_to_process = list(M) - while(turfs_to_process.len) - var/turf/simulated/mineral/archeo_turf = turfs_to_process[1] + var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process) - for(var/turf/simulated/mineral/T in orange(1, archeo_turf)) - if(T.finds) - continue + if(target_digsite_size > 1) + var/list/viable_adjacent_turfs = orange(1, archeo_turf) + for(var/turf/simulated/mineral/T in orange(1, archeo_turf)) + if(T.finds) + continue + if(T in processed_turfs) + continue + viable_adjacent_turfs.Add(T) - if(T in processed_turfs) - continue - - if(prob(XENOARCH_SPREAD_CHANCE)) - turfs_to_process.Add(T) + for(var/turf/simulated/mineral/T in viable_adjacent_turfs) + if(prob(target_digsite_size/viable_adjacent_turfs.len)) + turfs_to_process.Add(T) + target_digsite_size -= 1 + if(target_digsite_size <= 0) + break turfs_to_process.Remove(archeo_turf) processed_turfs.Add(archeo_turf) - if(isnull(archeo_turf.finds)) archeo_turf.finds = list() @@ -47,17 +90,59 @@ proc/SetupXenoarch() archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]" archeo_turf.overlays += archeo_turf.archaeo_overlay - //dont create artifact machinery in animal or plant digsites, or if we already have one - if(!M.artifact_find && digsite != 1 && digsite != 2 && prob(ARTIFACT_SPAWN_CHANCE)) - M.artifact_find = new() - master_controller.artifact_spawning_turfs.Add(M) + //have a chance for an artifact to spawn here, but not in animal or plant digsites + if(isnull(M.artifact_find) && digsite != 1 && digsite != 2) + artifact_spawning_turfs.Add(archeo_turf) - if(isnull(M.geologic_data)) - M.geologic_data = new/datum/geosample(M) + //create artifact machinery + var/num_artifacts_spawn = rand(ARTIFACTSPAWNNUM_LOWER, ARTIFACTSPAWNNUM_UPPER) + while(artifact_spawning_turfs.len > num_artifacts_spawn) + pick_n_take(artifact_spawning_turfs) + + var/list/artifacts_spawnturf_temp = artifact_spawning_turfs.Copy() + while(artifacts_spawnturf_temp.len > 0) + var/turf/simulated/mineral/artifact_turf = pop(artifacts_spawnturf_temp) + artifact_turf.artifact_find = new() + + //make sure we have some prefixes for the gene sequences + if(!genome_prefixes) + genome_prefixes = alphabet_uppercase.Copy() + if(!genome_prefixes.len) + del genome_prefixes + genome_prefixes = alphabet_uppercase.Copy() + + //create animal gene sequences + while(spawn_types_animal.len && genome_prefixes.len) + var/datum/genesequence/new_sequence = new/datum/genesequence() + new_sequence.spawned_type_text = pick(spawn_types_animal) + new_sequence.spawned_type = text2path(new_sequence.spawned_type_text) + spawn_types_animal -= new_sequence.spawned_type_text + + var/prefixletter = pick(genome_prefixes) + genome_prefixes -= prefixletter + while(new_sequence.full_genome_sequence.len < 7) + new_sequence.full_genome_sequence.Add("[prefixletter][pick(alphabet_uppercase)][pick(alphabet_uppercase)][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)]") + + all_animal_genesequences.Add(new_sequence) + + //create plant gene sequences + while(spawn_types_plant.len && genome_prefixes.len) + var/datum/genesequence/new_sequence = new/datum/genesequence() + new_sequence.spawned_type = pick(spawn_types_plant) + spawn_types_plant -= new_sequence.spawned_type_text + + var/prefixletter = pick(genome_prefixes) + genome_prefixes -= prefixletter + while(new_sequence.full_genome_sequence.len < 7) + new_sequence.full_genome_sequence.Add("[prefixletter][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)][pick(alphabet_uppercase)][pick(alphabet_uppercase)]") + + all_plant_genesequences.Add(new_sequence) #undef XENOARCH_SPAWN_CHANCE -#undef XENOARCH_SPREAD_CHANCE -#undef ARTIFACT_SPAWN_CHANCE +#undef DIGSITESIZE_LOWER +#undef DIGSITESIZE_UPPER +#undef ARTIFACTSPAWNNUM_LOWER +#undef ARTIFACTSPAWNNUM_UPPER //---- Noticeboard