= projectile_energy_cost && projectiles_to_add)
projectiles++
projectiles_to_add--
- chassis.cell.use(projectile_energy_cost)
+ chassis.use_power(projectile_energy_cost)
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
chassis.log_message("Rearmed [src.name].")
return
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index aef422f205c..7fb0c5e0462 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -6,10 +6,9 @@
var/obj/machinery/computer/mech_bay_power_console/recharge_console
var/obj/mecha/recharging_mecha = null
- Entered(atom as obj)
+ Entered(var/obj/mecha/mecha)
. = ..()
- if(istype(atom, /obj/mecha))
- var/obj/mecha/mecha = atom
+ if(istype(mecha))
mecha.occupant_message("Initializing power control devices.")
init_devices()
if(recharge_console && recharge_port)
@@ -22,7 +21,7 @@
mecha.occupant_message("Power port not found. Terminating.")
return
- Exited(atom as obj)
+ Exited(atom)
. = ..()
if(atom == recharging_mecha)
recharging_mecha = null
@@ -105,12 +104,13 @@
/datum/global_iterator/mech_bay_recharger
delay = 20
var/max_charge = 45
+ check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process()
process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha)
- if(mecha in port.recharge_floor)
+ if(port && mecha && mecha in port.recharge_floor)
var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge)
if(delta>0)
- mecha.cell.give(delta)
+ mecha.give_power(delta)
port.use_power(delta*150)
else
mecha.occupant_message("Fully charged.")
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 88f705c8666..49091986b64 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -89,11 +89,11 @@
src.verbs -= /obj/mecha/verb/disconnect_from_port
src.verbs -= /atom/movable/verb/pull
src.log_message("[src.name] created.")
+ src.loc.Entered(src)
return
/obj/mecha/Del()
src.go_out()
- src.loc.Exited(src)
..()
return
@@ -194,7 +194,7 @@
move_result = step(src,direction)
if(move_result)
can_move = 0
- cell.use(src.step_energy_drain)
+ use_power(step_energy_drain)
if(istype(src.loc, /turf/space))
if(!src.check_for_support())
src.pr_inertial_movement.start(list(src,direction))
@@ -401,7 +401,7 @@
if(PROJECTILE_LASER)
damage = 20
if(PROJECTILE_TASER)
- src.cell.use(500)
+ use_power(500)
if(PROJECTILE_WEAKBULLET)
damage = 8
if(PROJECTILE_BULLET)
@@ -419,36 +419,31 @@
/obj/mecha/proc/destroy()
spawn()
- var/obj/mecha/mecha = src
- // var/mob/M = src.occupant
var/turf/T = get_turf(src)
- var/wreckage = src.wreckage
- var/list/r_equipment = src.equipment
- var/obj/item/weapon/cell/r_cell = src.cell
- var/obj/machinery/portable_atmospherics/canister/r_canister = src.internal_tank
- src = null
- del(mecha)
+ tag = "\ref[src]" //better safe then sorry
+ loc.Exited(src)
+ loc = null
if(prob(40))
explosion(T, 0, 0, 1, 3)
- spawn(0)
- if(wreckage)
- var/obj/decal/mecha_wreckage/WR = new wreckage(T)
- for(var/obj/item/mecha_parts/mecha_equipment/E in r_equipment)
- if(prob(30))
- WR.salvage += E
- E.loc = WR
- E.equip_ready = 1
- E.reliability = rand(30,100)
- else
- E.loc = T
- E.destroy()
- if(r_cell)
- WR.salvage += r_cell
- r_cell.loc = WR
- r_cell.charge = rand(0, r_cell.charge)
- if(r_canister)
- WR.salvage += r_canister
- r_canister.loc = WR
+ if(wreckage)
+ var/obj/decal/mecha_wreckage/WR = new wreckage(T)
+ for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
+ if(prob(30))
+ WR.crowbar_salvage += E
+ E.loc = WR
+ E.equip_ready = 1
+ E.reliability = rand(30,100)
+ else
+ E.loc = T
+ E.destroy()
+ if(cell)
+ WR.crowbar_salvage += cell
+ cell.loc = WR
+ cell.charge = rand(0, cell.charge)
+ if(internal_tank)
+ WR.crowbar_salvage += internal_tank
+ internal_tank.loc = WR
+ del(src)
return
/obj/mecha/ex_act(severity)
@@ -481,7 +476,8 @@
return ex_act(rand(1,3))//should do for now
/obj/mecha/emp_act(severity)
- cell.use(min(cell.charge, cell.maxcharge/severity))
+ if(get_charge())
+ use_power(min(cell.charge, cell.maxcharge/severity))
src.log_message("EMP detected")
take_damage(100 / severity)
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST),1)
@@ -1108,6 +1104,7 @@
Unlock ID upload panel
DNA-lock
View internal log
+ Change exosuit name
@@ -1116,7 +1113,7 @@
"}
return output
-/obj/mecha/proc/get_equipment_menu()
+/obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu
var/output
if(equipment.len)
output += {"
@@ -1128,7 +1125,7 @@
output += "
"
return output
-/obj/mecha/proc/get_equipment_list()
+/obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html
if(!equipment.len)
return
var/output = "Equipment:"
@@ -1164,6 +1161,9 @@
src.occupant << browse(src.get_log_html(), "window=exosuit_log")
onclose(occupant, "exosuit_log")
return
+ if (href_list["change_name"])
+ name = input(occupant,"Choose new exosuit name","Rename exosuit",initial(name))
+ return
if (href_list["repair_int_control_lost"])
src.occupant_message("Recalibrating coordination system.")
src.log_message("Recalibration of coordination system started.")
@@ -1281,6 +1281,22 @@
if(!src.cell) return
return max(0, src.cell.charge)
+/obj/mecha/proc/use_power(amount)
+ return call((proc_res["dynusepower"]||src), "dynusepower")(amount)
+
+/obj/mecha/proc/dynusepower(amount)
+ if(get_charge()>=amount)
+ cell.use(amount)
+ return 1
+ return 0
+
+/obj/mecha/proc/give_power(amount)
+ if(!isnull(get_charge()))
+ cell.give(amount)
+ return 1
+ return 0
+
+
/obj/mecha/proc/output_access_dialog(obj/item/weapon/card/id/id_card, mob/user)
if(!id_card || !user) return
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 30c3634bcd3..b9eea980d9b 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -743,4 +743,24 @@
user.visible_message("[user] secures Durand Armour Plates.", "You secure Durand Armour Plates.")
if(1)
user.visible_message("[user] welds Durand Armour Plates to [holder].", "You weld Durand Armour Plates to [holder].")
- return 1
\ No newline at end of file
+ return 1
+
+
+/datum/construction/mecha/phazon_chassis
+ result = "/obj/mecha/combat/phazon"
+ steps = list(list("key"="/obj/item/mecha_parts/part/phazon_torso"),//1
+ list("key"="/obj/item/mecha_parts/part/phazon_left_arm"),//2
+ list("key"="/obj/item/mecha_parts/part/phazon_right_arm"),//3
+ list("key"="/obj/item/mecha_parts/part/phazon_left_leg"),//4
+ list("key"="/obj/item/mecha_parts/part/phazon_right_leg"),//5
+ list("key"="/obj/item/mecha_parts/part/phazon_head")
+ )
+
+ custom_action(step, atom/used_atom, mob/user)
+ user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
+ holder.overlays += used_atom.icon_state+"+o"
+ del used_atom
+ return 1
+
+ action(atom/used_atom,mob/user as mob)
+ return check_all_steps(used_atom,user)
\ No newline at end of file
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 388c655f807..ef719854595 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -42,7 +42,7 @@
desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems."
icon_state = "ripley_harness"
origin_tech = "programming=2;materials=3;biotech=2"
- construction_time = 300
+ construction_time = 200
construction_cost = list("metal"=40000,"glass"=15000)
/obj/item/mecha_parts/part/ripley_left_arm
@@ -50,7 +50,7 @@
desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_l_arm"
origin_tech = "programming=2;materials=3"
- construction_time = 200
+ construction_time = 150
construction_cost = list("metal"=25000)
/obj/item/mecha_parts/part/ripley_right_arm
@@ -58,7 +58,7 @@
desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_r_arm"
origin_tech = "programming=2;materials=3"
- construction_time = 200
+ construction_time = 150
construction_cost = list("metal"=25000)
/obj/item/mecha_parts/part/ripley_left_leg
@@ -66,7 +66,7 @@
desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_l_leg"
origin_tech = "programming=2;materials=3"
- construction_time = 200
+ construction_time = 150
construction_cost = list("metal"=30000)
/obj/item/mecha_parts/part/ripley_right_leg
@@ -74,7 +74,7 @@
desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_r_leg"
origin_tech = "programming=2;materials=3"
- construction_time = 200
+ construction_time = 150
construction_cost = list("metal"=30000)
///////// Gygax
@@ -278,6 +278,61 @@
construction_cost = list("metal"=20000,"bananium"=5000)
+////////// Phazon
+
+/obj/item/mecha_parts/chassis/phazon
+ name = "Phazon Chassis"
+ origin_tech = "materials=7"
+
+ New()
+ ..()
+ construct = new /datum/construction/mecha/phazon_chassis(src)
+
+/obj/item/mecha_parts/part/phazon_torso
+ name="Phazon Torso"
+ icon_state = "phazon_harness"
+ construction_time = 300
+ construction_cost = list("metal"=35000,"glass"=10000,"plasma"=20000)
+ origin_tech = "programming=5;materials=7;bluespace=6;powerstorage=6"
+
+/obj/item/mecha_parts/part/phazon_head
+ name="Phazon Head"
+ icon_state = "phazon_head"
+ construction_time = 200
+ construction_cost = list("metal"=15000,"glass"=5000,"plasma"=10000)
+ origin_tech = "programming=4;materials=5;magnets=6"
+
+/obj/item/mecha_parts/part/phazon_left_arm
+ name="Phazon Left Arm"
+ icon_state = "phazon_l_arm"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"plasma"=10000)
+ origin_tech = "materials=5;bluespace=2;magnets=2"
+
+/obj/item/mecha_parts/part/phazon_right_arm
+ name="Phazon Right Arm"
+ icon_state = "phazon_r_arm"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"plasma"=10000)
+ origin_tech = "materials=5;bluespace=2;magnets=2"
+
+/obj/item/mecha_parts/part/phazon_left_leg
+ name="Phazon Left Leg"
+ icon_state = "phazon_l_leg"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"plasma"=10000)
+ origin_tech = "materials=5;bluespace=3;magnets=3"
+
+/obj/item/mecha_parts/part/phazon_right_leg
+ name="Phazon Right Leg"
+ icon_state = "phazon_r_leg"
+ construction_time = 200
+ construction_cost = list("metal"=20000,"plasma"=10000)
+ origin_tech = "materials=5;bluespace=3;magnets=3"
+
+
+///////// Circuitboards
+
/obj/item/mecha_parts/circuitboard
name = "Exosuit Circuit board"
icon = 'module.dmi'
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index bc63f86c9bd..a408a22c974 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -10,16 +10,14 @@
density = 1
anchored = 1
opacity = 0
- var/list/welder_salvage = list("/obj/item/stack/sheet/r_metal","/obj/item/stack/sheet/metal","/obj/item/stack/rods")
- var/list/wirecutters_salvage = list("/obj/item/weapon/cable_coil")
- var/list/crowbar_salvage = list("/obj/item/weapon/cell")
- var/list/equipment = new
+ var/list/welder_salvage = list(/obj/item/stack/sheet/r_metal,/obj/item/stack/sheet/metal,/obj/item/stack/rods)
+ var/list/wirecutters_salvage = list(/obj/item/weapon/cable_coil)
+ var/list/crowbar_salvage
var/salvage_num = 5
- var/list/salvage
New()
..()
- salvage = new
+ crowbar_salvage = new
return
/obj/decal/mecha_wreckage/ex_act(severity)
@@ -31,53 +29,43 @@
/obj/decal/mecha_wreckage/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
if(salvage_num <= 0)
- user << "You can't see anything of value left on this wreck."
+ user << "You don't see anything that can be cut with [W]."
return
- if (W:remove_fuel(0,user))
+ if (!isemptylist(welder_salvage) && W:remove_fuel(0,user))
var/type = prob(70)?pick(welder_salvage):null
if(type)
var/N = new type(get_turf(user))
user.visible_message("[user] cuts [N] from [src]", "You cut [N] from [src]", "You hear a sound of welder nearby")
+ if(istype(N, /obj/item/mecha_parts/part))
+ welder_salvage -= N
+ salvage_num--
else
user << "You failed to salvage anything valuable from [src]."
- salvage_num--
else
user << "\blue You need more welding fuel to complete this task."
return
if(istype(W, /obj/item/weapon/wirecutters))
if(salvage_num <= 0)
- user << "You can't see anything of value left on this wreck."
+ user << "You don't see anything that can be cut with [W]."
return
- else
+ else if(!isemptylist(wirecutters_salvage))
var/type = prob(70)?pick(wirecutters_salvage):null
if(type)
var/N = new type(get_turf(user))
user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
+ salvage_num--
else
user << "You failed to salvage anything valuable from [src]."
- salvage_num--
if(istype(W, /obj/item/weapon/crowbar))
- if(salvage.len)
- var/obj/S = pick(salvage)
+ if(!isemptylist(crowbar_salvage))
+ var/obj/S = pick(crowbar_salvage)
if(S)
S.loc = get_turf(user)
- salvage -= S
+ crowbar_salvage -= S
user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].")
return
- if(salvage_num<=0)
- user << "You can't see anything of value left on this wreck."
- return
else
- var/type = prob(70)?pick(crowbar_salvage):null
- if(type)
- var/N = new type(get_turf(user))
- if(istype(N, /obj/item/weapon/cell))
- N:maxcharge = rand(5000,12000)
- N:charge = 0
- user.visible_message("[user] pries [N] from [src].", "You pry [N] from [src].")
- else
- user << "You failed to salvage anything from [src]."
- salvage_num--
+ user << "You don't see anything that can be pried with [W]."
else
..()
return
@@ -87,6 +75,22 @@
name = "Gygax wreckage"
icon_state = "gygax-broken"
+ New()
+ ..()
+ var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
+ /obj/item/mecha_parts/part/gygax_head,
+ /obj/item/mecha_parts/part/gygax_left_arm,
+ /obj/item/mecha_parts/part/gygax_right_arm,
+ /obj/item/mecha_parts/part/gygax_left_leg,
+ /obj/item/mecha_parts/part/gygax_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
+
+
/obj/decal/mecha_wreckage/marauder
name = "Marauder wreckage"
@@ -97,11 +101,41 @@
name = "Ripley wreckage"
icon_state = "ripley-broken"
+ New()
+ ..()
+ var/list/parts = 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)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
+
/obj/decal/mecha_wreckage/durand
name = "Durand wreckage"
icon_state = "durand-broken"
+ New()
+ ..()
+ var/list/parts = list(
+ /obj/item/mecha_parts/part/durand_torso,
+ /obj/item/mecha_parts/part/durand_head,
+ /obj/item/mecha_parts/part/durand_left_arm,
+ /obj/item/mecha_parts/part/durand_right_arm,
+ /obj/item/mecha_parts/part/durand_left_leg,
+ /obj/item/mecha_parts/part/durand_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
+
/obj/decal/mecha_wreckage/phazon
name = "Phazon wreckage"
icon_state = "phazon-broken"
diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm
index 6d5f24842da..09d73db01ae 100644
--- a/code/game/research/designs.dm
+++ b/code/game/research/designs.dm
@@ -34,7 +34,7 @@ other types of metals and chemistry for reagents).
#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
#define AUTOLATHE 4 //Uses glass/metal only.
#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
-#define MECHFAB 16
+#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
datum
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 559b5c14237..f973a4d2dee 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -111,4 +111,10 @@ h1.alert, h2.alert
{
color: #000000;
}
+
+.attack
+{
+ font-weight: bold;
+ color: #f00;
+}
"}
diff --git a/tgstation.dme b/tgstation.dme
index 6e91efef6fd..0b5b335ebb0 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -447,6 +447,7 @@
#include "code\game\mecha\combat\gygax.dm"
#include "code\game\mecha\combat\honker.dm"
#include "code\game\mecha\combat\marauder.dm"
+#include "code\game\mecha\combat\phazon.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
#include "code\game\mecha\equipment\tools\tools.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"