diff --git a/baystation12.dme b/baystation12.dme index 90884a4242..61cc972fe9 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -441,7 +441,6 @@ #include "code\game\objects\weapons.dm" #include "code\game\objects\closets\walllocker.dm" #include "code\game\objects\effects\aliens.dm" -#include "code\game\objects\effects\barsign.dm" #include "code\game\objects\effects\bump_teleporter.dm" #include "code\game\objects\effects\effect_system.dm" #include "code\game\objects\effects\gibs.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm index 6fef666aca..7fcd57eefd 100644 --- a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm +++ b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm @@ -5,6 +5,7 @@ var/global/list/datum/money_account/department_accounts = list() var/global/next_account_number = 0 var/global/obj/machinery/account_database/centcomm_account_db var/global/datum/money_account/vendor_account +var/global/list/all_money_accounts = list() /proc/create_station_account() if(!station_account) @@ -27,8 +28,7 @@ var/global/datum/money_account/vendor_account //add the account station_account.transaction_log.Add(T) - for(var/obj/machinery/account_database/A in machines) - A.accounts.Add(station_account) + all_money_accounts.Add(station_account) /proc/create_department_account(department) next_account_number = rand(111111, 999999) @@ -50,14 +50,71 @@ var/global/datum/money_account/vendor_account //add the account department_account.transaction_log.Add(T) - for(var/obj/machinery/account_database/A in machines) - A.accounts.Add(department_account) + all_money_accounts.Add(department_account) department_accounts[department] = department_account //the current ingame time (hh:mm) can be obtained by calling: //worldtime2text() +/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/account_database/source_db) + + //create a new account + var/datum/money_account/M = new() + M.owner_name = new_owner_name + M.remote_access_pin = rand(1111, 111111) + M.money = starting_funds + + //create an entry in the account transaction log for when it was created + var/datum/transaction/T = new() + T.target_name = new_owner_name + T.purpose = "Account creation" + T.amount = starting_funds + if(!source_db) + //set a random date, time and location some time over the past few decades + T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]" + T.time = "[rand(0,24)]:[rand(11,59)]" + T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" + + M.account_number = rand(111111, 999999) + else + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = source_db.machine_id + + M.account_number = next_account_number + next_account_number += rand(1,25) + + //create a sealed package containing the account details + var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(source_db.loc) + + var/obj/item/weapon/paper/R = new /obj/item/weapon/paper(P) + P.wrapped = R + R.name = "Account information: [M.owner_name]" + R.info = "Account details (confidential)


" + R.info += "Account holder: [M.owner_name]
" + R.info += "Account number: [M.account_number]
" + R.info += "Account pin: [M.remote_access_pin]
" + R.info += "Starting balance: $[M.money]
" + R.info += "Date and time: [worldtime2text()], [current_date_string]

" + R.info += "Creation terminal ID: [source_db.machine_id]
" + R.info += "Authorised NT officer overseeing creation: [source_db.held_card.registered_name]
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the Accounts Database." + + //add the account + M.transaction_log.Add(T) + all_money_accounts.Add(M) + + return M + /datum/money_account var/owner_name = "" var/account_number = 0 @@ -82,7 +139,6 @@ var/global/datum/money_account/vendor_account icon = 'virology.dmi' icon_state = "analyser" density = 1 - var/list/accounts = list() req_one_access = list(access_hop, access_captain) var/receipt_num var/machine_id = "" @@ -156,10 +212,10 @@ var/global/datum/money_account/vendor_account dat += "" dat += "" else - dat += "Create new account Sync accounts across databases

" + dat += "Create new account

" dat += "" - for(var/i=1, i<=accounts.len, i++) - var/datum/money_account/D = accounts[i] + for(var/i=1, i<=all_money_accounts.len, i++) + var/datum/money_account/D = all_money_accounts[i] dat += "" dat += "" dat += "" @@ -193,22 +249,12 @@ var/global/datum/money_account/vendor_account if(href_list["choice"]) switch(href_list["choice"]) - if("sync_accounts") - for(var/obj/machinery/account_database/A in machines) - for(var/datum/money_account/M in src.accounts) - if(!A.accounts.Find(M)) - A.accounts.Add(M) - for(var/datum/money_account/M in A.accounts) - if(!src.accounts.Find(M)) - src.accounts.Add(M) - usr << "\icon[src] Accounts synched across all NanoTrasen financial databases." - if("create_account") creating_new_account = 1 if("finalise_create_account") var/account_name = href_list["holder_name"] var/starting_funds = max(text2num(href_list["starting_funds"]), 0) - add_account(account_name, starting_funds) + create_account(account_name, starting_funds, src) if(starting_funds > 0) //subtract the money station_account.money -= starting_funds @@ -247,85 +293,18 @@ var/global/datum/money_account/vendor_account access_level = 1 if("view_account_detail") var/index = text2num(href_list["account_index"]) - if(index && index <= accounts.len) - detailed_account_view = accounts[index] + if(index && index <= all_money_accounts.len) + detailed_account_view = all_money_accounts[index] if("view_accounts_list") detailed_account_view = null creating_new_account = 0 src.attack_hand(usr) -/obj/machinery/account_database/proc/add_account_across_all(var/new_owner_name = "Default user", var/starting_funds = 0, var/pre_existing = 0) - var/datum/money_account/M = add_account(new_owner_name, starting_funds, pre_existing) - for(var/obj/machinery/account_database/D in machines) - if(D == src) - continue - D.accounts.Add(M) - - return M - -/obj/machinery/account_database/proc/add_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/pre_existing = 0) - - //create a new account - var/datum/money_account/M = new() - M.owner_name = new_owner_name - M.remote_access_pin = rand(1111, 111111) - M.money = starting_funds - - //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = new_owner_name - T.purpose = "Account creation" - T.amount = starting_funds - if(pre_existing) - //set a random date, time and location some time over the past few decades - T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]" - T.time = "[rand(0,24)]:[rand(11,59)]" - T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" - - M.account_number = rand(111111, 999999) - else - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = machine_id - - M.account_number = next_account_number - next_account_number += rand(1,25) - - //create a sealed package containing the account details - var/obj/item/smallDelivery/P = new(src.loc) - - var/obj/item/weapon/paper/R = new(P) - P.wrapped = R - R.name = "Account information: [M.owner_name]" - R.info = "Account details (confidential)


" - R.info += "Account holder: [M.owner_name]
" - R.info += "Account number: [M.account_number]
" - R.info += "Account pin: [M.remote_access_pin]
" - R.info += "Starting balance: $[M.money]
" - R.info += "Date and time: [worldtime2text()], [current_date_string]

" - R.info += "Creation terminal ID: [machine_id]
" - R.info += "Authorised NT officer overseeing creation: [held_card.registered_name]
" - - //stamp the paper - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!R.stamped) - R.stamped = new - R.stamped += /obj/item/weapon/stamp - R.overlays += stampoverlay - R.stamps += "
This paper has been stamped by the Accounts Database." - - //add the account - M.transaction_log.Add(T) - accounts.Add(M) - - return M - /obj/machinery/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) if(!activated) return 0 - for(var/datum/money_account/D in accounts) + for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number) D.money += amount @@ -350,7 +329,12 @@ var/global/datum/money_account/vendor_account /obj/machinery/account_database/proc/attempt_account_access(var/attempt_account_number, var/attempt_pin_number, var/security_level_passed = 0) if(!activated) return 0 - for(var/datum/money_account/D in accounts) + for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number) if( D.security_level <= security_level_passed && (!D.security_level || D.remote_access_pin == attempt_pin_number) ) return D + +/obj/machinery/account_database/proc/get_account(var/account_number) + for(var/datum/money_account/D in all_money_accounts) + if(D.account_number == account_number) + return D diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm b/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm index 7df719a2e0..f3160a3f8a 100644 --- a/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm +++ b/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm @@ -21,6 +21,30 @@ spawn(0) print_reference() + //create a short manual as well + var/obj/item/weapon/paper/R = new(src.loc) + R.name = "Steps to success: Correct EFTPOS Usage" + R.info += "When first setting up your EFTPOS device:" + R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" + R.info += "2. Confirm that your EFTPOS device is connected to your local accounts database. For additional assistance with this step, contact NanoTrasen IT Support
" + R.info += "3. Confirm that your EFTPOS device has been linked to the account that you wish to recieve funds for all transactions processed on this device.
" + R.info += "When starting a new transaction with your EFTPOS device:" + R.info += "1. Ensure the device is UNLOCKED so that new data may be entered.
" + R.info += "2. Enter a sum of money and reference message for the new transaction.
" + R.info += "3. Lock the transaction, it is now ready for your customer.
" + R.info += "4. If at this stage you wish to modify or cancel your transaction, you may simply reset (unlock) your EFTPOS device.
" + R.info += "5. Give your EFTPOS device to the customer, they must authenticate the transaction by swiping their ID card and entering their PIN number.
" + R.info += "6. If done correctly, the transaction will be logged to both accounts with the reference you have entered, the terminal ID of your EFTPOS device and the money transferred across accounts.
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the EFTPOS device." + //by default, connect to the station account //the user of the EFTPOS device can change the target account though, and no-one will be the wiser (except whoever's being charged) linked_account = station_account diff --git a/code/WorkInProgress/Mini/ATM.dm b/code/WorkInProgress/Mini/ATM.dm index 544c439033..a7c0544591 100644 --- a/code/WorkInProgress/Mini/ATM.dm +++ b/code/WorkInProgress/Mini/ATM.dm @@ -36,9 +36,12 @@ log transactions /obj/machinery/atm/New() ..() - reconnect_database() machine_id = "[station_name()] RT #[num_financial_terminals++]" +/obj/machinery/atm/initialize() + ..() + reconnect_database() + /obj/machinery/atm/process() if(stat & NOPOWER) return @@ -253,13 +256,15 @@ log transactions playsound(src, 'buzz-two.ogg', 50, 1) //create an entry in the account transaction log - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Unauthorised login attempt" - T.source_terminal = machine_id - T.date = current_date_string - T.time = worldtime2text() - authenticated_account.transaction_log.Add(T) + var/datum/money_account/failed_account = linked_db.get_account(tried_account_num) + if(failed_account) + var/datum/transaction/T = new() + T.target_name = failed_account.owner_name + T.purpose = "Unauthorised login attempt" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + failed_account.transaction_log.Add(T) else usr << "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining." previous_account_number = tried_account_num diff --git a/code/ZAS/ZAS_Turfs.dm b/code/ZAS/ZAS_Turfs.dm index c66d77e5f3..2ed0478aba 100644 --- a/code/ZAS/ZAS_Turfs.dm +++ b/code/ZAS/ZAS_Turfs.dm @@ -134,7 +134,6 @@ turf return ..() proc/update_air_properties() - . = 1 var/air_directions_archived = air_check_directions air_check_directions = 0 @@ -259,7 +258,7 @@ turf //The unsimulated turf is adjacent to another one of our zone's turfs, // better rebuild to be sure we didn't get cut in twain if(consider_rebuild) - NT.zone.rebuild = 1 + zone.rebuild = 1 //Not adjacent to anything, and unsimulated. Goodbye~ else @@ -269,6 +268,7 @@ turf processing = 1 else processing = 0 + return 1 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index eababc43c1..e878616cf6 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -780,7 +780,7 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl return 0 var/delayfraction = round(delay/numticks) - var/turf/T = user.loc + var/turf/T = get_turf(user) var/holding = user.get_active_hand() for(var/i = 0, i target_temperature + 2 || regulating_temperature) - //If it goes too far, we should adjust ourselves back before stopping. - if(get_danger_level(target_temperature, TLV["temperature"])) - return - - if(!regulating_temperature) - regulating_temperature = 1 - visible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ - "You hear a click and a faint electronic hum.") - - if(target_temperature > T0C + MAX_TEMPERATURE) - target_temperature = T0C + MAX_TEMPERATURE - - if(target_temperature < T0C + MIN_TEMPERATURE) - target_temperature = T0C + MIN_TEMPERATURE - - var/datum/gas_mixture/gas = location.remove_air(0.25*environment.total_moles) - var/heat_capacity = gas.heat_capacity() - var/energy_used = max( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE) - - //Use power. Assuming that each power unit represents 1000 watts.... - use_power(energy_used/1000, ENVIRON) - - //We need to cool ourselves. - if(environment.temperature > target_temperature) - gas.temperature -= energy_used/heat_capacity - else - gas.temperature += energy_used/heat_capacity - - environment.merge(gas) - - if(abs(environment.temperature - target_temperature) <= 0.5) - regulating_temperature = 0 - visible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ - "You hear a click as a faint electronic humming stops.") - - var/old_level = danger_level - danger_level = overall_danger_level() - - if (old_level != danger_level) - refresh_danger_level() - update_icon() - - if (mode==AALARM_MODE_CYCLE && environment.return_pressure()= danger_levels[4] && danger_levels[4] > 0) || current_value <= danger_levels[1]) - return 2 - if((current_value >= danger_levels[3] && danger_levels[3] > 0) || current_value <= danger_levels[2]) - return 1 - return 0 + // breathable air according to human/Life() + TLV["oxygen"] = list(16, 19, 135, 140) // Partial pressure, kpa + TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa + TLV["plasma"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa + TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa + TLV["pressure"] = list(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20) /* kpa */ + TLV["temperature"] = list(T0C-26, T0C, T0C+40, T0C+66) // K - update_icon() - if(wiresexposed) - icon_state = "alarmx" - return - if((stat & (NOPOWER|BROKEN)) || shorted) - icon_state = "alarmp" - return - switch(max(danger_level, alarm_area.atmosalm)) - if (0) - icon_state = "alarm0" - if (1) - icon_state = "alarm2" //yes, alarm2 is yellow alarm - if (2) - icon_state = "alarm1" - receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) - return - if (alarm_area.master_air_alarm != src) - if (master_is_operating()) - return - elect_master() - if (alarm_area.master_air_alarm != src) - return - if(!signal || signal.encryption) - return - var/id_tag = signal.data["tag"] - if (!id_tag) - return - if (signal.data["area"] != area_uid) - return - if (signal.data["sigtype"] != "status") +/obj/machinery/alarm/initialize() + set_frequency(frequency) + if (!master_is_operating()) + elect_master() + + +/obj/machinery/alarm/process() + if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2) + return + + var/turf/simulated/location = loc + if(!istype(location)) return//returns if loc is not simulated + + var/datum/gas_mixture/environment = location.return_air() + + //Handle temperature adjustment here. + if(environment.temperature < target_temperature - 2 || environment.temperature > target_temperature + 2 || regulating_temperature) + //If it goes too far, we should adjust ourselves back before stopping. + if(get_danger_level(target_temperature, TLV["temperature"])) return - var/dev_type = signal.data["device"] - if(!(id_tag in alarm_area.air_scrub_names) && !(id_tag in alarm_area.air_vent_names)) - register_env_machine(id_tag, dev_type) - if(dev_type == "AScr") - alarm_area.air_scrub_info[id_tag] = signal.data - else if(dev_type == "AVP") - alarm_area.air_vent_info[id_tag] = signal.data + if(!regulating_temperature) + regulating_temperature = 1 + visible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ + "You hear a click and a faint electronic hum.") - proc/register_env_machine(var/m_id, var/device_type) - var/new_name - if (device_type=="AVP") - new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" - alarm_area.air_vent_names[m_id] = new_name - else if (device_type=="AScr") - new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" - alarm_area.air_scrub_names[m_id] = new_name + if(target_temperature > T0C + MAX_TEMPERATURE) + target_temperature = T0C + MAX_TEMPERATURE + + if(target_temperature < T0C + MIN_TEMPERATURE) + target_temperature = T0C + MIN_TEMPERATURE + + var/datum/gas_mixture/gas = location.remove_air(0.25*environment.total_moles) + var/heat_capacity = gas.heat_capacity() + var/energy_used = max( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE) + + //Use power. Assuming that each power unit represents 1000 watts.... + use_power(energy_used/1000, ENVIRON) + + //We need to cool ourselves. + if(environment.temperature > target_temperature) + gas.temperature -= energy_used/heat_capacity else - return - spawn (10) - send_signal(m_id, list("init" = new_name) ) + gas.temperature += energy_used/heat_capacity - proc/refresh_all() - for(var/id_tag in alarm_area.air_vent_names) - var/list/I = alarm_area.air_vent_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) - continue - send_signal(id_tag, list("status") ) - for(var/id_tag in alarm_area.air_scrub_names) - var/list/I = alarm_area.air_scrub_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) - continue - send_signal(id_tag, list("status") ) + environment.merge(gas) - proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_TO_AIRALARM) + if(abs(environment.temperature - target_temperature) <= 0.5) + regulating_temperature = 0 + visible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ + "You hear a click as a faint electronic humming stops.") - proc/send_signal(var/target, var/list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = command - signal.data["tag"] = target - signal.data["sigtype"] = "command" - - radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) - // world << text("Signal [] Broadcasted to []", command, target) - - return 1 - - proc/apply_mode() - var/current_pressures = TLV["pressure"] - var/target_pressure = (current_pressures[2] + current_pressures[3])/2 - switch(mode) - if(AALARM_MODE_SCRUBBING) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0) ) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) ) - - if(AALARM_MODE_PANIC, AALARM_MODE_CYCLE) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 0) ) - - if(AALARM_MODE_REPLACEMENT) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) ) - - if(AALARM_MODE_FILL) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 0) ) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) ) - - if(AALARM_MODE_OFF) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 0) ) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 0) ) - - proc/apply_danger_level(var/new_danger_level) - if (alarm_area.atmosalert(new_danger_level)) - post_alert(new_danger_level) - - for (var/area/A in alarm_area.related) - for (var/obj/machinery/alarm/AA in A) - if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.danger_level != new_danger_level) - AA.update_icon() - - if(danger_level > 1) - air_doors_close(0) - else - air_doors_open(0) + var/old_level = danger_level + danger_level = overall_danger_level() + if (old_level != danger_level) + refresh_danger_level() update_icon() - proc/post_alert(alert_level) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency) - if(!frequency) + if (mode==AALARM_MODE_CYCLE && environment.return_pressure()= danger_levels[4] && danger_levels[4] > 0) || current_value <= danger_levels[1]) + return 2 + if((current_value >= danger_levels[3] && danger_levels[3] > 0) || current_value <= danger_levels[2]) + return 1 + return 0 + +/obj/machinery/alarm/update_icon() + if(wiresexposed) + icon_state = "alarmx" + return + if((stat & (NOPOWER|BROKEN)) || shorted) + icon_state = "alarmp" + return + switch(max(danger_level, alarm_area.atmosalm)) + if (0) + icon_state = "alarm0" + if (1) + icon_state = "alarm2" //yes, alarm2 is yellow alarm + if (2) + icon_state = "alarm1" + +/obj/machinery/alarm/receive_signal(datum/signal/signal) + if(stat & (NOPOWER|BROKEN)) + return + if (alarm_area.master_air_alarm != src) + if (master_is_operating()) return + elect_master() + if (alarm_area.master_air_alarm != src) + return + if(!signal || signal.encryption) + return + var/id_tag = signal.data["tag"] + if (!id_tag) + return + if (signal.data["area"] != area_uid) + return + if (signal.data["sigtype"] != "status") + return - var/datum/signal/alert_signal = new - alert_signal.source = src - alert_signal.transmission_method = 1 - alert_signal.data["zone"] = alarm_area.name - alert_signal.data["type"] = "Atmospheric" + var/dev_type = signal.data["device"] + if(!(id_tag in alarm_area.air_scrub_names) && !(id_tag in alarm_area.air_vent_names)) + register_env_machine(id_tag, dev_type) + if(dev_type == "AScr") + alarm_area.air_scrub_info[id_tag] = signal.data + else if(dev_type == "AVP") + alarm_area.air_vent_info[id_tag] = signal.data - if(alert_level==2) - alert_signal.data["alert"] = "severe" - else if (alert_level==1) - alert_signal.data["alert"] = "minor" - else if (alert_level==0) - alert_signal.data["alert"] = "clear" +/obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) + var/new_name + if (device_type=="AVP") + new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" + alarm_area.air_vent_names[m_id] = new_name + else if (device_type=="AScr") + new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" + alarm_area.air_scrub_names[m_id] = new_name + else + return + spawn (10) + send_signal(m_id, list("init" = new_name) ) - frequency.post_signal(src, alert_signal) +/obj/machinery/alarm/proc/refresh_all() + for(var/id_tag in alarm_area.air_vent_names) + var/list/I = alarm_area.air_vent_info[id_tag] + if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + continue + send_signal(id_tag, list("status") ) + for(var/id_tag in alarm_area.air_scrub_names) + var/list/I = alarm_area.air_scrub_info[id_tag] + if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + continue + send_signal(id_tag, list("status") ) - proc/refresh_danger_level() - var/level = 0 - for (var/area/A in alarm_area.related) - for (var/obj/machinery/alarm/AA in A) - if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) - if (AA.danger_level > level) - level = AA.danger_level - apply_danger_level(level) +/obj/machinery/alarm/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_TO_AIRALARM) - proc/air_doors_close(manual) - var/area/A = get_area(src) - if(!A.master.air_doors_activated) - A.master.air_doors_activated = 1 - for(var/obj/machinery/door/E in A.master.all_doors) - if(istype(E,/obj/machinery/door/firedoor)) - if(!E:blocked) - if(E.operating) - E:nextstate = CLOSED - else if(!E.density) - spawn(0) - E.close() - continue +/obj/machinery/alarm/proc/send_signal(var/target, var/list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise + if(!radio_connection) + return 0 -/* if(istype(E, /obj/machinery/door/airlock)) - if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER) || E:air_locked) continue - if(!E.density) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = command + signal.data["tag"] = target + signal.data["sigtype"] = "command" + + radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) +// world << text("Signal [] Broadcasted to []", command, target) + + return 1 + +/obj/machinery/alarm/proc/apply_mode() + var/current_pressures = TLV["pressure"] + var/target_pressure = (current_pressures[2] + current_pressures[3])/2 + switch(mode) + if(AALARM_MODE_SCRUBBING) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) ) + + if(AALARM_MODE_PANIC, AALARM_MODE_CYCLE) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 0) ) + + if(AALARM_MODE_REPLACEMENT) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) ) + + if(AALARM_MODE_FILL) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 0) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) ) + + if(AALARM_MODE_OFF) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 0) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 0) ) + +/obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level) + if (alarm_area.atmosalert(new_danger_level)) + post_alert(new_danger_level) + + for (var/area/A in alarm_area.related) + for (var/obj/machinery/alarm/AA in A) + if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.danger_level != new_danger_level) + AA.update_icon() + + if(danger_level > 1) + air_doors_close(0) + else + air_doors_open(0) + + update_icon() + +/obj/machinery/alarm/proc/post_alert(alert_level) + var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency) + if(!frequency) + return + + var/datum/signal/alert_signal = new + alert_signal.source = src + alert_signal.transmission_method = 1 + alert_signal.data["zone"] = alarm_area.name + alert_signal.data["type"] = "Atmospheric" + + if(alert_level==2) + alert_signal.data["alert"] = "severe" + else if (alert_level==1) + alert_signal.data["alert"] = "minor" + else if (alert_level==0) + alert_signal.data["alert"] = "clear" + + frequency.post_signal(src, alert_signal) + +/obj/machinery/alarm/proc/refresh_danger_level() + var/level = 0 + for (var/area/A in alarm_area.related) + for (var/obj/machinery/alarm/AA in A) + if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) + if (AA.danger_level > level) + level = AA.danger_level + apply_danger_level(level) + +/obj/machinery/alarm/proc/air_doors_close(manual) + var/area/A = get_area(src) + if(!A.master.air_doors_activated) + A.master.air_doors_activated = 1 + for(var/obj/machinery/door/E in A.master.all_doors) + if(istype(E,/obj/machinery/door/firedoor)) + if(!E:blocked) + if(E.operating) + E:nextstate = CLOSED + else if(!E.density) spawn(0) E.close() - spawn(10) - if(E.density) - E:air_locked = E.req_access - E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) - E.update_icon() - else if(E.operating) + continue + +/* if(istype(E, /obj/machinery/door/airlock)) + if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER) || E:air_locked) continue + if(!E.density) + spawn(0) + E.close() spawn(10) - E.close() if(E.density) E:air_locked = E.req_access E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) E.update_icon() - else if(!E:locked) //Don't lock already bolted doors. - E:air_locked = E.req_access - E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) - E.update_icon()*/ + else if(E.operating) + spawn(10) + E.close() + if(E.density) + E:air_locked = E.req_access + E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + E.update_icon() + else if(!E:locked) //Don't lock already bolted doors. + E:air_locked = E.req_access + E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + E.update_icon()*/ - proc/air_doors_open(manual) - var/area/A = get_area(loc) - if(A.master.air_doors_activated) - A.master.air_doors_activated = 0 - for(var/obj/machinery/door/E in A.master.all_doors) - if(istype(E, /obj/machinery/door/firedoor)) - if(!E:blocked) - if(E.operating) - E:nextstate = OPEN - else if(E.density) - spawn(0) - E.open() - continue +/obj/machinery/alarm/proc/air_doors_open(manual) + var/area/A = get_area(loc) + if(A.master.air_doors_activated) + A.master.air_doors_activated = 0 + for(var/obj/machinery/door/E in A.master.all_doors) + if(istype(E, /obj/machinery/door/firedoor)) + if(!E:blocked) + if(E.operating) + E:nextstate = OPEN + else if(E.density) + spawn(0) + E.open() + continue /* if(istype(E, /obj/machinery/door/airlock)) - if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue - if(!isnull(E:air_locked)) //Don't mess with doors locked for other reasons. - E:req_access = E:air_locked - E:air_locked = null - E.update_icon()*/ + if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue + if(!isnull(E:air_locked)) //Don't mess with doors locked for other reasons. + E:req_access = E:air_locked + E:air_locked = null + E.update_icon()*/ /////////// //HACKING// /////////// - proc/isWireColorCut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - return ((AAlarmwires & wireFlag) == 0) +/obj/machinery/alarm/proc/isWireColorCut(var/wireColor) + var/wireFlag = AAlarmWireColorToFlag[wireColor] + return ((AAlarmwires & wireFlag) == 0) - proc/isWireCut(var/wireIndex) - var/wireFlag = AAlarmIndexToFlag[wireIndex] - return ((AAlarmwires & wireFlag) == 0) +/obj/machinery/alarm/proc/isWireCut(var/wireIndex) + var/wireFlag = AAlarmIndexToFlag[wireIndex] + return ((AAlarmwires & wireFlag) == 0) - proc/allWiresCut() - var/i = 1 - while(i<=5) - if(AAlarmwires & AAlarmIndexToFlag[i]) - return 0 - i++ - return 1 +/obj/machinery/alarm/proc/allWiresCut() + var/i = 1 + while(i<=5) + if(AAlarmwires & AAlarmIndexToFlag[i]) + return 0 + i++ + return 1 - proc/cut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] - AAlarmwires &= ~wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) +/obj/machinery/alarm/proc/cut(var/wireColor) + var/wireFlag = AAlarmWireColorToFlag[wireColor] + var/wireIndex = AAlarmWireColorToIndex[wireColor] + AAlarmwires &= ~wireFlag + switch(wireIndex) + if(AALARM_WIRE_IDSCAN) + locked = 1 + + if(AALARM_WIRE_POWER) + shock(usr, 50) + shorted = 1 + update_icon() + + if (AALARM_WIRE_AI_CONTROL) + if (aidisabled == 0) + aidisabled = 1 + + if(AALARM_WIRE_SYPHON) + mode = AALARM_MODE_PANIC + apply_mode() + + if(AALARM_WIRE_AALARM) + + if (alarm_area.atmosalert(2)) + apply_danger_level(2) + spawn(1) + updateUsrDialog() + update_icon() + + updateDialog() + + return + +/obj/machinery/alarm/proc/mend(var/wireColor) + var/wireFlag = AAlarmWireColorToFlag[wireColor] + var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function + AAlarmwires |= wireFlag + switch(wireIndex) + if(AALARM_WIRE_IDSCAN) + + if(AALARM_WIRE_POWER) + shorted = 0 + shock(usr, 50) + update_icon() + + if(AALARM_WIRE_AI_CONTROL) + if (aidisabled == 1) + aidisabled = 0 + + updateDialog() + return + +/obj/machinery/alarm/proc/pulse(var/wireColor) + //var/wireFlag = AAlarmWireColorToFlag[wireColor] //not used in this function + var/wireIndex = AAlarmWireColorToIndex[wireColor] + switch(wireIndex) + if(AALARM_WIRE_IDSCAN) //unlocks for 30 seconds, if you have a better way to hack I'm all ears + locked = 0 + spawn(300) locked = 1 - if(AALARM_WIRE_POWER) - shock(usr, 50) + if (AALARM_WIRE_POWER) + if(shorted == 0) shorted = 1 update_icon() - if (AALARM_WIRE_AI_CONTROL) - if (aidisabled == 0) - aidisabled = 1 - - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_PANIC - apply_mode() - - if(AALARM_WIRE_AALARM) - - if (alarm_area.atmosalert(2)) - apply_danger_level(2) - spawn(1) - updateUsrDialog() - update_icon() - - updateDialog() - - return - - proc/mend(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function - AAlarmwires |= wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - - if(AALARM_WIRE_POWER) - shorted = 0 - shock(usr, 50) - update_icon() - - if(AALARM_WIRE_AI_CONTROL) - if (aidisabled == 1) - aidisabled = 0 - - updateDialog() - return - - proc/pulse(var/wireColor) - //var/wireFlag = AAlarmWireColorToFlag[wireColor] //not used in this function - var/wireIndex = AAlarmWireColorToIndex[wireColor] - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) //unlocks for 30 seconds, if you have a better way to hack I'm all ears - locked = 0 - spawn(300) - locked = 1 - - if (AALARM_WIRE_POWER) - if(shorted == 0) - shorted = 1 + spawn(1200) + if(shorted == 1) + shorted = 0 update_icon() - spawn(1200) - if(shorted == 1) - shorted = 0 - update_icon() - - if (AALARM_WIRE_AI_CONTROL) - if (aidisabled == 0) - aidisabled = 1 + if (AALARM_WIRE_AI_CONTROL) + if (aidisabled == 0) + aidisabled = 1 + updateDialog() + spawn(10) + if (aidisabled == 1) + aidisabled = 0 updateDialog() - spawn(10) - if (aidisabled == 1) - aidisabled = 0 - updateDialog() - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_REPLACEMENT - apply_mode() + if(AALARM_WIRE_SYPHON) + mode = AALARM_MODE_REPLACEMENT + apply_mode() - if(AALARM_WIRE_AALARM) - if (alarm_area.atmosalert(0)) - apply_danger_level(0) - spawn(1) - updateUsrDialog() - update_icon() + if(AALARM_WIRE_AALARM) + if (alarm_area.atmosalert(0)) + apply_danger_level(0) + spawn(1) + updateUsrDialog() + update_icon() - updateDialog() - return + updateDialog() + return - proc/shock(mob/user, prb) - if((stat & (NOPOWER))) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 //you lucked out, no shock for you - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() //sparks always. - if (electrocute_mob(user, get_area(src), src)) - return 1 - else - return 0 +/obj/machinery/alarm/proc/shock(mob/user, prb) + if((stat & (NOPOWER))) // unpowered, no shock + return 0 + if(!prob(prb)) + return 0 //you lucked out, no shock for you + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() //sparks always. + if (electrocute_mob(user, get_area(src), src)) + return 1 + else + return 0 /////////////// //END HACKING// /////////////// - attack_ai(mob/user) - return interact(user) +/obj/machinery/alarm/attack_ai(mob/user) + return interact(user) - attack_hand(mob/user) - . = ..() - if (.) - return - return interact(user) +/obj/machinery/alarm/attack_hand(mob/user) + . = ..() + if (.) + return + return interact(user) - interact(mob/user) - user.set_machine(src) - - if(buildstage!=2) - return - - if ( (get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=air_alarm") - user << browse(null, "window=AAlarmwires") - return - - - else if (istype(user, /mob/living/silicon) && aidisabled) - user << "AI control for this Air Alarm interface has been disabled." - user << browse(null, "window=air_alarm") - return - - if(wiresexposed && (!istype(user, /mob/living/silicon))) - var/t1 = text("[alarm_area.name] Air Alarm WiresAccess Panel
\n") - var/list/AAlarmwires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Black" = 5, - ) - for(var/wiredesc in AAlarmwires) - var/is_uncut = AAlarmwires & AAlarmWireColorToFlag[AAlarmwires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - - else - t1 += "Cut " - t1 += "Pulse " - - t1 += "
" - t1 += text("
\n[(locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - t1 += text("

Close

") - user << browse(t1, "window=AAlarmwires") - onclose(user, "AAlarmwires") - - if(!shorted) - user << browse(return_text(user),"window=air_alarm") - onclose(user, "air_alarm") +/obj/machinery/alarm/interact(mob/user) + user.set_machine(src) + if(buildstage!=2) return - proc/return_text(mob/user) - if(!(istype(user, /mob/living/silicon)) && locked) - return "\The [src][return_status()]
[rcon_text()]
(Swipe ID card to unlock interface)" - else - return "\The [src][return_status()]
[rcon_text()]
[return_controls()]" + if ( (get_dist(src, user) > 1 )) + if (!istype(user, /mob/living/silicon)) + user.machine = null + user << browse(null, "window=air_alarm") + user << browse(null, "window=AAlarmwires") + return - proc/return_status() - var/turf/location = get_turf(src) - var/datum/gas_mixture/environment = location.return_air() - var/total = environment.oxygen + environment.carbon_dioxide + environment.toxins + environment.nitrogen - var/output = "Air Status:
" - if(total == 0) - output += "Warning: Cannot obtain air sample for analysis." - return output + else if (istype(user, /mob/living/silicon) && aidisabled) + user << "AI control for this Air Alarm interface has been disabled." + user << browse(null, "window=air_alarm") + return - output += {" + if(wiresexposed && (!istype(user, /mob/living/silicon))) + var/t1 = text("[alarm_area.name] Air Alarm WiresAccess Panel
\n") + var/list/wirecolors = list( + "Orange" = 1, + "Dark red" = 2, + "White" = 3, + "Yellow" = 4, + "Black" = 5, + ) + for(var/wiredesc in wirecolors) + var/is_uncut = AAlarmwires & AAlarmWireColorToFlag[wirecolors[wiredesc]] + t1 += "[wiredesc] wire: " + if(!is_uncut) + t1 += "Mend" + + else + t1 += "Cut " + t1 += "Pulse " + + t1 += "
" + t1 += text("
\n[(locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") + t1 += text("

Close

") + user << browse(t1, "window=AAlarmwires") + onclose(user, "AAlarmwires") + + if(!shorted) + user << browse(return_text(user),"window=air_alarm") + onclose(user, "air_alarm") + + return + +/obj/machinery/alarm/proc/return_text(mob/user) + if(!(istype(user, /mob/living/silicon)) && locked) + return "\The [src][return_status()]
[rcon_text()]
(Swipe ID card to unlock interface)" + else + return "\The [src][return_status()]
[rcon_text()]
[return_controls()]" + +/obj/machinery/alarm/proc/return_status() + var/turf/location = get_turf(src) + var/datum/gas_mixture/environment = location.return_air() + var/total = environment.oxygen + environment.carbon_dioxide + environment.toxins + environment.nitrogen + var/output = "Air Status:
" + + if(total == 0) + output += "Warning: Cannot obtain air sample for analysis." + return output + + output += {" "} - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - var/list/current_settings = TLV["pressure"] - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = get_danger_level(environment_pressure, current_settings) + var/list/current_settings = TLV["pressure"] + var/environment_pressure = environment.return_pressure() + var/pressure_dangerlevel = get_danger_level(environment_pressure, current_settings) - current_settings = TLV["oxygen"] - var/oxygen_dangerlevel = get_danger_level(environment.oxygen*partial_pressure, current_settings) - var/oxygen_percent = round(environment.oxygen / total * 100, 2) + current_settings = TLV["oxygen"] + var/oxygen_dangerlevel = get_danger_level(environment.oxygen*partial_pressure, current_settings) + var/oxygen_percent = round(environment.oxygen / total * 100, 2) - current_settings = TLV["carbon dioxide"] - var/co2_dangerlevel = get_danger_level(environment.carbon_dioxide*partial_pressure, current_settings) - var/co2_percent = round(environment.carbon_dioxide / total * 100, 2) + current_settings = TLV["carbon dioxide"] + var/co2_dangerlevel = get_danger_level(environment.carbon_dioxide*partial_pressure, current_settings) + var/co2_percent = round(environment.carbon_dioxide / total * 100, 2) - current_settings = TLV["plasma"] - var/plasma_dangerlevel = get_danger_level(environment.toxins*partial_pressure, current_settings) - var/plasma_percent = round(environment.toxins / total * 100, 2) + current_settings = TLV["plasma"] + var/plasma_dangerlevel = get_danger_level(environment.toxins*partial_pressure, current_settings) + var/plasma_percent = round(environment.toxins / total * 100, 2) - current_settings = TLV["other"] - var/other_moles = 0.0 - for(var/datum/gas/G in environment.trace_gases) - other_moles+=G.moles - var/other_dangerlevel = get_danger_level(other_moles*partial_pressure, current_settings) + current_settings = TLV["other"] + var/other_moles = 0.0 + for(var/datum/gas/G in environment.trace_gases) + other_moles+=G.moles + var/other_dangerlevel = get_danger_level(other_moles*partial_pressure, current_settings) - current_settings = TLV["temperature"] - var/temperature_dangerlevel = get_danger_level(environment.temperature, current_settings) + current_settings = TLV["temperature"] + var/temperature_dangerlevel = get_danger_level(environment.temperature, current_settings) - output += {" + output += {" Pressure: [environment_pressure]kPa
Oxygen: [oxygen_percent]%
Carbon dioxide: [co2_percent]%
Toxins: [plasma_percent]%
"} - if (other_dangerlevel==2) - output += "Notice: High Concentration of Unknown Particles Detected
" - else if (other_dangerlevel==1) - output += "Notice: Low Concentration of Unknown Particles Detected
" + if (other_dangerlevel==2) + output += "Notice: High Concentration of Unknown Particles Detected
" + else if (other_dangerlevel==1) + output += "Notice: Low Concentration of Unknown Particles Detected
" - output += "Temperature: [environment.temperature]K ([round(environment.temperature - T0C, 0.1)]C)
" + output += "Temperature: [environment.temperature]K ([round(environment.temperature - T0C, 0.1)]C)
" - //Overall status - output += "Local Status: " - switch(max(pressure_dangerlevel,oxygen_dangerlevel,co2_dangerlevel,plasma_dangerlevel,other_dangerlevel,temperature_dangerlevel)) - if(2) - output += "DANGER: Internals Required" - if(1) - output += "Caution" - if(0) - if(alarm_area.atmosalm) - output += {"Caution: Atmos alert in area"} - else - output += {"Optimal"} + //Overall status + output += "Local Status: " + switch(max(pressure_dangerlevel,oxygen_dangerlevel,co2_dangerlevel,plasma_dangerlevel,other_dangerlevel,temperature_dangerlevel)) + if(2) + output += "DANGER: Internals Required" + if(1) + output += "Caution" + if(0) + if(alarm_area.atmosalm) + output += {"Caution: Atmos alert in area"} + else + output += {"Optimal"} - return output + return output - proc/rcon_text() - var/dat = "
#[D.account_number][D.owner_name]
" +/obj/machinery/alarm/proc/rcon_text() + var/dat = "
Remote Control:
" - if(rcon_setting == RCON_NO) - dat += "Off" - else - dat += "Off" - dat += " | " - if(rcon_setting == RCON_AUTO) - dat += "Auto" - else - dat += "Auto" - dat += " | " - if(rcon_setting == RCON_YES) - dat += "On" - else - dat += "On
" - //Hackish, I know. I didn't feel like bothering to rework all of this. - dat += "
Remote Control:
" + if(rcon_setting == RCON_NO) + dat += "Off" + else + dat += "Off" + dat += " | " + if(rcon_setting == RCON_AUTO) + dat += "Auto" + else + dat += "Auto" + dat += " | " + if(rcon_setting == RCON_YES) + dat += "On" + else + dat += "On
Thermostat:
[target_temperature - T0C]C
" + //Hackish, I know. I didn't feel like bothering to rework all of this. + dat += "Thermostat:
[target_temperature - T0C]C" - return dat + return dat - proc/return_controls() - var/output = ""//"[alarm_zone] Air [name]
" +/obj/machinery/alarm/proc/return_controls() + var/output = ""//"[alarm_zone] Air [name]
" - switch(screen) - if (AALARM_SCREEN_MAIN) - if(alarm_area.atmosalm) - output += "Reset - Atmospheric Alarm
" - else - output += "Activate - Atmospheric Alarm
" + switch(screen) + if (AALARM_SCREEN_MAIN) + if(alarm_area.atmosalm) + output += "Reset - Atmospheric Alarm
" + else + output += "Activate - Atmospheric Alarm
" - output += {" + output += {" Scrubbers Control
Vents Control
Set environmentals mode
Sensor Settings

"} - if (mode==AALARM_MODE_PANIC) - output += "PANIC SYPHON ACTIVE
Turn syphoning off" - else - output += "ACTIVATE PANIC SYPHON IN AREA" + if (mode==AALARM_MODE_PANIC) + output += "PANIC SYPHON ACTIVE
Turn syphoning off" + else + output += "ACTIVATE PANIC SYPHON IN AREA" - if (AALARM_SCREEN_VENT) - var/sensor_data = "" - if(alarm_area.air_vent_names.len) - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/data = alarm_area.air_vent_info[id_tag] - if(!data) - continue; - var/state = "" + if (AALARM_SCREEN_VENT) + var/sensor_data = "" + if(alarm_area.air_vent_names.len) + for(var/id_tag in alarm_area.air_vent_names) + var/long_name = alarm_area.air_vent_names[id_tag] + var/list/data = alarm_area.air_vent_info[id_tag] + if(!data) + continue; + var/state = "" + sensor_data += {" +[long_name][state]
+Operating: +[data["power"]?"on":"off"] +
+Pressure checks: +external +internal +
+External pressure bound: +- +- +- +- +[data["external"]] ++ ++ ++ ++ + (reset) +
+"} + if (data["direction"] == "siphon") sensor_data += {" - [long_name][state]
- Operating: - [data["power"]?"on":"off"] -
- Pressure checks: - external - internal -
- External pressure bound: - - - - - - - - - [data["external"]] - + - + - + - + - (reset) -
- "} - if (data["direction"] == "siphon") - sensor_data += {" - Direction: - siphoning -
- "} - sensor_data += {"
"} - else - sensor_data = "No vents connected.
" - output = {"Main menu
[sensor_data]"} - if (AALARM_SCREEN_SCRUB) - var/sensor_data = "" - if(alarm_area.air_scrub_names.len) - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/data = alarm_area.air_scrub_info[id_tag] - if(!data) - continue; - var/state = "" +Direction: +siphoning +
+"} + sensor_data += {"
"} + else + sensor_data = "No vents connected.
" + output = {"Main menu
[sensor_data]"} + if (AALARM_SCREEN_SCRUB) + var/sensor_data = "" + if(alarm_area.air_scrub_names.len) + for(var/id_tag in alarm_area.air_scrub_names) + var/long_name = alarm_area.air_scrub_names[id_tag] + var/list/data = alarm_area.air_scrub_info[id_tag] + if(!data) + continue; + var/state = "" + sensor_data += {" +[long_name][state]
+Operating: +[data["power"]?"on":"off"]
+Type: +[data["scrubbing"]?"scrubbing":"syphoning"]
+"} + + if(data["scrubbing"]) sensor_data += {" - [long_name][state]
- Operating: - [data["power"]?"on":"off"]
- Type: - [data["scrubbing"]?"scrubbing":"syphoning"]
- "} +Filtering: +Carbon Dioxide +[data["filter_co2"]?"on":"off"]; +Toxins +[data["filter_toxins"]?"on":"off"]; +Nitrous Oxide +[data["filter_n2o"]?"on":"off"] +
+"} + sensor_data += {" +Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""] +Dea":"red'>A")]ctivate
+
+"} + else + sensor_data = "No scrubbers connected.
" + output = {"Main menu
[sensor_data]"} - if(data["scrubbing"]) - sensor_data += {" - Filtering: - Carbon Dioxide - [data["filter_co2"]?"on":"off"]; - Toxins - [data["filter_toxins"]?"on":"off"]; - Nitrous Oxide - [data["filter_n2o"]?"on":"off"] -
- "} - sensor_data += {" - Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""] - Dea":"red'>A")]ctivate
-
- "} + if (AALARM_SCREEN_MODE) + output += "Main menu
Air machinery mode for the area:" - if (AALARM_SCREEN_MODE) - output += "Main menu
Air machinery mode for the area:" - - if (AALARM_SCREEN_SENSORS) - output += {" + if (AALARM_SCREEN_SENSORS) + output += {" Main menu
Alarm thresholds:
Partial pressure for gases @@ -919,170 +923,175 @@ table tr:first-child th:first-child { border: none;} "} - var/list/gases = list( - "oxygen" = "O2", - "carbon dioxide" = "CO2", - "plasma" = "Toxin", - "other" = "Other",) + var/list/gases = list( + "oxygen" = "O2", + "carbon dioxide" = "CO2", + "plasma" = "Toxin", + "other" = "Other",) - var/list/selected - for (var/g in gases) - output += "" - selected = TLV[g] - for(var/i = 1, i <= 4, i++) - output += "" - output += "" - - selected = TLV["pressure"] - output += " " + var/list/selected + for (var/g in gases) + output += "" + selected = TLV[g] for(var/i = 1, i <= 4, i++) - output += "" + output += "" output += "" - selected = TLV["temperature"] - output += "" - for(var/i = 1, i <= 4, i++) - output += "" - output += "
min2min1max1max2
[gases[g]][selected[i] >= 0 ? selected[i] :"OFF"]
Pressure
[gases[g]][selected[i] >= 0 ? selected[i] :"OFF"][selected[i] >= 0 ? selected[i] :"OFF"]
Temperature[selected[i] >= 0 ? selected[i] :"OFF"]
" + selected = TLV["pressure"] + output += " Pressure" + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"]" + output += "" - return output + selected = TLV["temperature"] + output += "Temperature" + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"]" + output += "" - Topic(href, href_list) + return output - if(href_list["rcon"]) - rcon_setting = text2num(href_list["rcon"]) +/obj/machinery/alarm/Topic(href, href_list) - if ( (get_dist(src, usr) > 1 )) - if (!istype(usr, /mob/living/silicon)) - usr.machine = null - usr << browse(null, "window=air_alarm") - usr << browse(null, "window=AAlarmwires") - return + if(href_list["rcon"]) + rcon_setting = text2num(href_list["rcon"]) - add_fingerprint(usr) - usr.machine = src + if ( (get_dist(src, usr) > 1 )) + if (!istype(usr, /mob/living/silicon)) + usr.machine = null + usr << browse(null, "window=air_alarm") + usr << browse(null, "window=AAlarmwires") + return - if(href_list["command"]) - var/device_id = href_list["id_tag"] - switch(href_list["command"]) - if( "power", - "adjust_external_pressure", - "set_external_pressure", - "checks", - "co2_scrub", - "tox_scrub", - "n2o_scrub", - "panic_siphon", - "scrubbing") + add_fingerprint(usr) + usr.machine = src - send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) ) + if(href_list["command"]) + var/device_id = href_list["id_tag"] + switch(href_list["command"]) + if( "power", + "adjust_external_pressure", + "set_external_pressure", + "checks", + "co2_scrub", + "tox_scrub", + "n2o_scrub", + "panic_siphon", + "scrubbing") - if("set_threshold") - var/env = href_list["env"] - var/threshold = text2num(href_list["var"]) - var/list/selected = TLV[env] - var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") - var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num - if (isnull(newval) || ..() || (locked && issilicon(usr))) - return - if (newval<0) - selected[threshold] = -1.0 - else if (env=="temperature" && newval>5000) - selected[threshold] = 5000 - else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) - selected[threshold] = 50*ONE_ATMOSPHERE - else if (env!="temperature" && env!="pressure" && newval>200) - selected[threshold] = 200 - else - newval = round(newval,0.01) - selected[threshold] = newval - if(threshold == 1) - if(selected[1] > selected[2]) - selected[2] = selected[1] - if(selected[1] > selected[3]) - selected[3] = selected[1] - if(selected[1] > selected[4]) - selected[4] = selected[1] - if(threshold == 2) - if(selected[1] > selected[2]) - selected[1] = selected[2] - if(selected[2] > selected[3]) - selected[3] = selected[2] - if(selected[2] > selected[4]) - selected[4] = selected[2] - if(threshold == 3) - if(selected[1] > selected[3]) - selected[1] = selected[3] - if(selected[2] > selected[3]) - selected[2] = selected[3] - if(selected[3] > selected[4]) - selected[4] = selected[3] - if(threshold == 4) - if(selected[1] > selected[4]) - selected[1] = selected[4] - if(selected[2] > selected[4]) - selected[2] = selected[4] - if(selected[3] > selected[4]) - selected[3] = selected[4] + send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) ) - apply_mode() + if("set_threshold") + var/env = href_list["env"] + var/threshold = text2num(href_list["var"]) + var/list/selected = TLV[env] + var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") + var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num + if (isnull(newval) || ..() || (locked && issilicon(usr))) + return + if (newval<0) + selected[threshold] = -1.0 + else if (env=="temperature" && newval>5000) + selected[threshold] = 5000 + else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) + selected[threshold] = 50*ONE_ATMOSPHERE + else if (env!="temperature" && env!="pressure" && newval>200) + selected[threshold] = 200 + else + newval = round(newval,0.01) + selected[threshold] = newval + if(threshold == 1) + if(selected[1] > selected[2]) + selected[2] = selected[1] + if(selected[1] > selected[3]) + selected[3] = selected[1] + if(selected[1] > selected[4]) + selected[4] = selected[1] + if(threshold == 2) + if(selected[1] > selected[2]) + selected[1] = selected[2] + if(selected[2] > selected[3]) + selected[3] = selected[2] + if(selected[2] > selected[4]) + selected[4] = selected[2] + if(threshold == 3) + if(selected[1] > selected[3]) + selected[1] = selected[3] + if(selected[2] > selected[3]) + selected[2] = selected[3] + if(selected[3] > selected[4]) + selected[4] = selected[3] + if(threshold == 4) + if(selected[1] > selected[4]) + selected[1] = selected[4] + if(selected[2] > selected[4]) + selected[2] = selected[4] + if(selected[3] > selected[4]) + selected[3] = selected[4] - if(href_list["screen"]) - screen = text2num(href_list["screen"]) + apply_mode() - if(href_list["atmos_unlock"]) - switch(href_list["atmos_unlock"]) - if("0") - air_doors_close(1) - if("1") - air_doors_open(1) + if(href_list["screen"]) + screen = text2num(href_list["screen"]) - if(href_list["atmos_alarm"]) - if (alarm_area.atmosalert(2)) - apply_danger_level(2) - update_icon() + if(href_list["atmos_unlock"]) + switch(href_list["atmos_unlock"]) + if("0") + air_doors_close(1) + if("1") + air_doors_open(1) - if(href_list["atmos_reset"]) - if (alarm_area.atmosalert(0)) - apply_danger_level(0) - update_icon() + if(href_list["atmos_alarm"]) + if (alarm_area.atmosalert(2)) + apply_danger_level(2) + update_icon() - if(href_list["mode"]) - mode = text2num(href_list["mode"]) - apply_mode() + if(href_list["atmos_reset"]) + if (alarm_area.atmosalert(0)) + apply_danger_level(0) + update_icon() - if(href_list["temperature"]) - var/list/selected = TLV["temperature"] - var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE) - var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE) - var/input_temperature = input("What temperature would you like the system to mantain? (Capped between [min_temperature]C and [max_temperature]C)", "Thermostat Controls") as num|null - if(!input_temperature || input_temperature > max_temperature || input_temperature < min_temperature) - usr << "Temperature must be between [min_temperature]C and [max_temperature]C" - else - target_temperature = input_temperature + T0C + if(href_list["mode"]) + mode = text2num(href_list["mode"]) + apply_mode() - if (href_list["AAlarmwires"]) - var/t1 = text2num(href_list["AAlarmwires"]) - if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (isWireColorCut(t1)) - mend(t1) - else - cut(t1) + if(href_list["temperature"]) + var/list/selected = TLV["temperature"] + var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE) + var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE) + var/input_temperature = input("What temperature would you like the system to mantain? (Capped between [min_temperature]C and [max_temperature]C)", "Thermostat Controls") as num|null + if(!input_temperature || input_temperature > max_temperature || input_temperature < min_temperature) + usr << "Temperature must be between [min_temperature]C and [max_temperature]C" + else + target_temperature = input_temperature + T0C - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.equipped(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - pulse(t1) + if (href_list["AAlarmwires"]) + var/t1 = text2num(href_list["AAlarmwires"]) + if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) + usr << "You need wirecutters!" + return + if (isWireColorCut(t1)) + mend(t1) + else + cut(t1) + if (AAlarmwires == 0) + usr << "You cut last of wires inside [src]" + update_icon() + buildstage = 1 + return - updateUsrDialog() + else if (href_list["pulse"]) + var/t1 = text2num(href_list["pulse"]) + if (!istype(usr.equipped(), /obj/item/device/multitool)) + usr << "You need a multitool!" + return + if (isWireColorCut(t1)) + usr << "You can't pulse a cut wire." + return + else + pulse(t1) + + updateUsrDialog() /obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob) @@ -1136,31 +1145,32 @@ table tr:first-child th:first-child { border: none;} buildstage = 2 update_icon() first_run() + return else if(istype(W, /obj/item/weapon/crowbar)) - user << "You pry out the circuit!" + user << "You start prying out the circuit." playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - spawn(20) + if(do_after(user,20)) + user << "You pry out the circuit!" var/obj/item/weapon/airalarm_electronics/circuit = new /obj/item/weapon/airalarm_electronics() circuit.loc = user.loc buildstage = 0 update_icon() - return + return if(0) if(istype(W, /obj/item/weapon/airalarm_electronics)) user << "You insert the circuit!" del(W) buildstage = 1 update_icon() + return - /* Commented out due to RUNTIMES, RUNTIMES EVERYWHERE. - else if(istype(W, /obj/item/weapon/wrench)) - user << "You remove the fire alarm assembly from the wall!" - var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame() - frame.loc = user.loc - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - del(src) */ - return + else if(istype(W, /obj/item/weapon/wrench)) + user << "You remove the fire alarm assembly from the wall!" + var/obj/item/alarm_frame/frame = new /obj/item/alarm_frame() + frame.loc = user.loc + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + del(src) return ..() @@ -1172,6 +1182,12 @@ table tr:first-child th:first-child { border: none;} spawn(rand(0,15)) update_icon() +/obj/machinery/alarm/examine() + ..() + if (buildstage < 2) + usr << "It is not wired." + if (buildstage < 1) + usr << "The circuit is missing." /* AIR ALARM CIRCUIT Just a object used in constructing air alarms @@ -1227,7 +1243,6 @@ Code shamelessly copied from apc_frame return new /obj/machinery/alarm(loc, ndir, 1) - del(src) /* diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 40f5a3b959..da6f8f90c8 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -112,8 +112,7 @@ if (B) beaker.reagents.reagent_list |= B - beaker.reagents.del_reagent("clonexadone") //Fix for infinite meat spawning when taking blood from human - beaker.reagents.update_total() //to an IV drip full of clonex + beaker.reagents.update_total() beaker.on_reagent_change() beaker.reagents.handle_reactions() update_icon() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index dd4d2662a7..bd3673719f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -570,10 +570,12 @@ w_class = 3 attack_verb = list("attacked", "slashed", "stabbed", "sliced") +/* NYET. /obj/item/weapon/toddler icon_state = "toddler" name = "toddler" desc = "This baby looks almost real. Wait, did it just burp?" force = 5 w_class = 4.0 - slot_flags = SLOT_BACK \ No newline at end of file + slot_flags = SLOT_BACK +*/ \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 7a76a2c968..ccfbd30e1b 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -103,8 +103,8 @@ var/global/normal_ooc_colour = "#002eb8" msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - if(!(prefs.toggles & CHAT_OOC)) - src << "\red You have OOC muted." + if(!(prefs.toggles & CHAT_LOOC)) + src << "\red You have LOOC muted." return if(!holder) @@ -127,14 +127,15 @@ var/global/normal_ooc_colour = "#002eb8" log_ooc("(LOCAL) [mob.name]/[key] : [msg]") - for(var/mob/M in hearers()) + var/list/heard = get_mobs_in_view(7, src.mob) + for(var/mob/M in heard) if(!M.client) continue var/client/C = M.client if (C in admins) continue //they are handled after that - if(C.prefs.toggles & CHAT_OOC) + if(C.prefs.toggles & CHAT_LOOC) var/display_name = src.key if(holder) if(holder.fakekey) @@ -144,5 +145,8 @@ var/global/normal_ooc_colour = "#002eb8" display_name = holder.fakekey C << "LOOC: [display_name]: [msg]" for(var/client/C in admins) - if(C.prefs.toggles & CHAT_OOC) - C << "LOOC: [src.key]: [msg]" \ No newline at end of file + if(C.prefs.toggles & CHAT_LOOC) + var/prefix = "(R)LOOC" + if (C.mob in heard) + prefix = "LOOC" + C << "[prefix]: [src.key]: [msg]" \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 8208af1bb9..63400f73e8 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -651,7 +651,7 @@ var/list/admin_verbs_mod = list( if(!istype(M, /mob/living/carbon/human)) usr << "\red You can only do this to humans!" return - switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Vox, Kida, and Tajara can result in unintended consequences.",,"Yes","No")) + switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Vox and Tajaran can result in unintended consequences.",,"Yes","No")) if("No") return var/new_facial = input("Please select facial hair color.", "Character Generation") as color diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index e37ac58fd9..cc7e6a4101 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -441,10 +441,10 @@ client/proc/one_click_antag() var/leader_chosen = 0 //when the leader is chosen. The last person spawned. - //Generates a list of candidates from active ghosts. The admin picks which players to respawn as the vox. + //Generates a list of candidates from active ghosts. for(var/mob/dead/observer/G in player_list) spawn(0) - if(is_alien_whitelisted(src, "Vox") || !config.usealienwhitelist) + if(is_alien_whitelisted(G, "Vox") || !config.usealienwhitelist) switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No")) if("Yes") if((world.time-time_passed)>300)//If more than 30 game seconds passed. @@ -462,7 +462,7 @@ client/proc/one_click_antag() candidates.Remove(G) if(candidates.len) - var/max_raiders = 6 + var/max_raiders = 4 var/raiders = max_raiders //Spawns vox raiders and equips them. for (var/obj/effect/landmark/L in world) @@ -507,6 +507,7 @@ client/proc/one_click_antag() i++ newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah")) + new_vox.vox_talk_understand = 1 new_vox.real_name = capitalize(newname) new_vox.name = new_vox.real_name new_vox.age = rand(12,20) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 907cd79f99..0abbe3aa26 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -794,18 +794,18 @@ datum/preferences if(is_alien_whitelisted(user, "Skrell")) //Check for Skrell and admins new_species += "Skrell" whitelisted = 1 - if(is_alien_whitelisted(user, "Kidan")) // Check for Kidan and admins - new_species += "Kidan" + if(is_alien_whitelisted(user, "Vox")) //Check for Skrell and admins + new_species += "Vox" whitelisted = 1 + if(!whitelisted) alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.") - else //Not using the whitelist? Aliens for everyone! new_species += "Tajaran" new_species += "Unathi" new_species += "Skrell" - new_species += "Kidan" + new_species += "Vox" species = input("Please select a species", "Character Generation", null) in new_species if(prev_species != species) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 19df39e337..e3773f7785 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -95,6 +95,17 @@ src << "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel." feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/listen_looc() + set name = "Show/Hide LOOC" + set category = "Preferences" + set desc = "Toggles seeing Local OutOfCharacter chat" + prefs.toggles ^= CHAT_LOOC + prefs.save_preferences() + src << "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel." + feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + /client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful set name = "Hear/Silence Ambience" set category = "Preferences" diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 0ade207cf1..8fd158fdf3 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -10,6 +10,8 @@ set name = "Toggle Magboots" set category = "Object" set src in usr + if(usr.stat) + return if(src.magpulse) src.flags &= ~NOSLIP src.slowdown = SHOES_SLOWDOWN diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 28541cda07..5171f22fe8 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -8,12 +8,13 @@ var/obj/machinery/account_database/affected_db /datum/event/money_hacker/setup() - for(var/obj/machinery/account_database/DB in world) - if( DB.z == 1 && !(DB.stat&NOPOWER) && DB.activated && DB.accounts.len) - affected_db = DB - break + if(all_money_accounts.len) + for(var/obj/machinery/account_database/DB in world) + if( DB.z == 1 && !(DB.stat&NOPOWER) && DB.activated ) + affected_db = DB + break if(affected_db) - affected_account = pick(affected_db.accounts) + affected_account = pick(all_money_accounts) else kill() return diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index a03d6f2969..3ac17a7f4c 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -7,8 +7,8 @@ /datum/event/money_lotto/start() winner_sum = pick(5000, 10000, 50000, 100000, 500000, 1000000, 1500000) - if(centcomm_account_db.accounts.len) - var/datum/money_account/D = pick(centcomm_account_db.accounts) + if(all_money_accounts.len) + var/datum/money_account/D = pick(all_money_accounts) D.money += winner_sum var/datum/transaction/T = new() diff --git a/code/modules/events/organ_failure.dm b/code/modules/events/organ_failure.dm index 89456c0c1b..80e7f807dd 100644 --- a/code/modules/events/organ_failure.dm +++ b/code/modules/events/organ_failure.dm @@ -22,7 +22,8 @@ datum/event/organ_failure/start() var/mob/living/carbon/human/C = candidates[1] // Bruise one of their organs - var/datum/organ/internal/I = pick(C.internal_organs) + var/O = pick(C.internal_organs) + var/datum/organ/internal/I = C.internal_organs[O] I.damage = I.min_bruised_damage candidates.Remove(C) - severity-- + severity-- \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 72bfbc0c48..7c394844d5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -808,8 +808,6 @@ return "Mobile vegetation" if("golem") return "Animated Construct" - if("kidan") - return "Kidan" else return "Human" @@ -822,9 +820,7 @@ else if(src.dna.mutantrace == "tajaran") return "Tajaran" else if(src.dna.mutantrace == "vox") - return "Vox" - else if(src.dna.mutantrace == "kidan") - return "Kidan" + return "vox" /mob/living/carbon/proc/update_mutantrace_languages() if(src.dna) @@ -836,8 +832,6 @@ src.tajaran_talk_understand = 1 else if(src.dna.mutantrace == "vox") src.vox_talk_understand = 1 - else if(src.dna.mutantrace == "kidan") - src.kidan_talk_understand = 1 /mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e82c8f3aa3..e947f30a96 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -440,12 +440,10 @@ proc/get_damage_icon_part(damage_state, body_part) if("skrell") race_icon = 'icons/mob/human_races/r_skrell.dmi' deform_icon = 'icons/mob/human_races/r_def_skrell.dmi' + if("vox") race_icon = 'icons/mob/human_races/r_vox.dmi' deform_icon = 'icons/mob/human_races/r_def_vox.dmi' - if("kidan") - race_icon = 'icons/mob/human_races/r_kidan.dmi' - deform_icon = 'icons/mob/human_races/r_def_kidan.dmi' else race_icon = 'icons/mob/human_races/r_human.dmi' diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 838187f62e..420e20a1b9 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -19,7 +19,6 @@ var/list/department_radio_keys = list( ":j" = "tajaran", "#j" = "tajaran", ".j" = "tajaran", ":o" = "soghun", "#o" = "soghun", ".o" = "soghun", ":v" = "vox", "#v" = "vox", ".v" = "vox", - ":q" = "kidan", "#q" = "kidan", ".q" = "kidan", ":R" = "right hand", "#R" = "right hand", ".R" = "right hand", ":L" = "left hand", "#L" = "left hand", ".L" = "left hand", @@ -40,7 +39,6 @@ var/list/department_radio_keys = list( ":J" = "tajaran", "#J" = "tajaran", ".J" = "tajaran", ":O" = "soghun", "#O" = "soghun", ".O" = "soghun", ":V" = "vox", "#V" = "vox", ".V" = "vox", - ":Q" = "kidan", "#Q" = "kidan", ".Q" = "kidan", //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. @@ -190,7 +188,6 @@ var/list/department_radio_keys = list( var/is_speaking_soghun = 0 var/is_speaking_taj = 0 var/is_speaking_vox = 0 - var/is_speaking_kidan = 0 var/is_speaking_radio = 0 switch (message_mode) @@ -293,10 +290,6 @@ var/list/department_radio_keys = list( if(vox_talk_understand || universal_speak) is_speaking_vox = 1 - if ("kidan") - if(kidan_talk_understand || universal_speak) - is_speaking_kidan = 1 - if("changeling") if(mind && mind.changeling) for(var/mob/Changeling in mob_list) @@ -395,8 +388,6 @@ var/list/department_radio_keys = list( heard_a += M else if(is_speaking_vox && (M:vox_talk_understand || M:universal_speak)) heard_a += M - else if(is_speaking_kidan && (M:kidan_talk_understand || M:universal_speak)) - heard_a += M else heard_b += M else @@ -412,7 +403,7 @@ var/list/department_radio_keys = list( var/rendered = null if (length(heard_a)) - var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox,is_speaking_kidan) + var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox) if (italics) message_a = "[message_a]" @@ -437,7 +428,7 @@ var/list/department_radio_keys = list( message_b = voice_message else message_b = stars(message) - message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox,is_speaking_kidan) + message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox) if (italics) message_b = "[message_b]" diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index e730974401..cc10e646dd 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -63,16 +63,21 @@ else powered = 0 +/datum/robot_component/armour + name = "armour plating" + energy_consumption = 0 + external_type = /obj/item/robot_parts/robot_component/armour + max_damage = 60 /datum/robot_component/actuator name = "actuator" energy_consumption = 2 external_type = /obj/item/robot_parts/robot_component/actuator - max_damage = 60 + max_damage = 50 /datum/robot_component/cell name = "power cell" - max_damage = 60 + max_damage = 50 /datum/robot_component/cell/destroy() ..() @@ -81,8 +86,8 @@ /datum/robot_component/radio name = "radio" external_type = /obj/item/robot_parts/robot_component/radio - energy_consumption = 3 - max_damage = 10 + energy_consumption = 1 + max_damage = 40 /datum/robot_component/binary_communication name = "binary communication device" @@ -93,8 +98,8 @@ /datum/robot_component/camera name = "camera" external_type = /obj/item/robot_parts/robot_component/camera - energy_consumption = 2 - max_damage = 20 + energy_consumption = 1 + max_damage = 40 /datum/robot_component/diagnosis_unit name = "self-diagnosis unit" @@ -111,6 +116,7 @@ components["diagnosis unit"] = new/datum/robot_component/diagnosis_unit(src) components["camera"] = new/datum/robot_component/camera(src) components["comms"] = new/datum/robot_component/binary_communication(src) + components["armour"] = new/datum/robot_component/armour(src) /mob/living/silicon/robot/proc/is_component_functioning(module_name) var/datum/robot_component/C = components[module_name] @@ -135,6 +141,9 @@ /obj/item/robot_parts/robot_component/actuator name = "actuator" +/obj/item/robot_parts/robot_component/armour + name = "armour plating" + /obj/item/robot_parts/robot_component/camera name = "camera" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4b3be0704f..667d44d570 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -3,14 +3,15 @@ real_name = "Cyborg" icon = 'icons/mob/robots.dmi' icon_state = "robot" - maxHealth = 300 - health = 300 + maxHealth = 200 + health = 200 universal_speak = 1 var/sight_mode = 0 var/custom_name = "" var/base_icon var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best + var/crisis //Admin-settable for combat module use. //Hud stuff @@ -106,17 +107,17 @@ camera.status = 0 initialize_components() - if(!unfinished) - // Create all the robot parts. - for(var/V in components) if(V != "power cell") - var/datum/robot_component/C = components[V] - C.installed = 1 - C.wrapped = new C.external_type + //if(!unfinished) + // Create all the robot parts. + for(var/V in components) if(V != "power cell") + var/datum/robot_component/C = components[V] + C.installed = 1 + C.wrapped = new C.external_type - if(!cell) - cell = new /obj/item/weapon/cell(src) - cell.maxcharge = 7500 - cell.charge = 7500 + if(!cell) + cell = new /obj/item/weapon/cell(src) + cell.maxcharge = 7500 + cell.charge = 7500 ..() diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 632b39e9f6..7387b20b79 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -1,9 +1,9 @@ /mob/living/silicon/robot/updatehealth() if(status_flags & GODMODE) - health = 100 + health = 200 stat = CONSCIOUS return - health = 100 - (getBruteLoss() + getFireLoss()) + health = 200 - (getBruteLoss() + getFireLoss()) return /mob/living/silicon/robot/getBruteLoss() @@ -47,6 +47,14 @@ if(C.installed == 1) rval += C return rval +/mob/living/silicon/robot/proc/get_armour() + + if(!components.len) return 0 + var/datum/robot_component/C = components["armour"] + if(C && C.installed == 1) + return C + return 0 + /mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn) var/list/datum/robot_component/parts = get_damaged_components(brute,burn) if(!parts.len) return @@ -75,6 +83,11 @@ burn -= absorb_burn src << "\red Your shield absorbs some of the impact!" + var/datum/robot_component/armour/A = get_armour() + if(A) + A.take_damage(brute,burn,sharp) + return + var/datum/robot_component/C = pick(components) C.take_damage(brute,burn,sharp) @@ -115,6 +128,11 @@ burn -= absorb_burn src << "\red Your shield absorbs some of the impact!" + var/datum/robot_component/armour/A = get_armour() + if(A) + A.take_damage(brute,burn,sharp) + return + while(parts.len && (brute>0 || burn>0) ) var/datum/robot_component/picked = pick(parts) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0a41d0d60c..2b74be7f28 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -208,13 +208,12 @@ //Whether or not mobs can understand other mobtypes. These stay in /mob so that ghosts can hear everything. var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE - var/robot_talk_understand = 0 - var/alien_talk_understand = 0 - var/tajaran_talk_understand = 0 - var/soghun_talk_understand = 0 - var/skrell_talk_understand = 0 - var/vox_talk_understand = 0 - var/kidan_talk_understand = 0 + var/robot_talk_understand = 0 + var/alien_talk_understand = 0 + var/tajaran_talk_understand = 0 + var/soghun_talk_understand = 0 + var/skrell_talk_understand = 0 + var/vox_talk_understand = 0 var/has_limbs = 1 //Whether this mob have any limbs he can move with var/can_stand = 1 //Whether this mob have ability to stand diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index bb81a5ca4e..48704fd821 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -359,10 +359,10 @@ if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist) new_character.dna.mutantrace = "skrell" new_character.skrell_talk_understand = 1 - if(client.prefs.species == "Kidan") - if(is_alien_whitelisted(src, "Kidan") || !config.usealienwhitelist) - new_character.dna.mutantrace = "kidan" - new_character.kidan_talk_understand = 1 + if(client.prefs.species == "Vox") + if(is_alien_whitelisted(src, "Vox"|| !config.usealienwhitelist)) + new_character.dna.mutantrace = "vox" + new_character.vox_talk_understand = 1 if(client.prefs.language == "Tajaran") if(is_alien_whitelisted(src, "Language_Tajaran") || !config.usealienwhitelist) @@ -373,9 +373,6 @@ if(client.prefs.language == "Skrell") if(is_alien_whitelisted(src, "Language_Skrell") || !config.usealienwhitelist) new_character.skrell_talk_understand = 1 - if(client.prefs.language == "Kidan") - if(is_alien_whitelisted(src, "Language_Kidan") || !config.usealienwhitelist) - new_character.kidan_talk_understand = 1 if(ticker.random_players) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 44b11436c2..1c8a8872b9 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -144,10 +144,9 @@ datum/preferences icobase = 'icons/mob/human_races/r_lizard.dmi' if("Skrell") icobase = 'icons/mob/human_races/r_skrell.dmi' + if("Vox") icobase = 'icons/mob/human_races/r_vox.dmi' - if("Kidan") - icobase = 'icons/mob/human_races/r_kidan.dmi' else icobase = 'icons/mob/human_races/r_human.dmi' diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 9a321f2038..97b80338a6 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -285,6 +285,7 @@ icon_state = "hair_e" gender = MALE // turnoff! + bald name = "Bald" icon_state = "bald" @@ -305,7 +306,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Kidan") + species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox") watson name = "Watson Mustache" diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index e8a2292684..58f6724e85 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -69,7 +69,7 @@ return 1 return 0 -/mob/proc/say_quote(var/text,var/is_speaking_soghun,var/is_speaking_skrell,var/is_speaking_tajaran,var/is_speaking_vox,var/is_speaking_kidan) +/mob/proc/say_quote(var/text,var/is_speaking_soghun,var/is_speaking_skrell,var/is_speaking_tajaran,var/is_speaking_vox) if(!text) return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code //tcomms code is still runtiming somewhere here @@ -81,9 +81,7 @@ if (is_speaking_tajaran) return "mrowls, \"[text]\""; if (is_speaking_vox) - return "shrieks, \"[text]\""; - if (is_speaking_kidan) - return "chitters, \"[text]\""; + return "chirps, \"[text]\""; //Needs Virus2 // if (src.disease_symptoms & DISEASE_HOARSE) // return "rasps, \"[text]\""; diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index a96e8cb1b2..b82e771131 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -746,10 +746,9 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) base = new('icons/mob/human_races/r_lizard.dmi') if("skrell") base = new('icons/mob/human_races/r_skrell.dmi') + if("vox") base = new('icons/mob/human_races/r_vox.dmi') - if("kidan") - base = new('icons/mob/human_races/r_kidan.dmi') else base = new('icons/mob/human_races/r_human.dmi') diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 604cf5428b..2b4b4c457d 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -74,7 +74,7 @@ var/mob/living/carbon/human/H = new_mob if(H.dna) - H.dna.mutantrace = pick("lizard","tajaran","skrell","golem","slime","plant","vox","kidan",4;"") + H.dna.mutantrace = pick("lizard","tajaran","skrell","golem","slime","plant","vox",4;"") else return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index dffbabc1a6..f5d3fee5bb 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1030,6 +1030,9 @@ datum /mob/living/simple_animal/hostile/syndicate/ranged, /mob/living/simple_animal/hostile/syndicate/ranged/space, /mob/living/simple_animal/hostile/alien/queen/large, + /mob/living/simple_animal/hostile/faithless, + /mob/living/simple_animal/hostile/panther, + /mob/living/simple_animal/hostile/snake, /mob/living/simple_animal/hostile/retaliate, /mob/living/simple_animal/hostile/retaliate/clown )//exclusion list for things you don't want the reaction to create. diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index a0149abdf6..4e82f08b55 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -109,7 +109,7 @@ /obj/machinery/keycard_auth/proc/broadcast_request() icon_state = "auth_on" - for(var/obj/machinery/keycard_auth/KA in machines) + for(var/obj/machinery/keycard_auth/KA in world) if(KA == src) continue KA.reset() spawn() diff --git a/code/setup.dm b/code/setup.dm index 046ba2a189..78d845436d 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -624,6 +624,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define CHAT_RADIO 512 #define CHAT_ATTACKLOGS 1024 #define CHAT_DEBUGLOGS 2048 +#define CHAT_LOOC 4096 #define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS) @@ -692,4 +693,4 @@ var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_d //proc/get_pulse methods #define GETPULSE_HAND 0 //less accurate (hand) -#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc) \ No newline at end of file +#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 5eb0ec9991..902160e9ef 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -56,7 +56,6 @@ h1.alert, h2.alert {color: #000000;} .skrell {color: #00CED1;} .soghun {color: #228B22;} .vox {color: #AA00AA;} -.kidan {color: #cc9900;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .interface {color: #330033;} diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt index 3c38a0dbe0..031b5f6b13 100644 --- a/config/admin_ranks.txt +++ b/config/admin_ranks.txt @@ -28,14 +28,16 @@ # +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag Admin Observer -Retired Admin +MOD +ADMIN Moderator +MOD Admin Candidate +ADMIN Trial Admin +@ +SPAWN +REJUV +VAREDIT +BAN Badmin +@ +POSSESS +BUILDMODE +SERVER +FUN -Game Admin +@ +STEALTH +SOUNDS +DEBUG +Game Admin +@ +STEALTH +SOUNDS +DEBUG +PERMISSIONS Game Master +EVERYTHING +Head Admin +EVERYTHING +Retired Admin +ADMIN +STEALTH Host +EVERYTHING -Coder +DEBUG +VAREDIT +SERVER +SPAWN \ No newline at end of file +Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +Dev Mod +@ +MOD \ No newline at end of file diff --git a/config/admins.txt b/config/admins.txt index fa503a4380..3b830cd27f 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -5,31 +5,4 @@ # Ranks can be anything defined in admin_ranks.txt ~Carn # ###################################################################### -abi79 - Game Master -arcalane - Game Admin -asanadas - Game Admin -bobbehluvspropane - Game Admin -cacophony - Game Admin -cajoes - Game Admin -cib - Retired Admin -compactninja - Retired Admin -duntadaman - Game Admin -dysthymia - Retired Admin -doughnuts - Game Admin -erthilo - Game Master -hawkv3 - Game Master -headswe - Game Master -iaryni - Game Master -masterofapples - Game Admin -megacaesar - Retired Admin -miniature - Game Master -misterbook - Game Admin -misterfox - Retired Admin -mloc - Game Master -skymarshal - Game Master -spaceman96 - Retired Admin -strumpetplaya - Retired Admin -tastyfish - Retired Admin -uristqwerty - Game Master -wrongnumber - Game Admin -mij - Game Admin \ No newline at end of file +# not_a_user - Admin diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 190adb91cd..01acc82de9 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -1,54 +1 @@ -botanistpower - Tajaran -bountylord13 - Soghun -bowlsoldier - Tajaran -bluefishie - Skrell -cubejackal - Soghun -danny220 - Skrell -danny220 - Soghun -danny220 - Tajaran -darkwingstalker - Skrell -deciusreln - Skrell -densane - Skrell -dopeghoti - Tajaran -duntadaman - Skrell -fenrisian - Tajaran -firefishie - Skrell -focksinabocks - Skrell -focksinabocks - Tajaran -foolamancer - Skrell -forsamori - Tajaran -forsamori - Soghun -galenus - Soghun -galenus - Skrell -galenus - Tajaran -kersh - Skrell -jadepython - Skrell -jadepython - Soghun -jadepython - Tajaran -masterofstuff - Skrell -masterofstuff - Soghun -mangled - Skrell -mcgulliver - Skrell -nerezza - Skrell -nerezza - Soghun -nerezza - Tajaran -nestromo - Soghun -philphil123 - Soghun -quilan - Tajaran -searif - Soghun -searif - Tajaran -searif - Skrell -serithi - Skrell -serithi - Soghun -serithi - Tajaran -sniperyeti - Skrell -spaceman96 - Tajaran -spaceman96 - Soghun -spaceman96 - Skrell -sparklysheep - Skrell -succubusy - Skrell -teddybehr - Soghun -whitellama - Skrell -watermelonstorm - Tajaran -yoshax - Tajaran -jamini - Tajaran \ No newline at end of file +some~user - Species \ No newline at end of file diff --git a/config/config.txt b/config/config.txt index 82bf3f188f..65ea61919e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -75,23 +75,24 @@ LOG_PDA ## default probablity is 1, increase to make that mode more likely to be picked ## set to 0 to disable that mode ## Cult mode is in alpha test, enable at your own risk -PROBABILITY EXTENDED 0 -PROBABILITY TRAITOR 2 +PROBABILITY EXTENDED 1 +PROBABILITY TRAITOR 0 PROBABILITY METEOR 0 -PROBABILITY MALFUNCTION 2 +PROBABILITY MALFUNCTION 1 PROBABILITY BLOB 0 -PROBABILITY NUCLEAR 0 +PROBABILITY NUCLEAR 1 PROBABILITY SANDBOX 0 -PROBABILITY WIZARD 0 +PROBABILITY WIZARD 1 PROBABILITY RESTRUCTURING 0 -PROBABILITY REVOLUTION 5 -PROBABILITY CHANGELING 0 +PROBABILITY REVOLUTION 0 +PROBABILITY CHANGELING 1 PROBABILITY CULT 1 PROBABILITY MONKEY 0 PROBABILITY TRAITORCHAN 0 -PROBABILITY EXTEND-A-TRAITORMONGOUS 0 -PROBABILITY EPIDEMIC 1 +PROBABILITY EXTEND-A-TRAITORMONGOUS 6 +PROBABILITY EPIDEMIC 0 PROBABILITY MEME 0 +PROBABILITY RP-REVOLUTION 0 ## Hash out to disable random events during the round. ALLOW_RANDOM_EVENTS @@ -109,10 +110,10 @@ ALLOW_ADMIN_OOCCOLOR # ALLOW_METADATA ## allow players to initiate a restart vote -#ALLOW_VOTE_RESTART +ALLOW_VOTE_RESTART ## allow players to initate a mode-change start -#ALLOW_VOTE_MODE +ALLOW_VOTE_MODE ## min delay (deciseconds) between voting sessions (default 10 minutes) VOTE_DELAY 6000 @@ -121,7 +122,7 @@ VOTE_DELAY 6000 VOTE_PERIOD 600 ## prevents dead players from voting or starting votes -# NO_DEAD_VOTE +#NO_DEAD_VOTE ## players' votes default to "No vote" (otherwise, default to "No change") DEFAULT_NO_VOTE @@ -137,7 +138,7 @@ ALLOW_AI # DONT_DEL_NEWMOB ## set a hosted by name for unix platforms -HOSTEDBY Yournamehere +HOSTEDBY yournamehere ## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. ## Set to 1 to jobban them from those positions, set to 0 to allow them. @@ -150,7 +151,7 @@ GUEST_BAN # USEWHITELIST ## set a server location for world reboot. Don't include the byond://, just give the address and port. -# SERVER ss13.example.com:2506 +#SERVER server.net:port ## forum address # FORUMURL http://example.com @@ -205,16 +206,10 @@ GATEWAY_DELAY 18000 ## Uncomment to restrict non-admins from using humanoid alien races USEALIENWHITELIST -## Location of the nudge.py script -NUDGE_SCRIPT_PATH nudge.py - ## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player. -ALIEN_PLAYER_RATIO 0.2 - +#ALIEN_PLAYER_RATIO 0.2 ##Remove the # to let ghosts spin chairs -## Uncomment this to enable external .rsc downloads. URLs must be separated by no more than one space. -## The linked .zip file should contain the required .rsc -#resource_urls http://firstserver.org/myresource.zip http://secondserver.org/myresource.zip http://10.22.11.1/myresource.zip +#GHOST_INTERACTION ## Uncomment to enable sending data to the IRC bot. #USE_IRC_BOT @@ -227,4 +222,4 @@ ALIEN_PLAYER_RATIO 0.2 ## Path to the python executable on the system. Leave blank for default. ## Default is "python" on Windows, "/usr/bin/env python2" on UNIX. -PYTHON_PATH +PYTHON_PATH diff --git a/config/custom_items.txt b/config/custom_items.txt index 074f3da732..e69de29bb2 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -1,77 +0,0 @@ -asanadas: Book Berner: /obj/item/clothing/glasses/meson/fluff/book_berner_1 -atomicdog92: Seth Sealis: /obj/item/clothing/suit/det_suit/fluff/leatherjack -botanistpower: Walter Brooks: /obj/item/clothing/gloves/fluff/walter_brooks_1 -bountylord13: Norah Briggs: /obj/item/clothing/head/welding/fluff/norah_briggs_1 -chinsky: Victor Kaminski: /obj/item/fluff/victor_kaminsky_1 -chinsky: Summer Springfield: /obj/item/weapon/camera_test/fluff/orange -compactninja: Al Peterson: /obj/item/clothing/head/flatcap -compactninja: Lister Black: /obj/item/weapon/storage/pill_bottle/fluff/listermedbottle, /obj/item/weapon/storage/pill_bottle/fluff/listermedbottle -crazy2455: Murad Hassim: /obj/item/clothing/gloves/fluff/murad_hassim_1 -cubejackal: Barry Sharke: /obj/item/clothing/mask/fluff/electriccig -daaneesh: Zelda Creedy: /obj/item/weapon/crowbar/fluff/zelda_creedy_1 -deusdactyl: James Girard: /obj/item/clothing/head/secsoft/fluff/swatcap, /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield -donofnyc3: Oen'g Issek: /obj/item/weapon/melee/baton/fluff/oeng_baton -eternal248: Maximilian Haynes: /obj/item/weapon/paper/certificate -executivekill: Hunter Duke: /obj/item/weapon/lighter/zippo/fluff/executivekill_1 -fastler: Fastler Greay: /obj/item/weapon/card/id/fluff/lifetime -fniff: Sarah Calvera: /obj/item/fluff/sarah_calvera_1 -fniff: Angleo Wilkerson: /obj/item/fluff/angelo_wilkerson_1 -foolamancer: Edvin Telephosphor: /obj/item/clothing/head/fluff/edvin_telephosphor_1 -furohman: Fay Sullivan: /obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 -furlucis: Chal Appara: /obj/item/clothing/gloves/fluff/chal_appara_1 -gvazdas: Sarah Carbrokes: /obj/item/fluff/sarah_carbrokes_1 -jamini: Edwin Atweeke: /obj/item/clothing/suit/labcoat/fluff/burnt -jamini: Nasir Khayyam: /obj/item/clothing/tie/fluff/nasir_khayyam_1 -jadepython: Thysse Ezinwa: /obj/item/clothing/glasses/eyepatch/fluff/thysse_1 -kirbyelder: John McKeever: /obj/item/paper/fluff/john_mckeever_1 -leon_the_killer: johnathan Falcian: /obj/item/weapon/clipboard/notebook/fluff/johnathan_falcian_1 -leonheart11: Johann Erzatz: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1 -lexusjjss: Lexus Langg: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask -lexusjjss: Zachary Tomlinson: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask -madmalicemccrea: Alice McCrea: /obj/item/clothing/head/welding/fluff/alice_mccrea_1 -magmaram: Maria Crash: /obj/item/device/camera/fluff/oldcamera -mangled: Li Matsuda: /obj/item/weapon/lighter/zippo/fluff/li_matsuda_1 -maximumbob: Maurice Bedford: /obj/item/fluff/maurice_bedford_1 -mcgulliver: Wox Derax: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask -mindphyre: Arjun Chopra: /obj/item/clothing/glasses/fluff/arjun_chopra_1 -misterbook: Smoke Perkins: /obj/item/clothing/mask/cigarette/pipe -misterfox: Rashid Siraj: /obj/item/weapon/storage/bible/tajaran -morrinn: Maye Day: /obj/item/weapon/storage/fluff/maye_daye_1 -naples: Russell Vierson: /obj/item/weapon/lighter/zippo/fluff/naples_1 -nega10: Ty Foster: /obj/item/clothing/mask/mara_kilpatrick_1 -nerezza: Asher Spock: /obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1 -nerezza: Asher Spock: /obj/item/weapon/card/id/fluff/asher_spock_2 -orangebottle: Lillian Levett: /obj/item/weapon/pen/fluff/fancypen -orangebottle: Lilliana Reade: /obj/item/weapon/pen/fluff/fancypen -paththegreat: Eli Stevens: /obj/item/weapon/pen/fluff/fountainpen -phaux: Tian Krieger: /obj/item/clothing/under/fluff/tian_dress -rawrtaicho: Riley Rohtin: /obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1 -rawrtaicho: Wyatt Engstrom: /obj/item/clothing/under/fluff/wyatt_1 -roaper: Ian Colm: /obj/item/weapon/card/id/fluff/ian_colm_1 -roaper: Ian Colm: /obj/item/clothing/glasses/welding/fluff/ian_colm_2 -rukral: Nashida Bishara: /obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1 -searif: Yuki Matsuda: /obj/item/clothing/under/fluff/jumpsuitdown, /obj/item/clothing/head/welding/fluff/yuki_matsuda_1 -searif: Ara Al-Jazari: /obj/item/clothing/under/rank/bartender/fluff/classy -serithi: Altair An-Nasaqan: /obj/item/clothing/tie/fluff/altair_locket -sirribbit: /obj/item/weapon/clipboard/fluff/mcreary_journal -sicktrigger: David Fanning: /obj/item/fluff/david_fanning_1 -silentthunder: Val McNeil: /obj/item/fluff/val_mcneil_1 -sniperyeti: Susan Harris: /obj/item/clothing/shoes/magboots/fluff/susan_harris_1 -spaceman96: Trenna Seber: /obj/item/weapon/pen/fluff/multi, /obj/item/clothing/suit/labcoat/fluff/pink -sparklysheep: Cado Keppel: /obj/item/weapon/fluff/cado_keppel_1 -sparklysheep: Uzenwa Sissra: /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 -suethecake: Ana Ka'Rimah: /obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker -superboredguy: Neil Patterson: /obj/item/clothing/head/hardhat/fluff/neil_patterson_1 -staghorn: Mara Kilpatrick: /obj/item/clothing/mask/mara_kilpatrick_1 -tastyfish: Cindy Robertson: /obj/item/weapon/wrapping_paper -thatoneguy: Hugo Cinderbatch: /obj/item/weapon/fluff/hugo_cinderbacth_1 -thebreadbocks: Steve Johnson: /obj/item/fluff/steve_johnson_1 -themij: Taryn Keppel: /obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 -thejesster14: Rosa Wolff: /obj/item/device/flashlight/fluff/thejesster14_1 -tzefa: Wes Solari: /obj/item/fluff/wes_solari_1 -vinceluk: Ashley Rifler: /obj/item/clothing/gloves/fluff/ashley_rifler_1 -vinceluk: Seth Sealis: /obj/item/clothing/suit/det_suit/fluff/graycoat -whitellama: Ethan Way: /obj/item/fluff/ethan_way_1 -whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1 -zuhayr: Jane Doe: /obj/item/clothing/under/fluff/jane_sidsuit -mordeth221: Sven Fjeltson: /obj/item/weapon/fluff/sven_fjeltson_1 diff --git a/config/custom_sprites.txt b/config/custom_sprites.txt index ca52951476..bb370589f5 100644 --- a/config/custom_sprites.txt +++ b/config/custom_sprites.txt @@ -2,4 +2,4 @@ rowtree-Lucy sydrec-SINA ravensdale-Blunt ravensdale-Skuld -serithi-REMNANT \ No newline at end of file +serithi-REMNANT diff --git a/config/game_options.txt b/config/game_options.txt index 98fcad7f74..7d6a52e83a 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -1,7 +1,7 @@ ### HEALTH ### ## level of health at which a mob becomes unconscious (crit) -HEALTH_THRESHOLD_CRIT 0 +HEALTH_THRESHOLD_CRIT -50 ## level of health at which a mob becomes dead HEALTH_THRESHOLD_DEAD -100 @@ -19,7 +19,7 @@ ORGAN_HEALTH_MULTIPLIER 100 ## multiplier which influences how fast organs regenerate naturally ## 100 means normal, 50 means half -ORGAN_REGENERATION_MULTIPLIER 20 +ORGAN_REGENERATION_MULTIPLIER 75 ### REVIVAL ### @@ -42,8 +42,8 @@ REVIVAL_BRAIN_LIFE -1 ## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 0 -WALK_DELAY 0 +RUN_SPEED 2 +WALK_SPEED 5 ## The variables below affect the movement of specific mob types. diff --git a/config/moderators.txt b/config/moderators.txt index d4874564c2..b14d8e49f4 100644 --- a/config/moderators.txt +++ b/config/moderators.txt @@ -1,22 +1,3 @@ ; just add the ckey (lowercase) of every moderator on a separate line ; lines starting with ; are comments and will be ignored -botanistpower -bowlsoldier -cubejackal -dakonic -densane -deusdactyl -fastler -fenrisian -foolamancer -madmalicemccrea -mangled -phaux -roaper -searif -sparklysheep -themij -chinsky -danny220 -; Why u no keep list in alphabetical order?! Lazies! Lazies! -Abi -; Imma best alphabetiser - Erthilo + diff --git a/config/motd.txt b/config/motd.txt index ad13a70672..3ba8d1d8a5 100644 --- a/config/motd.txt +++ b/config/motd.txt @@ -2,7 +2,7 @@ -This server is running Baystation 12's modification of the /tg/station13 SS13 code.

-Bugtracker: https://github.com/Baystation12/Baystation12/issues +Bugtracker: http://baystation12.net/forums/viewtopic.php?f=18&t=8185
Rules and roleplaying tips: http://baystation12.net/wiki/index.php/Rules or the Rules command.

diff --git a/icons/mob/human_races/r_def_kidan.dmi b/icons/mob/human_races/r_def_kidan.dmi deleted file mode 100644 index 0d7b050b7c..0000000000 Binary files a/icons/mob/human_races/r_def_kidan.dmi and /dev/null differ diff --git a/icons/mob/human_races/r_kidan.dmi b/icons/mob/human_races/r_kidan.dmi deleted file mode 100644 index c8be5e21ed..0000000000 Binary files a/icons/mob/human_races/r_kidan.dmi and /dev/null differ diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index bdecff15ff..6f0c97f9d0 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -1467,7 +1467,7 @@ "aCk" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/security/nuke_storage) "aCl" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aCm" = (/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aCn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/window{name = "Gateway Chamber"; req_access_txt = "62"},/turf/simulated/floor{icon_state = "dark"},/area/gateway) +"aCn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/window{tag = "icon-right"; name = "Gateway Chamber"; icon_state = "right"; dir = 2; req_access_txt = "62"},/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aCo" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aCp" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aCq" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hardsuits"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) @@ -10042,17 +10042,8 @@ "dQm" = (/obj/structure/table,/obj/item/weapon/cable_coil{amount = 5},/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/construction) "dRu" = (/obj/structure/rack,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 5},/obj/item/weapon/storage/box/samplebags{pixel_x = 3; pixel_y = -3},/obj/machinery/power/apc{dir = 4; name = "Maintenance Storage APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "dSG" = (/obj/structure/lattice,/obj/machinery/camera/emp_proof{c_tag = "Singularity Observation"; dir = 3; network = list("Singularity"); pixel_x = 20; pixel_y = 0},/turf/space,/area) -"dSI" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape_pod5/transit) -"dSJ" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod5/transit) -"dSK" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape_pod5/transit) "dSL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dSM" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/maintenance/asmaint) -"dSS" = (/turf/space/transit/north/shuttlespace_ns4,/area/shuttle/escape_pod5/transit) -"dST" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape_pod5/transit) -"dSZ" = (/turf/space/transit/north/shuttlespace_ns5,/area/shuttle/escape_pod5/transit) -"dTc" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape_pod5/transit) -"dTf" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod5/transit) -"dTg" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod5/transit) "dTj" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area) "dTn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "dTq" = (/obj/structure/table/reinforced,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/turf/unsimulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/centcom) @@ -10334,12 +10325,12 @@ cqEcrxcrvcrFcrwcrBcrzcrscrDcrEcrtcrAcrrcrCcrycrucrzcrBcrtcrvcrFcrscrAcrwcrCcrEcq cqMcrwcrEcrrcrscrycrvcrzcrtcrBcrCcrDcrucrFcrAcrxcrvcrycrCcrEcrrcrzcrDcrscrFcrBcqHcrLcrMcqQcqRcqScqTcqUcrkcqWcrGcrHcrIcrJcrNcrKcrLcrMcqTcqUcqVcqWcqUcqVcqWcrGcrHcrIcrJcrNcrKcrLcrecrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedIedJqdJrdIecrQdJpdJpdJpdJpdJpcrQdJodJodJodJodJncrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcrZcsacsacsacsbcrW cqPcrscrBcrucrzcrAcrEcrvcrCcrycrFcrtcrxcrrcrDcrwcrEcrAcrFcrBcrucrvcrtcrzcrrcrycqDcrGcrHcrIcrJcrNcrKcrLcrecqQcqRcqScqTcqUcqVcqWcrGcrHcrIcrJcrNcrKcrLcrMcqQcqRcqScqTcqUcqVcqWcrGcqYcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJsdIedIedIedIecrQdJvdJudJtdJudJwcrQdJydJxdJAdJzdJycrQcrPcrPcrXcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcrZcsacsacsacsbcrW cqCcrzcrycrxcrvcrDcrBcrEcrFcrAcrrcrCcrwcrucrtcrscrBcrDcrrcrycrxcrEcrCcrvcrucrAcqJcqScqTcqUcqVcqWcrGcrHcqZcrJcrNcrKcrLcrMcqQcqRcqScqTcqQcqRcqScqTcrHcrIcrJcrNcrKcrLcrMcqQcqRcqScricrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedJsdIedIedJBcrQdJCdJudJtdJudJEcrQdJydJDdJGdJFdJycrQcrPcrPcrXcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsccsacsacsacsdcrW -cqFcrvcrAcrwcrEcrtcrycrBcrrcrDcrucrFcrscrxcrCcrzcrycrtcrucrAcrwcrBcrFcrEcrxcrDcqGcrNcrKcrLcrMcqQcqRcqScricqUcqVcqWcrGcrHcrIcrJcrNaaaaaaaaaaaaaaaaaacqTcqUcqVcqWcrGcrHcrIcrJcrNcrccrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedJPdJsdIedJqcrQdJpdJpdJpdJpdJpcrQdKcdJDdJGdJFdKccrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsccsacsacsacsdcrW -cqIcrEcrDcrscrBcrCcskcrycrucslcsmcsncsocspcsqcsrcsscstcrxcrDcsucrycrrcrBcrwcrtcqOcrMcqQcqRcqScqTcqUcqVcrlcrGcrHcrIcrJcrNcrKcrLcrMaaaaaaaaaaaaaaaaaacqWcrGcrHcrIcrJcrNcrKcrLcrMcrfcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedIedIedJsdIecrQdKedKfdKedKfdKecrQdKddJDdJGdJFdKdcrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsccsacsacsacsdcrW -cqHcrBcrtcrzcrycsAcrDcrAcrxcspcsBcsCcsDcsEcsFcsGcsHcsIcrwcrtcrzcskcrucrycrscrCcqLcrIcrJcrNcrKcrLcrMcqQcrgcqScqTcqUcqVcqWcrGcrHcrIaaaaaaaaaaaaaaaaaacqRcqScqTcqUcqVcqWcrGcrHcrIcracrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedKgdIedIedJscrQdJNdJOdJNdJOdJNcrQdKddJDdJGdJFdKdcrQcrPcrXcrPcrXcrPcrQcrRcrRcrRcrRcrRcrQcrScrYcrScrYcrScrQcsccsacsacsacsdcrW -cqDcrycrCcrvcrAcrrcrtcrDcsOcsGcsHcsPcsQcsRcsDcsCcsScsTcsUcrCcrvcrDcrxcrAcrzcrFcqBcqTcqUcqVcqWcrGcrHcrIcracrNcrKcrLcrMcqQcqRcqScqTaaaaaaaaaaaaaaaaaacrJcrNcrKcrLcrMcqQcqRcqScqTcrjcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJqdIedKhdIedJPcrQdJIdJJdJIdJJdJIcrQdKjdKidKldKkdKjcrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsWcsXcsXcsXcsYcrW -cqJcrAcrFcrEcrDcrucrCcrtcsUcsCcsScsZcsBctacsQcsPctbcsFctccrFcrEcrtcrwcrDcrvcrrcqKcrHcrIcrJcrNcrKcrLcrMcrfcqRcqScqTcqUcqVcqWcrGcrHaaaaaaaaaaaaaaaaaacqQcqRcqScqTcqUcqVcqWcrGcrHcqZcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacthdJQdJQdJQdJQdJQctjdJQdJQdJQdJQdJQctjdJQdJQdJQdJQdJQctjctictictictictictjctictictictictictjctictictictictictjctictictictictictk -cqGcrDcrrcrBcrtcrxcrFcrCctccsPctbcsTcsHcsGcsBcsZcsEcsDctlcrrcrBcrCcrscrtcrEcrucqNcqRcqScqTcqUcqVcqWcrGcqYcrIcrJcrNcrKcrLcrMcqQcqRcqVcqTcqUcqVcqWcrJcrHcrIcrJcrNcrKcrLcrMcqQcqRcrhcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJTdJUdJVdJTdJUcrQdJSdJSdJSdJSdJScrQdJRdJRdJRdJRdJRcrQctmctmctnctoctocrQctpctpctpctpctpcrQctqctrctrctrctscrQcttctuctuctuctvcrW +cqFcrvcrAcrwcrEcrtcrycrBcrrcrDcrucrFcrscrxcrCcrzcrycrtcrucrAcrwcrBcrFcrEcrxcrDcqGcrNcrKcrLcrMcqQcqRcqScricqUcqVcqWcrGcrHcrIcrJcrNcrIcqWcqScqRcrHcqVcqTcqUcqVcqWcrGcrHcrIcrJcrNcrccrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedJPdJsdIedJqcrQdJpdJpdJpdJpdJpcrQdKcdJDdJGdJFdKccrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsccsacsacsacsdcrW +cqIcrEcrDcrscrBcrCcskcrycrucslcsmcsncsocspcsqcsrcsscstcrxcrDcsucrycrrcrBcrwcrtcqOcrMcqQcqRcqScqTcqUcqVcrlcrGcrHcrIcrJcrNcrKcrLcrMcsMcsMcsMcsMcsMcsMcqWcrGcrHcrIcrJcrNcrKcrLcrMcrfcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedIedIedJsdIecrQdKedKfdKedKfdKecrQdKddJDdJGdJFdKdcrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsccsacsacsacsdcrW +cqHcrBcrtcrzcrycsAcrDcrAcrxcspcsBcsCcsDcsEcsFcsGcsHcsIcrwcrtcrzcskcrucrycrscrCcqLcrIcrJcrNcrKcrLcrMcqQcrgcqScqTcqUcqVcqWcrGcrHcrIcsMcsNcsNcsNcsNcsMcqRcqScqTcqUcqVcqWcrGcrHcrIcracrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdIedKgdIedIedJscrQdJNdJOdJNdJOdJNcrQdKddJDdJGdJFdKdcrQcrPcrXcrPcrXcrPcrQcrRcrRcrRcrRcrRcrQcrScrYcrScrYcrScrQcsccsacsacsacsdcrW +cqDcrycrCcrvcrAcrrcrtcrDcsOcsGcsHcsPcsQcsRcsDcsCcsScsTcsUcrCcrvcrDcrxcrAcrzcrFcqBcqTcqUcqVcqWcrGcrHcrIcracrNcrKcrLcrMcqQcqRcqScqTcsMcsNcsNcsNcsNcsMcrHcrNcrKcrLcrMcqQcqRcqScqTcrjcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJqdIedKhdIedJPcrQdJIdJJdJIdJJdJIcrQdKjdKidKldKkdKjcrQcrPcrPcrPcrPcrPcrQcrRcrRcrRcrRcrRcrQcrScrScrScrScrScrQcsWcsXcsXcsXcsYcrW +cqJcrAcrFcrEcrDcrucrCcrtcsUcsCcsScsZcsBctacsQcsPctbcsFctccrFcrEcrtcrwcrDcrvcrrcqKcrHcrIcrJcrNcrKcrLcrMcrfcqRcqScqTcqUcqVcqWcrGcrHcsMcsNcsNcsNcsNcsMcqQcqRcqScqTcqUcqVcqWcrGcrHcqZcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacthdJQdJQdJQdJQdJQctjdJQdJQdJQdJQdJQctjdJQdJQdJQdJQdJQctjctictictictictictjctictictictictictjctictictictictictjctictictictictictk +cqGcrDcrrcrBcrtcrxcrFcrCctccsPctbcsTcsHcsGcsBcsZcsEcsDctlcrrcrBcrCcrscrtcrEcrucqNcqRcqScqTcqUcqVcqWcrGcqYcrIcrJcrNcrKcrLcrMcqQcqRcHGcIrctgcHGcItcIscrHcrIcrJcrNcrKcrLcrMcqQcqRcrhcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJTdJUdJVdJTdJUcrQdJSdJSdJSdJSdJScrQdJRdJRdJRdJRdJRcrQctmctmctnctoctocrQctpctpctpctpctpcrQctqctrctrctrctscrQcttctuctuctuctvcrW cqOcrtcrucrycrCcrwcrrcrFctlcsZcsEcsFcsScsCcsHcsTcsRcsQctwcrucrycrFcrzcrCcrBcrxcqEcqVcqWcrGcrHcrIcrJcrNcrccrLcrMcqQcqRcqScqTcqUcqVcqScrIcrJcrNcrKcrGcrKcrLcrMcqQcqRcqScqTcqUcqVcrlcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJUdJVdJTdJUdJVcrQdJSdJWdJSdJSdJScrQdJRdJXdJZdJYdJRcrQctxctxctyctzctzcrQctpctActpctBctpcrQctCctDctDctDctEcrQctFctGctGctGctHcrW cqLcrCcrxcrAcrFcrscrucrrctwcsTcsRcsDctbcsPcsScsFctacsBctIcrxcrAcrrcrvcrFcrycrwcqMcrJcrNcrKcrLcrMcqQcqRcrhcqTcqUcqVcqWcrGcrHcrIcrJctecsectJctdctKcshcqScqTcqUcqVcqWcrGcrHcrIcrJcrbcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJVdJTdJUdJVdJTcrQdJSdJSdJSdKadJScrQdJRdKbdKbdKbdJRcrQctxctLctLctLctzcrQctpctpctpctpctpcrQctCctDctDctDctEcrQctFctGctGctGctHcrW cqBcrFcrwcrDcrrcrzcrxcructIcsFctacsQcsEcsZctbcsDcsGcsHctMcrwcrDcrucrEcrrcrAcrscqPcrKcrLcrMcqQcqRcqScqTcrjcqVcqWcrGcrHcrIcrJcrNcrKcshctNctOctPctQctRcqUcqVcqWcrGcrHcrIcrJcrNcrKcrdcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrOdJTdJUdJVdJTdJUcrQdJSdJSdJSdJSdJScrQdJRdJRdJRdJRdJRcrQctxctyctyctyctzcrQctpctpctpctpctpcrQctCctDctDctDctEcrQctFctGctGctGctHcrW @@ -10372,12 +10363,12 @@ cqJcrFcrEcrtcrwcrDcrvcrrcrDcrFcrEcrtcrwcrDcrvcrrcrDcrvcrrcrFcrEcrtcrwcrDcrvcrrcq cqGcrrcrBcrCcrscrtcrEcrucrtcrrcrBcrCcrscrtcrEcrucrtcrEcrucrrcrBcrCcrscrtcrEcrucqNcrmcqBcrFcrwcrDcrrcsocsmcwecwfcwgcspcvJcvtcvxcvOcvscrscrCcwhcrwcrDcrucrEcrrcrAcrscqPcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuYaaacwbcwicwdaaacvzcvAcvEcvEcvDcvEcvAcvFcvGcvHcvHcuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwjcwkcwlcwmcwncvVcvVcvVaaacvWcvWcvWcwjcwkcwlcwmcwnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqOcrucrycrFcrzcrCcrBcrxcrCcrucrycrFcrzcrCcrBcrxcrCcrBcrxcrucrycrFcrzcrCcrBcrxcqEcrmcqKcrrcrscrtcrucvTcvpcvKcvucvscvvcvqcvKcvMcvtcvJcrzcrFcskcrscrtcrxcrBcrucrDcrzcqCcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZcuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocwpcwpcwpcwqcwrcwscwrcwrcwrcwscwrcwtcwpcwpcwpcwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqLcrxcrAcrrcrvcrFcrycrwcrFcrxcrAcrrcrvcrFcrycrwcrFcrycrwcrxcrAcrrcrvcrFcrycrwcqMcrmcqNcrucrzcrCcrxcvXcvvcvpcvscvJcvrcvwcvpcvucvKcvqcstcstcstcstcwucrwcrycrxcrtcrvcqFcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocwvcwvcwwcwxcwycwzcwAcwBcwCcwzcwycwDcwEcwvcwvcwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqBcrwcrDcrucwFcwGcwgcsIcwHcrucwFcwGcwgcsIcwHcrAcwIcwJcsmcwKcwLcrucrEcrrcrAcrscqPcrmcqEcrxcrvcrFcrwcwacvrcvvcvJcvqcvIcvLcvvcvscvpcvwcvxcvtcvqcvIcsAcrscrAcrwcrCcrEcqIcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocwvcwvcwNcwOcwPcwzcwPcwQcwPcwzcwPcwRcwNcwvcwvcwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqKcrAcrtcrxcwSdSJdSKdSIcwWcrxcwScwTcwUcwVcwWcrxcwXcwYcwZcxacxbcrxcrBcrucrDcrzcqCcrmcqMcrwcrEcrrcrscwhcvIcvrcvqcvwcvxcvOcvrcvJcvvcvLcvMcvKcvwcvxcxccrzcrDcrscrFcrBcqHcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxdcxdcxecxdcxdcxdcxfcxgcxdcxdcxdcxfcxdcxdcxdcxdcxdcxdcxfcxdcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxhcwEcwvcxicwPcwzcwzcwzcwzcwzcwzcwzcwPcxicwvcwwcxjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqNcrDcrCcrwcxbdTfdSTdTgcxncrwcxbcxkcxlcxmcxncrwcxocxpcxqcxrcxscrwcrycrxcrtcrvcqFcrmcqPcrscrBcrucrzcskcvxcvIcvwcvLcvMcvtcvIcvqcvrcvOcvucvpcvLcvMcvkcrvcrtcrzcrrcrycqDcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxecxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxfcxdcxdcxdcxdcxdcxfcxdcxdcxdcxdcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxhcwrcwtcxtcxucxvcxucwzcxwcxxcwzcxycwqcwrcxjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqEcrtcrFcrscxsdTcdSZdSKcwIcrscxscxzcxAcwUcwIcrscwScxBcxCcxDcxEcrscrAcrwcrCcrEcqIcrmcqCcrzcrycrxcvTcxFcvMcvxcvLcvOcvucvKcvxcvwcvIcvtcvscvvcvOcvucxGcsIcwucrvcrucrAcqJcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxHcxdcxdcxdcxdcxdcxecxdcxdcxgcxfcxdcxdcxfcxdcxdcxfcxgcxdcxfcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocxIcxJcxKcxLcwzcxwcxxcwzcxycwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqMcrCcrrcrzcxEdSIdSSdSTcxNcrzcxEcwVcxMcxlcxNcrzcxbcxOcxacxPcwWcrzcrDcrscrFcrBcqHcrmcqFcrvcrAcrwcvXcvqcvucvMcvOcvtcvscvpcvMcvLcvxcvKcvJcvrcvtcvscvpcvMcsAcrEcrxcrDcqGcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxecxdcxdcxfcxgcxdcxdcxfcxdcxgcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocxQcxRcxRcxucwzcxwcxxcwzcwycwocxScxScxScxSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -cqPcrFcrucrvcwWcwScxncxEcwFcrvcwWcwScxncxEcwFcrvcxscwLcwXcxbcxncrvcrtcrzcrrcrycqDcrmcqIcrEcrDcrscwacvwcvscvucvtcvKcvJcvvcvucvOcvMcvpcvqcvIcvKcvJcvvcvucxccrBcrwcrtcqOcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxecxdcxdcxdcxdcxdcxgcxdcxfcxgcxdcxfcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocxTcxRcxRcxUcwzcwPcwPcwzcwzcwscxScxScxScxSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqBcrwcrDcrucrBcrscrycrEcrtcrucwFcwGcwgcsIcwHcrAcwIcwJcsmcwKcwLcrucrEcrrcrAcrscqPcrmcqEcrxcrvcrFcrwcwacvrcvvcvJcvqcvIcvLcvvcvscvpcvwcvxcvtcvqcvIcsAcrscrAcrwcrCcrEcqIcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocwvcwvcwNcwOcwPcwzcwPcwQcwPcwzcwPcwRcwNcwvcwvcwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqKcrAcrtcrxcrrcrDcrucrFcrscrxcwScwTcwUcwVcwWcrxcwXcwYcwZcxacxbcrxcrBcrucrDcrzcqCcrmcqMcrwcrEcrrcrscwhcvIcvrcvqcvwcvxcvOcvrcvJcvvcvLcvMcvKcvwcvxcxccrzcrDcrscrFcrBcqHcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxdcxdcxecxdcxdcxdcxfcxgcxdcxdcxdcxfcxdcxdcxdcxdcxdcxdcxfcxdcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxhcwEcwvcxicwPcwzcwzcwzcwzcwzcwzcwzcwPcxicwvcwwcxjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqNcrDcrCcrwcrucrtcrxcrrcrzcrwcxbcxkcxlcxmcxncrwcxocxpcxqcxrcxscrwcrycrxcrtcrvcqFcrmcqPcrscrBcrucrzcskcvxcvIcvwcvLcvMcvtcvIcvqcvrcvOcvucvpcvLcvMcvkcrvcrtcrzcrrcrycqDcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxecxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxfcxdcxdcxdcxdcxdcxfcxdcxdcxdcxdcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxhcwrcwtcxtcxucxvcxucwzcxwcxxcwzcxycwqcwrcxjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqEcrtcrFcrscrxcrCcrwcrucrvcrscxscxzcxAcwUcwIcrscwScxBcxCcxDcxEcrscrAcrwcrCcrEcqIcrmcqCcrzcrycrxcvTcxFcvMcvxcvLcvOcvucvKcvxcvwcvIcvtcvscvvcvOcvucxGcsIcwucrvcrucrAcqJcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxHcxdcxdcxdcxdcxdcxecxdcxdcxgcxfcxdcxdcxfcxdcxdcxfcxgcxdcxfcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocxIcxJcxKcxLcwzcxwcxxcwzcxycwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqMcrCcrrcrzcrwcrFcrscrxcrEcrzcxEcwVcxMcxlcxNcrzcxbcxOcxacxPcwWcrzcrDcrscrFcrBcqHcrmcqFcrvcrAcrwcvXcvqcvucvMcvOcvtcvscvpcvMcvLcvxcvKcvJcvrcvtcvscvpcvMcsAcrEcrxcrDcqGcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxecxdcxdcxfcxgcxdcxdcxfcxdcxgcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocxQcxRcxRcxucwzcxwcxxcwzcwycwocxScxScxScxSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +cqPcrFcrucrvcrscrrcrzcrwcrBcrvcwWcwScxncxEcwFcrvcxscwLcwXcxbcxncrvcrtcrzcrrcrycqDcrmcqIcrEcrDcrscwacvwcvscvucvtcvKcvJcvvcvucvOcvMcvpcvqcvIcvKcvJcvvcvucxccrBcrwcrtcqOcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxdcxecxdcxdcxdcxdcxdcxgcxdcxfcxgcxdcxfcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocxTcxRcxRcxUcwzcwPcwPcwzcwzcwscxScxScxScxSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqCcrrcrxcrEcrCcrvcrucrAcrvcrrcrxcrEcrCcrvcrucrAcrvcrucrAcrrcrxcrEcrCcrvcrucrAcqJcrmcqHcrBcrtcrzcwhcvLcvJcvscvKcvpcvqcvrcvscvtcvucvvcvwcvxcvpcvqcvrcvscvkcrycrscrCcqLcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxdcxVcxVcxVcxVcxVcxVcxVcxdcxdcxdcxdcxdcxdcxdcxfcxdcxdcxHcxgcxdcxdcxdcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwqcwrcwrcwrcwtcwzcxwcxxcwzcxWcwocxScxScxScxSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqFcrAcrwcrBcrFcrEcrxcrDcrEcrAcrwcrBcrFcrEcrxcrDcrEcrxcrDcrAcrwcrBcrFcrEcrxcrDcqGcrmcqDcrycrCcrvcskcvOcvqcvJcvpcvvcvwcvIcvJcvKcvscvrcvLcvMcvvcvwcvIcvJcvlcrAcrzcrFcqBcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxXcxYcxZcyacyacyacybcxYcyccxdcxdcxdcxdcxHcxdcxdcxecxdcxecxdcxfcxdcxfcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacydcyecyecyfcygcwzcxwcxxcwzcyhcydaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa cqIcrscrscrycrrcrBcrwcrtcrBcrscrscrycrrcrBcrwcrtcrBcrwcrtcrscrscrycrrcrBcrwcrtcqOcrmcqJcrAcrFcrEcyicvtcvwcvqcvvcvrcvLcvxcvqcvpcvJcvIcvOcvucvrcvLcvxcvqcvycrDcrvcrrcqKcrmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwMcxdcxdcxdcxdcxdcxYcyjcykcylcymcyncyocyocxYcypcxdcxdcxVcxVcxVcxVcxVcxVcxVcxVcyqcyrcxVcwMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwocyscyscyscytcwzcxwcxxcwzcyucwocyvcyvcyvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/scripts/ircbot_message.py b/scripts/ircbot_message.py index f4e6f9361f..b2b8a02f1b 100644 --- a/scripts/ircbot_message.py +++ b/scripts/ircbot_message.py @@ -3,7 +3,7 @@ # Two arguments, channel and message. # EG: "ircbot_message.py #adminchannel ADMINHELP, people are killing me!" -import sys,pickle,socket +import sys,cPickle,socket def pack(): ip = sys.argv[1] @@ -12,7 +12,7 @@ def pack(): except: data = "NO DATA SPECIFIED" dictionary = {"ip":ip,"data":["PASSWORD"] + data} - pickled = pickle.dumps(dictionary) + pickled = cPickle.dumps(dictionary) nudge(pickled) def nudge(data): HOST = "IRCBOT IP"