mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
Final Initial Implementation of Xenobio2 System.
Kinks worked out, everything is functioning as it should.
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
usr.client.debug_variables(antag)
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.")
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote"))
|
||||
/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote","Xenobio"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
@@ -95,5 +95,8 @@
|
||||
if("Vote")
|
||||
debug_variables(vote)
|
||||
feedback_add_details("admin_verb", "DVote")
|
||||
if("Xenobio")
|
||||
debug_variables(xenobio_controller)
|
||||
feedback_add_details("admin_verb", "DXenobio")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||
return
|
||||
|
||||
@@ -183,6 +183,7 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/overlay_random_map,
|
||||
/client/proc/delete_random_map,
|
||||
/client/proc/show_plant_genes,
|
||||
/client/proc/show_xenobio_genes,
|
||||
/client/proc/enable_debug_verbs,
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_target,
|
||||
|
||||
@@ -160,6 +160,8 @@ var/global/list/xenoChemList = list("mutationtoxin",
|
||||
G.values["[TRAIT_XENO_HOSTILE]"] = get_trait(TRAIT_XENO_HOSTILE)
|
||||
G.values["[TRAIT_XENO_CHROMATIC]"] = get_trait(TRAIT_XENO_CHROMATIC)
|
||||
|
||||
return G
|
||||
|
||||
/datum/xeno/traits/proc/apply_gene(var/datum/xeno/genes/genes)
|
||||
if(!genes.genetype) return 0
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
for(var/mask in xenobio_controller.gene_tag_masks)
|
||||
usr << "[mask]: [xenobio_controller.gene_tag_masks[mask]]"
|
||||
|
||||
var/global/datum/controller/plants/xenobio_controller // Set in New().
|
||||
var/global/datum/controller/xenobio/xenobio_controller // Set in New().
|
||||
|
||||
/datum/controller/xenobio
|
||||
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
var/emptycolor = "#FF2222"
|
||||
var/operatingcolor = "#FFFF22"
|
||||
|
||||
|
||||
/obj/machinery/slime/extractor/New()
|
||||
..()
|
||||
update_light_color()
|
||||
|
||||
/obj/machinery/slime/extractor/map/New()
|
||||
..()
|
||||
circuit = new circuit(src)
|
||||
@@ -67,7 +72,12 @@
|
||||
if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) )
|
||||
user << "<span class='danger'>This is not a suitable subject for the core extractor!</span>"
|
||||
return
|
||||
|
||||
|
||||
var/mob/living/simple_animal/xeno/slime/S = victim
|
||||
if(S.is_child)
|
||||
user << "<span class='danger'>This subject is not developed enough for the core extractor!</span>"
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>[user] starts to put [victim] into the core extractor!</span>")
|
||||
src.add_fingerprint(user)
|
||||
if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
|
||||
@@ -81,11 +91,11 @@
|
||||
|
||||
/obj/machinery/slime/extractor/proc/update_light_color()
|
||||
if(src.occupant && !(inuse))
|
||||
set_light(1, 1, occupiedcolor)
|
||||
set_light(2, 2, occupiedcolor)
|
||||
else if(src.occupant)
|
||||
set_light(1, 1, operatingcolor)
|
||||
set_light(2, 2, operatingcolor)
|
||||
else
|
||||
set_light(1, 1, emptycolor)
|
||||
set_light(2, 2, emptycolor)
|
||||
|
||||
/obj/machinery/slime/extractor/proc/extract_cores()
|
||||
if(!src.occupant)
|
||||
@@ -115,6 +125,7 @@
|
||||
inuse = 0
|
||||
eject_contents()
|
||||
update_light_color()
|
||||
src.updateUsrDialog()
|
||||
|
||||
/obj/machinery/slime/extractor/proc/eject_slime()
|
||||
if(occupant)
|
||||
|
||||
@@ -53,6 +53,41 @@
|
||||
var/eject_disk = 0
|
||||
var/failed_task = 0
|
||||
var/disk_needs_genes = 0
|
||||
|
||||
/obj/machinery/xenobio/attack_ai(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/xenobio/attack_hand(mob/user as mob)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/xenobio/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(default_deconstruction_screwdriver(user, W))
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, W))
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/disk/xenobio))
|
||||
if(loaded_disk)
|
||||
user << "There is already a data disk loaded."
|
||||
return
|
||||
else
|
||||
var/obj/item/weapon/disk/xenobio/B = W
|
||||
|
||||
if(B.genes && B.genes.len)
|
||||
if(!disk_needs_genes)
|
||||
user << "That disk already has gene data loaded."
|
||||
return
|
||||
else
|
||||
if(disk_needs_genes)
|
||||
user << "That disk does not have any gene data loaded."
|
||||
return
|
||||
|
||||
user.drop_from_inventory(W)
|
||||
W.forceMove(src)
|
||||
loaded_disk = W
|
||||
user << "You load [W] into [src]."
|
||||
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/xenobio/process()
|
||||
|
||||
@@ -86,9 +121,23 @@
|
||||
var/obj/item/xenoproduct/product
|
||||
var/datum/xeno/traits/genetics // Currently scanned xeno genetic structure.
|
||||
var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point.
|
||||
|
||||
/obj/machinery/xenobio/extractor/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/xenoproduct))
|
||||
if(product)
|
||||
user << "There is already a xenobiological product loaded."
|
||||
return
|
||||
else
|
||||
var/obj/item/xenoproduct/B = W
|
||||
user.drop_from_inventory(B)
|
||||
B.forceMove(src)
|
||||
product = B
|
||||
user << "You load [B] into [src]."
|
||||
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/xenobio/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
|
||||
if(!user)
|
||||
return
|
||||
|
||||
@@ -121,10 +170,16 @@
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "xenobio_isolator.tmpl", "Biological Product Destructive Analyzer UI", 470, 450)
|
||||
ui = new(user, src, ui_key, "xenobio_isolator.tmpl", "B.P.D. Analyzer UI", 470, 450)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/xenobio/proc/eject_disk()
|
||||
if(!loaded_disk) return
|
||||
loaded_disk.forceMove(loc)
|
||||
visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
|
||||
loaded_disk = null
|
||||
|
||||
/obj/machinery/xenobio/extractor/Topic(href, href_list)
|
||||
|
||||
@@ -139,11 +194,7 @@
|
||||
product = null
|
||||
|
||||
if(href_list["eject_disk"])
|
||||
if(!loaded_disk) return
|
||||
|
||||
loaded_disk.forceMove(get_turf(src))
|
||||
visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
|
||||
loaded_disk = null
|
||||
eject_disk()
|
||||
|
||||
if(href_list["scan_genome"])
|
||||
|
||||
@@ -172,7 +223,7 @@
|
||||
|
||||
loaded_disk.genesource = "[genetics.source]"
|
||||
|
||||
loaded_disk.name += " ([xenobio_controller.gene_tag_masks[href_list["get_gene"]]], [genetics.source]"
|
||||
loaded_disk.name += " ([xenobio_controller.gene_tag_masks[href_list["get_gene"]]], [genetics.source])"
|
||||
loaded_disk.desc += " The label reads \'gene [xenobio_controller.gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.source]\'."
|
||||
eject_disk = 1
|
||||
|
||||
@@ -201,6 +252,26 @@
|
||||
circuit = /obj/item/weapon/circuitboard/biobombarder
|
||||
|
||||
var/mob/living/simple_animal/xeno/slime/occupant
|
||||
|
||||
/obj/machinery/xenobio/editor/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = W
|
||||
if(occupant)
|
||||
user << "There is already an organism loaded."
|
||||
return
|
||||
else
|
||||
if(isxeno(G.affecting))
|
||||
var/mob/living/simple_animal/xeno/X = G.affecting
|
||||
if(do_after(user, 30) && X.Adjacent(src) && user.Adjacent(src) && X.Adjacent(user) && !occupant)
|
||||
user.drop_from_inventory(G)
|
||||
X.forceMove(src)
|
||||
occupant = X
|
||||
user << "You load [X] into [src]."
|
||||
else
|
||||
user << "<span class='danger'>This specimen is incompatible with the machinery!</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/xenobio/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
|
||||
@@ -252,16 +323,23 @@
|
||||
|
||||
last_action = world.time
|
||||
active = 1
|
||||
occupant.nameVar = "modified"
|
||||
|
||||
if(prob(occupant.stability))
|
||||
failed_task = 1
|
||||
occupant.stability = 101
|
||||
|
||||
for(var/datum/plantgene/gene in loaded_disk.genes)
|
||||
for(var/datum/xeno/genes/gene in loaded_disk.genes)
|
||||
occupant.traitdat.apply_gene(gene)
|
||||
occupant.stability += rand(5,10)
|
||||
occupant.ProcessTraits()
|
||||
|
||||
|
||||
if(href_list["eject_disk"])
|
||||
eject_disk()
|
||||
|
||||
if(href_list["eject_xeno"])
|
||||
eject_xeno()
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
@@ -295,12 +373,14 @@
|
||||
occupant = victim
|
||||
|
||||
/obj/machinery/xenobio/editor/proc/eject_contents()
|
||||
for(var/obj/thing in (contents - component_parts - circuit))
|
||||
thing.forceMove(loc)
|
||||
eject_disk()
|
||||
eject_xeno()
|
||||
|
||||
/obj/machinery/xenobio/editor/proc/eject_xeno()
|
||||
if(occupant)
|
||||
occupant.forceMove(loc)
|
||||
occupant = null
|
||||
|
||||
|
||||
/obj/item/weapon/circuitboard/bioproddestanalyzer
|
||||
name = T_BOARD("biological product destructive analyzer")
|
||||
build_path = "/obj/machinery/xenobio/extractor"
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
var/emptycolor = "#FF2222"
|
||||
var/operatingcolor = "#FFFF22"
|
||||
|
||||
/obj/machinery/slime/replicator/New()
|
||||
..()
|
||||
update_light_color()
|
||||
|
||||
/obj/machinery/slime/replicator/map/New()
|
||||
..()
|
||||
circuit = new circuit(src)
|
||||
@@ -50,11 +54,11 @@
|
||||
|
||||
/obj/machinery/slime/replicator/proc/update_light_color()
|
||||
if(src.core && !(inuse))
|
||||
set_light(1, 1, occupiedcolor)
|
||||
set_light(2, 2, occupiedcolor)
|
||||
else if(src.core)
|
||||
set_light(1, 1, operatingcolor)
|
||||
set_light(2, 2, operatingcolor)
|
||||
else
|
||||
set_light(1, 1, emptycolor)
|
||||
set_light(2, 2, emptycolor)
|
||||
|
||||
/obj/machinery/slime/replicator/proc/replicate_slime()
|
||||
if(!src.core)
|
||||
|
||||
@@ -103,4 +103,12 @@ Slime specific procs go here.
|
||||
if(reagents.has_reagent("docilitytoxin")) //Toxin that makes them docile? Good for quelling angry mobs.
|
||||
hostile = 0
|
||||
traitdat.traits[TRAIT_XENO_HOSTILE] = 0
|
||||
..()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/xeno/slime/ProcessTraits()
|
||||
..()
|
||||
if(is_child)
|
||||
GenerateChild()
|
||||
else
|
||||
GenerateAdult()
|
||||
|
||||
@@ -83,6 +83,7 @@ Slime definitions, Life and New live here.
|
||||
for(var/datum/language/L in (typesof(/datum/language) - /datum/language))
|
||||
languages += L
|
||||
speak += "[station_name()]?"
|
||||
traitdat.source = "Slime"
|
||||
resistances[BURN] = 4
|
||||
resistances[BRUTE] = 0.2
|
||||
resistances[TOX] = 1.5
|
||||
|
||||
@@ -48,18 +48,18 @@ Slime cube lives here.
|
||||
announce_ghost_joinleave(candidate, 0, "They are a promethean now.")
|
||||
src.searching = 2
|
||||
var/mob/living/carbon/human/S = new(get_turf(src))
|
||||
S.client = candidate.client
|
||||
S. << "<b>You are a promethean, brought into existence on [station_name()].</b>"
|
||||
S.mind.assigned_role = "Promethean"
|
||||
S.set_species("Promethean")
|
||||
S.shapeshifter_set_colour("#05FF9B")
|
||||
for(var/mob/M in viewers(get_turf(loc))
|
||||
M.show_message("<span class='warning'>The monkey cube suddenly takes the shape of a humanoid!</span>")
|
||||
var/newname = sanitize(input(S, "You are a Promethean. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
|
||||
if (newname)
|
||||
S.real_name = newname
|
||||
S.name = S.real_name
|
||||
S.dna.real_name = newname
|
||||
if(S.mind) S.mind.name = S.name
|
||||
|
||||
for(var/mob/M in viewers(get_turf_or_move(loc)))
|
||||
M.show_message("<span class='warning'>The monkey cube suddenly takes the shape of a man!</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -92,6 +92,9 @@ Procs for targeting
|
||||
traitdat.traits[TRAIT_XENO_COLOR] = "#"
|
||||
for(var/i=0, i<6, i++)
|
||||
traitdat.traits[TRAIT_XENO_COLOR] += pick(hexNums)
|
||||
traitdat.traits[TRAIT_XENO_BIO_COLOR] = "#"
|
||||
for(var/i=0, i<6, i++)
|
||||
traitdat.traits[TRAIT_XENO_BIO_COLOR] += pick(hexNums)
|
||||
|
||||
RandomChemicals()
|
||||
//if(SPECIESMUT & mutable)
|
||||
|
||||
@@ -73,6 +73,9 @@ var/global/datum/global_init/init = new ()
|
||||
|
||||
// Set up roundstart seed list.
|
||||
plant_controller = new()
|
||||
|
||||
// Set up roundstart gene masking
|
||||
xenobio_controller = new()
|
||||
|
||||
// This is kinda important. Set up details of what the hell things are made of.
|
||||
populate_material_list()
|
||||
|
||||
@@ -49,7 +49,7 @@ Used In File(s): \code\modules\xenobio2\machines\gene_manipulators.dm
|
||||
{{if data.degradation <= 100}}
|
||||
{{:helper.link('Apply Gene Mods', 'gear', {'apply_gene' : 1}, null)}}
|
||||
{{/if}}
|
||||
{{:helper.link('Eject Target', 'circle-arrow-e', {'eject_packet' : 1}, null)}}
|
||||
{{:helper.link('Eject Target', 'circle-arrow-e', {'eject_xeno' : 1}, null)}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="notice">No target organism loaded</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Title: Biological Product Destructive Analyzer UI
|
||||
Title: B.P.D. Analyzer UI
|
||||
Used In File(s): \code\modules\xenobio2\machines\gene_manipulators.dm
|
||||
Copy of Lysis-isolation Centrifuge's NanoUI Template
|
||||
-->
|
||||
@@ -69,6 +69,6 @@ Copy of Lysis-isolation Centrifuge's NanoUI Template
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="notice">No seeds loaded.</div>
|
||||
<div class="notice">No biologocial sample loaded.</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
Reference in New Issue
Block a user