diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 5425a8ad5b2..f5255d061fd 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -807,9 +807,11 @@
brainmob.loc = src
brainmob.name = owner.real_name
brainmob.real_name = owner.real_name
- src.owner.mind.transfer_to(brainmob)
+ 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.
- brainmob.client.screen.len = null //clear the hud
+ if(brainmob.client)
+ brainmob.client.screen.len = null //clear the hud
brainmob << "\blue You might feel slightly disoriented. That's normal when your brain gets cut out."
/obj/item/brain/Del()
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index a834bee88de..c6cc0f83a6b 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -1,5 +1,5 @@
/obj/mecha/combat
- var/force = 25
+ var/force = 30
var/damtype = "brute"
var/melee_cooldown = 10
var/melee_can_hit = 1
@@ -101,9 +101,6 @@
if(istype(target, target_type) && hascall(target, "attackby"))
src.occupant_message("You hit [target].")
src.visible_message("[src.name] hits [target]")
- for (var/mob/V in viewers(src))
- if(V.client && !(V.blinded))
- V.show_message("[src.name] hits [target].", 1)
if(!istype(target, /turf/simulated/wall))
target:attackby(src,src.occupant)
else if(prob(5))
@@ -147,8 +144,8 @@
/obj/mecha/combat/moved_inside(var/mob/living/carbon/human/H as mob)
if(..())
- if(usr.client)
- usr.client.mouse_pointer_icon = file("icons/misc/mecha_mouse.dmi")
+ if(H.client)
+ H.client.mouse_pointer_icon = file("icons/misc/mecha_mouse.dmi")
return 1
else
return 0
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 5f85fb1e94c..e6da5986afd 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -3,11 +3,11 @@
name = "Durand"
icon_state = "durand"
step_in = 6
- health = 350
+ health = 400
deflect_chance = 20
max_temperature = 3000
infra_luminosity = 8
- force = 35
+ force = 40
var/defence = 0
var/defence_deflect = 35
wreckage = "/obj/decal/mecha_wreckage/durand"
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 15a92366c65..a1350270bc8 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -3,7 +3,7 @@
name = "Marauder"
icon_state = "marauder"
step_in = 7
- health = 400
+ health = 500
deflect_chance = 25
max_temperature = 5000
infra_luminosity = 3
@@ -17,6 +17,7 @@
wreckage = "/obj/decal/mecha_wreckage/marauder"
add_req_access = 0
internal_damage_threshold = 25
+ force = 45
/obj/mecha/combat/marauder/New()
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 625de351c51..8ff857112d9 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -267,6 +267,7 @@
/obj/item/mecha_parts/mecha_equipment/teleporter
name = "Teleporter"
+ desc = "An exosuit module that allows exosuits to teleport to any position in view."
icon_state = "mecha_teleport"
equip_cooldown = 300
energy_drain = 1000
@@ -286,6 +287,7 @@
/obj/item/mecha_parts/mecha_equipment/wormhole_generator
name = "Wormhole Generator"
+ desc = "An exosuit module that allows generating of small quasi-stable wormholes."
icon_state = "mecha_wholegen"
equip_cooldown = 50
energy_drain = 300
@@ -334,6 +336,7 @@
/obj/item/mecha_parts/mecha_equipment/gravcatapult
name = "Gravitational Catapult"
+ desc = "An exosuit mounted Gravitational Catapult."
icon_state = "mecha_teleport"
equip_cooldown = 10
energy_drain = 200
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 5a89eadae6b..27df2c1ca46 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -11,7 +11,7 @@
return 0
/obj/item/mecha_parts/mecha_equipment/weapon/laser
- equip_cooldown = 10
+ equip_cooldown = 7
name = "CH-PS \"Immolator\" Laser"
icon_state = "mecha_laser"
energy_drain = 30
@@ -84,7 +84,7 @@
name = "PBT \"Pacifier\" Mounted Taser"
icon_state = "mecha_taser"
energy_drain = 20
- equip_cooldown = 7
+ equip_cooldown = 6
action(target)
if(!action_checks(target)) return
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index fcf8d798168..aef422f205c 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -104,7 +104,7 @@
/datum/global_iterator/mech_bay_recharger
delay = 20
- var/max_charge = 30
+ var/max_charge = 45
process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha)
if(mecha in port.recharge_floor)
@@ -129,7 +129,7 @@
icon = 'mech_bay.dmi'
icon_state = "recharge_comp"
var/autostart = 1
- var/voltage = 30
+ var/voltage = 45
var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor
var/obj/machinery/mech_bay_recharge_port/recharge_port
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 06e9b644c91..e73ad1528f4 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -19,7 +19,7 @@
layer = MOB_LAYER //icon draw layer
infra_luminosity = 15
var/can_move = 1
- var/mob/living/carbon/human/occupant = null
+ var/mob/living/carbon/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
var/step_energy_drain = 10
var/health = 300 //health is health
@@ -61,7 +61,6 @@
var/obj/item/mecha_parts/mecha_equipment/selected
var/max_equip = 2
-
/obj/mecha/New()
..()
src.icon_state += "-open"
@@ -406,7 +405,8 @@
var/list/r_equipment = src.equipment
src = null
del(mecha)
- explosion(T, 0, 0, 1, 3)
+ if(prob(40))
+ explosion(T, 0, 0, 1, 3)
spawn(0)
if(wreckage)
var/obj/decal/mecha_wreckage/WR = new wreckage(T)
@@ -631,13 +631,12 @@
return
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
- if(H && H in range(1))
+ if(H && H.client && H in range(1))
+ H.client.eye = src
+ H.client.perspective = EYE_PERSPECTIVE
H.pulling = null
src.occupant = H
H.loc = src
- if(H.client)
- H.client.eye = src
- H.client.perspective = EYE_PERSPECTIVE
src.add_fingerprint(H)
src.Entered(H)
src.Move(src.loc)
@@ -650,6 +649,49 @@
else
return 0
+/obj/mecha/proc/mmi_move_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ if(!mmi_as_oc.brain || !mmi_as_oc.brain.brainmob || !mmi_as_oc.brain.brainmob.client)
+ user << "Consciousness matrix not detected."
+ return 0
+ if(mmi_as_oc.brain.brainmob.stat)
+ user << "Beta-rhythm below acceptable level."
+ return 0
+ if(src.occupant)
+ return 0
+ if(do_after(20))
+ if(!src.occupant)
+ return mmi_moved_inside(mmi_as_oc,user)
+ return 0
+
+
+/obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ if(mmi_as_oc && user in range(1))
+ if(!mmi_as_oc.brain || !mmi_as_oc.brain.brainmob || !mmi_as_oc.brain.brainmob.client)
+ user << "Consciousness matrix not detected."
+ return 0
+ if(mmi_as_oc.brain.brainmob.stat)
+ user << "Beta-rhythm below acceptable level."
+ return 0
+ user.drop_from_slot(mmi_as_oc)
+ var/mob/brainmob = mmi_as_oc.brain.brainmob
+ brainmob.client.eye = src
+ brainmob.client.perspective = EYE_PERSPECTIVE
+ src.occupant = brainmob
+ brainmob.loc = src //should allow relaymove
+ brainmob.canmove = 1
+ mmi_as_oc.loc = src
+ mmi_as_oc.mecha = src
+ src.verbs -= /obj/mecha/verb/eject
+ src.Entered(mmi_as_oc)
+ src.Move(src.loc)
+ src.icon_state = initial(icon_state)
+ src.log_message("[mmi_as_oc] moved in as pilot.")
+ if(!internal_damage)
+ src.occupant << sound('nominal.ogg',volume=50)
+ return 1
+ else
+ return 0
+
/obj/mecha/verb/view_stats()
set name = "View Stats"
@@ -660,6 +702,15 @@
pr_update_stats.start()
return
+/*
+/obj/mecha/verb/force_eject()
+ set category = "Object"
+ set name = "Force Eject"
+ set src in view(5)
+ src.go_out()
+ return
+*/
+
/obj/mecha/verb/eject()
set name = "Eject"
set category = "Exosuit Interface"
@@ -673,13 +724,28 @@
/obj/mecha/proc/go_out()
if(!src.occupant) return
- if(src.occupant.Move(src.loc))
- src.log_message("[src.occupant] moved out.")
- src.Exited(src.occupant)
- if (src.occupant.client)
+ var/atom/movable/mob_container
+ if(ishuman(src.occupant))
+ mob_container = src.occupant
+ else if(istype(src.occupant, /mob/living/carbon/brain))
+ var/mob/living/carbon/brain/brain = src.occupant
+ mob_container = brain.container
+ else
+ return
+ if(mob_container.Move(src.loc))//ejecting mob container
+ src.log_message("[mob_container] moved out.")
+ src.Exited(mob_container)
+ if(src.occupant.client)
src.occupant.client.eye = src.occupant.client.mob
src.occupant.client.perspective = MOB_PERSPECTIVE
src.occupant << browse(null, "window=exosuit")
+ if(istype(mob_container, /obj/item/device/mmi))
+ var/obj/item/device/mmi/mmi = mob_container
+ if(mmi.brain)
+ src.occupant.loc = mmi.brain
+ mmi.mecha = null
+ src.occupant.canmove = 0
+ src.verbs += /obj/mecha/verb/eject
src.occupant = null
src.pr_update_stats.stop()
src.icon_state = initial(icon_state)+"-open"
@@ -770,6 +836,14 @@
/obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob)
+
+ if(istype(W, /obj/item/device/mmi))
+ if(src.mmi_move_inside(W,user))
+ user << "[src]-MMI interface initialized successfuly"
+ else
+ user << "[src]-MMI interface initialization failed."
+ return
+
if(istype(W, /obj/item/mecha_parts/mecha_equipment))
var/obj/item/mecha_parts/mecha_equipment/E = W
spawn()
@@ -920,8 +994,9 @@
[(/obj/mecha/verb/connect_to_port in src.verbs)?"Connect to port
":null]
Unlock ID upload panel
View internal log
- Eject
"}
+ if(/obj/mecha/verb/eject in src.verbs)
+ output += "Eject
"
return output
/obj/mecha/Topic(href, href_list)
@@ -1042,26 +1117,15 @@
user << browse(output, "window=mecha_attack_ai")
return
*/
-
+/* //it seems this is not needed anymore...
/obj/mecha/hear_talk(mob/M as mob, text)
+ src.log_message("Heard talk from [M]")
if(occupant && M)
if(!occupant.say_understands(M))
text = stars(text)
var/rendered = "[M.name] [M.say_quote(text)]"
occupant.show_message(rendered, 2)
return
-/*
-if ("binary")
- if(src.robot_talk_understand || src.binarycheck())
- //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
- src.robot_talk(message)
- return
-
-if ("alientalk")
- if(src.alien_talk_understand || src.hivecheck())
- //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
- src.alien_talk(message)
- return
*/
/obj/mecha/proc/get_charge()//returns null if no powercell, else returns cell.charge
if(!src.cell) return
diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm
index 3748a569622..74fc615fa85 100644
--- a/code/game/research/designs.dm
+++ b/code/game/research/designs.dm
@@ -422,8 +422,8 @@ datum
build_path = "/obj/item/mecha_parts/circuitboard/gygax/targeting"
durand_main
- name = "Circuit Design (\"Gygax\" Central Control module)"
- desc = "Allows for the construction of a \"Gygax\" Central Control module."
+ name = "Circuit Design (\"Durand\" Central Control module)"
+ desc = "Allows for the construction of a \"Durand\" Central Control module."
id = "durand_main"
req_tech = list("programming" = 4, "materials" = 2)
build_type = IMPRINTER
@@ -431,8 +431,8 @@ datum
build_path = "/obj/item/mecha_parts/circuitboard/durand/main"
durand_peri
- name = "Circuit Design (\"Gygax\" Peripherals Control module)"
- desc = "Allows for the construction of a \"Gygax\" Peripheral Control module."
+ name = "Circuit Design (\"Durand\" Peripherals Control module)"
+ desc = "Allows for the construction of a \"Durand\" Peripheral Control module."
id = "durand_peri"
req_tech = list("programming" = 4, "materials" = 2)
build_type = IMPRINTER
@@ -440,8 +440,8 @@ datum
build_path = "/obj/item/mecha_parts/circuitboard/durand/peripherals"
durand_targ
- name = "Circuit Design (\"Gygax\" Weapons & Targeting Control module)"
- desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module."
+ name = "Circuit Design (\"Durand\" Weapons & Targeting Control module)"
+ desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module."
id = "durand_targ"
req_tech = list("programming" = 4, "materials" = 2)
build_type = IMPRINTER
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 48d5fd6ba5d..ce2c315ea2f 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -122,7 +122,11 @@
get_breath_from_internal(volume_needed)
update_canmove()
- canmove = 0
+ if(src.in_contents_of(/obj/mecha))
+ canmove = 1
+ else
+ canmove = 0
+ return
handle_breath(datum/gas_mixture/breath)