mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-22 23:43:21 +00:00
Plant DNA Manipulator update (#25370)
* WIP * changes * more changes * chnges * update * changes * I suck at TGUI if you see this please help * UI a bit better still figuring it out * More things * Eject Select, Select empty and autoselect empty implemented. can insert replaace stat/all stats from disk list * Ready to make a PR Disks can be loaded into the machine from boxed, an empty disk is automatically selected once an extraction is performed if one is available. All insert and replace buttons moved to the disk lists. Window size and scaling changed to fit LSD properly without wrapping. * minor ui tweak, fixes core stat disk being auto selected unintentionally. Loading via box now makes a sound. * rebuild TGUI * rebuild tgui * implemented RO button/indicator in UI, Added null checks for can_add * slightly shrink some buttons rebuild TGUI * Rebuild TGUI * use istype for type checks * removes the disk compartmentalizer from maps * removes Disk Compartmentalizer * actually removes the disk compartmentalizer * rebuild tgui and remove all remaining disk compartmentalizer sprites * fixes a message being output to world instead of the user * auto doc and readability improvements. * some fixes adjusts display name to display the new doubled percentages. Stored seed no longer counts as a disk for the purpose of reaching the disk capacity. * Rebuild TGUI
This commit is contained in:
committed by
GitHub
parent
a423a008e8
commit
6db06b1eb8
@@ -682,39 +682,6 @@
|
||||
/obj/machinery/smartfridge/secure/chemistry/preloaded/syndicate/Initialize(mapload)
|
||||
. = ..()
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
|
||||
/**
|
||||
* # Disk Compartmentalizer
|
||||
*
|
||||
* Disk variant of the [Smart Fridge][/obj/machinery/smartfridge].
|
||||
*/
|
||||
/obj/machinery/smartfridge/disks
|
||||
name = "disk compartmentalizer"
|
||||
desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)."
|
||||
icon_state = "disktoaster"
|
||||
icon_lightmask = "disktoaster"
|
||||
pass_flags = PASSTABLE
|
||||
visible_contents = TRUE
|
||||
board_type = /obj/machinery/smartfridge/disks
|
||||
|
||||
/obj/machinery/smartfridge/disks/Initialize(mapload)
|
||||
. = ..()
|
||||
accepted_items_typecache = typecacheof(list(
|
||||
/obj/item/disk,
|
||||
))
|
||||
|
||||
/obj/machinery/smartfridge/disks/update_fridge_contents()
|
||||
switch(length(contents))
|
||||
if(0)
|
||||
fill_level = null
|
||||
if(1)
|
||||
fill_level = 1
|
||||
if(2)
|
||||
fill_level = 2
|
||||
if(3)
|
||||
fill_level = 3
|
||||
if(4 to INFINITY)
|
||||
fill_level = 4
|
||||
/obj/machinery/smartfridge/id
|
||||
name = "identification card compartmentalizer"
|
||||
desc = "A machine capable of storing identification cards and PDAs. It's great for lost and terminated cards."
|
||||
|
||||
@@ -6,22 +6,36 @@
|
||||
icon_state = "dnamod"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
/// the seed stored in the machine
|
||||
var/obj/item/seeds/seed
|
||||
/// the disk in use
|
||||
var/obj/item/disk/plantgene/disk
|
||||
|
||||
/// list of the seed's trait genes
|
||||
var/list/core_genes = list()
|
||||
/// list of the seed's trait genes
|
||||
var/list/reagent_genes = list()
|
||||
/// list of the seed's trait genes
|
||||
var/list/trait_genes = list()
|
||||
|
||||
/// disk capacity
|
||||
var/disk_capacity = 100
|
||||
/// gene targeted for operation
|
||||
var/datum/plant_gene/target
|
||||
/// maximum potency that can be put on a disk
|
||||
var/max_potency = 50 // See RefreshParts() for how these work
|
||||
/// maximum yield that can be put on a disk
|
||||
var/max_yield = 2
|
||||
/// minimum production that can be put on a disk
|
||||
var/min_production = 12
|
||||
/// maximum endurance that can be put on a disk
|
||||
var/max_endurance = 10 // IMPT: ALSO AFFECTS LIFESPAN
|
||||
/// minimum weed growth chance that can be put on a disk
|
||||
var/min_weed_chance = 67
|
||||
/// minimum weed growth rate that can be put on a disk
|
||||
var/min_weed_rate = 10
|
||||
/// amount of seeds needed to make a core stat disk
|
||||
var/seeds_for_bulk_core = 5
|
||||
/// index of disk in use in the content list
|
||||
var/disk_index = 0
|
||||
|
||||
/obj/machinery/plantgenes/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -130,7 +144,7 @@
|
||||
else if(istype(I, /obj/item/unsorted_seeds))
|
||||
to_chat(user, "<span class='warning'>You need to sort [I] first!</span>")
|
||||
return ..()
|
||||
else if(istype(I, /obj/item/disk/plantgene))
|
||||
else if(istype(I, /obj/item/disk/plantgene) || istype(I, /obj/item/storage/box))
|
||||
add_disk(I, user)
|
||||
else
|
||||
return ..()
|
||||
@@ -146,13 +160,31 @@
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/plantgenes/proc/add_disk(obj/item/disk/plantgene/new_disk, mob/user)
|
||||
if(disk)
|
||||
to_chat(user, "<span class='warning'>A data disk is already loaded into the machine!</span>")
|
||||
if(length(contents) - (seed ? 1 : 0) >= disk_capacity)
|
||||
to_chat(user, "<span class='warning'>[src] cannot hold any more disks!</span>")
|
||||
return
|
||||
if(istype(new_disk, /obj/item/storage/box))
|
||||
var/has_disks = FALSE
|
||||
for(var/obj/item/disk/plantgene/D in new_disk.contents)
|
||||
if(length(contents)- (seed ? 1 : 0) >= disk_capacity)
|
||||
to_chat(user, "<span class='notice'>You fill [src] with disks.</span>")
|
||||
break
|
||||
has_disks = TRUE
|
||||
D.forceMove(src)
|
||||
if(!disk)
|
||||
disk = D
|
||||
if(has_disks)
|
||||
playsound(loc, 'sound/items/handling/cardboardbox_drop.ogg', 50)
|
||||
to_chat(user, "<span class='notice'>You load [src] from [new_disk].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[new_disk] contains no disks.</span>")
|
||||
SStgui.update_uis(src)
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
disk = new_disk
|
||||
disk.forceMove(src)
|
||||
if(!disk)
|
||||
disk = new_disk
|
||||
new_disk.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You add [new_disk] to the machine.</span>")
|
||||
ui_interact(user)
|
||||
|
||||
@@ -244,6 +276,40 @@
|
||||
|
||||
data["modal"] = ui_modal_data(src)
|
||||
|
||||
var/list/stats = list()
|
||||
var/list/traits = list()
|
||||
var/list/reagents = list()
|
||||
var/empty_disks = 0
|
||||
|
||||
data["stat_disks"] = list()
|
||||
data["trait_disks"] = list()
|
||||
data["reagent_disks"] = list()
|
||||
|
||||
for(var/i in 1 to length(contents))
|
||||
if(istype(contents[i], /obj/item/disk/plantgene))
|
||||
var/obj/item/disk/plantgene/D = contents[i]
|
||||
if(!D.gene && !D.is_bulk_core)
|
||||
empty_disks++
|
||||
else if(D.is_bulk_core)
|
||||
stats.Add(list(list("display_name" = D.ui_name, "index" = i, "stat" = "All", "ready" = D.seeds_needed <= D.seeds_scanned, "read_only" = D.read_only)))
|
||||
else if(istype(D.gene, /datum/plant_gene/core))
|
||||
var/datum/plant_gene/core/C = D.gene
|
||||
stats.Add(list(list("display_name" = C.name +" "+ num2text(C.value), "index" = i, "stat" = C.name, "read_only" = D.read_only)))
|
||||
else if(istype(D.gene, /datum/plant_gene/trait))
|
||||
var/insertable = D.gene?.can_add(seed)
|
||||
traits.Add(list(list("display_name" = D.gene.name, "index" = i, "can_insert" = insertable, "read_only" = D.read_only)))
|
||||
else if(istype(D.gene, /datum/plant_gene/reagent))
|
||||
var/datum/plant_gene/reagent/R = D.gene
|
||||
var/insertable = R?.can_add(seed)
|
||||
reagents.Add(list(list("display_name" = "[R.name] [num2text(R.rate*200)]%", "index" = i, "can_insert" = insertable, "read_only" = D.read_only)))
|
||||
if(length(stats))
|
||||
data["stat_disks"] = stats
|
||||
if(length(traits))
|
||||
data["trait_disks"] = traits
|
||||
if(length(reagents))
|
||||
data["reagent_disks"] = reagents
|
||||
data["empty_disks"] = empty_disks
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/plantgenes/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
||||
@@ -258,7 +324,12 @@
|
||||
|
||||
var/mob/user = ui.user
|
||||
|
||||
target = seed?.get_gene(params["id"])
|
||||
if(params["id"])
|
||||
target = seed?.get_gene(params["id"])
|
||||
else if(params["stat"] && params["stat"] != "All")
|
||||
for(var/datum/plant_gene/core/c_gene in core_genes)
|
||||
if(c_gene.name == params["stat"])
|
||||
target = c_gene
|
||||
|
||||
switch(action)
|
||||
if("eject_seed")
|
||||
@@ -274,9 +345,10 @@
|
||||
add_seed(I, user)
|
||||
|
||||
if("eject_disk")
|
||||
if(disk)
|
||||
disk.forceMove(loc)
|
||||
user.put_in_hands(disk)
|
||||
var/obj/item/disk/plantgene/D = contents[text2num(params["index"])]
|
||||
if(D)
|
||||
D.forceMove(loc)
|
||||
user.put_in_hands(D)
|
||||
disk = null
|
||||
update_genes()
|
||||
else
|
||||
@@ -312,23 +384,46 @@
|
||||
ui_modal_boolean(src, action, dat, yes_text = "Extract", no_text = "Cancel", delegate = PROC_REF(gene_extract))
|
||||
|
||||
if("bulk_replace_core")
|
||||
disk_index = text2num(params["index"])
|
||||
ui_modal_boolean(src, action, "Are you sure you want to replace ALL core genes of the [seed]?" , yes_text = "Replace", no_text = "Cancel", delegate = PROC_REF(bulk_replace_core))
|
||||
|
||||
if("replace")
|
||||
ui_modal_boolean(src, action, "Are you sure you want to replace [target.get_name()] gene with [disk.gene.get_name()]?", yes_text = "Replace", no_text = "Cancel", delegate = PROC_REF(gene_replace))
|
||||
disk_index = text2num(params["index"])
|
||||
var/obj/item/disk/plantgene/D = contents[text2num(params["index"])]
|
||||
ui_modal_boolean(src, action, "Are you sure you want to replace [target.get_name()] gene with [D.gene.get_name()]?", yes_text = "Replace", no_text = "Cancel", delegate = PROC_REF(gene_replace))
|
||||
|
||||
if("remove")
|
||||
ui_modal_boolean(src, action, "Are you sure you want to remove [target.get_name()] gene from the [seed]" , yes_text = "Remove", no_text = "Cancel", delegate = PROC_REF(gene_remove))
|
||||
|
||||
if("insert")
|
||||
if(!istype(disk.gene, /datum/plant_gene/core) && !disk.is_bulk_core && disk.gene.can_add(seed))
|
||||
seed.genes += disk.gene.Copy()
|
||||
if(istype(disk.gene, /datum/plant_gene/reagent))
|
||||
var/obj/item/disk/plantgene/D = contents[text2num(params["index"])]
|
||||
if(D.gene && (istype(D.gene, /datum/plant_gene/trait) || istype(D.gene, /datum/plant_gene/reagent)) && D.gene.can_add(seed))
|
||||
seed.genes += D.gene.Copy()
|
||||
if(istype(D.gene, /datum/plant_gene/reagent))
|
||||
seed.reagents_from_genes()
|
||||
update_genes()
|
||||
repaint_seed()
|
||||
// this doesnt need a modal, its easy enough to just remove the inserted gene
|
||||
|
||||
if("select")
|
||||
disk = contents[text2num(params["index"])]
|
||||
|
||||
if("select_empty_disk")
|
||||
for(var/obj/item/disk/plantgene/D in contents)
|
||||
if(!D.gene && !D.is_bulk_core)
|
||||
disk = D
|
||||
return
|
||||
|
||||
if("eject_empty_disk")
|
||||
for(var/obj/item/disk/plantgene/D in contents)
|
||||
if(!D.gene && !D.is_bulk_core)
|
||||
D.forceMove(loc)
|
||||
user.put_in_hands(D)
|
||||
update_genes()
|
||||
return
|
||||
to_chat(user, "<span class='warning'> No Empty Disks to Eject!</span>")
|
||||
if("set_read_only")
|
||||
var/obj/item/disk/plantgene/D = contents[text2num(params["index"])]
|
||||
D.read_only = !D.read_only
|
||||
|
||||
/obj/machinery/plantgenes/proc/gene_remove()
|
||||
if(istype(target, /datum/plant_gene/core))
|
||||
@@ -358,16 +453,22 @@
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
update_genes()
|
||||
target = null
|
||||
//replace with empty disk if possible
|
||||
for(var/obj/item/disk/plantgene/D in contents)
|
||||
if(!D.gene && !D.is_bulk_core)
|
||||
disk = D
|
||||
return
|
||||
|
||||
/obj/machinery/plantgenes/proc/gene_replace()
|
||||
if(!disk?.gene || disk.is_bulk_core)
|
||||
var/obj/item/disk/plantgene/D = contents[disk_index]
|
||||
if(!D?.gene || D.is_bulk_core)
|
||||
return
|
||||
if(!istype(target, /datum/plant_gene/core))
|
||||
return
|
||||
if(!istype(disk.gene, target.type))
|
||||
if(!istype(D.gene, target.type))
|
||||
return // you can't replace a endurance gene with a weed chance gene, etc
|
||||
seed.genes -= target
|
||||
var/datum/plant_gene/core/C = disk.gene.Copy()
|
||||
var/datum/plant_gene/core/C = D.gene.Copy()
|
||||
seed.genes += C
|
||||
C.apply_stat(seed)
|
||||
repaint_seed()
|
||||
@@ -395,15 +496,22 @@
|
||||
update_genes()
|
||||
target = null
|
||||
|
||||
if(disk.seeds_scanned >= disk.seeds_needed)
|
||||
for(var/obj/item/disk/plantgene/D in contents)
|
||||
if(!D.gene && (!D.is_bulk_core))
|
||||
disk = D
|
||||
return
|
||||
|
||||
/obj/machinery/plantgenes/proc/bulk_replace_core()
|
||||
if(!disk?.is_bulk_core)
|
||||
var/obj/item/disk/plantgene/D = contents[disk_index]
|
||||
if(!D?.is_bulk_core)
|
||||
return
|
||||
if(disk.seeds_scanned < disk.seeds_needed)
|
||||
if(D.seeds_scanned < D.seeds_needed)
|
||||
return
|
||||
for(var/datum/plant_gene/gene in seed.genes)
|
||||
if(istype(gene, /datum/plant_gene/core))
|
||||
seed.genes -= gene
|
||||
for(var/datum/plant_gene/core/gene in disk.core_genes)
|
||||
for(var/datum/plant_gene/core/gene in D.core_genes)
|
||||
var/datum/plant_gene/core/C = gene.Copy()
|
||||
seed.genes += C
|
||||
C.apply_stat(seed)
|
||||
|
||||
@@ -156,7 +156,10 @@
|
||||
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[reag_id]
|
||||
if(R && R.id == reagent_id)
|
||||
name = R.name
|
||||
if(reagent_id == "holywater")
|
||||
name = "Holy Water"
|
||||
else
|
||||
name = R.name
|
||||
|
||||
/datum/plant_gene/reagent/New(reag_id = null, reag_rate = 0)
|
||||
..()
|
||||
@@ -174,6 +177,8 @@
|
||||
/datum/plant_gene/reagent/can_add(obj/item/seeds/S)
|
||||
if(!..())
|
||||
return FALSE
|
||||
if(!S)
|
||||
return FALSE
|
||||
for(var/datum/plant_gene/reagent/R in S.genes)
|
||||
if(R.reagent_id == reagent_id)
|
||||
return FALSE
|
||||
@@ -195,7 +200,8 @@
|
||||
/datum/plant_gene/trait/can_add(obj/item/seeds/S)
|
||||
if(!..())
|
||||
return FALSE
|
||||
|
||||
if(!S)
|
||||
return FALSE
|
||||
for(var/datum/plant_gene/trait/R in S.genes)
|
||||
if(trait_id && R.trait_id == trait_id)
|
||||
return FALSE
|
||||
|
||||
Reference in New Issue
Block a user