diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 57f03e4b76..2f2be8cc46 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -118,6 +118,9 @@
/obj/item/weapon/circuitboard/rdconsole
name = "Circuit Board (RD Console)"
build_path = "/obj/machinery/computer/rdconsole"
+/obj/item/weapon/circuitboard/mecha_control
+ name = "Circuit Board (Exosuit Control Console)"
+ build_path = "/obj/machinery/computer/mecha"
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 7f0aee39cd..346e3156f5 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -85,8 +85,11 @@
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
usr << "\red You don't have the dexterity to do this!"
return 1
+/*
+ //distance checks are made by atom/proc/DblClick
if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon))
return 1
+*/
if (ishuman(user))
if(user.brainloss >= 60)
for(var/mob/M in viewers(src, null))
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index 8dcc863f18..82bf9d2001 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -416,4 +416,185 @@
var/area/area = loc
for (var/obj/machinery/turret/aTurret in get_area_all_atoms(area))
- aTurret.setState(enabled, lethal)
\ No newline at end of file
+ aTurret.setState(enabled, lethal)
+
+
+
+/obj/turret/gun_turret
+ name = "Gun Turret"
+ density = 1
+ anchored = 1
+ var/cooldown = 20
+ var/projectiles = 100
+ var/projectiles_per_shot = 2
+ var/deviation = 0.3
+ var/list/snapshot = list()
+ var/atom/cur_target
+ var/scan_range = 7
+ var/health = 40
+ var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1)
+ var/on = 0
+ icon = 'turrets.dmi'
+ icon_state = "gun_turret"
+
+
+ ex_act()
+ del src
+ return
+
+ emp_act()
+ del src
+ return
+
+ meteorhit()
+ del src
+ return
+
+ proc/update_health()
+ if(src.health<=0)
+ del src
+ return
+
+ proc/take_damage(damage)
+ src.health -= damage
+ if(src.health<=0)
+ del src
+ return
+
+ bullet_act(flag)
+ var/damage = 0
+ switch(flag)
+ if(PROJECTILE_PULSE)
+ damage = 40
+ if(PROJECTILE_LASER)
+ damage = 20
+ if(PROJECTILE_TASER)
+ damage = 8
+ if(PROJECTILE_WEAKBULLET)
+ damage = 8
+ if(PROJECTILE_BULLET)
+ damage = 10
+ if(PROJECTILE_BOLT)
+ damage = 5
+ if(PROJECTILE_DART)
+ damage = 5
+ src.take_damage(damage)
+ return
+
+ attack_hand(mob/user as mob)
+ user.machine = src
+ var/dat = {"
+
[src] Control
+
+ Power: [on?"on":"off"]
+ Scan Range: - [scan_range] +
+ Scan for: "}
+ for(var/scan in scan_for)
+ dat += ""
+
+ dat += {"Ammo: [max(0, projectiles)]
+
+ "}
+ user << browse(dat, "window=turret")
+ onclose(user, "turret")
+ return
+
+ attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+
+ attack_alien(mob/user as mob)
+ user.visible_message("[user] slashes at [src]", "You slash at [src]")
+ src.take_damage(15)
+ return
+
+ Topic(href, href_list)
+ if(href_list["power"])
+ src.on = !src.on
+ if(src.on)
+ spawn(50)
+ src.process()
+ if(href_list["scan_range"])
+ src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8)
+ if(href_list["scan_for"])
+ if(href_list["scan_for"] in scan_for)
+ scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]]
+ src.updateUsrDialog()
+ return
+
+
+ proc/validate_target(atom/target)
+ if(get_dist(target, src)>scan_range)
+ return 0
+ if(istype(target, /mob))
+ var/mob/M = target
+ if(!M.stat && !M.lying)//ninjas can't catch you if you're lying
+ return 1
+ else if(istype(target, /obj/mecha))
+ return 1
+ return 0
+
+
+ proc/process()
+ spawn while(on)
+ if(projectiles<=0)
+ on = 0
+ return
+ if(cur_target && !validate_target(cur_target))
+ cur_target = null
+ if(!cur_target)
+ cur_target = get_target()
+ fire(cur_target)
+ sleep(cooldown)
+ return
+
+ proc/get_target()
+ var/list/pos_targets = list()
+ var/target = null
+ if(scan_for["human"])
+ for(var/mob/living/carbon/human/M in oview(scan_range,src))
+ if(!M.stat && !M.lying)
+ pos_targets += M
+ if(scan_for["cyborg"])
+ for(var/mob/living/silicon/M in oview(scan_range,src))
+ if(!M.stat && !M.lying)
+ pos_targets += M
+ if(scan_for["mecha"])
+ for(var/obj/mecha/M in oview(scan_range, src))
+ pos_targets += M
+ if(scan_for["alien"])
+ for(var/mob/living/carbon/alien/M in oview(scan_range,src))
+ if(!M.stat && !M.lying)
+ pos_targets += M
+ if(pos_targets.len)
+ target = pick(pos_targets)
+ return target
+
+
+ proc/fire(atom/target)
+ if(!target)
+ cur_target = null
+ return
+ src.dir = get_dir(src,target)
+ var/turf/targloc = get_turf(target)
+ var/target_x = targloc.x
+ var/target_y = targloc.y
+ var/target_z = targloc.z
+ targloc = null
+ spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
+ if(!src) break
+ var/turf/curloc = get_turf(src)
+ targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
+ if (!targloc || !curloc)
+ continue
+ if (targloc == curloc)
+ continue
+ playsound(src, 'Gunshot.ogg', 50, 1)
+ var/obj/bullet/A = new /obj/bullet(curloc)
+ src.projectiles--
+ A.current = curloc
+ A.yo = targloc.y - curloc.y
+ A.xo = targloc.x - curloc.x
+ A.process()
+ sleep(2)
+ return
\ No newline at end of file
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index fa88be0104..8ab1c8ac45 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -42,6 +42,7 @@
else
deflect_chance = initial(deflect_chance)
src.occupant_message("You disable [src] defence mode.")
+ src.log_message("Toggled defence mode.")
return
@@ -51,8 +52,7 @@
return output
/obj/mecha/combat/durand/get_commands()
- var/output = {"Toggle defence mode
- "}
+ var/output = "Toggle defence mode
"
output += ..()
return output
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index f74e6eb903..c4812e5ae3 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -33,6 +33,7 @@
overload = 1
step_in = min(1, round(step_in/2))
src.occupant_message("You enable leg actuators overload.")
+ src.log_message("Toggled leg actuators overload.")
return
@@ -55,8 +56,7 @@
return output
/obj/mecha/combat/gygax/get_commands()
- var/output = {"Toggle leg actuators overload
- "}
+ var/output = "Toggle leg actuators overload
"
output += ..()
return output
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 3fe7dd80a0..23dae30efb 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -129,9 +129,8 @@
/obj/mecha/combat/marauder/get_commands()
var/output = {"Toggle thrusters
Toggle zoom mode
- Smoke
-
- "}
+ Smoke
+
"}
output += ..()
return output
diff --git a/code/game/mecha/combat/weapons/weapons.dm b/code/game/mecha/combat/weapons/weapons.dm
index a83798866b..a40c7d4172 100644
--- a/code/game/mecha/combat/weapons/weapons.dm
+++ b/code/game/mecha/combat/weapons/weapons.dm
@@ -397,4 +397,6 @@
spawn(weapon_cooldown)
weapon_ready = 1
chassis.log_message("Fired from [src.name], targeting [target].")
- return
\ No newline at end of file
+ return
+
+
diff --git a/code/game/mecha/global_iterator.dm b/code/game/mecha/global_iterator.dm
index 4355e9bc73..026d85f279 100644
--- a/code/game/mecha/global_iterator.dm
+++ b/code/game/mecha/global_iterator.dm
@@ -67,8 +67,7 @@ Data storage vars:
while(src && control_switch)
last_exec = world.timeofday
if(check_for_null && has_null_args())
- src.stop()
- break
+ return src.stop()
result = src.process(arglist(arg_list))
sleep(delay)
return
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index c2c8c6407b..e92f4c5ad0 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -9,10 +9,11 @@
name = "Exosuit Fabricator"
density = 1
anchored = 1
- layer=2
use_power = 1
idle_power_usage = 20
active_power_usage = 5000
+ 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,
@@ -64,7 +65,8 @@
list("result"="/obj/item/mecha_parts/part/honker_right_arm","time"=200,"metal"=20000,"bananium"=5000),
list("result"="/obj/item/mecha_parts/part/honker_left_leg","time"=200,"metal"=20000,"bananium"=5000),
list("result"="/obj/item/mecha_parts/part/honker_right_leg","time"=200,"metal"=20000,"bananium"=5000),
- )
+ ),
+ "Misc"=list(list("result"="/obj/item/mecha_tracking","time"=30,"metal"=500))
)
@@ -128,9 +130,9 @@
var/i = 0
for(var/p in part)
if(p in resources)
- cost += "[i?" | ":null][part[p]] [p]"
+ cost += "[i?" | ":null][part[p]*resource_coeff] [p]"
i++
- var/output = "[O.name] ([cost]) [part["time"]/10]sec"
+ var/output = "[O.name] ([cost]) [part["time"]*time_coeff/10]sec"
del O
return output
@@ -143,13 +145,13 @@
proc/remove_resources(part)
for(var/p in part)
if(p in resources)
- src.resources[p] -= part[p]
+ src.resources[p] -= part[p]*resource_coeff
return
proc/check_resources(part)
for(var/p in part)
if(p in resources)
- if(src.resources[p] < part[p])
+ if(src.resources[p] < part[p]*resource_coeff)
return 0
return 1
@@ -205,7 +207,233 @@
src.remove_resources(part)
src.icon_state = "mechfab3" //looks better than 'flick'
src.use_power = 2
- spawn(time)
+ 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
+ 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_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)
@@ -225,25 +453,25 @@
var/amnt
if(istype(W, /obj/item/stack/sheet/gold))
material = "gold"
- amnt = W:perunit
+ amnt = "g_amt"
else if(istype(W, /obj/item/stack/sheet/silver))
material = "silver"
- amnt = W:perunit
+ amnt = "g_amt"
else if(istype(W, /obj/item/stack/sheet/diamond))
material = "diamond"
- amnt = W:perunit
+ amnt = "g_amt"
else if(istype(W, /obj/item/stack/sheet/plasma))
material = "plasma"
- amnt = W:perunit
+ amnt = "g_amt"
else if(istype(W, /obj/item/stack/sheet/metal))
material = "metal"
- amnt = W:perunit
+ amnt = "m_amt"
else if(istype(W, /obj/item/stack/sheet/glass))
material = "glass"
- amnt = W:perunit
+ amnt = "g_amt"
else if(istype(W, /obj/item/stack/sheet/clown))
material = "bananium"
- amnt = W:perunit
+ amnt = "g_amt"
else
return ..()
@@ -252,12 +480,13 @@
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[material] < res_max_amount && W)
- src.resources[material] += amnt
+ while(src.resources[type] < res_max_amount && W)
+ src.resources[type] += W.vars[amnt]
W.use(1)
count++
flick("mechfab2", src)
@@ -266,3 +495,4 @@
else
user << "The fabricator cannot hold more [name]."
return
+*/
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index dc3b97b25f..b55f39fa82 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -90,39 +90,71 @@
if(mech_click == world.time) return
mech_click = world.time
*/
+ if(!istype(object, /atom)) return
if(istype(object, /obj/screen))
var/obj/screen/using = object
if(using.screen_loc == ui_acti || using.screen_loc == ui_iarrowleft || using.screen_loc == ui_iarrowright)//ignore all HUD objects save 'intent' and its arrows
return ..()
else
return
-// if(!location) return //probably GUI
- if(M.stat>0) return
- if(!istype(object,/atom)) return
var/obj/mecha/Mech = M.loc
-// sleep(-1)
spawn() //this helps prevent clickspam fest.
- Mech.click_action(object)
+ Mech.click_action(object,M)
else
return ..()
-/obj/mecha/proc/click_action(atom/target)
-// if(!istype(target,/turf) && !istype(target.loc,/turf)) return
- if(!src.occupant) return
+/obj/mecha/proc/click_action(atom/target,mob/user)
+ if(!src.occupant || src.occupant != user ) return
+ if(user.stat) return
if(state || !cell || cell.charge<=0) return
if(src == target) return
var/dir_to_target = get_dir(src,target)
- if(dir_to_target && !(get_dir(src,target) & src.dir))//wrong direction
+ if(dir_to_target && !(dir_to_target & src.dir))//wrong direction
return
- if(get_dist(src,target)<=1)
- src.melee_action(target)
- else
+ if(get_dist(src,target)>1)
src.range_action(target)
+ else
+ src.melee_action(target)
return
/obj/mecha/proc/melee_action(atom/target)
- return
+/*
+ if(istype(target, /obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/A = target
+ if(A.locked)
+ src.occupant_message("Unable to open airlock - bolted")
+ return 0
+ else if(src.density && !src.welded && !src.operating) && ((!src.arePowerSystemsOn()) || (stat & NOPOWER)))
+ if(src.arePowerSystemsOn() && !(stat&NOPOWER))
+ A.open()
+ else
+ spawn(0)
+ src.operating = 1
+ animate("opening")
+ sleep(15)
+ src.density = 0
+ update_icon()
+ if (!istype(src, /obj/machinery/door/airlock/glass))
+ src.sd_SetOpacity(0)
+ src.operating = 0
+ return 0
+ else if(!src.density && !src.welded && !src.operating)
+ if(src.arePowerSystemsOn() && !(stat&NOPOWER))
+ A.close()
+ else
+ spawn( 0 )
+ src.operating = 1
+ animate("closing")
+ src.density = 1
+ sleep(15)
+ update_icon()
+ if ((src.visible) && (!istype(src, /obj/machinery/door/airlock/glass)))
+ src.sd_SetOpacity(1)
+ src.operating = 0
+ return 0
+*/
+ return 1
/obj/mecha/proc/range_action(atom/target)
return
@@ -144,7 +176,7 @@
//////////////////////////////////
/obj/mecha/relaymove(mob/user,direction)
- if(!can_move)
+ if(!can_move || user != src.occupant)
return 0
if(connected_port)
src.occupant_message("Unable to move while connected to the air system port")
@@ -230,7 +262,7 @@
/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)//TODO
if(!src) return
- if(prob(40))
+ if(prob(25))
if(ignore_threshold || src.health*100/initial(src.health)LIFE SUPPORT SYSTEM MALFUNCTION
":null]
[internal_damage&MECHA_INT_TANK_BREACH?"GAS TANK BREACH
":null]
[internal_damage&MECHA_INT_CONTROL_LOST?"COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate
":null]
- [integrity<30?"DAMAGE LEVEL CRITICAL":null]
+ [integrity<30?"DAMAGE LEVEL CRITICAL
":null]
Integrity: [integrity]%
Powercell charge: [cell.charge/cell.maxcharge*100]%
Air source: [use_internal_tank?"Internal Airtank":"Environment"]
@@ -955,7 +994,7 @@
/datum/global_iterator/mecha_intertial_movement //inertial movement in space
delay = 7
- process(var/obj/mecha/mecha,direction)
+ process(var/obj/mecha/mecha as obj,direction)
if(direction)
if(!step(mecha, direction)||mecha.check_for_support())
src.stop()
@@ -978,8 +1017,7 @@
process(var/obj/mecha/mecha)
if(!mecha.internal_damage)
- src.stop()
- return
+ return src.stop()
if(mecha.internal_damage & MECHA_INT_FIRE)
if(mecha.return_pressure()>mecha.maximum_pressure*1.5 && !(mecha.internal_damage&MECHA_INT_TANK_BREACH))
mecha.internal_damage |= MECHA_INT_TANK_BREACH
diff --git a/code/game/mecha/mecha_construction.dm b/code/game/mecha/mecha_construction.dm
index 22b13f1629..6a4b9f00fd 100644
--- a/code/game/mecha/mecha_construction.dm
+++ b/code/game/mecha/mecha_construction.dm
@@ -59,6 +59,8 @@
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
@@ -383,15 +385,19 @@
list("key"="/obj/item/weapon/wrench"),//9
list("key"="/obj/item/weapon/gun/energy/laser_gun"),//10
list("key"="/obj/item/weapon/screwdriver"),//11
- list("key"="/obj/item/mecha_parts/circuitboard/gygax/targeting"),//12
+ list("key"="/obj/item/weapon/stock_parts/adv_capacitor"),//12
list("key"="/obj/item/weapon/screwdriver"),//13
- list("key"="/obj/item/mecha_parts/circuitboard/gygax/peripherals"),//14
+ list("key"="/obj/item/weapon/stock_parts/adv_scanning_module"),//14
list("key"="/obj/item/weapon/screwdriver"),//15
- list("key"="/obj/item/mecha_parts/circuitboard/gygax/main"),//16
- list("key"="/obj/item/weapon/wirecutters"),//17
- list("key"="/obj/item/weapon/cable_coil"),//18
+ list("key"="/obj/item/mecha_parts/circuitboard/gygax/targeting"),//16
+ list("key"="/obj/item/weapon/screwdriver"),//17
+ list("key"="/obj/item/mecha_parts/circuitboard/gygax/peripherals"),//18
list("key"="/obj/item/weapon/screwdriver"),//19
- list("key"="/obj/item/weapon/wrench")//20
+ list("key"="/obj/item/mecha_parts/circuitboard/gygax/main"),//20
+ list("key"="/obj/item/weapon/wirecutters"),//21
+ list("key"="/obj/item/weapon/cable_coil"),//22
+ list("key"="/obj/item/weapon/screwdriver"),//23
+ list("key"="/obj/item/weapon/wrench")//24
)
action(atom/used_atom,mob/user as mob)
@@ -403,29 +409,39 @@
//TODO: better messages.
switch(step)
- if(20)
+ if(24)
user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
- if(19)
+ if(23)
user.visible_message("[user] adjusts [holder] hydraulic systems.", "You adjust [holder] hydraulic systems.")
- if(18)
+ if(22)
user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- if(17)
+ if(21)
user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- if(16)
+ if(20)
user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
del used_atom
- if(15)
+ if(19)
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- if(14)
+ if(18)
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
del used_atom
- if(13)
+ if(17)
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
- if(12)
+ if(16)
user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
del used_atom
- if(11)
+ if(15)
user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
+ if(14)
+ user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
+ del used_atom
+ if(13)
+ user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
+ if(12)
+ user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
+ del used_atom
+ if(11)
+ user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
if(10)
user.visible_message("[user] installs the laser gun into the weapon socket.", "You install the laser gun into the weapon socket.")
del used_atom
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
new file mode 100644
index 0000000000..91481150f7
--- /dev/null
+++ b/code/game/mecha/mecha_control_console.dm
@@ -0,0 +1,152 @@
+/obj/machinery/computer/mecha
+ name = "Exosuit Control"
+ icon = 'computer.dmi'
+ icon_state = "mecha"
+ req_access = list(access_robotics)
+ var/list/located = list()
+ var/screen = 0
+ var/stored_data
+
+ attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/computerframe/A = new /obj/computerframe( src.loc )
+ new /obj/item/weapon/shard( src.loc )
+ var/obj/item/weapon/circuitboard/mecha_control/M = new /obj/item/weapon/circuitboard/mecha_control( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ A.circuit = M
+ A.state = 3
+ A.icon_state = "3"
+ A.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/computerframe/A = new /obj/computerframe( src.loc )
+ var/obj/item/weapon/circuitboard/mecha_control/M = new /obj/item/weapon/circuitboard/mecha_control( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+ return
+
+ attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
+
+ attack_paw(var/mob/user as mob)
+ return src.attack_hand(user)
+
+ attack_hand(var/mob/user as mob)
+ if(..())
+ return
+ user.machine = src
+ var/dat = "[src.name]"
+ if(screen == 0)
+ dat += "Tracking beacons data
"
+ for(var/obj/item/mecha_tracking/TR in world)
+ var/answer = TR.get_mecha_info()
+ if(answer)
+ dat += {"
[answer]
+ Show exosuit log | (EMP pulse)
"}
+ if(screen==1)
+ dat += "Log contents
"
+ dat += "Return
"
+ dat += "[stored_data]"
+
+ dat += "(Refresh)
"
+ dat += ""
+
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+ return
+
+ Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["shock"])
+ var/obj/item/mecha_tracking/MT = locate(href_list["shock"])
+ MT.shock()
+ if(href_list["get_log"])
+ var/obj/item/mecha_tracking/MT = locate(href_list["get_log"])
+ stored_data = MT.get_mecha_log()
+ screen = 1
+ if(href_list["return"])
+ screen = 0
+ src.updateUsrDialog()
+ return
+
+
+
+/obj/item/mecha_tracking
+ name = "Exosuit tracking beacon"
+ desc = "Device used to transmit exosuit data."
+ icon = 'device.dmi'
+ icon_state = "motion2"
+
+ proc/get_mecha_info()
+ if(!istype(src.loc, /obj/mecha))
+ return 0
+ var/obj/mecha/M = src.loc
+ var/answer = {"Name: [M.name]
+ Integrity: [M.health/initial(M.health)*100]%
+ Cell charge: [M.cell?"[M.cell.charge/M.cell.maxcharge*100]%":"Not found"]
+ Airtank: [M.return_pressure()]kPa
+ Pilot: [M.occupant||"None"]
+ Location: [get_area(M)||"Unknown"]
+ Active equipment:"}
+ if(istype(M, /obj/mecha/combat))
+ var/obj/mecha/combat/CM = M
+ answer += " [CM.selected_weapon.name]
"
+ else if(istype(M, /obj/mecha/working))
+ var/obj/mecha/working/WM = M
+ answer += " [WM.selected_tool.name]
"
+ if(istype(M, /obj/mecha/working/ripley))
+ var/obj/mecha/working/ripley/RM = M
+ answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
"
+
+ return answer
+
+ emp_act()
+ del src
+ return
+
+ ex_act()
+ del src
+ return
+
+ proc/in_mecha()
+ if(istype(src.loc, /obj/mecha))
+ return 1
+ return 0
+
+ proc/shock()
+ if(src.in_mecha())
+ var/obj/mecha/M = src.loc
+ M.emp_act(3)
+ del(src)
+
+ proc/get_mecha_log()
+ if(!src.in_mecha())
+ return 0
+ var/obj/mecha/M = src.loc
+ return M.get_log_html()
+
+
+/obj/item/weapon/storage/mechatrackingbox
+
+ New()
+ new /obj/item/mecha_tracking(src)
+ new /obj/item/mecha_tracking(src)
+ new /obj/item/mecha_tracking(src)
+ new /obj/item/mecha_tracking(src)
+ new /obj/item/mecha_tracking(src)
+ new /obj/item/mecha_tracking(src)
+ new /obj/item/mecha_tracking(src)
+ ..()
+ return
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 3f78854216..d081b89385 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -31,7 +31,7 @@
var/obj/O = locate(href_list["drop_from_cargo"])
if(O && O in src.cargo)
src.occupant << "\blue You unload [O]."
- O.loc = src.loc
+ O.loc = get_turf(src)
src.cargo -= O
var/turf/T = get_turf(O)
if(T)
@@ -53,13 +53,20 @@
return output
/obj/mecha/working/ripley/Del()
- for(var/obj/O in cargo)
- if(rand(0,1))
- cargo -= O
- del O
- else
- O.loc = get_turf(src)
- step_rand(O)
+ for(var/mob/M in src)
+ if(M==src.occupant)
+ continue
+ M.loc = get_turf(src)
+ var/turf/T = get_turf(M)
+ if(T)
+ T.Entered(M)
+ step_rand(M)
+ for(var/atom/movable/A in src.cargo)
+ A.loc = get_turf(src)
+ var/turf/T = get_turf(A)
+ if(T)
+ T.Entered(A)
+ step_rand(A)
..()
return
diff --git a/code/game/mecha/working/tools/tools.dm b/code/game/mecha/working/tools/tools.dm
index d22003567f..55cc38c2b8 100644
--- a/code/game/mecha/working/tools/tools.dm
+++ b/code/game/mecha/working/tools/tools.dm
@@ -60,7 +60,7 @@
name = "Hydraulic Clamp"
tool_cooldown = 15
energy_drain = 10
- var/force = 15
+ var/force = 20
var/obj/mecha/working/ripley/cargo_holder
New()
diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm
index b810fb70e9..c0995edfe6 100644
--- a/code/game/mecha/working/working.dm
+++ b/code/game/mecha/working/working.dm
@@ -9,6 +9,11 @@
var/add_req_access = 1
internal_damage_threshold = 70
+/obj/mecha/working/New()
+ ..()
+ new /obj/item/mecha_tracking(src)
+ return
+
/obj/mecha/working/melee_action(atom/target as obj|mob|turf)
if(internal_damage&MECHA_INT_CONTROL_LOST)
diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm
index 5b38a1534a..a03cb59cf5 100644
--- a/code/game/research/designs.dm
+++ b/code/game/research/designs.dm
@@ -227,6 +227,15 @@ datum
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/prisoner"
+ mechacontrol
+ name = "Circuit Design (Exosuit Control Console)"
+ desc = "Allows for the construction of circuit boards used to build an exosuit control console."
+ id = "mechacontrol"
+ req_tech = list("programming" = 3)
+ build_type = IMPRINTER
+ materials = list("$glass" = 2000, "acid" = 20)
+ build_path = "/obj/item/weapon/circuitboard/mecha_control"
+
///////////////////////////////////
//////////AI Module Disks//////////
///////////////////////////////////
@@ -779,4 +788,4 @@ datum
var/datum/design/blueprint
New()
src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
\ No newline at end of file
+ src.pixel_y = rand(-5.0, 5)
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index b9b98179f0..752f0fa6c4 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi
index b33cbd222b..caf7e20f85 100644
Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 91baa8b45d..0bb9eb4033 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -425,6 +425,7 @@
#include "code\game\mecha\mech_fabricator.dm"
#include "code\game\mecha\mecha.dm"
#include "code\game\mecha\mecha_construction.dm"
+#include "code\game\mecha\mecha_control_console.dm"
#include "code\game\mecha\mecha_wreckage.dm"
#include "code\game\mecha\combat\combat.dm"
#include "code\game\mecha\combat\durand.dm"