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 <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael Aislinn
2014-06-19 10:56:23 +10:00
parent 6c46ceaf6d
commit 0e1c367012
4 changed files with 175 additions and 95 deletions

View File

@@ -252,3 +252,6 @@ var/DBConnection/dbcon_old = new() //Tgstation database (Old database) - See the
// Reference list for disposal sort junctions. Filled up by sorting junction's New()
/var/list/tagger_locations = list()
//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")

View File

@@ -1,9 +1,6 @@
/**********************Mineral deposits**************************/
datum/controller/game_controller/var/list/artifact_spawning_turfs = list()
var/list/artifact_spawn = list() // Runtime fix for geometry loading before controller is instantiated.
/turf/simulated/mineral //wall piece
name = "Rock"
icon = 'icons/turf/walls.dmi'

View File

@@ -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 += "<b><font color=red>Unable to locate cloning pod.</font></b><br>"
else
else if(istype(pod1))
dat += "<b><font color=green>Cloning pod connected.</font></b><br>"
dat += "<table border=1>"
@@ -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)

View File

@@ -1,30 +1,78 @@
#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(!M.geologic_data)
if(isnull(M.geologic_data))
M.geologic_data = new/datum/geosample(M)
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)
for(var/turf/simulated/mineral/archeo_turf in turfs_to_process)
while(turfs_to_process.len)
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(T in processed_turfs)
continue
if(prob(XENOARCH_SPREAD_CHANCE))
turfs_to_process.Add(T)
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)
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
processed_turfs.Add(archeo_turf)
if(!archeo_turf.finds)
if(isnull(archeo_turf.finds))
archeo_turf.finds = list()
if(prob(50))
archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95)))
@@ -42,11 +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()
artifact_spawn.Add(src)
//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)
//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 DIGSITESIZE_LOWER
#undef DIGSITESIZE_UPPER
#undef ARTIFACTSPAWNNUM_LOWER
#undef ARTIFACTSPAWNNUM_UPPER
//---- Noticeboard