Integrated circuit fixes and code improvements

This commit is contained in:
ACCount
2017-11-21 12:04:09 +03:00
committed by CitadelStationBot
parent 065a816183
commit 8a64287249
21 changed files with 720 additions and 555 deletions
@@ -4,22 +4,13 @@
icon = 'icons/obj/electronic_assemblies.dmi'
icon_state = "circuit_printer"
w_class = WEIGHT_CLASS_BULKY
var/metal = 0
var/init_max_metal = 100
var/max_metal = 100
var/metal_per_sheet = 10 // One sheet equals this much metal.
var/debug = FALSE
var/upgraded = FALSE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits.
var/upgraded = TRUE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits.
var/can_clone = FALSE // Same for above, but will allow the printer to duplicate a specific assembly.
var/static/list/recipe_list //category = list(paths in category)
var/current_category = null
var/as_printing = FALSE
var/as_needs = 0
var/program ="blank"
var/obj/item/device/integrated_electronics/prefab/PR = null
var/list/program // Currently loaded save, in form of list
/obj/item/device/integrated_circuit_printer/proc/check_interactivity(mob/user)
return user.canUseTopic(src,be_close = TRUE)
return user.canUseTopic(src, be_close = TRUE)
/obj/item/device/integrated_circuit_printer/upgraded
upgraded = TRUE
@@ -27,55 +18,23 @@
/obj/item/device/integrated_circuit_printer/Initialize()
. = ..()
if(!recipe_list)
recipe_list = SScircuit.circuit_fabricator_recipe_list
AddComponent(/datum/component/material_container, list(MAT_METAL), MINERAL_MATERIAL_AMOUNT * 25, TRUE, list(/obj/item/stack, /obj/item/integrated_circuit))
/obj/item/device/integrated_circuit_printer/attackby(var/obj/item/O, var/mob/user)
if(istype(O,/obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/stack = O
var/num = min((max_metal - metal) / metal_per_sheet, stack.amount)
if(num < 1)
to_chat(user, "<span class='warning'>\The [src] is too full to add more metal.</span>")
return
if(stack.use(num))
to_chat(user, "<span class='notice'>You add [num] sheet\s to \the [src].</span>")
metal += num * metal_per_sheet
if(as_printing)
if(as_needs <= metal)
PR = new/obj/item/device/integrated_electronics/prefab(get_turf(loc))
PR.program = program
metal = metal - as_needs
to_chat(user, "<span class='notice'>Assembly has been printed.</span>")
as_printing = FALSE
as_needs = 0
max_metal = init_max_metal
else
to_chat(user, "<span class='notice'>Please insert [(as_needs-metal)/10] more metal!</span>")
interact(user)
return TRUE
if(istype(O,/obj/item/integrated_circuit))
to_chat(user, "<span class='notice'>You insert the circuit into \the [src]. </span>")
user.temporarilyRemoveItemFromInventory(O)
metal = min(metal + O.w_class, max_metal)
qdel(O)
interact(user)
return TRUE
if(istype(O,/obj/item/disk/integrated_circuit/upgrade/advanced))
if(istype(O, /obj/item/disk/integrated_circuit/upgrade/advanced))
if(upgraded)
to_chat(user, "<span class='warning'>\The [src] already has this upgrade. </span>")
return TRUE
to_chat(user, "<span class='notice'>You install \the [O] into \the [src]. </span>")
to_chat(user, "<span class='notice'>You install \the [O] into \the [src]. </span>")
upgraded = TRUE
interact(user)
return TRUE
if(istype(O,/obj/item/disk/integrated_circuit/upgrade/clone))
if(istype(O, /obj/item/disk/integrated_circuit/upgrade/clone))
if(can_clone)
to_chat(user, "<span class='warning'>\The [src] already has this upgrade. </span>")
return TRUE
to_chat(user, "<span class='notice'>You install \the [O] into \the [src]. </span>")
to_chat(user, "<span class='notice'>You install \the [O] into \the [src]. </span>")
can_clone = TRUE
interact(user)
return TRUE
@@ -86,37 +45,33 @@
interact(user)
/obj/item/device/integrated_circuit_printer/interact(mob/user)
var/window_height = 600
var/window_width = 500
if(isnull(current_category))
current_category = recipe_list[1]
current_category = SScircuit.circuit_fabricator_recipe_list[1]
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/HTML = "<center><h2>Integrated Circuit Printer</h2></center><br>"
HTML += "Metal: [metal/metal_per_sheet]/[max_metal/metal_per_sheet] sheets.<br>"
HTML += "Metal: [materials.total_amount]/[materials.max_amount].<br><br>"
if(CONFIG_GET(flag/ic_printing))
HTML += "Assembly cloning: [can_clone ? "Available": "Unavailable"].<br>"
HTML += "Circuits available: [upgraded ? "Advanced":"Regular"]."
HTML += "Assembly Cloning: [can_clone ? "Available": "Unavailable"]."
HTML += "Crossed out circuits mean that the printer is not sufficiently upgraded to create that circuit.<br>"
if(!upgraded)
HTML += "<br>Crossed out circuits mean that the printer is not sufficiently upgraded to create that circuit."
HTML += "<hr>"
if(can_clone)
if(can_clone && CONFIG_GET(flag/ic_printing))
HTML += "Here you can load script for your assembly.<br>"
if(as_printing)
HTML += " {Load Program} "
HTML += " <A href='?src=[REF(src)];print=load'>{Load Program}</a> "
if(!program)
HTML += " {Print Assembly}"
else
HTML += " <A href='?src=[REF(src)];print=load'>{Load Program}</a> "
if(program == "blank")
HTML += " {Check Program} "
else
HTML += " <A href='?src=[REF(src)];print=check'>{Check Program}</a> "
if((program == "blank")|as_printing)
HTML += " {Print assembly} "
else
HTML += " <A href='?src=[REF(src)];print=print'>{Print assembly}</a> "
if(as_printing)
HTML += "<br> printing in process. Please insert more metal. "
HTML += " <A href='?src=[REF(src)];print=print'>{Print Assembly}</a>"
HTML += "<br><hr>"
HTML += "Categories:"
for(var/category in recipe_list)
for(var/category in SScircuit.circuit_fabricator_recipe_list)
if(category != current_category)
HTML += " <a href='?src=[REF(src)];category=[category]'>\[[category]\]</a> "
else // Bold the button if it's already selected.
@@ -124,28 +79,26 @@
HTML += "<hr>"
HTML += "<center><h4>[current_category]</h4></center>"
var/list/current_list = recipe_list[current_category]
for(var/k in 1 to current_list.len)
var/obj/O = current_list[k]
var/list/current_list = SScircuit.circuit_fabricator_recipe_list[current_category]
for(var/path in current_list)
var/obj/O = path
var/can_build = TRUE
if(istype(O, /obj/item/integrated_circuit))
var/obj/item/integrated_circuit/IC = current_list[k]
if(ispath(path, /obj/item/integrated_circuit))
var/obj/item/integrated_circuit/IC = path
if((initial(IC.spawn_flags) & IC_SPAWN_RESEARCH) && (!(initial(IC.spawn_flags) & IC_SPAWN_DEFAULT)) && !upgraded)
can_build = FALSE
if(can_build)
HTML += "<A href='?src=[REF(src)];build=[current_list[k]]'>\[[initial(O.name)]\]</A>: [initial(O.desc)]<br>"
HTML += "<A href='?src=[REF(src)];build=[path]'>\[[initial(O.name)]\]</A>: [initial(O.desc)]<br>"
else
HTML += "<s>\[[initial(O.name)]\]: [initial(O.desc)]</s><br>"
HTML += "<s>\[[initial(O.name)]\]</s>: [initial(O.desc)]<br>"
user << browse(jointext(HTML, null), "window=integrated_printer;size=[window_width]x[window_height];border=1;can_resize=1;can_close=1;can_minimize=1")
user << browse(HTML, "window=integrated_printer;size=600x500;border=1;can_resize=1;can_close=1;can_minimize=1")
/obj/item/device/integrated_circuit_printer/Topic(href, href_list)
if(!check_interactivity(usr))
return
if(..())
return TRUE
var/sc = 0
add_fingerprint(usr)
if(href_list["category"])
current_category = href_list["category"]
@@ -163,10 +116,15 @@
var/obj/item/integrated_circuit/IC = build_type
cost = initial(IC.w_class)
if(metal - cost < 0)
to_chat(usr, "<span class='warning'>You need [cost] metal to build that!.</span>")
cost *= SScircuit.cost_multiplier
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if(!materials.use_amount_type(cost, MAT_METAL))
to_chat(usr, "<span class='warning'>You need [cost] metal to build that!</span>")
return TRUE
metal -= cost
new build_type(get_turf(loc))
if(href_list["print"])
@@ -175,39 +133,48 @@
return
switch(href_list["print"])
if("load")
program = input("Put your code there:", "loading", null, null)
if("check")
sc = sanity_check(program,usr)
if(sc == 0)
to_chat(usr, "<span class='warning'>Invalid program.</span>")
else if(sc == -1)
to_chat(usr, "<span class='warning'>Unknown circuits found. Upgrades required to process this design.</span>")
else if(sc == null)
to_chat(usr, "<span class='warning'>Invalid program.</span>")
else
to_chat(usr, "<span class='notice'>Program is correct.You'll need [sc/10] sheets of metal</span>")
var/input = input("Put your code there:", "loading", null, null) as message | null
if(!check_interactivity(usr))
return
if(!input)
program = null
return
var/validation = SScircuit.validate_electronic_assembly(input)
// Validation error codes are returned as text.
if(istext(validation))
to_chat(usr, "<span class='warning'>Error: [validation]</span>")
return
else if(islist(validation))
program = validation
to_chat(usr, "<span class='notice'>This is a valid program for [program["assembly"]["type"]].</span>")
if(program["requires_upgrades"])
if(upgraded)
to_chat(usr, "<span class='notice'>It uses advanced component designs.</span>")
else
to_chat(usr, "<span class='warning'>It uses unknown component designs. Printer upgrade is required to proceed.</span>")
to_chat(usr, "<span class='notice'>Used space: [program["used_space"]]/[program["max_space"]].</span>")
to_chat(usr, "<span class='notice'>Complexity: [program["complexity"]]/[program["max_complexity"]].</span>")
to_chat(usr, "<span class='notice'>Metal cost: [program["metal_cost"]].</span>")
if("print")
sc = sanity_check(program,usr)
if(sc == 0 || sc == null)
to_chat(usr, "<span class='warning'>Invalid program.</span>")
else if(sc == -1)
to_chat(usr, "<span class='warning'>Unknown circuits found. Upgrades required to process this design.</span>")
if(!program)
return
if(program["requires_upgrades"] && !upgraded)
to_chat(usr, "<span class='warning'>This program uses unknown component designs. Printer upgrade is required to proceed.</span>")
else
as_printing = TRUE
if(sc <= metal)
PR = new/obj/item/device/integrated_electronics/prefab(get_turf(loc))
PR.program = program
metal = metal - sc
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if(materials.use_amount_type(program["metal_cost"], MAT_METAL))
SScircuit.load_electronic_assembly(get_turf(src), program)
to_chat(usr, "<span class='notice'>Assembly has been printed.</span>")
as_printing = FALSE
as_needs = 0
max_metal=init_max_metal
else
max_metal = sc + metal_per_sheet
as_needs = sc
to_chat(usr, "<span class='notice'>Please insert [(as_needs-metal)/10] more metal!</span>")
to_chat(usr, "<span class='warning'>You need [program["metal_cost"]] metal to build that!</span>")
interact(usr)
// FUKKEN UPGRADE DISKS
/obj/item/disk/integrated_circuit/upgrade
name = "integrated circuit printer upgrade disk"
@@ -227,6 +194,7 @@
name = "integrated circuit printer upgrade disk - circuit cloner"
desc = "Install this into your integrated circuit printer to enhance it. This one allows the printer to duplicate assemblies."
icon_state = "upgrade_disk_clone"
<<<<<<< HEAD
origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 5)
/obj/item/device/integrated_circuit_printer/proc/sanity_check(var/program,var/mob/user)
@@ -404,4 +372,6 @@
return 0
if(initial(IO.io_type) != initial(IO2.io_type))
return 0
return metalcost
return metalcost
=======
>>>>>>> b161b18... Integrated circuit fixes and code improvements (#32773)