diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 682e619df96..81ccfce0f6d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -22,9 +22,11 @@ obj/machinery/atmospherics/binary/pump var/on = 0 var/target_pressure = ONE_ATMOSPHERE +/* attack_hand(mob/user) on = !on update_icon() +*/ update_icon() if(node1&&node2) @@ -123,6 +125,39 @@ obj/machinery/atmospherics/binary/pump target_pressure = number - if(signal.data["tag"]) - spawn(5) broadcast_status() - update_icon() \ No newline at end of file + broadcast_status() + update_icon() + return + + + attack_hand(user as mob) + if(..()) + return + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "\red Access denied." + return + usr.machine = src + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + - + - + - + [round(target_pressure,0.1)]kPa + + + + + + + "} + + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") + return + + 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"]))) + src.update_icon() + src.updateUsrDialog() + return diff --git a/code/ATMOSPHERICS/components/filter.dm b/code/ATMOSPHERICS/components/filter.dm index 05652a9350a..e744247e0e9 100644 --- a/code/ATMOSPHERICS/components/filter.dm +++ b/code/ATMOSPHERICS/components/filter.dm @@ -336,7 +336,9 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE else current_filter_type = "ERROR - Report this bug to the admin, please!" - dat += {"Filtering: [current_filter_type]

+ dat += {" + Power: [on?"On":"Off"]
+ Filtering: [current_filter_type]

Set Filter Type:

Carbon Molecules
Oxygen
@@ -344,12 +346,15 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE Carbon Dioxide
Nitrous Oxide
Nothing
-
Desirible output pressure: +
Desirable output pressure: + - - - [src.target_pressure] + - +"} + + + + + "} /* user << browse("[src.name] control[dat]","window=atmo_filter") onclose(user, "atmo_filter") @@ -375,8 +380,13 @@ obj/machinery/atmospherics/filter/Topic(href, href_list) // -- TLE 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["power"]) + on=!on + src.update_icon() + src.updateUsrDialog() +/* for(var/mob/M in viewers(1, src)) if ((M.client && M.machine == src)) src.attack_hand(M) +*/ return diff --git a/code/ATMOSPHERICS/components/mixer.dm b/code/ATMOSPHERICS/components/mixer.dm index 19fe7a05640..343fea6888d 100644 --- a/code/ATMOSPHERICS/components/mixer.dm +++ b/code/ATMOSPHERICS/components/mixer.dm @@ -7,6 +7,7 @@ obj/machinery/atmospherics/mixer dir = SOUTH initialize_directions = SOUTH|NORTH|WEST + req_access = list(access_atmospherics) var/on = 0 @@ -246,4 +247,59 @@ obj/machinery/atmospherics/mixer del(network_out) node_out = null - return null \ No newline at end of file + return null + + + attack_hand(user as mob) + if(..()) + return + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "\red Access denied." + return + usr.machine = src + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + - + - + - + [target_pressure]kPa + + + + + + +
+ Node 1 Concentration: + - + - + [node1_concentration]([node1_concentration*100]%) + + + + +
+ Node 2 Concentration: + - + - + [node2_concentration]([node2_concentration*100]%) + + + + + "} + + user << browse("[src.name] control[dat]", "window=atmo_mixer") + onclose(user, "atmo_mixer") + return + + 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["node1_c"]) + var/value = text2num(href_list["node1_c"]) + src.node1_concentration = max(0, min(1, src.node1_concentration + value)) + src.node2_concentration = max(0, min(1, src.node2_concentration - value)) + if(href_list["node2_c"]) + var/value = text2num(href_list["node2_c"]) + src.node2_concentration = max(0, min(1, src.node2_concentration + value)) + src.node1_concentration = max(0, min(1, src.node1_concentration - value)) + src.update_icon() + src.updateUsrDialog() + return diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm index cc54d500fbc..b827512125b 100644 --- a/code/WorkInProgress/Chemistry-Reagents.dm +++ b/code/WorkInProgress/Chemistry-Reagents.dm @@ -154,6 +154,8 @@ datum if(self.data&&method == INGEST) if(M.virus && M.virus.type == self.data) M.virus.cure() + else if(!(self.data in M.resistances)) + M.resistances += self.data return diff --git a/code/game/asteroid/device.dm b/code/game/asteroid/device.dm index e6b993045eb..7141b6c521f 100644 --- a/code/game/asteroid/device.dm +++ b/code/game/asteroid/device.dm @@ -22,50 +22,49 @@ usr << "\blue You deactivate the GPS" proc/work() - if(!active) return - if(!beacon) - for(var/obj/ship_landing_beacon/B in world) - if(B.name == "Beacon - SS13") - beacon = B - break - + while(active) if(!beacon) - usr << "\red Unable to detect beacon signal." + for(var/obj/ship_landing_beacon/B in world) + if(B.name == "Beacon - SS13") + beacon = B + break + + if(!beacon) + usr << "\red Unable to detect beacon signal." + active = 0 + icon_state = "pinonnull" + return + + if(!istype(src.loc, /turf) && !istype(src.loc, /mob)) + usr << "\red Too much interference. Please hold the device in hand or place it on belt." active = 0 icon_state = "pinonnull" return - if(!istype(src.loc, /turf) && !istype(src.loc, /mob)) - usr << "\red Too much interference. Please hold the device in hand or place it on belt." - active = 0 - icon_state = "pinonnull" - return + src.icon_state = "pinonfar" - src.icon_state = "pinonfar" + var/atom/cur_loc = src.loc - var/atom/cur_loc = src.loc + if(cur_loc.z == beacon.z) + src.dir = get_dir(cur_loc,beacon) + else + var/list/beacon_global_loc = beacon.get_global_map_pos() + var/list/src_global_loc = cur_loc.get_global_map_pos() + if(beacon_global_loc && src_global_loc) + var/hor_dir = 0 + var/ver_dir = 0 + if(beacon_global_loc["x"]>src_global_loc["x"]) + hor_dir = EAST + else if(beacon_global_loc["x"]src_global_loc["x"]) - hor_dir = EAST - else if(beacon_global_loc["x"]src_global_loc["y"]) + ver_dir = NORTH + else if(beacon_global_loc["y"]src_global_loc["y"]) - ver_dir = NORTH - else if(beacon_global_loc["y"]Pressure: [] kPa", round(environment.return_pressure(), 0.1)) + t = "Pressure: [round(environment.return_pressure(), 0.01)] kPa; Temperature: [round(environment.temperature,0.01)]°K ([round(environment.temperature-T0C,0.01)]°C)" else t = "\red Results: Sensor Error!" else diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 76dc32b49c9..730cbecb2f7 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -191,6 +191,7 @@ src.Move(src.loc) if(usr.client) usr.client.mouse_pointer_icon = file("icons/misc/mecha_mouse.dmi") + src.log_message("[usr] moved in as pilot.") return /obj/mecha/combat/go_out() @@ -209,6 +210,7 @@ weapons -= destr_weapon destr_weapon.destroy() src.occupant_message("The [destr_weapon] is destroyed!") + src.log_append_to_last("[destr_weapon] is destoyed.",1) return diff --git a/code/game/mecha/combat/weapons/weapons.dm b/code/game/mecha/combat/weapons/weapons.dm index 571e340f8d9..a2090b1d453 100644 --- a/code/game/mecha/combat/weapons/weapons.dm +++ b/code/game/mecha/combat/weapons/weapons.dm @@ -10,6 +10,7 @@ if(!istype(mecha, /obj/mecha/combat)) return src.chassis = mecha + chassis.log_append_to_last("[src.name] initialized.") return /datum/mecha_weapon/proc/destroy() @@ -55,6 +56,7 @@ missiles-- spawn(weapon_cooldown) weapon_ready = 1 + chassis.log_message("Fired from [src.name], targeting [target].",1) return proc/rearm() @@ -64,6 +66,7 @@ missiles++ missiles_to_add-- chassis.cell.charge -= missile_energy_cost + chassis.log_message("Rearmed [src.name].") return get_weapon_info() @@ -108,6 +111,7 @@ F.prime() spawn(weapon_cooldown) weapon_ready = 1 + chassis.log_message("Fired from [src.name], targeting [target].") return /datum/mecha_weapon/laser @@ -136,7 +140,7 @@ A.process() spawn(weapon_cooldown) weapon_ready = 1 - + chassis.log_message("Fired from [src.name], targeting [target].") return @@ -144,6 +148,7 @@ weapon_cooldown = 50 name = "eZ-13 mk2 Heavy pulse rifle" energy_drain = 60 + var/num_penetrations = 2 fire(target) if(!fire_checks(target)) return @@ -157,6 +162,7 @@ playsound(chassis, 'marauder.ogg', 50, 1) var/obj/beam/a_laser/A = new /obj/beam/a_laser/pulse_laser(curloc) + A.life = num_penetrations A.current = curloc A.yo = targloc.y - curloc.y A.xo = targloc.x - curloc.x @@ -166,7 +172,7 @@ A.process() spawn(weapon_cooldown) weapon_ready = 1 - + chassis.log_message("Fired from [src.name], targeting [target].") return @@ -174,6 +180,7 @@ weapon_cooldown = 10 name = "PBT \"Pacifier\" Mounted Taser" energy_drain = 20 + weapon_cooldown = 7 fire(target) if(!fire_checks(target)) return @@ -196,7 +203,7 @@ A.process() spawn(weapon_cooldown) weapon_ready = 1 - + chassis.log_message("Fired from [src.name], targeting [target].") return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f5aa1fcf929..451cfd29c35 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -22,6 +22,7 @@ var/deflect_chance = 2 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. var/obj/item/weapon/cell/cell = new var/state = 0 + var/list/log = new var/datum/effects/system/spark_spread/spark_system = new var/lights = 0 @@ -48,6 +49,7 @@ var/datum/global_iterator/pr_location_temp_check //processes location temperature damage var/datum/global_iterator/pr_internal_damage //processes internal damage + /obj/mecha/New() ..() src.air_contents.volume = gas_tank_volume //liters @@ -64,8 +66,10 @@ pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0) 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 + src.log_message("[src.name] created.") return /obj/mecha/Del() @@ -140,6 +144,7 @@ if(istype(src.loc, /turf/space)) if(!src.check_for_support()) src.pr_inertial_movement.start(list(src,direction)) + src.log_message("Movement control lost. Inertial movement started.") return 1 return 0 @@ -192,6 +197,7 @@ if("fire") src.health -= amount*1.2 src.update_health() + src.log_append_to_last("Took [amount] points of damage. Damage type: \"[type]\".",1) return /obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)//TODO @@ -206,6 +212,7 @@ if(int_dam_flag) internal_damage |= int_dam_flag pr_internal_damage.start() + src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1) return @@ -217,6 +224,7 @@ return /obj/mecha/attack_hand(mob/user as mob) + src.log_message("Attack by hand/paw. Attacker - [user].",1) if (user.mutations & 8 && !prob(src.deflect_chance)) src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) @@ -225,6 +233,7 @@ else src.visible_message("[user] hits [src.name]. Nothing happens") user << "You hit [src.name] with no visible effect." + src.log_append_to_last("Armor saved.") return /obj/mecha/attack_paw(mob/user as mob) @@ -232,6 +241,7 @@ /obj/mecha/attack_alien(mob/user as mob) + src.log_message("Attack by alien. Attacker - [user].",1) if(!prob(src.deflect_chance)) src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) @@ -241,6 +251,7 @@ if(V.client && !(V.blinded)) V.show_message("\red The [user] slashes at [src.name]'s armor!", 1) else + src.log_append_to_last("Armor saved.") playsound(src.loc, 'slash.ogg', 50, 1, -1) user << "\green Your claws had no effect!" src.occupant_message("\blue The [user]'s claws are stopped by the armor.") @@ -251,8 +262,10 @@ /obj/mecha/hitby(A as mob|obj) + src.log_message("Hit by [A].",1) if(prob(src.deflect_chance) || istype(A, /mob)) src.occupant_message("\blue The [A] bounces off the armor.") + src.log_append_to_last("Armor saved.") for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) V.show_message("The [A] bounces off the [src.name] armor", 1) @@ -260,22 +273,34 @@ var/mob/M = A M.bruteloss += 10 M.updatehealth() - return else if(istype(A, /obj)) var/obj/O = A if(O.throwforce) src.take_damage(O.throwforce) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - return + + return /obj/mecha/bullet_act(flag) + var/dam_type + switch(dam_type) + if(PROJECTILE_PULSE) + dam_type = "Pulse" + if(PROJECTILE_LASER) + dam_type = "Laser" + if(PROJECTILE_TASER) + dam_type = "Taser" + else + dam_type = "Default" + src.log_message("Hit by projectile. Type: [dam_type]([flag]).",1) if(prob(src.deflect_chance)) src.occupant_message("\blue The armor deflects the incoming projectile.") for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) V.show_message("The [src.name] armor deflects the projectile", 1) + src.log_append_to_last("Armor saved.") else var/damage var/ignore_threshold @@ -309,8 +334,10 @@ return /obj/mecha/ex_act(severity) + src.log_message("Affected by explosion of severity: [severity].",1) if(prob(src.deflect_chance)) severity++ + src.log_append_to_last("Armor saved, changing severity to [severity].") switch(severity) if(1.0) src.destroy() @@ -328,17 +355,6 @@ src.check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST),1) return -/obj/mecha/proc/check_location_temp() - spawn while(src) - if(istype(src.loc, /turf/simulated/)) - var/turf/simulated/T = src.loc - if(T.air) - if(T.air.temperature > src.max_temperature) - src.take_damage(10) - sleep(10) - return - - ///////////////////////////////////// //////// Atmospheric stuff //////// ///////////////////////////////////// @@ -387,7 +403,7 @@ var/datum/pipe_network/network = connected_port.return_network(src) if(network && !network.gases.Find(air_contents)) network.gases += air_contents - + src.log_message("Connected to gas port.") return 1 /obj/mecha/proc/disconnect() @@ -400,7 +416,7 @@ connected_port.connected_device = null connected_port = null - + src.log_message("Disconnected from gas port.") return 1 @@ -455,6 +471,8 @@ src.sd_SetLuminosity(src.luminosity + src.lights_power) else src.sd_SetLuminosity(src.luminosity - src.lights_power) + src.log_message("Toggled lights.") + return /obj/mecha/verb/move_inside() set name = "Move Inside" @@ -462,8 +480,10 @@ if (usr.stat != 0 || !istype(usr, /mob/living/carbon/human)) return + src.log_message("[usr] tries to move in.") if (src.occupant) usr << "\blue The [src.name] is already occupied!" + src.log_append_to_last("Permission denied.") return /* if (usr.abiotic()) @@ -472,6 +492,7 @@ */ if(!src.operation_allowed(usr)) usr << "\red Access denied" + src.log_append_to_last("Permission denied.") return usr << "You start climbing into [src.name]" spawn(20) @@ -483,6 +504,7 @@ src.add_fingerprint(usr) src.Entered(usr) src.Move(src.loc) + src.log_append_to_last("[usr] moved in as pilot.") return @@ -509,6 +531,7 @@ /obj/mecha/proc/go_out() if(!src.occupant) return if(src.occupant.Move(src.loc)) + src.log_message("[src.occupant] moved out.") src.Exited(src.occupant) if (src.occupant.client) src.occupant.client.eye = src.occupant.client.mob @@ -516,6 +539,7 @@ src.occupant << browse(null, "window=exosuit") src.occupant = null src.pr_update_stats.stop() + return ////// Misc @@ -526,6 +550,26 @@ src.occupant << "[message]" return +/obj/mecha/proc/log_message(message as text,red=null) + log.len++ + log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") + return log.len + +/obj/mecha/proc/log_append_to_last(message as text,red=null) + var/list/last_entry = src.log[src.log.len] + last_entry["message"] += "
[red?"":null][message][red?"":null]" + return + + +/obj/mecha/proc/get_log_html() + var/output = "[src.name] Log" + for(var/list/entry in log) + output += {"
[time2text(entry["time"],"DDD MMM DD hh:mm:ss")]
+
[entry["message"]]
+ "} + output += "" + return output + /obj/mecha/proc/operation_allowed(mob/living/carbon/human/H) //check if it doesn't require any access at all if(src.check_operational_access(null)) @@ -573,6 +617,7 @@ /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) + src.log_message("Attacked by [W].") if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(src.internals_access_allowed(usr)) if(state==0) @@ -609,6 +654,7 @@ src.cell = null state = 4 user << "You unscrew and pry out the powercell." + src.log_message("Powercell removed") else if(state==4 && src.cell) state=3 user << "You screw the cell in place" @@ -621,6 +667,7 @@ user.drop_item() W.loc = src src.cell = W + src.log_message("Powercell installed") else user << "There's already a powercell installed." return @@ -644,6 +691,7 @@ else if(prob(src.deflect_chance)) user << "\red The [W] bounces off [src.name] armor." + src.log_append_to_last("Armor saved.") /* for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) @@ -684,6 +732,7 @@ var/output = {"Toggle Lights
[(/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
Eject
"} return output @@ -705,15 +754,22 @@ if (href_list["eject"]) src.eject() return + if (href_list["view_log"]) + src.occupant << browse(src.get_log_html(), "window=exosuit_log") + onclose(occupant, "exosuit_log") + return if (href_list["repair_int_control_lost"]) src.occupant_message("Recalibrating coordination system.") + src.log_message("Recalibration of coordination system started.") var/T = src.loc spawn(100) if(T == src.loc) src.internal_damage &= ~MECHA_INT_CONTROL_LOST src.occupant_message("Recalibration successful.") + src.log_message("Recalibration of coordination system finished with 0 errors.") else src.occupant_message("Recalibration failed.") + src.log_message("Recalibration of coordination system failed with 1 error.",1) return diff --git a/code/game/mecha/working/tools/tools.dm b/code/game/mecha/working/tools/tools.dm index d13d44e7bb3..aec1c1c5a00 100644 --- a/code/game/mecha/working/tools/tools.dm +++ b/code/game/mecha/working/tools/tools.dm @@ -10,6 +10,7 @@ if(!istype(mecha, /obj/mecha/working)) return src.chassis = mecha + chassis.log_append_to_last("[src.name] initialized.") return @@ -75,6 +76,7 @@ O.loc = chassis O.anchored = 0 chassis.occupant_message("[target] succesfully loaded.") + chassis.log_message("Loaded [O]. Cargo compartment capacity: [chassis.cargo_capacity - chassis.cargo.len]") else chassis.occupant_message("You must hold still while handling objects.") tool_ready = 1 @@ -123,6 +125,7 @@ if(istype(target, /turf/simulated/wall/r_wall)) chassis.occupant_message("\red The [target] is too durable to drill through.") else + chassis.log_message("Drilled through [target]") target.ex_act(2) tool_ready = 1 return diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index 9cbfe7991ba..75f88d9cc90 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -33,13 +33,11 @@ var/turf/T = get_turf(O.loc) if(T) T.Entered(O) - return - + src.log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") if (href_list["select_tool"]) var/tool = locate(href_list["select_tool"]) if(tool) src.selected_tool = tool - return return /obj/mecha/working/get_stats_part() @@ -70,4 +68,5 @@ tools -= destr_tool destr_tool.destroy() src.occupant_message("The [destr_tool] is destroyed!") + src.log_append_to_last("[destr_tool] is destroyed.") return \ No newline at end of file