Files
vgstation13/code/modules/virus2/diseasesplicer.dm
2020-06-05 04:52:14 +02:00

288 lines
8.8 KiB
Plaintext

#define DISEASE_SPLICER_BURNING_TICKS 5
#define DISEASE_SPLICER_SPLICING_TICKS 5
#define DISEASE_SPLICER_SCANNING_TICKS 5
/obj/machinery/computer/diseasesplicer
name = "disease splicer"
icon = 'icons/obj/virology.dmi'
icon_state = "splicer"
circuit = "/obj/item/weapon/circuitboard/splicer"
var/datum/disease2/effect/memorybank = null
var/analysed = FALSE // If the buffered effect came from a dish that had been analyzed this is TRUE
var/obj/item/weapon/virusdish/dish = null
var/burning = 0 // Time in process ticks until disk burning is over
var/splicing = 0 // Time in process ticks until splicing is over
var/scanning = 0 // Time in process ticks until scan is over
var/spliced = FALSE // If at least one effect has been spliced into the current dish this is TRUE
idle_power_usage = 100
active_power_usage = 600
light_color = "#00FF00"
/obj/machinery/computer/diseasesplicer/attackby(var/obj/I, var/mob/user)
if(!(istype(I,/obj/item/weapon/virusdish) || istype(I,/obj/item/weapon/disk/disease)))
return ..()
if(istype(I, /obj/item/weapon/virusdish))
if(dish)
to_chat(user, "<span class='warning'>A virus containment dish is already inside \the [src].</span>")
return
if(!user.drop_item(I, src))
to_chat(user, "<span class='warning'>You can't let go of \the [I]!</span>")
return
dish = I
playsound(loc, 'sound/machines/click.ogg', 50, 1)
update_icon()
if(istype(I, /obj/item/weapon/disk/disease))
var/obj/item/weapon/disk/disease/disk = I
visible_message("<span class='notice'>[user] swipes \the [disk] against \the [src].</span>", "<span class='notice'>You swipe \the [disk] against \the [src], copying the data into the machine's buffer.</span>")
memorybank = disk.effect
anim(target = src, a_icon = icon, flick_anim = "splicer_disk", sleeptime = 15)
spawn(2)
update_icon()
attack_hand(user)
/obj/machinery/computer/diseasesplicer/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = NANOUI_FOCUS)
var/list/data = list(
"splicing" = splicing,
"scanning" = scanning,
"burning" = burning
)
if(dish && dish.contained_virus)
if (dish.analysed)
data["dish_name"] = dish.contained_virus.name()
else
data["dish_name"] = "Unknown [dish.contained_virus.form]"
if(memorybank)
data["memorybank"] = "[analysed ? memorybank.name : "Unknown DNA strand"] (Stage [memorybank.stage])"
if(!dish)
data["dish_error"] = "no dish inserted"
else if(!dish.contained_virus)
data["dish_error"] = "no pathogen in dish"
else if(!dish.analysed)
data["dish_error"] = "dish not analysed"
else if(dish.growth < 50)
data["dish_error"] = "not enough cells"
else
var/list/effects_list = list()
for(var/datum/disease2/effect/_effect in dish.contained_virus.effects)
var/list/effect_data = list(
"name" = dish.analysed ? _effect.name : "Unknown DNA strand",
"stage" = _effect.stage
)
effects_list += list(effect_data)
data["dish_effects"] = effects_list
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "disease_splicer.tmpl", name, 690, 330)
ui.set_initial_data(data)
ui.open()
/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user)
. = ..()
if(stat & (NOPOWER|BROKEN))
eject_dish()
return
if(.)
return
ui_interact(user)
/obj/machinery/computer/diseasesplicer/process()
if(stat & (NOPOWER|BROKEN))
return
if(scanning || splicing || burning)
use_power = 2
else
use_power = 1
if(scanning)
scanning -= 1
if(!scanning)
update_icon()
nanomanager.update_uis(src)
alert_noise("beep")
if(splicing)
splicing -= 1
if(!splicing)
update_icon()
nanomanager.update_uis(src)
alert_noise("ping")
if(burning)
burning -= 1
if(!burning)
update_icon()
anim(target = src, a_icon = icon, flick_anim = "splicer_print", sleeptime = 15)
nanomanager.update_uis(src)
var/obj/item/weapon/disk/disease/d = new /obj/item/weapon/disk/disease(src)
if(analysed)
d.name = "\improper [memorybank.name] GNA disk (Stage: [memorybank.stage])"
else
d.name = "unknown GNA disk (Stage: [memorybank.stage])"
d.effect = memorybank
if (!(memorybank.type in extracted_gna))
extracted_gna |= memorybank.type
score["disease_extracted"] += 1
switch (memorybank.badness)
if (EFFECT_DANGER_HELPFUL)
score["disease_effects"] += 20
if (EFFECT_DANGER_FLAVOR)
score["disease_effects"] += 2
if (EFFECT_DANGER_ANNOYING)
score["disease_effects"] += 1
if (EFFECT_DANGER_HINDRANCE)
score["disease_effects"] += 5
if (EFFECT_DANGER_HARMFUL)
score["disease_effects"] += 10
if (EFFECT_DANGER_DEADLY)
score["disease_effects"] += 30
alert_noise("ping")
spawn(10)
d.forceMove(loc)
d.pixel_x = -6
d.pixel_y = 3
/obj/machinery/computer/diseasesplicer/update_icon()
..()
overlays.len = 0
if (dish)
var/image/dish_outline = image(icon,"smalldish2-outline")
dish_outline.alpha = 128
dish_outline.pixel_x = -1
dish_outline.pixel_y = -13
overlays += dish_outline
var/image/dish_content = image(icon,"smalldish2-empty")
dish_content.alpha = 128
dish_content.pixel_x = -1
dish_content.pixel_y = -13
if (dish.contained_virus)
dish_content.icon_state = "smalldish2-color"
dish_content.color = dish.contained_virus.color
overlays += dish_content
if(stat & (BROKEN|NOPOWER))
return
if (dish && dish.contained_virus)
if (dish.analysed)
var/image/scan_pattern = image(icon,"pattern-[dish.contained_virus.pattern]b")
scan_pattern.color = "#00FF00"
scan_pattern.pixel_x = -2
scan_pattern.pixel_y = 4
overlays += scan_pattern
else
overlays += image(icon,"splicer_unknown")
if(scanning || splicing)
var/image/splicer_glass = image(icon,"splicer_glass")
splicer_glass.plane = LIGHTING_PLANE
splicer_glass.layer = ABOVE_LIGHTING_LAYER
splicer_glass.blend_mode = BLEND_ADD
overlays += splicer_glass
if (memorybank)
var/image/buffer_light = image(icon,"splicer_buffer")
buffer_light.plane = LIGHTING_PLANE
buffer_light.layer = ABOVE_LIGHTING_LAYER
overlays += buffer_light
/obj/machinery/computer/diseasesplicer/proc/buffer2dish()
if(!memorybank || !dish || !dish.contained_virus)
return
var/list/effects = dish.contained_virus.effects
for(var/x = 1 to effects.len)
var/datum/disease2/effect/e = effects[x]
if(e.stage == memorybank.stage)
effects[x] = memorybank.getcopy(dish.contained_virus)
log_debug("[dish.contained_virus.form] #[add_zero("[dish.contained_virus.uniqueID]", 4)][dish.contained_virus.childID ? "-[add_zero("[dish.contained_virus.childID]", 2)]" : ""] had [memorybank.name] spliced into to replace [e.name] by [key_name(usr)].")
dish.contained_virus.log += "<br />[timestamp()] [memorybank.name] spliced in by [key_name(usr)] (replaces [e.name])"
break
splicing = DISEASE_SPLICER_SPLICING_TICKS
spliced = TRUE
update_icon()
/obj/machinery/computer/diseasesplicer/proc/dish2buffer(var/target_stage)
if(!dish || !dish.contained_virus)
return
var/list/effects = dish.contained_virus.effects
for(var/x = 1 to effects.len)
var/datum/disease2/effect/e = effects[x]
if(e.stage == target_stage)
memorybank = e
break
scanning = DISEASE_SPLICER_SCANNING_TICKS
analysed = dish.analysed
qdel(dish)
dish = null
update_icon()
anim(target = src, a_icon = icon, flick_anim = "splicer_scan", sleeptime = 15)
/obj/machinery/computer/diseasesplicer/proc/eject_dish()
if(!dish)
return
if(spliced)
//Here we generate a new ID so the spliced pathogen gets it's own entry in the database instead of being shown as the old one.
dish.contained_virus.subID = rand(0, 9999)
var/list/randomhexes = list("7","8","9","a","b","c","d","e")
var/colormix = "#[pick(randomhexes)][pick(randomhexes)][pick(randomhexes)][pick(randomhexes)][pick(randomhexes)][pick(randomhexes)]"
dish.contained_virus.color = BlendRGB(dish.contained_virus.color,colormix,0.25)
dish.contained_virus.addToDB()
say("Updated pathogen database with new spliced entry.")
dish.info = dish.contained_virus.get_info()
dish.name = "growth dish ([dish.contained_virus.name(TRUE)])"
spliced = FALSE
dish.contained_virus.update_global_log()
dish.forceMove(loc)
if (Adjacent(usr))
dish.forceMove(usr.loc)
usr.put_in_hands(dish)
dish = null
update_icon()
/obj/machinery/computer/diseasesplicer/Topic(href, href_list)
if(..())
return TRUE
if(scanning || splicing || burning)
return FALSE
add_fingerprint(usr)
if(href_list["erase_buffer"])
memorybank = null
update_icon()
if(href_list["eject_dish"])
eject_dish()
var/target_stage = text2num(href_list["dish_effect_to_buffer"])
if(target_stage)
dish2buffer(target_stage)
else if(href_list["splice_buffer_to_dish"])
buffer2dish()
else if(href_list["burn_buffer_to_disk"])
burning = DISEASE_SPLICER_BURNING_TICKS
return TRUE
#undef DISEASE_SPLICER_BURNING_TICKS
#undef DISEASE_SPLICER_SPLICING_TICKS
#undef DISEASE_SPLICER_SCANNING_TICKS