- Added some new Odysseus parts and tweaked old ones

- Added Exosuit Syringe Gun Module
- New Odysseus sprites - courtesy of Veyveyr
- Updated the changelog

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2847 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
panurgomatic
2011-12-29 00:13:29 +00:00
parent c601d5a39f
commit 346e19f4e4
11 changed files with 401 additions and 57 deletions

View File

@@ -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)]<br />"
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] \[<a href=\"?src=\ref[src];toggle_mode=1\">[mode? "Analyze" : "Launch"]</a>\]<br />\[Syringes: [syringes.len]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]<br /><a href='?src=\ref[src];show_reagents=1'>Reagents list</a>"
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("<span class=\"alert\">No syringes loaded.</span>")
return
if(reagents.total_volume<=0)
chassis.occupant_message("<span class=\"alert\">No available reagents to load syringe with.</span>")
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("<span class=\"attack\"> [M] was hit by the syringe!</span>")
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 = {"<html>
<head>
<title>Reagent Synthesizer</title>
<script language='javascript' type='text/javascript'>
[js_byjax]
</script>
<style>
h3 {margin-bottom:2px;font-size:14px;}
#reagents, #reagents_form {}
form {width: 90%; margin:10px auto; border:1px dotted #999; padding:6px;}
#submit {margin-top:5px;}
</style>
</head>
<body>
<h3>Current reagents:</h3>
<div id="reagents">
[get_current_reagents() || "None"]
</div>
<h3>Reagents production:</h3>
<div id="reagents_form">
[get_reagents_form()]
</div>
</body>
</html>
"}
return output
proc/get_reagents_form()
var/r_list = get_reagents_list()
var/inputs
if(r_list)
inputs += "<input type=\"hidden\" name=\"src\" value=\"\ref[src]\">"
inputs += "<input type=\"hidden\" name=\"select_reagents\" value=\"1\">"
inputs += "<input id=\"submit\" type=\"submit\" value=\"Apply settings\">"
var/output = {"<form action="byond://" method="get">
[r_list || "No known reagents"]
[inputs]
</form>
[r_list? "<span style=\"font-size:80%;\">Only the first [synth_speed] selected reagent\s will be added to production</span>" : null]
"}
return output
proc/get_reagents_list()
var/output
for(var/i=1 to known_reagents.len)
var/reagent_id = known_reagents[i]
output += {"<input type="checkbox" value="[reagent_id]" name="reagent_[i]" [(reagent_id in processed_reagents)? "checked=\"1\"" : null]> [known_reagents[reagent_id]]<br />"}
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)] - <a href=\"?src=\ref[src];purge_reagent=[R.id]\">Purge Reagent</a><br />"
if(output)
output += "Total: [round(reagents.total_volume,0.001)]/[reagents.maximum_volume] - <a href=\"?src=\ref[src];purge_all=1\">Purge All</a>"
return output
proc/load_syringe(obj/item/weapon/reagent_containers/syringe/S)
if(syringes.len<max_syringes)
S.reagents.trans_to(src, S.reagents.total_volume)
S.forceMove(src)
syringes += S
chassis.occupant_message("Syringe loaded.")
update_equip_info()
return 1
chassis.occupant_message("The [src] syringe chamber is full.")
return 0
proc/analyze_reagents(atom/A)
if(!A.reagents)
chassis.occupant_message("<span class=\"alert\">No reagent info gained from [A].</span>")
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("<span class=\"alert\">Reagent processing stopped.</a>")
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"

View File

@@ -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,

View File

@@ -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("<font color='red'>Recalibration failed.</font>")
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
*/
*/

View File

@@ -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].")

View File

@@ -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

View File

@@ -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

View File

@@ -1,11 +1,11 @@
/obj/mecha/medical/odysseus
desc = "Odysseus Medical Exosuit"
desc = "These exosuits are developed and produced by Vey-Med. (&copy; 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

View File

@@ -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"
////////////////////////////////////////

View File

@@ -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. -->
<b><font color='blue'>29 December 2011</font><b>
<ul>
<li><b>ConstantA updated:</b>
<ul>
<li>Added some new Odysseus parts and tweaked old ones.</li>
<li>Added Exosuit Syringe Gun Module</li>
<li>New Odysseus sprites - courtesy of Veyveyr</li>
</ul>
</ul>
<b><font color='blue'>28 December 2011</font><b>
<ul>
<li><b>RavingManiac updated:</b>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB