[user] hits [src] with [W].")
+ user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].")
+ 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/attack_ai(var/mob/living/silicon/ai/user as mob)
+ if(!istype(user, /mob/living/silicon/ai))
+ return
+ var/output = {"Assume direct control over [src]?
+ Yes
+ "}
+ user << browse(output, "window=mecha_attack_ai")
+ return
+*/
+
/////////////////////////////////////
//////// Atmospheric stuff ////////
/////////////////////////////////////
-/*
-//standard for /obj class
-/obj/mecha/handle_internal_lifeform(lifeform, volume)
- ..()
- world << "Handling [lifeform] breathing. Requested [volume]"
-*/
-
/obj/mecha/remove_air(amount)
if(use_internal_tank && internal_tank)
return internal_tank.air_contents.remove(amount)
@@ -528,19 +728,6 @@
return internal_tank.return_temperature()
return 0
-
-/*
-/obj/mecha/proc/preserve_temp()
-// set background = 1
- spawn while(src)
- if(cell && cell.charge>0)
- if(src.occupant)
- if(src.occupant.bodytemperature > 320 || src.occupant.bodytemperature < 300)
- src.occupant.bodytemperature += src.occupant.adjust_body_temperature(src.occupant.bodytemperature, 310.15, 10)
- cell.charge--
- sleep(10)
-*/
-
/obj/mecha/proc/connect(obj/machinery/atmospherics/portables_connector/new_port)
//Make sure not already connected to something else
if(connected_port || !new_port || new_port.connected_device)
@@ -686,19 +873,21 @@
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
if(H && H.client && H in range(1))
- H.client.eye = src
+ H.reset_view(src)
+ /*
H.client.perspective = EYE_PERSPECTIVE
+ H.client.eye = src
+ */
H.pulling = null
+ H.forceMove(src)
src.occupant = H
- H.loc = src
src.add_fingerprint(H)
- src.Entered(H)
- src.Move(src.loc)
+ src.forceMove(src.loc)
src.log_append_to_last("[H] moved in as pilot.")
src.icon_state = initial(icon_state)
dir = dir_in
playsound(src, 'windowdoor.ogg', 50, 1)
- if(!internal_damage)
+ if(!hasInternalDamage())
src.occupant << sound('nominal.ogg',volume=50)
return 1
else
@@ -736,8 +925,11 @@
return 0
user.drop_from_slot(mmi_as_oc)
var/mob/brainmob = mmi_as_oc.brainmob
+ brainmob.reset_view(src)
+ /*
brainmob.client.eye = src
brainmob.client.perspective = EYE_PERSPECTIVE
+ */
occupant = brainmob
brainmob.loc = src //should allow relaymove
brainmob.canmove = 1
@@ -749,7 +941,7 @@
src.icon_state = initial(icon_state)
dir = dir_in
src.log_message("[mmi_as_oc] moved in as pilot.")
- if(!internal_damage)
+ if(!hasInternalDamage())
src.occupant << sound('nominal.ogg',volume=50)
return 1
else
@@ -797,12 +989,14 @@
mob_container = brain.container
else
return
- if(mob_container.Move(src.loc))//ejecting mob container
+ if(mob_container.forceMove(src.loc))//ejecting mob container
src.log_message("[mob_container] moved out.")
- src.Exited(mob_container)
+ occupant.reset_view()
+ /*
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
@@ -816,54 +1010,9 @@
src.dir = dir_in
return
-/obj/mecha/examine()
- set src in view()
- ..()
- var/integrity = health/initial(health)*100
- switch(integrity)
- if(85 to 100)
- usr << "It's fully intact."
- if(65 to 85)
- usr << "It's slightly damaged."
- if(45 to 65)
- usr << "It's badly damaged."
- if(25 to 45)
- usr << "It's heavily damaged."
- else
- usr << "It's falling apart."
- if(equipment && equipment.len)
- usr << "It's equipped with:"
- for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
- usr << "\icon[ME] [ME]"
- return
-
-////// Misc
-
-/obj/mecha/proc/occupant_message(message as text)
- if(message)
- if(src.occupant && src.occupant.client)
- src.occupant << "[message]"
- return
-
-/obj/mecha/proc/log_message(message as text,red=null)
- log.len++
- log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]")
- return log.len
-
-/obj/mecha/proc/log_append_to_last(message as text,red=null)
- var/list/last_entry = src.log[src.log.len]
- last_entry["message"] += "
[red?"":null][message][red?"":null]"
- return
-
-
-/obj/mecha/proc/get_log_html()
- var/output = "[src.name] Log"
- for(var/list/entry in log)
- output += {"[time2text(entry["time"],"DDD MMM DD hh:mm:ss")] 2555
- [entry["message"]]
- "}
- output += ""
- return output
+/////////////////////////
+////// Access stuff /////
+/////////////////////////
/obj/mecha/proc/operation_allowed(mob/living/carbon/human/H)
for(var/ID in list(H.equipped(), H.wear_id, H.belt))
@@ -900,140 +1049,9 @@
return 1
-/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("[user] hits [src] with [W].")
- user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].")
- 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))
- if(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()
- if(E.can_attach(src))
- user.drop_item()
- E.attach(src)
- user.visible_message("[user] attaches [W] to [src]", "You attach [W] to [src]")
- else
- user << "You were unable to attach [W] to [src]"
- return
- if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if(add_req_access || maint_access)
- if(internals_access_allowed(usr))
- var/obj/item/weapon/card/id/id_card
- if(istype(W, /obj/item/weapon/card/id))
- id_card = W
- else
- var/obj/item/device/pda/pda = W
- id_card = pda.id
- output_maintenance_dialog(id_card, user)
- return
- else
- user << "\red Invalid ID: Access denied."
- else
- user << "\red Maintenance protocols disabled by operator."
- else if(istype(W, /obj/item/weapon/wrench))
- if(state==1)
- state = 2
- user << "You undo the securing bolts."
- else if(state==2)
- state = 1
- user << "You tighten the securing bolts."
- return
-
- else if(istype(W, /obj/item/weapon/crowbar))
- if(state==2)
- state = 3
- user << "You open the hatch to the power unit"
- else if(state==3)
- state=2
- user << "You close the hatch to the power unit"
- return
-
- else if(istype(W, /obj/item/weapon/screwdriver))
- if(state==3 && src.cell)
- src.cell.loc = src.loc
- src.cell = null
- state = 4
- user << "You unscrew and pry out the powercell."
- src.log_message("Powercell removed")
- else if(state==4 && src.cell)
- state=3
- user << "You screw the cell in place"
- return
-
- else if(istype(W, /obj/item/weapon/cell))
- if(state==4)
- if(!src.cell)
- user << "You install the powercell"
- user.drop_item()
- W.loc = src
- src.cell = W
- src.log_message("Powercell installed")
- else
- user << "There's already a powercell installed."
- return
-
- else if(istype(W, /obj/item/weapon/weldingtool) && W:welding && user.a_intent != "hurt")
- if (W:remove_fuel(0,user))
- if (src.internal_damage & MECHA_INT_TANK_BREACH)
- src.internal_damage &= ~MECHA_INT_TANK_BREACH
- user << "\blue You repair the damaged gas tank."
- else
- return
- if(src.health[user] hits [src] with [W].")
- user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].")
- 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
-
+////////////////////////////////////
+///// Rendering stats window ///////
+////////////////////////////////////
/obj/mecha/proc/get_stats_html()
var/output = {"
@@ -1080,13 +1098,27 @@
"}
return output
+/obj/mecha/proc/report_internal_damage()
+ var/output = null
+ var/list/dam_reports = list(
+ "[MECHA_INT_FIRE]" = "INTERNAL FIRE",
+ "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION",
+ "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH",
+ "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate",
+ "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT"
+ )
+ for(var/tflag in dam_reports)
+ var/intdamflag = text2num(tflag)
+ if(hasInternalDamage(intdamflag))
+ output += dam_reports[tflag]
+ output += "
"
+ return output
+
+
/obj/mecha/proc/get_stats_part()
var/integrity = health/initial(health)*100
var/cell_charge = get_charge()
- var/output = {"[internal_damage&MECHA_INT_FIRE?"INTERNAL FIRE
":null]
- [internal_damage&MECHA_INT_TEMP_CONTROL?"LIFE SUPPORT SYSTEM MALFUNCTION
":null]
- [internal_damage&MECHA_INT_TANK_BREACH?"GAS TANK BREACH
":null]
- [internal_damage&MECHA_INT_CONTROL_LOST?"COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate
":null]
+ var/output = {"[report_internal_damage()]
[integrity<30?"DAMAGE LEVEL CRITICAL
":null]
Integrity: [integrity]%
Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
@@ -1160,6 +1192,85 @@
return output
+/obj/mecha/proc/get_log_html()
+ var/output = "[src.name] Log"
+ for(var/list/entry in log)
+ output += {"[time2text(entry["time"],"DDD MMM DD hh:mm:ss")] 2555
+ [entry["message"]]
+ "}
+ output += ""
+ return output
+
+
+/obj/mecha/proc/output_access_dialog(obj/item/weapon/card/id/id_card, mob/user)
+ if(!id_card || !user) return
+ var/output = {"
+
+
+
+ Following keycodes are present in this system:
"}
+ for(var/a in operation_req_access)
+ output += "[get_access_desc(a)] - Delete
"
+ output += "
Following keycodes were detected on portable device:
"
+ for(var/a in id_card.access)
+ if(a in operation_req_access) continue
+ var/a_name = get_access_desc(a)
+ if(!a_name) continue //there's some strange access without a name
+ output += "[a_name] - Add
"
+ output += "
Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)"
+ output += ""
+ user << browse(output, "window=exosuit_add_access")
+ onclose(user, "exosuit_add_access")
+ return
+
+/obj/mecha/proc/output_maintenance_dialog(obj/item/weapon/card/id/id_card,mob/user)
+ if(!id_card || !user) return
+ var/output = {"
+
+
+
+
+ [add_req_access?"Edit operation keycodes":null]
+ [maint_access?"Initiate maintenance protocol":null]
+
+ "}
+ user << browse(output, "window=exosuit_maint_console")
+ onclose(user, "exosuit_maint_console")
+ return
+
+
+////////////////////////////////
+/////// Messages and Log ///////
+////////////////////////////////
+
+/obj/mecha/proc/occupant_message(message as text)
+ if(message)
+ if(src.occupant && src.occupant.client)
+ src.occupant << "\icon[src] [message]"
+ return
+
+/obj/mecha/proc/log_message(message as text,red=null)
+ log.len++
+ log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]")
+ return log.len
+
+/obj/mecha/proc/log_append_to_last(message as text,red=null)
+ var/list/last_entry = src.log[src.log.len]
+ last_entry["message"] += "
[red?"":null][message][red?"":null]"
+ return
+
+
+/////////////////
+///// Topic /////
+/////////////////
+
/obj/mecha/Topic(href, href_list)
..()
if(href_list["update_content"])
@@ -1263,20 +1374,27 @@
return
if(href_list["reset_dna"])
src.dna = null
- if (href_list["repair_int_control_lost"])
+ if(href_list["repair_int_control_lost"])
src.occupant_message("Recalibrating coordination system.")
src.log_message("Recalibration of coordination system started.")
var/T = src.loc
if(do_after(100))
if(T == src.loc)
- src.internal_damage &= ~MECHA_INT_CONTROL_LOST
+ src.clearInternalDamage(MECHA_INT_CONTROL_LOST)
src.occupant_message("Recalibration successful.")
src.log_message("Recalibration of coordination system finished with 0 errors.")
else
src.occupant_message("Recalibration failed.")
src.log_message("Recalibration of coordination system failed with 1 error.",1)
+ //debug
+ /*
+ if(href_list["debug"])
+ if(href_list["set_i_dam"])
+ setInternalDamage(filter.getNum("set_i_dam"))
+ if(href_list["clear_i_dam"])
+ clearInternalDamage(filter.getNum("clear_i_dam"))
return
-
+ */
/*
@@ -1326,27 +1444,15 @@
*/
return
+///////////////////////
+///// Power stuff /////
+///////////////////////
-/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
- return
-/*
-/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob)
- if(!istype(user, /mob/living/silicon/ai))
- return
- var/output = {"Assume direct control over [src]?
- Yes
- "}
- user << browse(output, "window=mecha_attack_ai")
- return
-*/
+/obj/mecha/proc/get_charge()
+ return call((proc_res["dyngetcharge"]||src), "dyngetcharge")()
-/obj/mecha/hear_talk(mob/M as mob, text)
- if(M==occupant && radio.broadcasting)
- radio.talk_into(M, text)
- return
-
-/obj/mecha/proc/get_charge()//returns null if no powercell, else returns cell.charge
+/obj/mecha/proc/dyngetcharge()//returns null if no powercell, else returns cell.charge
if(!src.cell) return
return max(0, src.cell.charge)
@@ -1366,50 +1472,6 @@
return 0
-/obj/mecha/proc/output_access_dialog(obj/item/weapon/card/id/id_card, mob/user)
- if(!id_card || !user) return
- var/output = {"
-
-
-
- Following keycodes are present in this system:
"}
- for(var/a in operation_req_access)
- output += "[get_access_desc(a)] - Delete
"
- output += "
Following keycodes were detected on portable device:
"
- for(var/a in id_card.access)
- if(a in operation_req_access) continue
- var/a_name = get_access_desc(a)
- if(!a_name) continue //there's some strange access without a name
- output += "[a_name] - Add
"
- output += "
Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)"
- output += ""
- user << browse(output, "window=exosuit_add_access")
- onclose(user, "exosuit_add_access")
- return
-
-/obj/mecha/proc/output_maintenance_dialog(obj/item/weapon/card/id/id_card,mob/user)
- if(!id_card || !user) return
- var/output = {"
-
-
-
-
- [add_req_access?"Edit operation keycodes":null]
- [maint_access?"Initiate maintenance protocol":null]
-
- "}
- user << browse(output, "window=exosuit_maint_console")
- onclose(user, "exosuit_maint_console")
- return
-
-
//////////////////////////////////////////
//////// Mecha global iterators ////////
//////////////////////////////////////////
@@ -1439,26 +1501,68 @@
/datum/global_iterator/mecha_internal_damage // processing internal damage
process(var/obj/mecha/mecha)
- if(!mecha.internal_damage)
+ if(!mecha.hasInternalDamage())
return src.stop()
var/datum/gas_mixture/int_tank_air = mecha.return_air()
- if(mecha.internal_damage & MECHA_INT_FIRE)
- if(mecha.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.internal_damage&MECHA_INT_TANK_BREACH))
- mecha.internal_damage |= MECHA_INT_TANK_BREACH
- if(!(mecha.internal_damage & MECHA_INT_TEMP_CONTROL) && prob(5))
- mecha.internal_damage &= ~MECHA_INT_FIRE
- mecha.occupant_message("Internal fire extinquished.")
+ if(mecha.hasInternalDamage(MECHA_INT_FIRE))
+ if(mecha.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)))
+ mecha.setInternalDamage(MECHA_INT_TANK_BREACH)
+ if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5))
+ mecha.clearInternalDamage(MECHA_INT_FIRE)
if(int_tank_air && int_tank_air.volume>0) //heat the air_contents
int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15))
if(int_tank_air.temperature>mecha.max_temperature/2)//we assume that the tank contents include mecha pilot compartment.
- mecha.take_damage(1,"fire")
- if(mecha.internal_damage & MECHA_INT_TEMP_CONTROL) //stop the mecha_preserve_temp loop datum
+ mecha.take_damage(4/round(mecha.max_temperature/int_tank_air.temperature,0.1),"fire")
+ if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum
mecha.pr_int_temp_processor.stop()
- if(mecha.internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank
+ if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank
if(int_tank_air)
var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10)
if(mecha.loc && hascall(mecha.loc,"assume_air"))
mecha.loc.assume_air(leaked_gas)
else
del(leaked_gas)
+ if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
+ if(mecha.get_charge())
+ mecha.spark_system.start()
+ mecha.cell.charge -= min(20,mecha.cell.charge)
+ mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge)
return
+
+
+/////////////
+
+//debug
+/*
+/obj/mecha/verb/test_int_damage()
+ set name = "Test internal damage"
+ set category = "Exosuit Interface"
+ set src in view(0)
+ if(!occupant) return
+ if(usr!=occupant)
+ return
+ var/output = {"
+
+
+
+ Set:
+ MECHA_INT_FIRE
+ MECHA_INT_TEMP_CONTROL
+ MECHA_INT_SHORT_CIRCUIT
+ MECHA_INT_TANK_BREACH
+ MECHA_INT_CONTROL_LOST
+
+ Clear:
+ MECHA_INT_FIRE
+ MECHA_INT_TEMP_CONTROL
+ MECHA_INT_SHORT_CIRCUIT
+ MECHA_INT_TANK_BREACH
+ MECHA_INT_CONTROL_LOST
+
+ "}
+
+ occupant << browse(output, "window=ex_debug")
+ //src.health = initial(src.health)/2.2
+ //src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
+ return
+*/
\ No newline at end of file
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 589802853e..0642adcb13 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -120,7 +120,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Peripherals control module is installed"),
//8
- list("key"=/obj/item/mecha_parts/circuitboard/ripley/peripherals,
+ list("key"=/obj/item/weapon/circuitboard/mecha/ripley/peripherals,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Central control module is secured"),
//9
@@ -128,7 +128,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Central control module is installed"),
//10
- list("key"=/obj/item/mecha_parts/circuitboard/ripley/main,
+ list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is adjusted"),
//11
@@ -187,7 +187,7 @@
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
else
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/mecha_parts/circuitboard/ripley/main(get_turf(holder))
+ new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
if(8)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
@@ -199,7 +199,7 @@
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
else
user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/mecha_parts/circuitboard/ripley/peripherals(get_turf(holder))
+ new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
if(6)
if(diff==FORWARD)
user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
@@ -314,7 +314,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Targeting module is installed"),
//12
- list("key"=/obj/item/mecha_parts/circuitboard/gygax/targeting,
+ list("key"=/obj/item/weapon/circuitboard/mecha/gygax/targeting,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Peripherals control module is secured"),
//13
@@ -322,7 +322,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Peripherals control module is installed"),
//14
- list("key"=/obj/item/mecha_parts/circuitboard/gygax/peripherals,
+ list("key"=/obj/item/weapon/circuitboard/mecha/gygax/peripherals,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Central control module is secured"),
//15
@@ -330,7 +330,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Central control module is installed"),
//16
- list("key"=/obj/item/mecha_parts/circuitboard/gygax/main,
+ list("key"=/obj/item/weapon/circuitboard/mecha/gygax/main,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is adjusted"),
//17
@@ -389,7 +389,7 @@
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
else
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
- new /obj/item/mecha_parts/circuitboard/gygax/main(get_turf(holder))
+ new /obj/item/weapon/circuitboard/mecha/gygax/main(get_turf(holder))
if(14)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
@@ -401,7 +401,7 @@
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
else
user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
- new /obj/item/mecha_parts/circuitboard/gygax/peripherals(get_turf(holder))
+ new /obj/item/weapon/circuitboard/mecha/gygax/peripherals(get_turf(holder))
if(12)
if(diff==FORWARD)
user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
@@ -413,7 +413,7 @@
user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
else
user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
- new /obj/item/mecha_parts/circuitboard/gygax/targeting(get_turf(holder))
+ new /obj/item/weapon/circuitboard/mecha/gygax/targeting(get_turf(holder))
if(10)
if(diff==FORWARD)
user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
@@ -512,9 +512,9 @@
list("key"=/obj/item/weapon/wrench),//5
list("key"=/obj/item/stack/sheet/metal),//6
list("key"=/obj/item/weapon/screwdriver),//7
- list("key"=/obj/item/mecha_parts/circuitboard/firefighter/peripherals),//8
+ list("key"=/obj/item/weapon/circuitboard/mecha/firefighter/peripherals),//8
list("key"=/obj/item/weapon/screwdriver),//9
- list("key"=/obj/item/mecha_parts/circuitboard/ripley/main),//10
+ list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main),//10
list("key"=/obj/item/weapon/wirecutters),//11
list("key"=/obj/item/weapon/cable_coil),//12
list("key"=/obj/item/weapon/screwdriver),//13
@@ -600,11 +600,11 @@
list("key"=/obj/item/weapon/bikehorn),//3
list("key"=/obj/item/clothing/mask/gas/clown_hat),//4
list("key"=/obj/item/weapon/bikehorn),//5
- list("key"=/obj/item/mecha_parts/circuitboard/honker/targeting),//6
+ list("key"=/obj/item/weapon/circuitboard/mecha/honker/targeting),//6
list("key"=/obj/item/weapon/bikehorn),//7
- list("key"=/obj/item/mecha_parts/circuitboard/honker/peripherals),//8
+ list("key"=/obj/item/weapon/circuitboard/mecha/honker/peripherals),//8
list("key"=/obj/item/weapon/bikehorn),//9
- list("key"=/obj/item/mecha_parts/circuitboard/honker/main),//10
+ list("key"=/obj/item/weapon/circuitboard/mecha/honker/main),//10
list("key"=/obj/item/weapon/bikehorn),//11
)
@@ -681,11 +681,11 @@
list("key"=/obj/item/weapon/screwdriver),//9
list("key"=/obj/item/weapon/stock_parts/scanning_module/adv),//10
list("key"=/obj/item/weapon/screwdriver),//11
- list("key"=/obj/item/mecha_parts/circuitboard/durand/targeting),//12
+ list("key"=/obj/item/weapon/circuitboard/mecha/durand/targeting),//12
list("key"=/obj/item/weapon/screwdriver),//13
- list("key"=/obj/item/mecha_parts/circuitboard/durand/peripherals),//14
+ list("key"=/obj/item/weapon/circuitboard/mecha/durand/peripherals),//14
list("key"=/obj/item/weapon/screwdriver),//15
- list("key"=/obj/item/mecha_parts/circuitboard/durand/main),//16
+ list("key"=/obj/item/weapon/circuitboard/mecha/durand/main),//16
list("key"=/obj/item/weapon/wirecutters),//17
list("key"=/obj/item/weapon/cable_coil),//18
list("key"=/obj/item/weapon/screwdriver),//19
@@ -768,4 +768,182 @@
return 1
action(atom/used_atom,mob/user as mob)
- return check_all_steps(used_atom,user)
\ No newline at end of file
+ return check_all_steps(used_atom,user)
+
+
+
+
+/datum/construction/mecha/odysseus_chassis
+ steps = list(list("key"=/obj/item/mecha_parts/part/odysseus_torso),//1
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_arm),//2
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_arm),//3
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_leg),//4
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_leg)//5
+ )
+
+ 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)
+
+ spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/odysseus(const_holder)
+ const_holder.density = 1
+ spawn()
+ del src
+ feedback_inc("mecha_odysseus_created",1)
+ return
+
+
+/datum/construction/reversible/mecha/odysseus
+ result = "/obj/mecha/medical/odysseus"
+ steps = list(
+ //1
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=/obj/item/weapon/wrench,
+ "desc"="External armor is wrenched."),
+ //2
+ list("key"=/obj/item/weapon/wrench,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="External armor is installed."),
+ //3
+ list("key"=/obj/item/stack/sheet/r_metal,
+ "backkey"=/obj/item/weapon/weldingtool,
+ "desc"="Internal armor is welded."),
+ //4
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=/obj/item/weapon/wrench,
+ "desc"="Internal armor is wrenched"),
+ //5
+ list("key"=/obj/item/weapon/wrench,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Internal armor is installed"),
+ //6
+ list("key"=/obj/item/stack/sheet/metal,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="Peripherals control module is secured"),
+ //7
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Peripherals control module is installed"),
+ //8
+ list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/peripherals,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="Central control module is secured"),
+ //9
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Central control module is installed"),
+ //10
+ list("key"=/obj/item/weapon/circuitboard/mecha/odysseus/main,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="The wiring is adjusted"),
+ //11
+ list("key"=/obj/item/weapon/wirecutters,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="The wiring is added"),
+ //12
+ list("key"=/obj/item/weapon/cable_coil,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="The hydraulic systems are active."),
+ //13
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/wrench,
+ "desc"="The hydraulic systems are connected."),
+ //14
+ list("key"=/obj/item/weapon/wrench,
+ "desc"="The hydraulic systems are disconnected.")
+ )
+
+ action(atom/used_atom,mob/user as mob)
+ return check_step(used_atom,user)
+
+ custom_action(index, diff, atom/used_atom, mob/user)
+ if(!..())
+ return 0
+
+ //TODO: better messages.
+ switch(index)
+ if(14)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
+ coil.amount = 4
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ del used_atom
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/odysseus/main(get_turf(holder))
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ del used_atom
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/odysseus/peripherals(get_turf(holder))
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
+ MS.amount = 5
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
+ else
+ user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
+ var/obj/item/stack/sheet/r_metal/MS = new /obj/item/stack/sheet/r_metal(get_turf(holder))
+ MS.amount = 5
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
+ return 1
\ No newline at end of file
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 3299550b25..a83a648dbc 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -24,8 +24,10 @@
for(var/obj/item/mecha_tracking/TR in world)
var/answer = TR.get_mecha_info()
if(answer)
- dat += {"
[answer]
+ dat += {"
[answer]
+ Send message
Show exosuit log | (EMP pulse)
"}
+
if(screen==1)
dat += "Log contents
"
dat += "Return
"
@@ -41,11 +43,19 @@
Topic(href, href_list)
if(..())
return
+ var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
+ if(href_list["send_message"])
+ var/obj/item/mecha_tracking/MT = filter.getObj("send_message")
+ var/message = strip_html_simple(input(usr,"Input message","Transmit message") as text)
+ var/obj/mecha/M = MT.in_mecha()
+ if(trim(message) && M)
+ M.occupant_message(message)
+ return
if(href_list["shock"])
- var/obj/item/mecha_tracking/MT = locate(href_list["shock"])
+ var/obj/item/mecha_tracking/MT = filter.getObj("shock")
MT.shock()
if(href_list["get_log"])
- var/obj/item/mecha_tracking/MT = locate(href_list["get_log"])
+ var/obj/item/mecha_tracking/MT = filter.getObj("get_log")
stored_data = MT.get_mecha_log()
screen = 1
if(href_list["return"])
@@ -92,12 +102,12 @@
proc/in_mecha()
if(istype(src.loc, /obj/mecha))
- return 1
+ return src.loc
return 0
proc/shock()
- if(src.in_mecha())
- var/obj/mecha/M = src.loc
+ var/obj/mecha/M = in_mecha()
+ if(M)
M.emp_act(2)
del(src)
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 66d2e7dadf..bdf76b9678 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -330,15 +330,66 @@
construction_cost = list("metal"=20000,"plasma"=10000)
origin_tech = "materials=5;bluespace=3;magnets=3"
+///////// Odysseus
+
+
+/obj/item/mecha_parts/chassis/odysseus
+ name = "Odysseus Chassis"
+
+ New()
+ ..()
+ construct = new /datum/construction/mecha/odysseus_chassis(src)
+
+/obj/item/mecha_parts/part/odysseus_torso
+ name="Odysseus Torso"
+ desc="A torso part of Odysseus. Contains power unit, processing core and life support systems."
+ icon_state = "ripley_harness"
+ origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
+ construction_time = 200
+ construction_cost = list("metal"=30000,"glass"=10000)
+
+/obj/item/mecha_parts/part/odysseus_left_arm
+ name="Odysseus Left Arm"
+ desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
+ icon_state = "ripley_l_arm"
+ origin_tech = "programming=2;materials=2;engineering=2"
+ construction_time = 150
+ construction_cost = list("metal"=20000)
+
+/obj/item/mecha_parts/part/odysseus_right_arm
+ name="Odysseus Right Arm"
+ desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
+ icon_state = "ripley_r_arm"
+ origin_tech = "programming=2;materials=2;engineering=2"
+ construction_time = 150
+ construction_cost = list("metal"=20000)
+
+/obj/item/mecha_parts/part/odysseus_left_leg
+ name="Odysseus Left Leg"
+ desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
+ icon_state = "ripley_l_leg"
+ origin_tech = "programming=2;materials=2;engineering=2"
+ construction_time = 150
+ construction_cost = list("metal"=2500)
+
+/obj/item/mecha_parts/part/odysseus_right_leg
+ name="Odysseus Right Leg"
+ desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
+ icon_state = "ripley_r_leg"
+ origin_tech = "programming=2;materials=2;engineering=2"
+ construction_time = 150
+ construction_cost = list("metal"=2500)
+
+
///////// Circuitboards
-/obj/item/mecha_parts/circuitboard
+/obj/item/weapon/circuitboard/mecha
name = "Exosuit Circuit board"
icon = 'module.dmi'
icon_state = "std_mod"
item_state = "electronic"
- flags = FPRINT | TABLEPASS| CONDUCT
+ flags = FPRINT | TABLEPASS | CONDUCT
force = 5.0
w_class = 2.0
throwforce = 5.0
@@ -407,4 +458,15 @@
name = "Circuit board (H.O.N.K Central Control module)"
icon_state = "mainboard"
+ odysseus
+ origin_tech = "programming=3"
+
+ odysseus/peripherals
+ name = "Circuit board (Odysseus Peripherals Control module)"
+ icon_state = "mcontroller"
+
+ odysseus/main
+ name = "Circuit board (Odysseus Central Control module)"
+ icon_state = "mainboard"
+
diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm
new file mode 100644
index 0000000000..851c613f8a
--- /dev/null
+++ b/code/game/mecha/medical/medical.dm
@@ -0,0 +1,22 @@
+/obj/mecha/medical/New()
+ ..()
+ new /obj/item/mecha_tracking(src)
+ return
+
+
+/obj/mecha/medical/mechturn(direction)
+ dir = direction
+ playsound(src,'mechmove01.ogg',40,1)
+ return 1
+
+/obj/mecha/medical/mechstep(direction)
+ var/result = step(src,direction)
+ if(result)
+ playsound(src,'mechstep.ogg',25,1)
+ return result
+
+/obj/mecha/medical/mechsteprand()
+ var/result = step_rand(src)
+ if(result)
+ playsound(src,'mechstep.ogg',25,1)
+ return result
\ No newline at end of file
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
new file mode 100644
index 0000000000..ff19add9f7
--- /dev/null
+++ b/code/game/mecha/medical/odysseus.dm
@@ -0,0 +1,99 @@
+/obj/mecha/medical/odysseus
+ desc = "Odysseus Medical Exosuit"
+ name = "Odysseus"
+ icon_state = "placeholder-1"
+ step_in = 2
+ max_temperature = 1500
+ health = 120
+ wreckage = null
+ internal_damage_threshold = 35
+ deflect_chance = 15
+ step_energy_drain = 6
+ var/obj/item/clothing/glasses/hud/health/mech/hud
+
+ New()
+ ..()
+ hud = new /obj/item/clothing/glasses/hud/health/mech(src)
+ return
+
+ moved_inside(var/mob/living/carbon/human/H as mob)
+ if(..())
+ if(H.glasses)
+ occupant_message("[H.glasses] prevent you from using [src] [hud]")
+ else
+ H.glasses = hud
+ return 1
+ else
+ return 0
+
+ go_out()
+ if(ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ if(H.glasses == hud)
+ H.glasses = null
+ ..()
+ return
+/*
+ verb/set_perspective()
+ set name = "Set client perspective."
+ set category = "Exosuit Interface"
+ set src = usr.loc
+ var/perspective = input("Select a perspective type.",
+ "Client perspective",
+ occupant.client.perspective) in list(MOB_PERSPECTIVE,EYE_PERSPECTIVE)
+ world << "[perspective]"
+ occupant.client.perspective = perspective
+ return
+
+ verb/toggle_eye()
+ set name = "Toggle eye."
+ set category = "Exosuit Interface"
+ set src = usr.loc
+ if(occupant.client.eye == occupant)
+ occupant.client.eye = src
+ else
+ occupant.client.eye = occupant
+ world << "[occupant.client.eye]"
+ return
+*/
+
+//TODO - Check documentation for client.eye and client.perspective...
+/obj/item/clothing/glasses/hud/health/mech
+ name = "Integrated Medical Hud"
+
+
+ process_hud(var/mob/M)
+/*
+ world<< "view(M)"
+ for(var/mob/mob in view(M))
+ world << "[mob]"
+ world<< "view(M.client)"
+ for(var/mob/mob in view(M.client))
+ world << "[mob]"
+ world<< "view(M.loc)"
+ for(var/mob/mob in view(M.loc))
+ world << "[mob]"
+*/
+
+ if(!M || M.stat || !(M in view(M))) return
+ if(!M.client) return
+ var/client/C = M.client
+ var/icon/tempHud = 'hud.dmi'
+ for(var/mob/living/carbon/human/patient in view(M.loc))
+ if(M.see_invisible < patient.invisibility)
+ continue
+ var/foundVirus = 0
+ for(var/datum/disease/D in patient.viruses)
+ if(!D.hidden[SCANNER])
+ foundVirus++
+ if(patient.virus2)
+ foundVirus++
+ C.images += image(tempHud,patient,"hud[RoundHealth(patient.health)]")
+ if(patient.stat == 2)
+ C.images += image(tempHud,patient,"huddead")
+ else if(patient.alien_egg_flag)
+ C.images += image(tempHud,patient,"hudxeno")
+ else if(foundVirus)
+ C.images += image(tempHud,patient,"hudill")
+ else
+ C.images += image(tempHud,patient,"hudhealthy")
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 3021a0bea5..c682561e67 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -47,7 +47,6 @@
var/light_consumption = 0 //not used
var/equip_consumption = 0 //not used
var/environ_consumption = 0 //not used
- var/emagged = 0
var/wiresexposed = 0
var/apcwires = 15
netnum = -1 // set so that APCs aren't found as powernet nodes
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 6774671f16..917744f93f 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -105,7 +105,6 @@ display round(lastgen) and plasmatank amount
board_path = "/obj/item/weapon/circuitboard/pacman"
coin_left = 0 // How much is left of the coin
time_per_coin = 1
- emagged = 0
heat = 0
New()
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 96c6068fb6..a2e21c3a85 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -493,7 +493,7 @@ datum
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/ripley/main"
+ build_path = "/obj/item/weapon/circuitboard/mecha/ripley/main"
ripley_peri
name = "Circuit Design (APLU \"Ripley\" Peripherals Control module)"
@@ -502,7 +502,7 @@ datum
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/ripley/peripherals"
+ build_path = "/obj/item/weapon/circuitboard/mecha/ripley/peripherals"
gygax_main
name = "Circuit Design (\"Gygax\" Central Control module)"
@@ -511,7 +511,7 @@ datum
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/gygax/main"
+ build_path = "/obj/item/weapon/circuitboard/mecha/gygax/main"
gygax_peri
name = "Circuit Design (\"Gygax\" Peripherals Control module)"
@@ -520,7 +520,7 @@ datum
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/gygax/peripherals"
+ build_path = "/obj/item/weapon/circuitboard/mecha/gygax/peripherals"
gygax_targ
name = "Circuit Design (\"Gygax\" Weapons & Targeting Control module)"
@@ -529,7 +529,7 @@ datum
req_tech = list("programming" = 4, "combat" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/gygax/targeting"
+ build_path = "/obj/item/weapon/circuitboard/mecha/gygax/targeting"
durand_main
name = "Circuit Design (\"Durand\" Central Control module)"
@@ -538,7 +538,7 @@ datum
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/durand/main"
+ build_path = "/obj/item/weapon/circuitboard/mecha/durand/main"
durand_peri
name = "Circuit Design (\"Durand\" Peripherals Control module)"
@@ -547,7 +547,7 @@ datum
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/durand/peripherals"
+ build_path = "/obj/item/weapon/circuitboard/mecha/durand/peripherals"
durand_targ
name = "Circuit Design (\"Durand\" Weapons & Targeting Control module)"
@@ -556,7 +556,7 @@ datum
req_tech = list("programming" = 4, "combat" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/durand/targeting"
+ build_path = "/obj/item/weapon/circuitboard/mecha/durand/targeting"
honker_main
@@ -566,7 +566,7 @@ datum
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/honker/main"
+ build_path = "/obj/item/weapon/circuitboard/mecha/honker/main"
honker_peri
name = "Circuit Design (\"H.O.N.K\" Peripherals Control module)"
@@ -575,7 +575,7 @@ datum
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/honker/peripherals"
+ build_path = "/obj/item/weapon/circuitboard/mecha/honker/peripherals"
honker_targ
name = "Circuit Design (\"H.O.N.K\" Weapons & Targeting Control module)"
@@ -584,7 +584,7 @@ datum
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
- build_path = "/obj/item/mecha_parts/circuitboard/honker/targeting"
+ build_path = "/obj/item/weapon/circuitboard/mecha/honker/targeting"
////////////////////////////////////////
/////////// Mecha Equpment /////////////
@@ -654,14 +654,14 @@ datum
req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3)
build_path = "/obj/item/mecha_parts/mecha_equipment/gravcatapult"
- /*mech_repair_droid
+ 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, "engineering" = 3)
build_path = "/obj/item/mecha_parts/mecha_equipment/repair_droid"
- */
+
mech_plasma_generator
name = "Exosuit Module Design (Plasma Converter Module)"
desc = "Exosuit-mounted plasma converter."
@@ -670,6 +670,32 @@ datum
req_tech = list("plasmatech" = 2, "powerstorage"= 2, "engineering" = 2)
build_path = "/obj/item/mecha_parts/mecha_equipment/plasma_generator"
+ mech_energy_relay
+ name = "Exosuit Module Design (Tesla Energy Relay)"
+ desc = "Tesla Energy Relay"
+ id = "mech_energy_relay"
+ build_type = MECHFAB
+ req_tech = list("magnets" = 4, "syndicate" = 3)
+ build_path = "/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay"
+
+ mech_ccw_armor
+ name = "Exosuit Module Design(Reactive Armor Booster Module)"
+ desc = "Exosuit-mounted armor booster."
+ id = "mech_ccw_armor"
+ build_type = MECHFAB
+ req_tech = list("materials" = 5, "combat" = 4)
+ build_path = "/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster"
+
+ mech_proj_armor
+ name = "Exosuit Module Design(Reflective Armor Booster Module)"
+ desc = "Exosuit-mounted armor booster."
+ id = "mech_proj_armor"
+ build_type = MECHFAB
+ req_tech = list("materials" = 5, "combat" = 5, "engineering"=3)
+ build_path = "/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster"
+
+
+
////////////////////////////////////////
//////////Disk Construction Disks///////
////////////////////////////////////////
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 3bb1649408..fa6178bdee 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -44,7 +44,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
screen = 1.0 //Which screen is currently showing.
id = 0 //ID of the computer (for server restrictions).
sync = 1 //If sync = 0, it doesn't show up on Server Control Console
- emagged = 0 //Turns off ID check
req_access = list(access_tox) //Data and setting manipulation requires scientist access.
diff --git a/html/changelog.html b/html/changelog.html
index fde880b037..0244c43582 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -54,6 +54,24 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit tho. Thanks. -->
+23 December 2011
+
+ - ConstantA updated:
+
+ - Mech Fabricators now require robotics ID to operate. Emag removes this restriction.
+ - Added Odysseus Medical Exosuit. Has integrated Medical Hud and ability to mount medical modules.
+ - Added Sleeper Medical module for exosuits. Similar to common sleepers, but no ability to inject reagents.
+ - Added Cable Layer module for exosuits. Load with cable (attack cable with it), activate, walk over dismantled floor.
+ - Added another exosuit internal damage type - short circuit. Short-circuited exosuits will drain powercell charge and power relay won't work.
+ - You should be able to send messages to exosuit operators using Exosuit Control Console
+ - Gygax armour and module capacity nerfed.
+ - Exosuit weapon recharge time raised.
+ - Bugfix: EMP actually drains exosuit cell and damages it
+
+
+
+
+
21 December 2011
diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi
index 9a4e0b686f..01f731f1b6 100644
Binary files a/icons/mob/mecha.dmi and b/icons/mob/mecha.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index d612f77e42..83b54ca498 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -60,6 +60,7 @@
#define FILE_DIR "code/game/mecha/equipment"
#define FILE_DIR "code/game/mecha/equipment/tools"
#define FILE_DIR "code/game/mecha/equipment/weapons"
+#define FILE_DIR "code/game/mecha/medical"
#define FILE_DIR "code/game/mecha/working"
#define FILE_DIR "code/game/objects"
#define FILE_DIR "code/game/objects/alien"
@@ -241,6 +242,7 @@
#include "code\datums\diseases\wizarditis.dm"
#include "code\datums\diseases\xeno_transformation.dm"
#include "code\datums\helper_datums\construction_datum.dm"
+#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\global_iterator.dm"
#include "code\datums\helper_datums\teleport.dm"
@@ -527,6 +529,8 @@
#include "code\game\mecha\equipment\mecha_equipment.dm"
#include "code\game\mecha\equipment\tools\tools.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
+#include "code\game\mecha\medical\medical.dm"
+#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\working\firefighter.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"