mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
- Removed distance check from machinery/attack_hand(), since it's done by atom/dblclick() (may or may not introduce some BUGS).
- Added mecha control console (with circuitboard and circuit design). There must be a tracking beacon on mecha to get info. - Added mecha tracking beacons (can be attached to mechs by attacking or throwing). Working mechs have one installed by default. - Added gun turret (WIP) - Fixed "cargo-controlled" mecha movement (I hope). - Probably solved problems with mobs inside Ripley. - Mecha internal fire processing runtime error fixed. - Gygax construction now requires advanced capacitor and advanced scanner module. - Other... things. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1132 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -417,3 +417,184 @@
|
||||
|
||||
for (var/obj/machinery/turret/aTurret in get_area_all_atoms(area))
|
||||
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 = {"<html>
|
||||
<head><title>[src] Control</title></head>
|
||||
<body>
|
||||
<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"on":"off"]</a><br>
|
||||
<b>Scan Range: </b><a href='?src=\ref[src];scan_range=-1'>-</a> [scan_range] <a href='?src=\ref[src];scan_range=1'>+</a><br>
|
||||
<b>Scan for: </b>"}
|
||||
for(var/scan in scan_for)
|
||||
dat += "<div style=\"margin-left: 15px;\">[scan] (<a href='?src=\ref[src];scan_for=[scan]'>[scan_for[scan]?"Yes":"No"]</a>)</div>"
|
||||
|
||||
dat += {"<b>Ammo: </b>[max(0, projectiles)]<br>
|
||||
</body>
|
||||
</html>"}
|
||||
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
|
||||
@@ -42,6 +42,7 @@
|
||||
else
|
||||
deflect_chance = initial(deflect_chance)
|
||||
src.occupant_message("<font color='red'>You disable [src] defence mode.</font>")
|
||||
src.log_message("Toggled defence mode.")
|
||||
return
|
||||
|
||||
|
||||
@@ -51,8 +52,7 @@
|
||||
return output
|
||||
|
||||
/obj/mecha/combat/durand/get_commands()
|
||||
var/output = {"<a href='?src=\ref[src];toggle_defence_mode=1'>Toggle defence mode</a><br>
|
||||
"}
|
||||
var/output = "<a href='?src=\ref[src];toggle_defence_mode=1'>Toggle defence mode</a><hr>"
|
||||
output += ..()
|
||||
return output
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
overload = 1
|
||||
step_in = min(1, round(step_in/2))
|
||||
src.occupant_message("<font color='red'>You enable leg actuators overload.</font>")
|
||||
src.log_message("Toggled leg actuators overload.")
|
||||
return
|
||||
|
||||
|
||||
@@ -55,8 +56,7 @@
|
||||
return output
|
||||
|
||||
/obj/mecha/combat/gygax/get_commands()
|
||||
var/output = {"<a href='?src=\ref[src];toggle_leg_overload=1'>Toggle leg actuators overload</a><br>
|
||||
"}
|
||||
var/output = "<a href='?src=\ref[src];toggle_leg_overload=1'>Toggle leg actuators overload</a><br><hr>"
|
||||
output += ..()
|
||||
return output
|
||||
|
||||
|
||||
@@ -129,9 +129,8 @@
|
||||
/obj/mecha/combat/marauder/get_commands()
|
||||
var/output = {"<a href='?src=\ref[src];toggle_thrusters=1'>Toggle thrusters</a><br>
|
||||
<a href='?src=\ref[src];toggle_zoom=1'>Toggle zoom mode</a><br>
|
||||
<a href='?src=\ref[src];smoke=1'>Smoke</a><br>
|
||||
<hr>
|
||||
"}
|
||||
<a href='?src=\ref[src];smoke=1'>Smoke</a>
|
||||
<hr>"}
|
||||
output += ..()
|
||||
return output
|
||||
|
||||
|
||||
@@ -398,3 +398,5 @@
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?"<a href='?src=\ref[src];part=\ref[part]'>":"<span class='red'>"][output_part_info(part)][resources_available?"</a>":"</span>"]<br>"
|
||||
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 += "<span class=\"res_name\">[resource]: </span>[min(res_max_amount, resources[resource])] cm<sup>3</sup><br>"
|
||||
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 = {"<TT>Building [src.being_built.name].<BR>
|
||||
Please wait until completion...</TT><BR>
|
||||
<BR>
|
||||
"}
|
||||
else
|
||||
dat = output_available_resources()
|
||||
dat += "<hr>"
|
||||
if(!part_set)
|
||||
for(var/part_set in part_sets)
|
||||
dat += "<a href='?src=\ref[src];part_set=[part_set]'>[part_set]<BR>"
|
||||
else
|
||||
dat += output_parts_list(part_set)
|
||||
dat += "<hr><a href='?src=\ref[src];part_set=clear'>Return</a>"
|
||||
|
||||
user << browse({"
|
||||
<html>
|
||||
<head>
|
||||
<title>[src.name]</title>
|
||||
<style>
|
||||
.res_name {font-weight: bold; text-transform: capitalize;}
|
||||
.red {color: #f00;}
|
||||
</style>
|
||||
</head>
|
||||
<body>[dat]</body>
|
||||
</html>
|
||||
"}, "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
|
||||
*/
|
||||
|
||||
@@ -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)<src.internal_damage_threshold)
|
||||
for(var/T in possible_int_damage)
|
||||
if(internal_damage & T)
|
||||
@@ -238,8 +270,8 @@
|
||||
if(possible_int_damage.len)
|
||||
var/int_dam_flag = pick(possible_int_damage)
|
||||
if(int_dam_flag)
|
||||
internal_damage |= int_dam_flag
|
||||
pr_internal_damage.start()
|
||||
src.internal_damage |= int_dam_flag
|
||||
src.pr_internal_damage.start()
|
||||
src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1)
|
||||
src.occupant << sound('warning-buzzer.ogg',wait=0)
|
||||
return
|
||||
@@ -288,8 +320,11 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/hitby(A as mob|obj)
|
||||
/obj/mecha/hitby(atom/movable/A as mob|obj)
|
||||
src.log_message("Hit by [A].",1)
|
||||
if(istype(A, /obj/item/mecha_tracking))
|
||||
A.loc = src
|
||||
return
|
||||
if(prob(src.deflect_chance) || istype(A, /mob))
|
||||
src.occupant_message("\blue The [A] bounces off the armor.")
|
||||
src.visible_message("The [A] bounces off the [src.name] armor")
|
||||
@@ -350,8 +385,9 @@
|
||||
return
|
||||
|
||||
/obj/mecha/proc/destroy()
|
||||
spawn()
|
||||
var/obj/mecha/mecha = src
|
||||
var/mob/M = src.occupant
|
||||
// var/mob/M = src.occupant
|
||||
var/turf/T = src.loc
|
||||
var/wreckage = src.wreckage
|
||||
src = null
|
||||
@@ -360,12 +396,6 @@
|
||||
spawn(0)
|
||||
if(wreckage)
|
||||
new wreckage(T)
|
||||
if(M)
|
||||
if(prob(20))
|
||||
M.bruteloss += rand(10,20)
|
||||
M.updatehealth()
|
||||
else
|
||||
M.gib()
|
||||
return
|
||||
|
||||
/obj/mecha/ex_act(severity)
|
||||
@@ -399,8 +429,8 @@
|
||||
|
||||
/obj/mecha/emp_act(severity)
|
||||
cell.charge -= min(cell.charge, cell.maxcharge/severity)
|
||||
health -= 100 / severity
|
||||
update_health()
|
||||
src.log_message("EMP pulse detected")
|
||||
take_damage(100 / severity)
|
||||
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST),1)
|
||||
return
|
||||
|
||||
@@ -426,7 +456,10 @@
|
||||
return src.air_contents
|
||||
|
||||
/obj/mecha/proc/return_pressure()
|
||||
if(src.air_contents)
|
||||
return src.air_contents.return_pressure()
|
||||
else
|
||||
return 0
|
||||
|
||||
/*
|
||||
/obj/mecha/proc/preserve_temp()
|
||||
@@ -768,6 +801,12 @@
|
||||
user << "The [src.name] is at full integrity"
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/mecha_tracking))
|
||||
user.drop_from_slot(W)
|
||||
W.loc = src
|
||||
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]")
|
||||
return
|
||||
|
||||
else
|
||||
src.log_message("Attacked by [W]. Attacker - [user]")
|
||||
if(prob(src.deflect_chance))
|
||||
@@ -804,7 +843,7 @@
|
||||
[internal_damage&MECHA_INT_TEMP_CONTROL?"<font color='red'><b>LIFE SUPPORT SYSTEM MALFUNCTION</b></font><br>":null]
|
||||
[internal_damage&MECHA_INT_TANK_BREACH?"<font color='red'><b>GAS TANK BREACH</b></font><br>":null]
|
||||
[internal_damage&MECHA_INT_CONTROL_LOST?"<font color='red'><b>COORDINATION SYSTEM CALIBRATION FAILURE</b></font> - <a href='?src=\ref[src];repair_int_control_lost=1'>Recalibrate</a><br>":null]
|
||||
[integrity<30?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font>":null]
|
||||
[integrity<30?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font><br>":null]
|
||||
<b>Integrity: </b> [integrity]%<br>
|
||||
<b>Powercell charge: </b>[cell.charge/cell.maxcharge*100]%<br>
|
||||
<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
152
code/game/mecha/mecha_control_console.dm
Normal file
152
code/game/mecha/mecha_control_console.dm
Normal file
@@ -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 = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
for(var/obj/item/mecha_tracking/TR in world)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
dat += "[stored_data]"
|
||||
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>(Refresh)</A><BR>"
|
||||
dat += "</body></html>"
|
||||
|
||||
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 = {"<b>Name:</b> [M.name]<br>
|
||||
<b>Integrity:</b> [M.health/initial(M.health)*100]%<br>
|
||||
<b>Cell charge:</b> [M.cell?"[M.cell.charge/M.cell.maxcharge*100]%":"Not found"]<br>
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa<br>
|
||||
<b>Pilot:</b> [M.occupant||"None"]<br>
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]<br>
|
||||
<b>Active equipment:</b>"}
|
||||
if(istype(M, /obj/mecha/combat))
|
||||
var/obj/mecha/combat/CM = M
|
||||
answer += " [CM.selected_weapon.name]<br>"
|
||||
else if(istype(M, /obj/mecha/working))
|
||||
var/obj/mecha/working/WM = M
|
||||
answer += " [WM.selected_tool.name]<br>"
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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//////////
|
||||
///////////////////////////////////
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 24 KiB |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user