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