Mech update:

- Mechs cannot interact with objects if not facing them. This includes firing a weapon.
- It takes some time to switch mech movement direction.
- Air for mech pilot breathing can be taken from air tank or environment.
- Zoom mode added to Marauder. Marauder cannot move or turn while in zoom mode.
- Some mech_fabricator helper procs.

Atmos update:
- Tired of clicking + and - to set various devices output pressure? Replaced with simple inputbox.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1004 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
panurgomatic
2011-02-09 18:26:48 +00:00
parent 2c1015763a
commit 8fe1f68740
8 changed files with 280 additions and 40 deletions

View File

@@ -98,15 +98,7 @@ obj/machinery/atmospherics/binary/pump
interact(mob/user as mob)
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output pressure: </b>
<a href='?src=\ref[src];out_press=-1000'><b>-</b></a>
<a href='?src=\ref[src];out_press=-100'><b>-</b></a>
<a href='?src=\ref[src];out_press=-10'><b>-</b></a>
<a href='?src=\ref[src];out_press=-1'>-</a>
[round(target_pressure,0.1)]kPa
<a href='?src=\ref[src];out_press=1'>+</a>
<a href='?src=\ref[src];out_press=10'><b>+</b></a>
<a href='?src=\ref[src];out_press=100'><b>+</b></a>
<a href='?src=\ref[src];out_press=1000'><b>+</b></a>
[round(target_pressure,0.1)]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
"}
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD><TT>[dat]</TT>", "window=atmo_pump")
@@ -160,8 +152,9 @@ obj/machinery/atmospherics/binary/pump
Topic(href,href_list)
if(href_list["power"])
on = !on
if(href_list["out_press"])
src.target_pressure = max(0, min(4500, src.target_pressure + text2num(href_list["out_press"])))
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = max(0, min(4500, new_pressure))
usr.machine = src
src.update_icon()
src.updateUsrDialog()

View File

@@ -347,15 +347,7 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE
<A href='?src=\ref[src];filterset=4'>Nitrous Oxide</A><BR>
<A href='?src=\ref[src];filterset=-1'>Nothing</A><BR>
<HR><B>Desirable output pressure:</B>
<a href='?src=\ref[src];out_press=-1000'><b>-</b></a>
<a href='?src=\ref[src];out_press=-100'><b>-</b></a>
<a href='?src=\ref[src];out_press=-10'><b>-</b></a>
<a href='?src=\ref[src];out_press=-1'>-</a>
[src.target_pressure]
<a href='?src=\ref[src];out_press=1'>+</a>
<a href='?src=\ref[src];out_press=10'><b>+</b></a>
<a href='?src=\ref[src];out_press=100'><b>+</b></a>
<a href='?src=\ref[src];out_press=1000'><b>+</b></a>
[src.target_pressure] | <a href='?src=\ref[src];set_press=1'>Change</a>
"}
/*
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD>[dat]","window=atmo_filter")
@@ -380,8 +372,9 @@ obj/machinery/atmospherics/filter/Topic(href, href_list) // -- TLE
src.filter_type = text2num(href_list["filterset"])
if (href_list["temp"])
src.temp = null
if(href_list["out_press"])
src.target_pressure = max(0, min(4000, src.target_pressure + text2num(href_list["out_press"])))
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = max(0, min(4500, new_pressure))
if(href_list["power"])
on=!on
src.update_icon()

View File

@@ -261,13 +261,7 @@ obj/machinery/atmospherics/mixer
usr.machine = src
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"On":"Off"]</a><br>
<b>Desirable output pressure: </b>
<a href='?src=\ref[src];out_press=-100'><b>-</b></a>
<a href='?src=\ref[src];out_press=-10'><b>-</b></a>
<a href='?src=\ref[src];out_press=-1'>-</a>
[target_pressure]kPa
<a href='?src=\ref[src];out_press=1'>+</a>
<a href='?src=\ref[src];out_press=10'><b>+</b></a>
<a href='?src=\ref[src];out_press=100'><b>+</b></a>
[target_pressure]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
<br>
<b>Node 1 Concentration:</b>
<a href='?src=\ref[src];node1_c=-0.1'><b>-</b></a>
@@ -291,8 +285,9 @@ obj/machinery/atmospherics/mixer
Topic(href,href_list)
if(href_list["power"])
on = !on
if(href_list["out_press"])
src.target_pressure = max(0, min(4500, src.target_pressure + text2num(href_list["out_press"])))
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
src.target_pressure = max(0, min(4500, new_pressure))
if(href_list["node1_c"])
var/value = text2num(href_list["node1_c"])
src.node1_concentration = max(0, min(1, src.node1_concentration + value))

View File

@@ -7,6 +7,7 @@
deflect_chance = 25
max_temperature = 5000
infra_luminosity = 3
var/zoom = 0
var/thrusters = 0
var/smoke = 5
var/smoke_ready = 1
@@ -28,6 +29,9 @@
/obj/mecha/combat/marauder/relaymove(mob/user,direction)
if(!can_move)
return 0
if(zoom)
src.occupant_message("Unable to move while in zoom mode.")
return 0
if(connected_port)
src.occupant_message("Unable to move while connected to the air system port")
return 0
@@ -40,6 +44,9 @@
var/move_result = 0
if(internal_damage&MECHA_INT_CONTROL_LOST)
move_result = step_rand(src)
else if(src.dir!=direction)
src.dir=direction
move_result = 1
else
move_result = step(src,direction)
if(move_result)
@@ -66,7 +73,7 @@
if(src.occupant)
if(cell.charge > 0)
thrusters = !thrusters
src.occupant << "\blue Thrusters [thrusters?"en":"dis"]abled."
src.occupant_message("\blue Thrusters [thrusters?"en":"dis"]abled.")
return
@@ -84,6 +91,29 @@
smoke_ready = 1
return
/obj/mecha/combat/marauder/verb/zoom()
set category = "Exosuit Interface"
set name = "Zoom"
set src in view(0)
if(usr!=src.occupant)
return
if(src.occupant.client)
src.zoom = !src.zoom
src.log_message("Toggled zoom mode.")
src.occupant_message("\blue Zoom mode [zoom?"en":"dis"]abled.")
if(zoom)
src.occupant.client.view = 12
else
src.occupant.client.view = world.view//world.view - default mob view size
return
/obj/mecha/combat/marauder/go_out()
src.occupant.client.view = world.view
..()
return
/obj/mecha/combat/marauder/get_stats_part()
var/output = ..()
output += {"<b>Smoke:</b> [smoke]
@@ -95,7 +125,9 @@
/obj/mecha/combat/marauder/get_commands()
var/output = {"<a href='?src=\ref[src];toggle_thrusters=1'>Toggle thrusters</a><br>
<a href='?src=\ref[src];smoke=1'>Smoke</a><br>
<a href='?src=\ref[src];toggle_zoom=1'>Toggle zoom mode</a><br>
<a href='?src=\ref[src];smoke=1'>Smoke</a><br>
<hr>
"}
output += ..()
return output
@@ -106,4 +138,6 @@
src.toggle_thrusters()
if (href_list["smoke"])
src.smoke()
if (href_list["toggle_zoom"])
src.zoom()
return

View File

@@ -24,7 +24,7 @@
var/res_max_amount = 200000
var/part_set
var/obj/being_built
var/list/part_sets = list(
var/list/part_sets = list( //set names must be unique
"Ripley"=list(
list("result"="/obj/mecha_chassis/ripley","time"=100,"metal"=20000),
list("result"="/obj/item/mecha_parts/part/ripley_torso","time"=300,"metal"=40000,"glass"=15000),
@@ -33,6 +33,17 @@
list("result"="/obj/item/mecha_parts/part/ripley_left_leg","time"=200,"metal"=30000),
list("result"="/obj/item/mecha_parts/part/ripley_right_leg","time"=200,"metal"=30000)
),
/*
"Ripley-on-Fire"=list(
list("result"="/obj/mecha_chassis/firefighter","time"=150,"metal"=20000),
list("result"="/obj/item/mecha_parts/part/firefighter_torso","time"=300,"metal"=45000,"glass"=20000),
list("result"="/obj/item/mecha_parts/part/firefighter_left_arm","time"=200,"metal"=25000),
list("result"="/obj/item/mecha_parts/part/firefighter_right_arm","time"=200,"metal"=25000),
list("result"="/obj/item/mecha_parts/part/firefighter_left_leg","time"=200,"metal"=30000),
list("result"="/obj/item/mecha_parts/part/firefighter_right_leg","time"=200,"metal"=30000)
),
*/
"Gygax"=list(
list("result"="/obj/mecha_chassis/gygax","time"=100,"metal"=25000),
list("result"="/obj/item/mecha_parts/part/gygax_torso","time"=300,"metal"=50000,"glass"=20000),
@@ -45,6 +56,51 @@
)
)
proc/add_part_set(set_name,parts=null)
if(set_name in part_sets)//attempt to create duplicate set
return 0
if(isnull(parts))
part_sets[set_name] = list()
else
part_sets[set_name] = parts
return 1
proc/add_part_to_set(set_name,part)
src.add_part_set(set_name)//if no "set_name" set exists, create
var/list/part_set = part_sets[set_name]
part_set[++part_set.len] = part
return
proc/remove_part_set(set_name)
for(var/i=1,i<=part_sets.len,i++)
if(part_sets[i]==set_name)
part_sets.Cut(i,++i)
return
proc/sanity_check()
for(var/p in resources)
var/index = resources.Find(p)
index = resources.Find(p, index)
if(index) //duplicate resource
world << "Duplicate resource definition for [src](\ref[src])"
return 0
for(var/set_name in part_sets)
var/index = part_sets.Find(set_name)
index = part_sets.Find(set_name, index)
if(index) //duplicate part set
world << "Duplicate part set definition for [src](\ref[src])"
return 0
return 1
/*
New()
..()
src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000))
src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/ripley_left_arm","time"=200,"metal"=25000))
src.remove_part_set("Gygax")
return
*/
proc/output_parts_list(set_name)
var/output = ""
if(set_name in part_sets)
@@ -176,6 +232,10 @@
else
return ..()
if(src.being_built)
user << "The fabricator is currently processing. Please wait until completion."
return
var/name = "[W.name]"
if(src.resources[material] < res_max_amount)
var/count = 0

View File

@@ -31,6 +31,7 @@
//var/inertia_dir = null //for open space travel.
//inner atmos machinery. Air tank mostly
var/use_internal_tank = 0
var/datum/gas_mixture/air_contents = new
var/obj/machinery/atmospherics/portables_connector/connected_port = null //filling the air tanks
var/filled = 0.5
@@ -105,6 +106,8 @@
if(!src.occupant) return
if(state || !cell || cell.charge<=0) return
if(src == target) return
if(!(get_dir(src,target) & src.dir))//wrong direction
return
if(get_dist(src,target)<=1)
src.melee_action(target)
else
@@ -147,6 +150,9 @@
var/move_result = 0
if(internal_damage&MECHA_INT_CONTROL_LOST)
move_result = step_rand(src)
else if(src.dir!=direction)
src.dir=direction
move_result = 1
else
move_result = step(src,direction)
if(move_result)
@@ -376,18 +382,28 @@
/obj/mecha/meteorhit()
return ex_act(rand(1,3))//should do for now
/obj/mecha/emp_act()
cell.use(rand(cell.maxcharge/2, cell.maxcharge))
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST),1)
return
/////////////////////////////////////
//////// Atmospheric stuff ////////
/////////////////////////////////////
/* //standard for /obj class
/*
//standard for /obj class
/obj/mecha/handle_internal_lifeform(lifeform, volume)
..()
world << "Handling occupant breathing"
world << "Handling [lifeform] breathing. Requested [volume]"
*/
/obj/mecha/remove_air(amount)
return src.air_contents.remove(amount)
if(src.use_internal_tank)
return src.air_contents.remove(amount)
else
var/turf/T = get_turf(src)
return T.remove_air(amount)
/obj/mecha/return_air()
return src.air_contents
@@ -496,6 +512,18 @@
src.log_message("Toggled lights.")
return
/obj/mecha/verb/toggle_internal_tank()
set name = "Toggle internal airtank usage."
set category = "Exosuit Interface"
set src in view(0)
if(usr!=src.occupant)
return
use_internal_tank = !use_internal_tank
src.log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
return
/obj/mecha/verb/move_inside()
set name = "Move Inside"
set src in oview(1)
@@ -757,6 +785,7 @@
[integrity<30?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font>":null]
<b>Integrity: </b> [integrity]%<br>
<b>Powercell charge: </b>[cell.charge/cell.maxcharge*100]%<br>
<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>
<b>Airtank pressure: </b>[src.return_pressure()]kPa<br>
<b>Internal temperature: </b> [src.air_contents.temperature]&deg;K|[src.air_contents.temperature - T0C]&deg;C<br>
<b>Lights: </b>[lights?"on":"off"]<br>
@@ -765,6 +794,7 @@
/obj/mecha/proc/get_commands()
var/output = {"<a href='?src=\ref[src];toggle_lights=1'>Toggle Lights</a><br>
<a href='?src=\ref[src];toggle_airtank=1'>Toggle Internal Airtank Usage</a><br>
[(/obj/mecha/verb/disconnect_from_port in src.verbs)?"<a href='?src=\ref[src];port_disconnect=1'>Disconnect from port</a><br>":null]
[(/obj/mecha/verb/connect_to_port in src.verbs)?"<a href='?src=\ref[src];port_connect=1'>Connect to port</a><br>":null]
<a href='?src=\ref[src];view_log=1'>View internal log</a><br>
@@ -780,6 +810,9 @@
if (href_list["toggle_lights"])
src.toggle_lights()
return
if (href_list["toggle_airtank"])
src.toggle_internal_tank()
return
if (href_list["port_disconnect"])
src.disconnect_from_port()
return
@@ -945,4 +978,4 @@
if(mecha.air_contents.temperature > 0 && pressure_delta > 0)
transfer_moles = pressure_delta*environment.volume/(mecha.air_contents.temperature * R_IDEAL_GAS_EQUATION)
mecha.loc.assume_air(mecha.air_contents.remove(transfer_moles))
return
return

View File

@@ -9,6 +9,9 @@
var/datum/construction/construct
flags = FPRINT | CONDUCT
//////// Ripley chassis
/obj/mecha_chassis/ripley
name = "Ripley Chassis Frame"
@@ -37,7 +40,7 @@
..()
return
/////// Gygax chasis
/obj/mecha_chassis/gygax
name = "Gygax Chassis Frame"
@@ -66,6 +69,36 @@
..()
return
/////// Firefighter chassis
/obj/mecha_chassis/firefighter
name = "Ripley-on-Fire Chassis Frame"
New()
..()
construct = new /datum/construction/mecha/firefighter_chassis(src)
attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/mecha_parts))
if(construct)
construct.check_all_steps(W, user)
else
..()
return
/obj/mecha_chassis/firefighter_full
name = "Ripley-on-Fire Chassis"
icon_state = "ripley_chassis"
New()
..()
construct = new /datum/construction/mecha/firefighter(src)
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(!construct || !construct.check_step(W, user))
..()
return
/////////////////////////
////// Mecha Parts //////
/////////////////////////
@@ -130,6 +163,28 @@
name="Gygax Armour Plates"
icon_state = "gygax_armour"
////////// Firefighter
/obj/item/mecha_parts/part/firefighter_torso
name="Ripley-on-Fire Torso"
icon_state = "ripley_harness"
/obj/item/mecha_parts/part/firefighter_left_arm
name="Ripley-on-Fire Left Arm"
icon_state = "ripley_l_arm"
/obj/item/mecha_parts/part/firefighter_right_arm
name="Ripley-on-Fire Right Arm"
icon_state = "ripley_r_arm"
/obj/item/mecha_parts/part/firefighter_left_leg
name="Ripley-on-Fire Left Leg"
icon_state = "ripley_l_leg"
/obj/item/mecha_parts/part/firefighter_right_leg
name="Ripley-on-Fire Right Leg"
icon_state = "ripley_r_leg"
@@ -165,6 +220,10 @@
name = "Circuit board (Gygax Central Control module)"
icon_state = "mainboard"
firefighter/peripherals
name = "Circuit board (Ripley-on-Fire Peripherals Control module)"
icon_state = "mcontroller"
////////////////////////////////
///// Construction datums //////
////////////////////////////////
@@ -378,6 +437,79 @@
return 1
/datum/construction/mecha/firefighter_chassis
result = "/obj/mecha_chassis/firefighter_full"
steps = list(list("key"="/obj/item/mecha_parts/part/firefighter_torso"),//1
list("key"="/obj/item/mecha_parts/part/firefighter_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/firefighter_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/firefighter_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/firefighter_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
/datum/construction/mecha/firefighter
result = "/obj/mecha/working/firefighter"
steps = list(list("key"="/obj/item/weapon/weldingtool"),//1
list("key"="/obj/item/weapon/wrench"),//2
list("key"="/obj/item/stack/sheet/r_metal"),//3
list("key"="/obj/item/weapon/weldingtool"),//4
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/screwdriver"),//9
list("key"="/obj/item/mecha_parts/circuitboard/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
list("key"="/obj/item/weapon/wrench")//14
)
custom_action(step, atom/used_atom, mob/user)
if(!..())
return 0
//TODO: better messages.
switch(step)
if(14)
user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
if(13)
user.visible_message("[user] adjusts [holder] hydraulic systems.", "You adjust [holder] hydraulic systems.")
if(12)
user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
if(11)
user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
if(10)
user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
del used_atom
if(9)
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
if(8)
user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
del used_atom
if(7)
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
if(6)
user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
if(5)
user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
if(4)
user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
if(3)
user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
if(2)
user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
if(1)
user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
return 1
////////////////// misc ////////////////

View File

@@ -52,7 +52,7 @@
output += "</div>"
return output
/obj/mecha/working/ripley/destroy()
/obj/mecha/working/ripley/Del()
for(var/obj/O in cargo)
if(rand(0,1))
cargo -= O