diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 57470a7433..f1f806cf79 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -871,13 +871,13 @@
/obj/item/mecha_parts/mecha_equipment/tool/sleeper
name = "Mounted Sleeper"
- desc = "Mounted Sleeper"
+ desc = "Mounted Sleeper. (Can be attached to: Medical Exosuits)"
icon = 'Cryogenic2.dmi'
icon_state = "sleeper_0"
origin_tech = "programming=2;biotech=3"
energy_drain = 20
range = MELEE
- construction_cost = list("metal"=5000,"silver"=100,"glass"=10000)
+ construction_cost = list("metal"=5000,"glass"=10000)
reliability = 1000
equip_cooldown = 20
var/mob/living/carbon/occupant = null
@@ -1039,7 +1039,7 @@
if(occupant.reagents)
for(var/datum/reagent/R in occupant.reagents.reagent_list)
if(R.volume > 0)
- . += "[R]: [round(R.volume,0.01)]"
+ . += "[R]: [round(R.volume,0.01)]
"
return . || "None"
@@ -1110,6 +1110,12 @@
cable.amount = 0
..()
+ can_attach(obj/mecha/working/M)
+ if(..())
+ if(istype(M))
+ return 1
+ return 0
+
attach()
..()
event = chassis.events.addEvent("onMove",src,"layCable")
@@ -1179,7 +1185,7 @@
return
proc/use_cable(amount)
- if(!equip_ready && (!cable || cable.amount<1))
+ if(!cable || cable.amount<1)
set_ready_state(1)
chassis.occupant_message("Cable depleted, [src] deactivated.")
chassis.log_message("Cable depleted, [src] deactivated.")
@@ -1229,6 +1235,264 @@
last_piece = NC
return 1
+/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
+ name = "Syringe Gun"
+ desc = "Exosuit-mounted chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur. (Can be attached to: Medical Exosuits)"
+ icon = 'gun.dmi'
+ icon_state = "syringegun"
+ var/list/syringes
+ var/list/known_reagents
+ var/list/processed_reagents
+ var/max_syringes = 10
+ var/max_volume = 75 //max reagent volume
+ var/synth_speed = 5 //[num] reagent units per cycle
+ energy_drain = 10
+ var/mode = 0 //0 - fire syringe, 1 - analyze reagents.
+ var/datum/global_iterator/mech_synth/synth
+ range = MELEE|RANGED
+ equip_cooldown = 10
+ origin_tech = "materials=3;biotech=4;magnets=4;programming=3"
+ construction_time = 200
+ construction_cost = list("metal"=3000,"gold"=2000,"plasma"=4000)
+
+ New()
+ ..()
+ flags |= NOREACT
+ syringes = new
+ known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Anti-Toxin (Dylovene)")
+ processed_reagents = new
+ create_reagents(max_volume)
+ synth = new (list(src),0)
+
+ detach()
+ synth.stop()
+ return ..()
+
+ critfail()
+ ..()
+ flags &= ~NOREACT
+ return
+
+ can_attach(obj/mecha/medical/M)
+ if(..())
+ if(istype(M))
+ return 1
+ return 0
+
+ get_equip_info()
+ var/output = ..()
+ if(output)
+ return "[output] \[[mode? "Analyze" : "Launch"]\]
\[Syringes: [syringes.len]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]
Reagents list"
+ return
+
+ action(atom/movable/target)
+ if(!action_checks(target))
+ return
+ if(istype(target,/obj/item/weapon/reagent_containers/syringe))
+ return load_syringe(target)
+ if(mode)
+ return analyze_reagents(target)
+ if(!syringes.len)
+ chassis.occupant_message("No syringes loaded.")
+ return
+ if(reagents.total_volume<=0)
+ chassis.occupant_message("No available reagents to load syringe with.")
+ return
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ var/turf/trg = get_turf(target)
+ var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
+ S.forceMove(get_turf(chassis))
+ reagents.trans_to(S, min(S.volume, reagents.total_volume))
+ syringes -= S
+ S.icon = 'chemical.dmi'
+ S.icon_state = "syringeproj"
+ playsound(chassis, 'syringeproj.ogg', 50, 1)
+ spawn(-1)
+ src = null //if src is deleted, still process the syringe
+ for(var/i=0, i<6, i++)
+ if(!S)
+ break
+ if(step_towards(S,trg))
+ var/list/mobs = new
+ for(var/mob/living/carbon/M in S.loc)
+ mobs += M
+ var/mob/living/carbon/M = safepick(mobs)
+ if(M)
+ S.icon_state = initial(S.icon_state)
+ S.icon = initial(S.icon)
+ S.reagents.trans_to(M, S.reagents.total_volume)
+ M.take_organ_damage(5)
+ S.visible_message(" [M] was hit by the syringe!")
+ break
+ else if(S.loc == trg)
+ S.icon_state = initial(S.icon_state)
+ S.icon = initial(S.icon)
+ S.update_icon()
+ break
+ else
+ S.icon_state = initial(S.icon_state)
+ S.icon = initial(S.icon)
+ S.update_icon()
+ break
+ sleep(1)
+ do_after_cooldown()
+ return 1
+
+ Topic(href,href_list)
+ ..()
+ var/datum/topic_input/filter = new (href,href_list)
+ if(filter.get("toggle_mode"))
+ mode = !mode
+ update_equip_info()
+ return
+ if(filter.get("select_reagents"))
+ processed_reagents.len = 0
+ var/m = 0
+ for(var/i=1 to known_reagents.len)
+ if(m>synth_speed)
+ break
+ var/reagent = filter.get("reagent_[i]")
+ if(reagent && (reagent in known_reagents))
+ chassis.occupant_message("[known_reagents[reagent]] added to production")
+ processed_reagents += reagent
+ m++
+ if(processed_reagents.len)
+ synth.start()
+ chassis.occupant_message("Reagent processing started.")
+ return
+ if(filter.get("show_reagents"))
+ chassis.occupant << browse(get_reagents_page(),"window=msyringegun")
+ if(filter.get("purge_reagent"))
+ var/reagent = filter.get("purge_reagent")
+ if(reagent)
+ reagents.del_reagent(reagent)
+ return
+ if(filter.get("purge_all"))
+ reagents.clear_reagents()
+ return
+ return
+
+ proc/get_reagents_page()
+ var/output = {"
+
+ Reagent Synthesizer
+
+
+
+
+ Current reagents:
+
+ [get_current_reagents() || "None"]
+
+ Reagents production:
+
+ [get_reagents_form()]
+
+
+
+ "}
+ return output
+
+ proc/get_reagents_form()
+ var/r_list = get_reagents_list()
+ var/inputs
+ if(r_list)
+ inputs += ""
+ inputs += ""
+ inputs += ""
+ var/output = {"
+ [r_list? "Only the first [synth_speed] selected reagent\s will be added to production" : null]
+ "}
+ return output
+
+ proc/get_reagents_list()
+ var/output
+ for(var/i=1 to known_reagents.len)
+ var/reagent_id = known_reagents[i]
+ output += {" [known_reagents[reagent_id]]
"}
+ return output
+
+ proc/get_current_reagents()
+ var/output
+ for(var/datum/reagent/R in reagents.reagent_list)
+ if(R.volume > 0)
+ output += "[R]: [round(R.volume,0.001)] - Purge Reagent
"
+ if(output)
+ output += "Total: [round(reagents.total_volume,0.001)]/[reagents.maximum_volume] - Purge All"
+ return output
+
+ proc/load_syringe(obj/item/weapon/reagent_containers/syringe/S)
+ if(syringes.lenNo reagent info gained from [A].")
+ return 0
+ chassis.occupant_message("Analyzing reagents...")
+ for(var/datum/reagent/R in A.reagents.reagent_list)
+ if(R.reagent_state == 2 && add_known_reagent(R.id,R.name))
+ chassis.occupant_message("Reagent analyzed, identified as [R.name] and added to database.")
+ send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form())
+ chassis.occupant_message("Analyzis complete.")
+ return 1
+
+ proc/add_known_reagent(r_id,r_name)
+ set_ready_state(0)
+ do_after_cooldown()
+ if(!(r_id in known_reagents))
+ known_reagents += r_id
+ known_reagents[r_id] = r_name
+ return 1
+ return 0
+
+
+ update_equip_info()
+ if(..())
+ send_byjax(chassis.occupant,"msyringegun.browser","reagents",get_current_reagents())
+ send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form())
+ return 1
+ return
+
+ on_reagent_change()
+ ..()
+ update_equip_info()
+ return
+
+/datum/global_iterator/mech_synth
+ delay = 100
+
+ process(var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/S)
+ if(!S.processed_reagents.len || S.reagents.total_volume >= S.reagents.maximum_volume)
+ S.chassis.occupant_message("Reagent processing stopped.")
+ return stop()
+ if(anyprob(S.reliability))
+ S.critfail()
+ var/amount = S.synth_speed / S.processed_reagents.len
+ for(var/reagent in S.processed_reagents)
+ S.reagents.add_reagent(reagent,amount)
+ S.chassis.use_power(S.energy_drain*10)
+ return 1
+
+
/*
/obj/item/mecha_parts/mecha_equipment/defence_shocker
name = "Exosuit Defence Shocker"
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index d9bb91014f..ad2dcca0c1 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -56,10 +56,12 @@
"Odysseus"=list(
/obj/item/mecha_parts/chassis/odysseus,
/obj/item/mecha_parts/part/odysseus_torso,
+ /obj/item/mecha_parts/part/odysseus_head,
/obj/item/mecha_parts/part/odysseus_left_arm,
/obj/item/mecha_parts/part/odysseus_right_arm,
/obj/item/mecha_parts/part/odysseus_left_leg,
- /obj/item/mecha_parts/part/odysseus_right_leg
+ /obj/item/mecha_parts/part/odysseus_right_leg,
+ /obj/item/mecha_parts/part/odysseus_armour
),
"Gygax"=list(
@@ -97,6 +99,7 @@
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,
/obj/item/mecha_parts/mecha_equipment/tool/sleeper,
+ /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,
///obj/item/mecha_parts/mecha_equipment/repair_droid,
/obj/item/mecha_parts/mecha_equipment/plasma_generator,
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index a818e7ab3a..65b23540ed 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -74,13 +74,10 @@
radio.icon_state = icon_state
radio.subspace_transmission = 1
src.icon_state += "-open"
- /*
- src.air_contents.volume = gas_tank_volume //liters
- src.air_contents.temperature = T20C
- src.air_contents.oxygen = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
- */
- internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
+ if(!add_airtank())
+ removeVerb(/obj/mecha/verb/connect_to_port)
+ removeVerb(/obj/mecha/verb/toggle_internal_tank)
src.spark_system.set_up(2, 0, src)
src.spark_system.attach(src)
cell = new(src)
@@ -93,8 +90,8 @@
// pr_location_temp_check = new /datum/global_iterator/mecha_location_temp_check(list(src))
pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0)
- src.verbs -= /obj/mecha/verb/disconnect_from_port
- src.verbs -= /atom/movable/verb/pull
+ removeVerb(/obj/mecha/verb/disconnect_from_port)
+ removeVerb(/atom/movable/verb/pull)
src.log_message("[src.name] created.")
src.loc.Entered(src)
return
@@ -108,6 +105,16 @@
////// Helpers /////////
////////////////////////
+/obj/mecha/proc/removeVerb(verb_path)
+ verbs -= verb_path
+
+/obj/mecha/proc/addVerb(verb_path)
+ verbs += verb_path
+
+/obj/mecha/proc/add_airtank()
+ internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
+ return internal_tank
+
/obj/mecha/proc/do_after(delay as num)
sleep(delay)
if(src)
@@ -705,6 +712,12 @@
//////// Atmospheric stuff ////////
/////////////////////////////////////
+/obj/mecha/proc/get_turf_air()
+ var/turf/T = get_turf(src)
+ if(T)
+ . = T.return_air()
+ return
+
/obj/mecha/remove_air(amount)
if(use_internal_tank && internal_tank)
return internal_tank.air_contents.remove(amount)
@@ -715,19 +728,25 @@
return
/obj/mecha/return_air()
- if(internal_tank)
- return internal_tank.return_air()
+ if(use_internal_tank && internal_tank)
+ . = internal_tank.return_air()
+ else
+ . = get_turf_air()
return
/obj/mecha/proc/return_pressure()
- if(internal_tank)
- return internal_tank.return_pressure()
- return 0
+ . = 0
+ var/datum/gas_mixture/gm = return_air()
+ if(gm)
+ . = gm.return_pressure()
+ return
/obj/mecha/proc/return_temperature()
- if(internal_tank)
- return internal_tank.return_temperature()
- return 0
+ . = 0
+ var/datum/gas_mixture/gm = return_air()
+ if(gm)
+ . = gm.return_temperature()
+ return
/obj/mecha/proc/connect(obj/machinery/atmospherics/portables_connector/new_port)
//Make sure not already connected to something else
@@ -1387,6 +1406,7 @@
else
src.occupant_message("Recalibration failed.")
src.log_message("Recalibration of coordination system failed with 1 error.",1)
+
//debug
/*
if(href_list["debug"])
@@ -1397,6 +1417,7 @@
return
*/
+
/*
if (href_list["ai_take_control"])
@@ -1506,10 +1527,11 @@
return src.stop()
var/datum/gas_mixture/int_tank_air = mecha.return_air()
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(mecha.use_internal_tank && mecha.internal_tank)
+ if(mecha.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)))
+ mecha.setInternalDamage(MECHA_INT_TANK_BREACH)
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.
@@ -1517,12 +1539,14 @@
if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum
mecha.pr_int_temp_processor.stop()
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.internal_tank)
+ int_tank_air = mecha.internal_tank.return_air()
+ 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()
@@ -1566,4 +1590,4 @@
//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 0642adcb13..42efe367e0 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -775,10 +775,11 @@
/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
+ list("key"=/obj/item/mecha_parts/part/odysseus_head),//2
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_arm),//3
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_arm),//4
+ list("key"=/obj/item/mecha_parts/part/odysseus_left_leg),//5
+ list("key"=/obj/item/mecha_parts/part/odysseus_right_leg)//6
)
custom_action(step, atom/used_atom, mob/user)
@@ -812,7 +813,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
//3
- list("key"=/obj/item/stack/sheet/r_metal,
+ list("key"=/obj/item/mecha_parts/part/odysseus_armour,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Internal armor is welded."),
//4
@@ -931,16 +932,17 @@
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].")
+ user.visible_message("[user] installs [used_atom] layer to [holder].", "You install external reinforced armor layer to [holder].")
+ holder.overlays += used_atom.icon_state
+ del used_atom
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
+ var/obj/item/mecha_parts/part/odysseus_armour/MS = new /obj/item/mecha_parts/part/odysseus_armour(get_turf(holder))
+ user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].")
if(1)
if(diff==FORWARD)
user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index a29156ab3d..6961bd7e81 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -340,46 +340,59 @@
..()
construct = new /datum/construction/mecha/odysseus_chassis(src)
+/obj/item/mecha_parts/part/odysseus_head
+ name="Odysseus Head"
+ icon_state = "odysseus_head"
+ construction_time = 100
+ construction_cost = list("metal"=2000,"glass"=10000)
+ origin_tech = "programming=3;materials=2"
+
/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"
+ icon_state = "odysseus_torso"
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
- construction_time = 200
- construction_cost = list("metal"=25000,"glass"=10000)
+ construction_time = 180
+ construction_cost = list("metal"=25000)
/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"
+ icon_state = "odysseus_l_arm"
origin_tech = "programming=2;materials=2;engineering=2"
- construction_time = 150
- construction_cost = list("metal"=15000)
+ construction_time = 120
+ construction_cost = list("metal"=10000)
/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"
+ icon_state = "odysseus_r_arm"
origin_tech = "programming=2;materials=2;engineering=2"
- construction_time = 150
- construction_cost = list("metal"=15000)
+ construction_time = 120
+ construction_cost = list("metal"=10000)
/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"
+ icon_state = "odysseus_l_leg"
origin_tech = "programming=2;materials=2;engineering=2"
- construction_time = 150
- construction_cost = list("metal"=20000)
+ construction_time = 130
+ construction_cost = list("metal"=15000)
/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"
+ icon_state = "odysseus_r_leg"
origin_tech = "programming=2;materials=2;engineering=2"
- construction_time = 150
- construction_cost = list("metal"=20000)
+ construction_time = 130
+ construction_cost = list("metal"=15000)
+/obj/item/mecha_parts/part/odysseus_armour
+ name="Odysseus Carapace"
+ icon_state = "odysseus_armour"
+ origin_tech = "materials=3;engineering=3"
+ construction_time = 200
+ construction_cost = list("metal"=15000)
///////// Circuitboards
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 7d1108c8f3..366e475a16 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -170,3 +170,24 @@
/obj/effect/decal/mecha_wreckage/phazon
name = "Phazon wreckage"
icon_state = "phazon-broken"
+
+
+/obj/effect/decal/mecha_wreckage/odysseus
+ name = "Odysseus wreckage"
+ icon_state = "odysseus-broken"
+
+ New()
+ ..()
+ var/list/parts = list(
+ /obj/item/mecha_parts/part/odysseus_torso,
+ /obj/item/mecha_parts/part/odysseus_head,
+ /obj/item/mecha_parts/part/odysseus_left_arm,
+ /obj/item/mecha_parts/part/odysseus_right_arm,
+ /obj/item/mecha_parts/part/odysseus_left_leg,
+ /obj/item/mecha_parts/part/odysseus_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
\ No newline at end of file
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index ff19add9f7..26850eec4b 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -1,11 +1,11 @@
/obj/mecha/medical/odysseus
- desc = "Odysseus Medical Exosuit"
+ desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)."
name = "Odysseus"
- icon_state = "placeholder-1"
+ icon_state = "odysseus"
step_in = 2
max_temperature = 1500
health = 120
- wreckage = null
+ wreckage = /obj/effect/decal/mecha_wreckage/odysseus
internal_damage_threshold = 35
deflect_chance = 15
step_energy_drain = 6
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 5c9ad3cef2..2d80a87d29 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -775,6 +775,13 @@ datum
req_tech = list("materials" = 5, "combat" = 5, "engineering"=3)
build_path = "/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster"
+ mech_syringe_gun
+ name = "Exosuit Module Design(Syringe Gun)"
+ desc = "Exosuit-mounted syringe gun and chemical synthesizer."
+ id = "mech_syringe_gun"
+ build_type = MECHFAB
+ req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3)
+ build_path = "/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun"
////////////////////////////////////////
diff --git a/html/changelog.html b/html/changelog.html
index 498e83c3f6..98eec79cc1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -54,6 +54,16 @@ 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. -->
+29 December 2011
+
+ - ConstantA updated:
+
+ - Added some new Odysseus parts and tweaked old ones.
+ - Added Exosuit Syringe Gun Module
+ - New Odysseus sprites - courtesy of Veyveyr
+
+
+
28 December 2011
- RavingManiac updated:
diff --git a/icons/misc/mech_construct.dmi b/icons/misc/mech_construct.dmi
index 4f9b1c6d1f..3ac80483f0 100644
Binary files a/icons/misc/mech_construct.dmi and b/icons/misc/mech_construct.dmi differ
diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi
index b013fa1ec2..0b6097b3f3 100644
Binary files a/icons/mob/mecha.dmi and b/icons/mob/mecha.dmi differ