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 += "| #[D.account_number] | "
dat += "[D.owner_name] | "
@@ -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, iYour account number is: #[M.account_number]
"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 3c39813f5f..71906ffb3b 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -97,609 +97,613 @@
var/list/TLV = list()
- server/New()
- ..()
- req_access = list(access_rd, access_atmospherics, access_engine_equip)
- TLV["oxygen"] = list(-1.0, -1.0,-1.0,-1.0) // 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(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */
- TLV["temperature"] = list(20, 40, 140, 160) // K
- target_temperature = 90
- New(var/loc, var/dir, var/building = 0)
- ..()
-
- if(building)
- if(loc)
- src.loc = loc
-
- if(dir)
- src.dir = dir
-
- buildstage = 0
- wiresexposed = 1
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- update_icon()
- return
-
- first_run()
-
- proc/first_run()
- alarm_area = get_area(src)
- if (alarm_area.master)
- alarm_area = alarm_area.master
- area_uid = alarm_area.uid
- if (name == "alarm")
- name = "[alarm_area.name] Air Alarm"
-
- // 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
-
- initialize()
- set_frequency(frequency)
- if (!master_is_operating())
- elect_master()
+/obj/machinery/alarm/server/New()
+ ..()
+ req_access = list(access_rd, access_atmospherics, access_engine_equip)
+ TLV["oxygen"] = list(-1.0, -1.0,-1.0,-1.0) // 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(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */
+ TLV["temperature"] = list(20, 40, 140, 160) // K
+ target_temperature = 90
- process()
- if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2)
- return
+/obj/machinery/alarm/New(var/loc, var/dir, var/building = 0)
+ ..()
- var/turf/simulated/location = loc
- if(!istype(location)) return//returns if loc is not simulated
+ if(building)
+ if(loc)
+ src.loc = loc
- var/datum/gas_mixture/environment = location.return_air()
+ if(dir)
+ src.dir = dir
- //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
-
- 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 = "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 | "
+/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 += "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:"
+ var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\
+ AALARM_MODE_REPLACEMENT = "Replace Air - Siphons out air while replacing",\
+ AALARM_MODE_PANIC = "Panic - Siphons air out of the room",\
+ AALARM_MODE_CYCLE = "Cycle - Siphons air before replacing",\
+ AALARM_MODE_FILL = "Fill - Shuts off scrubbers and opens vents",\
+ AALARM_MODE_OFF = "Off - Shuts off vents and scrubbers",)
+ for (var/m=1,m<=modes.len,m++)
+ if (mode==m)
+ output += "- [modes[m]] (selected)
"
else
- sensor_data = "No scrubbers connected.
"
- output = {"Main menu
[sensor_data]"}
+ output += "- [modes[m]]
"
+ output += "
"
- if (AALARM_SCREEN_MODE)
- output += "Main menu
Air machinery mode for the area:"
- var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\
- AALARM_MODE_REPLACEMENT = "Replace Air - Siphons out air while replacing",\
- AALARM_MODE_PANIC = "Panic - Siphons air out of the room",\
- AALARM_MODE_CYCLE = "Cycle - Siphons air before replacing",\
- AALARM_MODE_FILL = "Fill - Shuts off scrubbers and opens vents",\
- AALARM_MODE_OFF = "Off - Shuts off vents and scrubbers",)
- for (var/m=1,m<=modes.len,m++)
- if (mode==m)
- output += "- [modes[m]] (selected)
"
- else
- output += "- [modes[m]]
"
- output += "
"
-
- 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;}
| min2 | min1 | max1 | max2 |
"}
- 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 += "| [gases[g]] | "
- selected = TLV[g]
- for(var/i = 1, i <= 4, i++)
- output += "[selected[i] >= 0 ? selected[i] :"OFF"] | "
- output += "
"
-
- selected = TLV["pressure"]
- output += " | Pressure | "
+ var/list/selected
+ for (var/g in gases)
+ output += "
|---|
| [gases[g]] | "
+ selected = TLV[g]
for(var/i = 1, i <= 4, i++)
- output += "[selected[i] >= 0 ? selected[i] :"OFF"] | "
+ output += "[selected[i] >= 0 ? selected[i] :"OFF"] | "
output += "
"
- selected = TLV["temperature"]
- output += "| Temperature | "
- for(var/i = 1, i <= 4, i++)
- output += "[selected[i] >= 0 ? selected[i] :"OFF"] | "
- output += "
|---|
"
+ 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"