diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 31fc228cc9..2fe3d0b12c 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -98,15 +98,7 @@ obj/machinery/atmospherics/binary/pump
interact(mob/user as mob)
var/dat = {"Power: [on?"On":"Off"]
Desirable output pressure:
- -
- -
- -
- -
- [round(target_pressure,0.1)]kPa
- +
- +
- +
- +
+ [round(target_pressure,0.1)]kPa | Change
"}
user << browse("
[src.name] control[dat]", "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()
diff --git a/code/ATMOSPHERICS/components/filter.dm b/code/ATMOSPHERICS/components/filter.dm
index d5a6d28daf..9f1ac6b095 100644
--- a/code/ATMOSPHERICS/components/filter.dm
+++ b/code/ATMOSPHERICS/components/filter.dm
@@ -347,15 +347,7 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE
Nitrous Oxide
Nothing
Desirable output pressure:
- -
- -
- -
- -
- [src.target_pressure]
- +
- +
- +
- +
+ [src.target_pressure] | Change
"}
/*
user << browse("[src.name] control[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()
diff --git a/code/ATMOSPHERICS/components/mixer.dm b/code/ATMOSPHERICS/components/mixer.dm
index cd2821ee20..9ad3c44cf1 100644
--- a/code/ATMOSPHERICS/components/mixer.dm
+++ b/code/ATMOSPHERICS/components/mixer.dm
@@ -261,13 +261,7 @@ obj/machinery/atmospherics/mixer
usr.machine = src
var/dat = {"Power: [on?"On":"Off"]
Desirable output pressure:
- -
- -
- -
- [target_pressure]kPa
- +
- +
- +
+ [target_pressure]kPa | Change
Node 1 Concentration:
-
@@ -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))
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 792113b046..d89f60129e 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -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 += {"Smoke: [smoke]
@@ -95,7 +125,9 @@
/obj/mecha/combat/marauder/get_commands()
var/output = {"Toggle thrusters
- Smoke
+ Toggle zoom mode
+ Smoke
+
"}
output += ..()
return output
@@ -106,4 +138,6 @@
src.toggle_thrusters()
if (href_list["smoke"])
src.smoke()
+ if (href_list["toggle_zoom"])
+ src.zoom()
return
\ No newline at end of file
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 8d84df8f67..020fa47588 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -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
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 0d9c0debf8..d38caa39a6 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -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?"DAMAGE LEVEL CRITICAL":null]
Integrity: [integrity]%
Powercell charge: [cell.charge/cell.maxcharge*100]%
+ Air source: [use_internal_tank?"Internal Airtank":"Environment"]
Airtank pressure: [src.return_pressure()]kPa
Internal temperature: [src.air_contents.temperature]°K|[src.air_contents.temperature - T0C]°C
Lights: [lights?"on":"off"]
@@ -765,6 +794,7 @@
/obj/mecha/proc/get_commands()
var/output = {"Toggle Lights
+ Toggle Internal Airtank Usage
[(/obj/mecha/verb/disconnect_from_port in src.verbs)?"Disconnect from port
":null]
[(/obj/mecha/verb/connect_to_port in src.verbs)?"Connect to port
":null]
View internal log
@@ -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
\ No newline at end of file
+ return
diff --git a/code/game/mecha/mecha_construction.dm b/code/game/mecha/mecha_construction.dm
index d93e405623..dd8d4e6489 100644
--- a/code/game/mecha/mecha_construction.dm
+++ b/code/game/mecha/mecha_construction.dm
@@ -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 ////////////////
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 03c374367c..3f78854216 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -52,7 +52,7 @@
output += ""
return output
-/obj/mecha/working/ripley/destroy()
+/obj/mecha/working/ripley/Del()
for(var/obj/O in cargo)
if(rand(0,1))
cargo -= O