- 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:
panurgomatic
2011-02-25 10:37:02 +00:00
parent ab651d6676
commit 74aba8b9a8
19 changed files with 739 additions and 94 deletions

View File

@@ -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"

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -398,3 +398,5 @@
weapon_ready = 1
chassis.log_message("Fired from [src.name], targeting [target].")
return

View File

@@ -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

View File

@@ -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
*/

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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"