- Added mecha DNA-locking. Only the person with matching UE can operate such mechs.

- Added two mecha armor booster modules (no sprites) and a repair droid module (sprite is temporary).

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1362 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
panurgomatic
2011-04-04 00:42:12 +00:00
parent f290ccd932
commit 7d6d1cebeb
9 changed files with 357 additions and 44 deletions
+1
View File
@@ -874,6 +874,7 @@
brainmob.loc = src
brainmob.name = owner.real_name
brainmob.real_name = owner.real_name
brainmob.dna = owner.dna
if(src.owner.mind)
src.owner.mind.transfer_to(brainmob)
brainmob.death() //the brain is dead until stuffed into an MMI. In which case it might still be dead if it's been beat up.
+1
View File
@@ -10,6 +10,7 @@
var/overload = 0
wreckage = "/obj/decal/mecha_wreckage/gygax"
internal_damage_threshold = 35
max_equip = 3
/*
+13 -1
View File
@@ -74,4 +74,16 @@
if(..())
if(istype(M, /obj/mecha/combat))
return 1
return 0
return 0
/obj/item/mecha_parts/mecha_equipment/proc/detach()
if(src.Move(get_turf(chassis)))
chassis.equipment -= src
if(chassis.selected == src)
chassis.selected = null
chassis.log_message("[src] removed from equipment.")
src.chassis = null
src.equip_ready = 1
return
+231 -1
View File
@@ -164,6 +164,7 @@
/obj/item/mecha_parts/mecha_equipment/tool/rcd
name = "Mounted RCD"
desc = "An exosuit-mounted Rapid Construction Device."
icon_state = "mecha_rcd"
equip_cooldown = 20
energy_drain = 250
@@ -393,4 +394,233 @@
Topic(href, href_list)
if(href_list["mode"])
mode = text2num(href_list["mode"])
return
return
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants.
name = "Armor Booster Module (Close Combat Weaponry)"
desc = "Boosts exosuit armor against armed melee attacks."
icon_state = "mecha_abooster_ccw"
equip_cooldown = 10
energy_drain = 50
range = RANGED
construction_cost = list("metal"=20000,"silver"=20000)
var/deflect_coeff = 1.15
var/damage_coeff = 0.8
can_attach(obj/mecha/M as obj)
if(..())
if(!istype(M, /obj/mecha/combat/honker))
if(!M.proc_res["dynattackby"])
return 1
return 0
attach(obj/mecha/M as obj)
..()
chassis.proc_res["dynattackby"] = src
return
proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
if(!action_checks(user))
return chassis.dynattackby(W,user)
chassis.log_message("Attacked by [W]. Attacker - [user]")
if(prob(chassis.deflect_chance*src.deflect_coeff))
user << "\red The [W] bounces off [chassis] armor."
chassis.log_append_to_last("Armor saved.")
else
chassis.occupant_message("<font color='red'><b>[user] hits [chassis] with [W].</b></font>")
user.visible_message("<font color='red'><b>[user] hits [chassis] with [W].</b></font>", "<font color='red'><b>You hit [src] with [W].</b></font>")
chassis.take_damage(round(W.force*0.8),W.damtype)
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
equip_ready = 0
chassis.cell.use(energy_drain)
if(do_after_cooldown())
equip_ready = 1
return
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
name = "Armor Booster Module (Ranged Weaponry)"
desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots."
icon_state = "mecha_abooster_proj"
equip_cooldown = 10
energy_drain = 50
range = RANGED
construction_cost = list("metal"=20000,"gold"=20000)
var/damage_coeff = 0.8
can_attach(obj/mecha/M as obj)
if(..())
if(!istype(M, /obj/mecha/combat/honker))
if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"])
return 1
return 0
attach(obj/mecha/M as obj)
..()
chassis.proc_res["dynbulletdamage"] = src
chassis.proc_res["dynhitby"] = src
return
proc/dynbulletdamage(flag)
if(!action_checks(src))
return chassis.dynbulletdamage(flag)
var/damage
switch(flag)
if(PROJECTILE_PULSE)
damage = 30
if(PROJECTILE_LASER)
damage = 20
if(PROJECTILE_WEAKBULLET)
damage = 8
if(PROJECTILE_BULLET)
damage = 10
if(PROJECTILE_BOLT)
damage = 5
if(PROJECTILE_DART)
damage = 5
else
return
chassis.take_damage(round(damage*src.damage_coeff))
chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
equip_ready = 0
chassis.cell.use(energy_drain)
if(do_after_cooldown())
equip_ready = 1
return
proc/dynhitby(atom/movable/A)
if(!action_checks(A))
return chassis.dynhitby(A)
if(prob(chassis.deflect_chance) || istype(A, /mob) || istype(A, /obj/item/mecha_tracking))
chassis.occupant_message("\blue The [A] bounces off the armor.")
chassis.visible_message("The [A] bounces off the [chassis] armor")
chassis.log_append_to_last("Armor saved.")
if(istype(A, /mob))
var/mob/M = A
M.bruteloss += 10
M.updatehealth()
else if(istype(A, /obj))
var/obj/O = A
if(O.throwforce)
chassis.take_damage(O.throwforce*damage_coeff)
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
equip_ready = 0
chassis.cell.use(energy_drain)
if(do_after_cooldown())
equip_ready = 1
return
/obj/item/mecha_parts/mecha_equipment/repair_droid
name = "Exosuit Repair Droid"
desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost all types of external or internal damage."
icon_state = "repair_droid"
equip_cooldown = 20
energy_drain = 20
range = RANGED
construction_cost = list("metal"=10000,"gold"=5000,"silver"=5000,"glass"=10000)
var/health_boost = 2
var/datum/global_iterator/pr_repair_droid
var/icon/droid_overlay
New()
..()
pr_repair_droid = new /datum/global_iterator/mecha_repair_droid(list(src),0)
pr_repair_droid.set_delay(equip_cooldown)
return
attach(obj/mecha/M as obj)
..()
droid_overlay = new(src.icon, icon_state = "repair_droid")
M.overlays += droid_overlay
return
destroy()
chassis.overlays -= droid_overlay
..()
return
detach()
chassis.overlays -= droid_overlay
pr_repair_droid.stop()
..()
return
get_equip_info()
var/output = ..()
output += " - <a href='?src=\ref[src];toggle_repairs=1'>[pr_repair_droid.active()?"Dea":"A"]ctivate</a>"
return output
Topic(href, href_list)
if(href_list["toggle_repairs"])
chassis.overlays -= droid_overlay
if(pr_repair_droid.toggle())
droid_overlay = new(src.icon, icon_state = "repair_droid_a")
chassis.log_message("[src] activated.")
else
droid_overlay = new(src.icon, icon_state = "repair_droid")
chassis.log_message("[src] deactivated.")
equip_ready = 1
chassis.overlays += droid_overlay
return
/datum/global_iterator/mecha_repair_droid
process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj)
if(!RD.chassis)
return src.stop()
var/repaired = 0
if(RD.chassis.health < initial(RD.chassis.health))
RD.chassis.health += min(RD.health_boost, initial(RD.chassis.health)-RD.chassis.health)
repaired = 1
if(RD.chassis.internal_damage && prob(20))
if(RD.chassis.internal_damage&MECHA_INT_TEMP_CONTROL)
RD.chassis.internal_damage &= ~MECHA_INT_TEMP_CONTROL
repaired = 1
else if(RD.chassis.internal_damage&MECHA_INT_SHORT_CIRCUIT)
RD.chassis.internal_damage &= ~MECHA_INT_SHORT_CIRCUIT
repaired = 1
else if(RD.chassis.internal_damage&MECHA_INT_TANK_BREACH)
RD.chassis.internal_damage &= ~MECHA_INT_TANK_BREACH
repaired = 1
else if(RD.chassis.internal_damage&MECHA_INT_CONTROL_LOST)
RD.chassis.internal_damage &= ~MECHA_INT_CONTROL_LOST
repaired = 1
if(repaired)
RD.chassis.cell.use(RD.energy_drain)
RD.equip_ready = 0
else
RD.equip_ready = 1
return
/*
/obj/item/mecha_parts/mecha_equipment/defence_shocker
name = "Exosuit Defence Shocker"
desc = ""
icon_state = "mecha_teleport"
equip_cooldown = 10
energy_drain = 100
range = RANGED
var/shock_damage = 15
var/active
can_attach(obj/mecha/M as obj)
if(..())
if(!istype(M, /obj/mecha/combat/honker))
if(!M.proc_res["dynattackby"] && !M.proc_res["dynattackhand"] && !!M.proc_res["dynattackalien"])
return 1
return 0
attach(obj/mecha/M as obj)
..()
chassis.proc_res["dynattackby"] = src
return
proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
if(!action_checks(user) || !active)
return
user.electrocute_act(shock_damage, src)
return chassis.dynattackby(W,user)
*/
+3 -1
View File
@@ -24,6 +24,8 @@ Control functions:
active() - Returns 1 if datum is active, 0 otherwise.
toggle() - toggles datum state. Returns 1 if datum activated, 0 otherwise
Misc functions:
get_last_exec_time() - Returns the time of last iteration.
@@ -134,6 +136,6 @@ Data storage vars:
proc/toggle()
if(!src.stop())
src.start()
return
return src.active()
+20 -9
View File
@@ -73,14 +73,18 @@
/obj/item/mecha_parts/part/honker_right_leg
),
"Exosuit Equipment"=list(
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
/obj/item/mecha_parts/mecha_equipment/weapon/taser,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
/obj/item/mecha_parts/mecha_equipment/weapon/honker),
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
/obj/item/mecha_parts/mecha_equipment/weapon/taser,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
/obj/item/mecha_parts/mecha_equipment/weapon/honker,
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,
/obj/item/mecha_parts/mecha_equipment/repair_droid
),
"Misc"=list(/obj/item/mecha_tracking)
@@ -175,7 +179,7 @@
var/list/part_set = part_sets[set_name]
for(var/atom/part in part_set)
var/resources_available = check_resources(part)
output += "<div class='part'>[output_part_info(part)]<br>\[[resources_available?"<a href='?src=\ref[src];part=\ref[part]'>Build</a> | ":null]<a href='?src=\ref[src];add_to_queue=\ref[part]'>Add to queue</a>\]</div>"
output += "<div class='part'>[output_part_info(part)]<br>\[[resources_available?"<a href='?src=\ref[src];part=\ref[part]'>Build</a> | ":null]<a href='?src=\ref[src];add_to_queue=\ref[part]'>Add to queue</a>\]\[<a href='?src=\ref[src];part_desc=\ref[part]'>?</a>\]</div>"
return output
proc/output_part_info(var/obj/item/mecha_parts/part)
@@ -368,6 +372,7 @@
body, table {height: 100%;}
td {vertical-align: top; padding: 5px;}
html, body {padding: 0px; margin: 0px;}
h1 {font-size: 18px; margin: 5px 0px;}
</style>
</head><body>
<body>
@@ -436,6 +441,12 @@
if(href_list["auto_sync"])
src.sync = !src.sync
//pr_auto_sync.toggle()
if(href_list["part_desc"])
var/obj/part = locate(href_list["part_desc"])
temp = {"<h1>[part] description:</h1>
[part.desc]<br>
<a href='?src=\ref[src];clear_temp=1'>Return</a>
"}
src.updateUsrDialog()
return
+81 -31
View File
@@ -29,11 +29,11 @@
var/list/log = new
var/last_message = 0
var/add_req_access = 1
var/dna //dna-locking the mech
var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference
var/datum/effects/system/spark_spread/spark_system = new
var/lights = 0
var/lights_power = 6
//var/inertia_dir = null //for open space travel.
//inner atmos machinery. Air tank mostly
var/use_internal_tank = 0
@@ -334,8 +334,13 @@
/obj/mecha/hitby(atom/movable/A as mob|obj)
src.log_message("Hit by [A].",1)
call((proc_res["dynhitby"]||src), "dynhitby")(A)
return
/obj/mecha/proc/dynhitby(atom/movable/A)
if(istype(A, /obj/item/mecha_tracking))
A.loc = src
src.visible_message("The [A] fastens firmly to [src].")
return
if(prob(src.deflect_chance) || istype(A, /mob))
src.occupant_message("\blue The [A] bounces off the armor.")
@@ -345,13 +350,11 @@
var/mob/M = A
M.bruteloss += 10
M.updatehealth()
else if(istype(A, /obj))
var/obj/O = A
if(O.throwforce)
src.take_damage(O.throwforce)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
@@ -372,30 +375,35 @@
src.visible_message("The [src.name] armor deflects the projectile")
src.log_append_to_last("Armor saved.")
else
var/damage
var/ignore_threshold
switch(flag)
if(PROJECTILE_PULSE)
damage = 40
ignore_threshold = 1
if(PROJECTILE_LASER)
damage = 20
if(PROJECTILE_TASER)
src.cell.use(500)
if(PROJECTILE_WEAKBULLET)
damage = 8
if(PROJECTILE_BULLET)
damage = 10
if(PROJECTILE_BOLT)
damage = 5
if(PROJECTILE_DART)
damage = 5
else
return
src.take_damage(damage)
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST),ignore_threshold)
call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(flag) //calls equipment
return
/obj/mecha/proc/dynbulletdamage(flag)
var/damage
var/ignore_threshold
switch(flag)
if(PROJECTILE_PULSE)
damage = 40
ignore_threshold = 1
if(PROJECTILE_LASER)
damage = 20
if(PROJECTILE_TASER)
src.cell.use(500)
if(PROJECTILE_WEAKBULLET)
damage = 8
if(PROJECTILE_BULLET)
damage = 10
if(PROJECTILE_BOLT)
damage = 5
if(PROJECTILE_DART)
damage = 5
else
return
src.take_damage(damage)
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST),ignore_threshold)
return
/obj/mecha/proc/destroy()
spawn()
var/obj/mecha/mecha = src
@@ -618,7 +626,10 @@
usr << "\blue <B>Subject cannot have abiotic items on.</B>"
return
*/
if(!src.operation_allowed(usr))
var/passed
if((src.dna && usr.dna.unique_enzymes==src.dna))
passed = 1
if(!passed && !src.operation_allowed(usr))
usr << "\red Access denied"
src.log_append_to_last("Permission denied.")
return
@@ -658,6 +669,9 @@
return 0
if(src.occupant)
return 0
if(src.dna && src.dna!=mmi_as_oc.brain.brainmob.dna.unique_enzymes)
user << "Stop it!"
return 0
if(do_after(20))
if(!src.occupant)
return mmi_moved_inside(mmi_as_oc,user)
@@ -835,6 +849,25 @@
return 0
/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
src.log_message("Attacked by [W]. Attacker - [user]")
if(prob(src.deflect_chance))
user << "\red The [W] bounces off [src.name] armor."
src.log_append_to_last("Armor saved.")
/*
for (var/mob/V in viewers(src))
if(V.client && !(V.blinded))
V.show_message("The [W] bounces off [src.name] armor.", 1)
*/
else
src.occupant_message("<font color='red'><b>[user] hits [src] with [W].</b></font>")
user.visible_message("<font color='red'><b>[user] hits [src] with [W].</b></font>", "<font color='red'><b>You hit [src] with [W].</b></font>")
src.take_damage(W.force,W.damtype)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
/obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/mmi))
@@ -941,6 +974,8 @@
return
else
call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
/*
src.log_message("Attacked by [W]. Attacker - [user]")
if(prob(src.deflect_chance))
user << "\red The [W] bounces off [src.name] armor."
@@ -955,13 +990,19 @@
user.visible_message("<font color='red'><b>[user] hits [src] with [W].</b></font>", "<font color='red'><b>You hit [src] with [W].</b></font>")
src.take_damage(W.force,W.damtype)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
*/
return
/obj/mecha/proc/get_stats_html()
var/output = {"<html>
<head><title>[src.name] data</title></head>
<body style="color: #00ff00; background: #000000; font: 13px 'Courier', monospace;">
<head><title>[src.name] data</title>
<style>
body {color: #00ff00; background: #000000; font: 13px 'Courier', monospace;}
hr {border: 1px solid #0f0; color: #0f0; background-color: #0f0;}
</style>
</head>
<body>
[src.get_stats_part()]
<hr>
[src.get_commands()]
@@ -984,6 +1025,7 @@
<b>Airtank pressure: </b>[src.return_pressure()]kPa<br>
<b>Internal temperature: </b> [src.air_contents.temperature]&deg;K|[src.air_contents.temperature - T0C]&deg;C<br>
<b>Lights: </b>[lights?"on":"off"]<br>
[src.dna?"<b>DNA-locked:</b><br> <span style='font-size:5px;letter-spacing:-1px;'>[src.dna]</span> \[<a href='?src=\ref[src];reset_dna=1'>Reset</a>\]<br>":null]
"}
return output
@@ -992,11 +1034,13 @@
<a href='?src=\ref[src];toggle_airtank=1'>Toggle Internal Airtank Usage</a><br>
[(/obj/mecha/verb/disconnect_from_port in src.verbs)?"<a href='?src=\ref[src];port_disconnect=1'>Disconnect from port</a><br>":null]
[(/obj/mecha/verb/connect_to_port in src.verbs)?"<a href='?src=\ref[src];port_connect=1'>Connect to port</a><br>":null]
<hr>
<a href='?src=\ref[src];unlock_id_upload=1'>Unlock ID upload panel</a><br>
<a href='?src=\ref[src];view_log=1'>View internal log</a><br>
<a href='?src=\ref[src];dna_lock=1'>DNA-lock</a><br>
<hr>
[(/obj/mecha/verb/eject in src.verbs)?"<a href='?src=\ref[src];eject=1'>Eject</a><br>":null]
"}
if(/obj/mecha/verb/eject in src.verbs)
output += "<a href='?src=\ref[src];eject=1'>Eject</a><br>"
return output
/obj/mecha/Topic(href, href_list)
@@ -1055,6 +1099,12 @@
add_req_access = 0
var/mob/user = locate(href_list["user"])
user << browse(null,"window=exosuit_add_access")
if(href_list["dna_lock"])
if(src.occupant)
src.dna = src.occupant.dna.unique_enzymes
src.occupant_message("You feel a prick as the needle takes your DNA sample.")
if(href_list["reset_dna"])
src.dna = null
/*
if (href_list["ai_take_control"])
+7 -1
View File
@@ -536,7 +536,13 @@ datum
req_tech = list("bluespace" = 2, "magnets" = 3)
build_path = "/obj/item/mecha_parts/mecha_equipment/gravcatapult"
mech_repair_droid
name = "Exosuit Module Design (Repair Droid Module)"
desc = "Automated Repair Droid. BEEP BOOP"
id = "mech_repair_droid"
build_type = MECHFAB
req_tech = list("magnets" = 3, "programming" = 3)
build_path = "/obj/item/mecha_parts/mecha_equipment/repair_droid"
////////////////////////////////////////
Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 29 KiB