diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index b61a97ea33a..8a6fc0438c9 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -108,7 +108,7 @@
if(damtype == "brute")
for(var/target_type in src.destroyable_obj)
if(istype(target, target_type) && hascall(target, "attackby"))
- src.occupant.show_message("You hit [target].", 1)
+ src.occupant_message("You hit [target].")
src.visible_message("[src.name] hits [target]")
for (var/mob/V in viewers(src))
if(V.client && !(V.blinded))
diff --git a/code/game/mecha/global_iterator.dm b/code/game/mecha/global_iterator.dm
index 026d85f2791..9b03af071e9 100644
--- a/code/game/mecha/global_iterator.dm
+++ b/code/game/mecha/global_iterator.dm
@@ -127,4 +127,8 @@ Data storage vars:
// world << "\red Invalid arguments supplied for [src.type], ref = \ref[src]"
return 0
+ proc/toggle_null_checks()
+ src.check_for_null = !src.check_for_null
+ return
+
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index e92f4c5ad07..c0e734adf1f 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -1,22 +1,24 @@
/////////////////////////////
///// Part Fabricator ///////
/////////////////////////////
-
-
+/*
/obj/machinery/mecha_part_fabricator
icon = 'stationobjs.dmi'
icon_state = "mechfab1"
name = "Exosuit Fabricator"
+ desc = "Nothing is being built."
density = 1
anchored = 1
use_power = 1
idle_power_usage = 20
active_power_usage = 5000
+ var/screen = "main" // parts
+ var/temp
var/time_coeff = 1 //can be upgraded with research
var/resource_coeff = 1.5 //can be upgraded with research
var/list/resources = list(
- "metal"=20000,
- "glass"=20000,
+ "metal"=0,
+ "glass"=0,
"gold"=0,
"silver"=0,
"diamond"=0,
@@ -26,6 +28,8 @@
var/res_max_amount = 200000
var/part_set
var/obj/being_built
+ var/list/queue
+ var/processing_queue = 0
var/list/part_sets = list( //set names must be unique
"Ripley"=list(
list("result"="/obj/mecha_chassis/ripley","time"=100,"metal"=20000),
@@ -118,28 +122,32 @@
var/output = ""
if(set_name in part_sets)
var/list/part_set = part_sets[set_name]
- for(var/part in part_set)
+ for(var/list/part in part_set)
var/resources_available = check_resources(part)
- output += "[resources_available?"":""][output_part_info(part)][resources_available?"":""]
"
+ output += "
"
return output
proc/output_part_info(part)
var/path = part["result"]
var/obj/O = new path(src)
- var/cost = "Cost: "
- var/i = 0
- for(var/p in part)
- if(p in resources)
- cost += "[i?" | ":null][part[p]*resource_coeff] [p]"
- i++
- var/output = "[O.name] ([cost]) [part["time"]*time_coeff/10]sec"
+ var/output = "[O.name] (Cost: [output_part_cost(part)]) [part["time"]*time_coeff/10]sec"
del O
return output
+ proc/output_part_cost(part)
+ var/i = 0
+ var/output
+ for(var/p in part)
+ if(p in resources)
+ output += "[i?" | ":null][part[p]*resource_coeff] [p]"
+ i++
+ return output
+
+
proc/output_available_resources()
var/output
for(var/resource in resources)
- output += "[resource]: [min(res_max_amount, resources[resource])] cm3
"
+ output += "[resource]: [min(res_max_amount, resources[resource])] cm3
"
return output
proc/remove_resources(part)
@@ -155,38 +163,126 @@
return 0
return 1
+ proc/add_part_set_to_queue(set_name as text)
+ if(set_name in part_sets)
+ var/list/part_set = part_sets[set_name]
+ for(var/part in part_set)
+ add_to_queue(part)
+ return
+
+ proc/add_to_queue(part)
+ if(!istype(queue, /list))
+ queue = list()
+ queue[++queue.len] = part
+ return queue.len
+
+ proc/remove_from_queue(index as num)
+ if(!istype(queue, /list) || !queue[index])
+ return 0
+ queue.Cut(index,++index)
+ return 1
+
+ proc/process_queue()
+ if(!istype(queue, /list) || !queue.len)
+ return 0
+ while(queue.len)
+ if(stat&(NOPOWER|BROKEN))
+ return 0
+ var/list/part = queue[1]
+ if(!check_resources(part))
+ src.visible_message("[src] beeps, \"Not enough resources. Queue processing stopped\".")
+ temp = {"Not enough resources to build next part.
+ Try again | Return"}
+ return 0
+ remove_from_queue(1)
+ build_part(part)
+ src.visible_message("[src] beeps, \"Queue processing finished successfully\".")
+ return 1
+
+ proc/list_queue()
+ var/output = "Queue contains:"
+ if(!istype(queue, /list) || !queue.len)
+ output += "
Nothing"
+ else
+ output += ""
+ for(var/i=1;i<=queue.len;i++)
+ var/list/part = queue[i]
+ var/path = part["result"]
+ var/obj/O = new path(src)
+ output += "- [O.name] - [i>1?"↑":null] [i↓
":null] Remove"
+ del O
+ output += ""
+ output += "\[Process queue | Clear queue\]"
+ return output
+
+ proc/build_part(list/part)
+ if(!part || !part.len) return
+ var/path = part["result"]
+ var/time = part["time"]
+ src.being_built = new path(src)
+ src.desc = "It's building [src.being_built]."
+ src.remove_resources(part)
+ src.icon_state = "mechfab3" //looks better than 'flick'
+ src.use_power = 2
+ src.updateUsrDialog()
+ sleep(time*time_coeff)
+ src.use_power = 1
+ src.being_built.Move(get_step(src,EAST))
+ src.icon_state = initial(src.icon_state)
+ src.visible_message("[src] beeps, \"The [src.being_built] is complete\".")
+ src.icon_state = initial(src.icon_state)
+ src.being_built = null
+ src.desc = initial(src.desc)
+ src.updateUsrDialog()
+ return 1
+
attack_hand(mob/user as mob)
- var/dat
+ var/dat, left_part
if (..())
return
user.machine = src
- if (src.being_built)
- dat = {"Building [src.being_built.name].
- Please wait until completion...
-
- "}
+ if(temp)
+ left_part = temp
+ else if(src.being_built)
+ left_part = {"Building [src.being_built.name].
+ Please wait until completion..."}
else
- dat = output_available_resources()
- dat += "
"
- if(!part_set)
- for(var/part_set in part_sets)
- dat += "[part_set]
"
- else
- dat += output_parts_list(part_set)
- dat += "
Return"
+ switch(screen)
+ if("main")
+ left_part = output_available_resources()+"
"
+ for(var/part_set in part_sets)
+ left_part += "[part_set] - \[Add all parts to queue\]
"
+ if("parts")
+ left_part += output_parts_list(part_set)
+ left_part += "
Return"
+ dat = {"
+
+ [src.name]
+
-
-[dat]
-
- "}, "window=mecha_fabricator")
+ td {vertical-align: top; padding: 5px;}
+ html, body {padding: 0px; margin: 0px;}
+
+
+
+
+
+ |
+ [left_part]
+ |
+
+ [list_queue()]
+ |
+
+
+
+ "}
+ user << browse(dat, "window=mecha_fabricator;size=1000x400")
onclose(user, "mecha_fabricator")
return
@@ -198,23 +294,422 @@
src.part_set = null
else
src.part_set = href_list["part_set"]
+ screen = "parts"
if(href_list["part"])
var/list/part = locate(href_list["part"])
- if(!part) return
- var/path = part["result"]
- var/time = part["time"]
- src.being_built = new path(src)
- src.remove_resources(part)
- src.icon_state = "mechfab3" //looks better than 'flick'
- src.use_power = 2
- spawn(time*time_coeff)
- src.use_power = 1
- src.being_built.Move(get_step(src,EAST))
- src.icon_state = initial(src.icon_state)
- src.visible_message("[src] beeps, \"The [src.being_built] is complete\".")
- src.icon_state = initial(src.icon_state)
- src.being_built = null
- src.updateUsrDialog()
+ if(!processing_queue)
+ build_part(part)
+ else
+ add_to_queue(part)
+ if(href_list["add_to_queue"])
+ var/part = locate(href_list["add_to_queue"])
+ add_to_queue(part)
+ if(href_list["remove_from_queue"])
+ var/index = text2num(href_list["remove_from_queue"])
+ if(isnum(index))
+ remove_from_queue(index)
+ if(href_list["partset_to_queue"])
+ var/part_set = href_list["partset_to_queue"]
+ add_part_set_to_queue(part_set)
+ if(href_list["process_queue"])
+ temp = null
+ processing_queue = 1
+ process_queue()
+ processing_queue = 0
+ if(href_list["list_queue"])
+ list_queue()
+ if(href_list["clear_temp"])
+ temp = null
+ if(href_list["screen"])
+ src.screen = href_list["screen"]
+ if(href_list["queue_move"] && href_list["index"])
+ var/index = text2num(href_list["index"])
+ var/new_index = index + text2num(href_list["queue_move"])
+ if(isnum(index) && isnum(new_index))
+ if(new_index>0&&new_index<=queue.len)
+ queue.Swap(index,new_index)
+ if(href_list["clear_queue"])
+ queue = null
+ src.updateUsrDialog()
+ return
+
+ process()
+ if (stat & (NOPOWER|BROKEN))
+ return
+
+
+ attackby(obj/item/stack/sheet/W as obj, mob/user as mob)
+ var/material
+ if(istype(W, /obj/item/stack/sheet/gold))
+ material = "gold"
+ else if(istype(W, /obj/item/stack/sheet/silver))
+ material = "silver"
+ else if(istype(W, /obj/item/stack/sheet/diamond))
+ material = "diamond"
+ else if(istype(W, /obj/item/stack/sheet/plasma))
+ material = "plasma"
+ else if(istype(W, /obj/item/stack/sheet/metal))
+ material = "metal"
+ else if(istype(W, /obj/item/stack/sheet/glass))
+ material = "glass"
+ else if(istype(W, /obj/item/stack/sheet/clown))
+ material = "bananium"
+ else
+ return ..()
+
+ if(src.being_built)
+ user << "The fabricator is currently processing. Please wait until completion."
+ return
+
+ var/name = "[W.name]"
+ var/amnt = W.perunit
+ if(src.resources[material] < res_max_amount)
+ var/count = 0
+ spawn(10)
+ if(W && W.amount)
+ while(src.resources[material] < res_max_amount && W)
+ src.resources[material] += amnt
+ W.use(1)
+ count++
+ flick("mechfab2", src)
+ user << "You insert [count] [name] into the fabricator."
+ src.updateUsrDialog()
+ else
+ user << "The fabricator cannot hold more [name]."
+ return
+*/
+
+/obj/machinery/mecha_part_fabricator
+ icon = 'stationobjs.dmi'
+ icon_state = "mechfab1"
+ name = "Exosuit Fabricator"
+ desc = "Nothing is being built."
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 20
+ active_power_usage = 5000
+ var/time_coeff = 2 //can be upgraded with research
+ var/resource_coeff = 1.5 //can be upgraded with research
+ var/list/resources = list(
+ "metal"=0,
+ "glass"=0,
+ "gold"=0,
+ "silver"=0,
+ "diamond"=0,
+ "plasma"=0,
+ "bananium"=0
+ )
+ var/res_max_amount = 200000
+ var/part_set
+ var/obj/being_built
+ var/list/queue = list()
+ var/processing_queue = 0
+ var/screen = "main"
+ var/temp
+ var/list/part_sets = list( //set names must be unique
+ "Ripley"=list(
+ /obj/item/mecha_parts/chassis/ripley,
+ /obj/item/mecha_parts/part/ripley_torso,
+ /obj/item/mecha_parts/part/ripley_left_arm,
+ /obj/item/mecha_parts/part/ripley_right_arm,
+ /obj/item/mecha_parts/part/ripley_left_leg,
+ /obj/item/mecha_parts/part/ripley_right_leg
+ ),
+ "Gygax"=list(
+ /obj/item/mecha_parts/chassis/gygax,
+ /obj/item/mecha_parts/part/gygax_torso,
+ /obj/item/mecha_parts/part/gygax_head,
+ /obj/item/mecha_parts/part/gygax_left_arm,
+ /obj/item/mecha_parts/part/gygax_right_arm,
+ /obj/item/mecha_parts/part/gygax_left_leg,
+ /obj/item/mecha_parts/part/gygax_right_leg,
+ /obj/item/mecha_parts/part/gygax_armour
+ ),
+
+ "H.O.N.K"=list(
+ /obj/item/mecha_parts/chassis/honker,
+ /obj/item/mecha_parts/part/honker_torso,
+ /obj/item/mecha_parts/part/honker_head,
+ /obj/item/mecha_parts/part/honker_left_arm,
+ /obj/item/mecha_parts/part/honker_right_arm,
+ /obj/item/mecha_parts/part/honker_left_leg,
+ /obj/item/mecha_parts/part/honker_right_leg
+ ),
+ "Misc"=list(/obj/item/mecha_tracking)
+
+ )
+
+ New()
+ ..()
+ for(var/part_set in part_sets)
+ convert_part_set(part_set)
+ return
+
+ Del()
+ for(var/atom/A in src)
+ del A
+ ..()
+ return
+
+ proc/convert_part_set(set_name as text)
+ var/list/parts = part_sets[set_name]
+ if(istype(parts, /list))
+ for(var/i=1;i<=parts.len;i++)
+ var/path = parts[i]
+ parts[i] = new path(src)
+ return
+
+
+ proc/add_part_set(set_name as text,parts=null)
+ if(set_name in part_sets)//attempt to create duplicate set
+ return 0
+ if(isnull(parts))
+ part_sets[set_name] = list()
+ else
+ part_sets[set_name] = parts
+ convert_part_set(set_name)
+ return 1
+
+ proc/add_part_to_set(set_name as text,part)
+ src.add_part_set(set_name)//if no "set_name" set exists, create
+ var/list/part_set = part_sets[set_name]
+ if(ispath(part))
+ part_set[++part_set.len] = new part(src)
+ else
+ part_set[++part_set.len] = part
+ return
+
+ proc/remove_part_set(set_name as text)
+ for(var/i=1,i<=part_sets.len,i++)
+ if(part_sets[i]==set_name)
+ part_sets.Cut(i,++i)
+ return
+/*
+ proc/sanity_check()
+ for(var/p in resources)
+ var/index = resources.Find(p)
+ index = resources.Find(p, ++index)
+ if(index) //duplicate resource
+ world << "Duplicate resource definition for [src](\ref[src])"
+ return 0
+ for(var/set_name in part_sets)
+ var/index = part_sets.Find(set_name)
+ index = part_sets.Find(set_name, ++index)
+ if(index) //duplicate part set
+ world << "Duplicate part set definition for [src](\ref[src])"
+ return 0
+ return 1
+*/
+/*
+ New()
+ ..()
+ src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000))
+ src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/ripley_left_arm","time"=200,"metal"=25000))
+ src.remove_part_set("Gygax")
+ return
+*/
+
+ proc/output_parts_list(set_name as text)
+ var/output = ""
+ if(set_name in part_sets)
+ var/list/part_set = part_sets[set_name]
+ for(var/atom/part in part_set)
+ var/resources_available = check_resources(part)
+ output += ""
+ return output
+
+ proc/output_part_info(var/obj/item/mecha_parts/part)
+ var/output = "[part.name] (Cost: [output_part_cost(part)]) [part.construction_time*time_coeff/10]sec"
+ return output
+
+ proc/output_part_cost(var/obj/item/mecha_parts/part)
+ var/i = 0
+ var/output
+ for(var/p in part.construction_cost)
+ if(p in resources)
+ output += "[i?" | ":null][part.construction_cost[p]*resource_coeff] [p]"
+ i++
+ return output
+
+ proc/output_available_resources()
+ var/output
+ for(var/resource in resources)
+ output += "[resource]: [min(res_max_amount, resources[resource])] cm3
"
+ return output
+
+ proc/remove_resources(var/obj/item/mecha_parts/part as obj)
+ for(var/resource in part.construction_cost)
+ if(resource in src.resources)
+ src.resources[resource] -= part.construction_cost[resource]*resource_coeff
+ return
+
+ proc/check_resources(var/obj/item/mecha_parts/part as obj)
+ for(var/resource in part.construction_cost)
+ if(resource in src.resources)
+ if(src.resources[resource] < part.construction_cost[resource]*resource_coeff)
+ return 0
+ return 1
+
+ proc/build_part(var/obj/item/mecha_parts/part as obj)
+ if(!part) return
+ src.being_built = new part.type(src)
+ src.desc = "It's building [src.being_built]."
+ src.remove_resources(part)
+ src.icon_state = "mechfab3" //looks better than 'flick'
+ src.use_power = 2
+ src.updateUsrDialog()
+ sleep(part.construction_time*time_coeff)
+ src.use_power = 1
+ src.being_built.Move(get_step(src,EAST))
+ src.icon_state = initial(src.icon_state)
+ src.visible_message("[src] beeps, \"The [src.being_built] is complete\".")
+ src.icon_state = initial(src.icon_state)
+ src.being_built = null
+ src.desc = initial(src.desc)
+ src.updateUsrDialog()
+ return 1
+
+ proc/add_part_set_to_queue(set_name as text)
+ if(set_name in part_sets)
+ var/list/part_set = part_sets[set_name]
+ for(var/part in part_set)
+ add_to_queue(part)
+ return
+
+ proc/add_to_queue(part as obj)
+ if(!istype(queue, /list))
+ queue = list()
+ queue[++queue.len] = part
+ return queue.len
+
+ proc/remove_from_queue(index as num)
+ if(!istype(queue, /list) || !queue[index])
+ return 0
+ queue.Cut(index,++index)
+ return 1
+
+ proc/process_queue()
+ while(istype(queue, /list) && queue.len)
+ if(stat&(NOPOWER|BROKEN))
+ return 0
+ var/part = queue[1]
+ if(!check_resources(part))
+ src.visible_message("[src] beeps, \"Not enough resources. Queue processing stopped\".")
+ temp = {"Not enough resources to build next part.
+ Try again | Return"}
+ return 0
+ remove_from_queue(1)
+ build_part(part)
+ src.visible_message("[src] beeps, \"Queue processing finished successfully\".")
+ return 1
+
+ proc/list_queue()
+ var/output = "Queue contains:"
+ if(!istype(queue, /list) || !queue.len)
+ output += "
Nothing"
+ else
+ output += ""
+ for(var/i=1;i<=queue.len;i++)
+ var/atom/part = queue[i]
+ output += "- [part.name] - [i>1?"↑":null] [i↓
":null] Remove"
+ output += ""
+ output += "\[Process queue | Clear queue\]"
+ return output
+
+ attack_hand(mob/user as mob)
+ var/dat, left_part
+ if (..())
+ return
+ user.machine = src
+ if(temp)
+ left_part = temp
+ else if(src.being_built)
+ left_part = {"Building [src.being_built.name].
+ Please wait until completion..."}
+ else
+ switch(screen)
+ if("main")
+ left_part = output_available_resources()+"
"
+ for(var/part_set in part_sets)
+ left_part += "[part_set] - \[Add all parts to queue\]
"
+ if("parts")
+ left_part += output_parts_list(part_set)
+ left_part += "
Return"
+ dat = {"
+
+ [src.name]
+
+
+
+
+
+ |
+ [left_part]
+ |
+
+ [list_queue()]
+ |
+
+
+
+ "}
+ user << browse(dat, "window=mecha_fabricator;size=1000x400")
+ onclose(user, "mecha_fabricator")
+ return
+
+
+ Topic(href, href_list)
+ ..()
+ if(href_list["part_set"])
+ if(href_list["part_set"]=="clear")
+ src.part_set = null
+ else
+ src.part_set = href_list["part_set"]
+ screen = "parts"
+ if(href_list["part"])
+ var/list/part = locate(href_list["part"])
+ if(!processing_queue)
+ build_part(part)
+ else
+ add_to_queue(part)
+ if(href_list["add_to_queue"])
+ var/part = locate(href_list["add_to_queue"])
+ add_to_queue(part)
+ if(href_list["remove_from_queue"])
+ var/index = text2num(href_list["remove_from_queue"])
+ if(isnum(index))
+ remove_from_queue(index)
+ if(href_list["partset_to_queue"])
+ var/part_set = href_list["partset_to_queue"]
+ add_part_set_to_queue(part_set)
+ if(href_list["process_queue"])
+ temp = null
+ processing_queue = 1
+ process_queue()
+ processing_queue = 0
+ if(href_list["list_queue"])
+ list_queue()
+ if(href_list["clear_temp"])
+ temp = null
+ if(href_list["screen"])
+ src.screen = href_list["screen"]
+ if(href_list["queue_move"] && href_list["index"])
+ var/index = text2num(href_list["index"])
+ var/new_index = index + text2num(href_list["queue_move"])
+ if(isnum(index) && isnum(new_index))
+ if(new_index>0&&new_index<=queue.len)
+ queue.Swap(index,new_index)
+ if(href_list["clear_queue"])
+ queue = list()
src.updateUsrDialog()
return
@@ -261,238 +756,3 @@
else
user << "The fabricator cannot hold more [name]."
return
-
-/*
-/obj/machinery/mecha_part_fabricator_wip
- icon = 'stationobjs.dmi'
- icon_state = "mechfab1"
- name = "Exosuit Fabricator"
- density = 1
- anchored = 1
- layer=2
- use_power = 1
- idle_power_usage = 20
- active_power_usage = 5000
- var/time_coeff = 2 //can be upgraded with research
- var/resource_coeff = 1.5 //can be upgraded with research
- var/list/resources = list(
- "/obj/item/stack/sheet/metal"=20000,
-
- )
- var/res_max_amount = 200000
- var/part_set
- var/obj/being_built
- var/list/part_sets = list( //set names must be unique
- "Ripley"=list("/obj/item/mecha_parts/part/ripley_torso",
- "/obj/item/mecha_parts/part/ripley_left_arm",
- "/obj/item/mecha_parts/part/ripley_right_arm",
- "/obj/item/mecha_parts/part/ripley_left_leg",
- "/obj/item/mecha_parts/part/ripley_right_leg"
- )
- )
-
- New()
- ..()
- for(var/part_set in part_sets)
- var/list/parts = part_sets[part_set]
- for(var/i;i<=parts.len;i++)
- parts[i]=new text2path(parts[i])(src)
- return
-
-
- proc/add_part_set(set_name,parts=null)
- if(set_name in part_sets)//attempt to create duplicate set
- return 0
- if(isnull(parts))
- part_sets[set_name] = list()
- else
- part_sets[set_name] = parts
- return 1
-
- proc/add_part_to_set(set_name,part)
- src.add_part_set(set_name)//if no "set_name" set exists, create
- var/list/part_set = part_sets[set_name]
- part_set[++part_set.len] = part
- return
-
- proc/remove_part_set(set_name)
- for(var/i=1,i<=part_sets.len,i++)
- if(part_sets[i]==set_name)
- part_sets.Cut(i,++i)
- return
-
- proc/sanity_check()
- for(var/p in resources)
- var/index = resources.Find(p)
- index = resources.Find(p, ++index)
- if(index) //duplicate resource
- world << "Duplicate resource definition for [src](\ref[src])"
- return 0
- for(var/set_name in part_sets)
- var/index = part_sets.Find(set_name)
- index = part_sets.Find(set_name, ++index)
- if(index) //duplicate part set
- world << "Duplicate part set definition for [src](\ref[src])"
- return 0
- return 1
-/*
- New()
- ..()
- src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000))
- src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/ripley_left_arm","time"=200,"metal"=25000))
- src.remove_part_set("Gygax")
- return
-*/
-
- proc/output_parts_list(set_name)
- var/output = ""
- if(set_name in part_sets)
- var/list/part_set = part_sets[set_name]
- for(var/part in part_set)
- var/resources_available = check_resources(part)
- output += "[resources_available?"":""][output_part_info(part)][resources_available?"":""]
"
- return output
-
- proc/output_part_info(var/obj/item/mecha_parts/part)
- var/cost = "Cost: "
- var/i = 0
- for(var/resource in part.construction_cost)
- cost += "[i?" | ":null][part[p]*resource_coeff] [p]"
- i++
- var/output = "[O.name] ([cost]) [part["time"]*time_coeff/10]sec"
- del O
- return output
-
- proc/output_available_resources()
- var/output
- for(var/resource in resources)
- output += "[resource]: [min(res_max_amount, resources[resource])] cm3
"
- return output
-
- proc/remove_resources(var/obj/item/mecha_parts/part)
- for(var/resource in part.construction_cost)
- src.resources[resource] -= part.construction_cost[resource]*resource_coeff
- return
-
- proc/check_resources(var/obj/item/mecha_parts/part)
- for(var/resource in part.construction_cost)
- if(resource in src.resources)
- if(src.resources[resource] < part.construction_cost[resource]*resource_coeff)
- return 0
- return 1
-
- attack_hand(mob/user as mob)
- var/dat
- if (..())
- return
- user.machine = src
- if (src.being_built)
- dat = {"Building [src.being_built.name].
- Please wait until completion...
-
- "}
- else
- dat = output_available_resources()
- dat += "
"
- if(!part_set)
- for(var/part_set in part_sets)
- dat += "[part_set]
"
- else
- dat += output_parts_list(part_set)
- dat += "
Return"
-
- user << browse({"
-
-
-[src.name]
-
-
-[dat]
-
- "}, "window=mecha_fabricator")
- onclose(user, "mecha_fabricator")
- return
-
-
- Topic(href, href_list)
- ..()
- if(href_list["part_set"])
- if(href_list["part_set"]=="clear")
- src.part_set = null
- else
- src.part_set = href_list["part_set"]
- if(href_list["part"])
- var/list/part = locate(href_list["part"])
- if(!part) return
- var/path = part["result"]
- var/time = part["time"]
- src.being_built = new path(src)
- src.remove_resources(part)
- src.icon_state = "mechfab3" //looks better than 'flick'
- src.use_power = 2
- spawn(time*time_coeff)
- src.use_power = 1
- src.being_built.Move(get_step(src,EAST))
- src.icon_state = initial(src.icon_state)
- src.visible_message("[src] beeps, \"The [src.being_built] is complete\".")
- src.icon_state = initial(src.icon_state)
- src.being_built = null
- src.updateUsrDialog()
- src.updateUsrDialog()
- return
-
- process()
- if (stat & (NOPOWER|BROKEN))
- return
-
- attackby(obj/item/stack/sheet/W as obj, mob/user as mob)
- var/material
- var/amnt
- if(istype(W, /obj/item/stack/sheet/gold))
- material = "gold"
- amnt = "g_amt"
- else if(istype(W, /obj/item/stack/sheet/silver))
- material = "silver"
- amnt = "g_amt"
- else if(istype(W, /obj/item/stack/sheet/diamond))
- material = "diamond"
- amnt = "g_amt"
- else if(istype(W, /obj/item/stack/sheet/plasma))
- material = "plasma"
- amnt = "g_amt"
- else if(istype(W, /obj/item/stack/sheet/metal))
- material = "metal"
- amnt = "m_amt"
- else if(istype(W, /obj/item/stack/sheet/glass))
- material = "glass"
- amnt = "g_amt"
- else if(istype(W, /obj/item/stack/sheet/clown))
- material = "bananium"
- amnt = "g_amt"
- else
- return ..()
-
- if(src.being_built)
- user << "The fabricator is currently processing. Please wait until completion."
- return
-
- var/name = "[W.name]"
- var/type = "[W.type]"
- if(src.resources[material] < res_max_amount)
- var/count = 0
- spawn(10)
- if(W && W.amount)
- while(src.resources[type] < res_max_amount && W)
- src.resources[type] += W.vars[amnt]
- W.use(1)
- count++
- flick("mechfab2", src)
- user << "You insert [count] [name] into the fabricator."
- src.updateUsrDialog()
- else
- user << "The fabricator cannot hold more [name]."
- return
-*/
diff --git a/code/game/mecha/mecha_construction.dm b/code/game/mecha/mecha_construction.dm
index df713618129..56c295a35f6 100644
--- a/code/game/mecha/mecha_construction.dm
+++ b/code/game/mecha/mecha_construction.dm
@@ -1,10 +1,20 @@
-///////////////////////////
-////// Mecha Chassis //////
-///////////////////////////
+/////////////////////////
+////// Mecha Parts //////
+/////////////////////////
-/obj/mecha_chassis
- name="Mecha Chassis"
+/obj/item/mecha_parts
+ name = "mecha part"
icon = 'mech_construct.dmi'
+ icon_state = "blank"
+ w_class = 20
+ flags = FPRINT | TABLEPASS | CONDUCT
+ origin_tech = "programming=2;materials=2"
+ var/construction_time = 100
+ var/list/construction_cost = list("metal"=20000,"glass"=5000)
+
+
+/obj/item/mecha_parts/chassis
+ name="Mecha Chassis"
icon_state = "backbone"
var/datum/construction/construct
flags = FPRINT | CONDUCT
@@ -14,108 +24,116 @@
..()
return
+ attack_hand()
+ return
+/////////// Ripley
-//////// Ripley chassis
-/obj/mecha_chassis/ripley
+/obj/item/mecha_parts/chassis/ripley
name = "Ripley Chassis"
New()
..()
construct = new /datum/construction/mecha/ripley_chassis(src)
-/////// Gygax chasis
-/obj/mecha_chassis/gygax
+/obj/item/mecha_parts/part/ripley_torso
+ name="Ripley Torso"
+ icon_state = "ripley_harness"
+ construction_time = 300
+ construction_cost = list("metal"=40000,"glass"=15000)
+
+/obj/item/mecha_parts/part/ripley_left_arm
+ name="Ripley Left Arm"
+ icon_state = "ripley_l_arm"
+ construction_time = 200
+ construction_cost = list("metal"=25000)
+
+/obj/item/mecha_parts/part/ripley_right_arm
+ name="Ripley Right Arm"
+ icon_state = "ripley_r_arm"
+ construction_time = 200
+ construction_cost = list("metal"=25000)
+
+/obj/item/mecha_parts/part/ripley_left_leg
+ name="Ripley Left Leg"
+ icon_state = "ripley_l_leg"
+ construction_time = 200
+ construction_cost = list("metal"=30000)
+
+/obj/item/mecha_parts/part/ripley_right_leg
+ name="Ripley Right Leg"
+ icon_state = "ripley_r_leg"
+ construction_time = 200
+ construction_cost = list("metal"=30000)
+
+///////// Gygax
+
+/obj/item/mecha_parts/chassis/gygax
name = "Gygax Chassis"
+ construction_cost = list("metal"=25000)
New()
..()
construct = new /datum/construction/mecha/gygax_chassis(src)
-/////// Firefighter chassis
-/obj/mecha_chassis/firefighter
+/obj/item/mecha_parts/part/gygax_torso
+ name="Gygax Torso"
+ icon_state = "gygax_harness"
+ origin_tech = "programming=3;materials=4;biotech=1"
+ construction_time = 300
+ construction_cost = list("metal"=50000,"glass"=20000)
+
+/obj/item/mecha_parts/part/gygax_head
+ name="Gygax Head"
+ icon_state = "gygax_head"
+ origin_tech = "programming=3;materials=4;magnets=3"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"glass"=10000)
+
+/obj/item/mecha_parts/part/gygax_left_arm
+ name="Gygax Left Arm"
+ icon_state = "gygax_l_arm"
+ origin_tech = "programming=3;materials=4"
+ construction_time = 200
+ construction_cost = list("metal"=30000,"glass"=20000)
+
+/obj/item/mecha_parts/part/gygax_right_arm
+ name="Gygax Right Arm"
+ icon_state = "gygax_r_arm"
+ origin_tech = "programming=3;materials=4"
+ construction_time = 200
+ construction_cost = list("metal"=30000,"glass"=20000)
+
+/obj/item/mecha_parts/part/gygax_left_leg
+ name="Gygax Left Leg"
+ icon_state = "gygax_l_leg"
+ origin_tech = "programming=3;materials=4"
+ construction_time = 200
+ construction_cost = list("metal"=35000,"glass"=20000)
+
+/obj/item/mecha_parts/part/gygax_right_leg
+ name="Gygax Right Leg"
+ icon_state = "gygax_r_leg"
+ origin_tech = "programming=3;materials=4"
+ construction_time = 200
+ construction_cost = list("metal"=35000,"glass"=20000)
+
+/obj/item/mecha_parts/part/gygax_armour
+ name="Gygax Armour Plates"
+ icon_state = "gygax_armour"
+ origin_tech = "materials=5,combat=4"
+ construction_time = 600
+ construction_cost = list("metal"=75000,"diamond"=10000)
+
+////////// Firefighter
+
+/obj/item/mecha_parts/chassis/firefighter
name = "Ripley-on-Fire Chassis"
New()
..()
construct = new /datum/construction/mecha/firefighter_chassis(src)
-/////// HONK chassis
-/obj/mecha_chassis/honker
- name = "H.O.N.K Chassis"
-
- New()
- ..()
- construct = new /datum/construction/mecha/honker_chassis(src)
-
-/////////////////////////
-////// Mecha Parts //////
-/////////////////////////
-
-
-/obj/item/mecha_parts
- name = "mecha part"
- icon = 'mech_construct.dmi'
- icon_state = "blank"
- w_class = 20
- flags = FPRINT | TABLEPASS | CONDUCT
- var/construction_time = 100
- var/list/construction_cost = list("/obj/item/stack/sheet/metal"=20000)
-
-/////////// Ripley
-
-/obj/item/mecha_parts/part/ripley_torso
- name="Ripley Torso"
- icon_state = "ripley_harness"
-
-/obj/item/mecha_parts/part/ripley_left_arm
- name="Ripley Left Arm"
- icon_state = "ripley_l_arm"
-
-/obj/item/mecha_parts/part/ripley_right_arm
- name="Ripley Right Arm"
- icon_state = "ripley_r_arm"
-
-/obj/item/mecha_parts/part/ripley_left_leg
- name="Ripley Left Leg"
- icon_state = "ripley_l_leg"
-
-/obj/item/mecha_parts/part/ripley_right_leg
- name="Ripley Right Leg"
- icon_state = "ripley_r_leg"
-
-///////// Gygax
-
-/obj/item/mecha_parts/part/gygax_torso
- name="Gygax Torso"
- icon_state = "gygax_harness"
-
-/obj/item/mecha_parts/part/gygax_head
- name="Gygax Head"
- icon_state = "gygax_head"
-
-/obj/item/mecha_parts/part/gygax_left_arm
- name="Gygax Left Arm"
- icon_state = "gygax_l_arm"
-
-/obj/item/mecha_parts/part/gygax_right_arm
- name="Gygax Right Arm"
- icon_state = "gygax_r_arm"
-
-/obj/item/mecha_parts/part/gygax_left_leg
- name="Gygax Left Leg"
- icon_state = "gygax_l_leg"
-
-/obj/item/mecha_parts/part/gygax_right_leg
- name="Gygax Right Leg"
- icon_state = "gygax_r_leg"
-
-/obj/item/mecha_parts/part/gygax_armour
- name="Gygax Armour Plates"
- icon_state = "gygax_armour"
-
-////////// Firefighter
-
/obj/item/mecha_parts/part/firefighter_torso
name="Ripley-on-Fire Torso"
icon_state = "ripley_harness"
@@ -138,29 +156,49 @@
////////// HONK
+
+/obj/item/mecha_parts/chassis/honker
+ name = "H.O.N.K Chassis"
+
+ New()
+ ..()
+ construct = new /datum/construction/mecha/honker_chassis(src)
+
/obj/item/mecha_parts/part/honker_torso
name="H.O.N.K Torso"
icon_state = "honker_harness"
+ construction_time = 300
+ construction_cost = list("metal"=35000,"glass"=10000,"bananium"=10000)
/obj/item/mecha_parts/part/honker_head
name="H.O.N.K Head"
icon_state = "honker_head"
+ construction_time = 200
+ construction_cost = list("metal"=15000,"glass"=5000,"bananium"=5000)
/obj/item/mecha_parts/part/honker_left_arm
name="H.O.N.K Left Arm"
icon_state = "honker_l_arm"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"bananium"=5000)
/obj/item/mecha_parts/part/honker_right_arm
name="H.O.N.K Right Arm"
icon_state = "honker_r_arm"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"bananium"=5000)
/obj/item/mecha_parts/part/honker_left_leg
name="H.O.N.K Left Leg"
icon_state = "honker_l_leg"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"bananium"=5000)
/obj/item/mecha_parts/part/honker_right_leg
name="H.O.N.K Right Leg"
icon_state = "honker_r_leg"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"bananium"=5000)
/obj/item/mecha_parts/circuitboard
@@ -176,7 +214,7 @@
throw_range = 15
ripley
- origin_tech = "programming=3;materials=3"
+ origin_tech = "programming=3;materials=1"
ripley/peripherals
name = "Circuit board (Ripley Peripherals Control module)"
@@ -187,7 +225,7 @@
icon_state = "mainboard"
gygax
- origin_tech = "programming=4;materials=4"
+ origin_tech = "programming=4;materials=2"
gygax/peripherals
name = "Circuit board (Gygax Peripherals Control module)"
@@ -196,6 +234,7 @@
gygax/targeting
name = "Circuit board (Gygax Weapon Control and Targeting module)"
icon_state = "mcontroller"
+ origin_tech = "programming=3;materials=1;combat=3"
gygax/main
name = "Circuit board (Gygax Central Control module)"
@@ -206,7 +245,7 @@
icon_state = "mcontroller"
honker
- origin_tech = "programming=3;materials=3"
+ origin_tech = "programming=3;materials=2"
honker/peripherals
name = "Circuit board (H.O.N.K Peripherals Control module)"
@@ -256,7 +295,6 @@
/datum/construction/mecha/ripley_chassis
- result = "/obj/mecha_chassis/ripley_full"
steps = list(list("key"="/obj/item/mecha_parts/part/ripley_torso"),//1
list("key"="/obj/item/mecha_parts/part/ripley_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/ripley_right_arm"),//3
@@ -274,7 +312,7 @@
return check_all_steps(used_atom,user)
spawn_result()
- var/obj/mecha_chassis/const_holder = holder
+ var/obj/item/mecha_parts/chassis/const_holder = holder
const_holder.construct = new /datum/construction/mecha/ripley(const_holder)
const_holder.density = 1
spawn()
@@ -344,7 +382,6 @@
/datum/construction/mecha/gygax_chassis
- result = "/obj/mecha_chassis/gygax_full"
steps = list(list("key"="/obj/item/mecha_parts/part/gygax_torso"),//1
list("key"="/obj/item/mecha_parts/part/gygax_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/gygax_right_arm"),//3
@@ -363,7 +400,7 @@
return check_all_steps(used_atom,user)
spawn_result()
- var/obj/mecha_chassis/const_holder = holder
+ var/obj/item/mecha_parts/chassis/const_holder = holder
const_holder.construct = new /datum/construction/mecha/gygax(const_holder)
const_holder.density = 1
spawn()
@@ -470,7 +507,6 @@
/datum/construction/mecha/firefighter_chassis
- result = "/obj/mecha_chassis/firefighter_full"
steps = list(list("key"="/obj/item/mecha_parts/part/firefighter_torso"),//1
list("key"="/obj/item/mecha_parts/part/firefighter_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/firefighter_right_arm"),//3
@@ -488,7 +524,7 @@
return check_all_steps(used_atom,user)
spawn_result()
- var/obj/mecha_chassis/const_holder = holder
+ var/obj/item/mecha_parts/chassis/const_holder = holder
const_holder.construct = new /datum/construction/mecha/firefighter(const_holder)
const_holder.density = 1
spawn()
@@ -559,7 +595,6 @@
/datum/construction/mecha/honker_chassis
- result = "/obj/mecha_chassis/honker_full"
steps = list(list("key"="/obj/item/mecha_parts/part/honker_torso"),//1
list("key"="/obj/item/mecha_parts/part/honker_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/honker_right_arm"),//3
@@ -578,7 +613,7 @@
return 1
spawn_result()
- var/obj/mecha_chassis/const_holder = holder
+ var/obj/item/mecha_parts/chassis/const_holder = holder
const_holder.construct = new /datum/construction/mecha/honker(const_holder)
const_holder.density = 1
spawn()
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 330f82fcd9d..89dce975e53 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -88,6 +88,8 @@
desc = "Device used to transmit exosuit data."
icon = 'device.dmi'
icon_state = "motion2"
+ var/construction_time = 30
+ var/list/construction_cost = list("metal"=500)
proc/get_mecha_info()
if(!in_mecha())