diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm
index 5e4a45e21a..089522490a 100644
--- a/code/WorkInProgress/buildmode.dm
+++ b/code/WorkInProgress/buildmode.dm
@@ -92,8 +92,8 @@
usr << "\blue ***********************************************************"
if(4)
usr << "\blue ***********************************************************"
- usr << "\blue Left Mouse Button on turf/obj/mob = Throw"
- usr << "\blue Right Mouse Button on turf/obj/mob = Select"
+ usr << "\blue Left Mouse Button on turf/obj/mob = Select"
+ usr << "\blue Right Mouse Button on turf/obj/mob = Throw"
usr << "\blue ***********************************************************"
return
diff --git a/code/WorkInProgress/kilakk/responseteam.dm b/code/WorkInProgress/kilakk/responseteam.dm
index c5b49537c4..94a4664c9c 100644
--- a/code/WorkInProgress/kilakk/responseteam.dm
+++ b/code/WorkInProgress/kilakk/responseteam.dm
@@ -40,7 +40,7 @@ var/sent_emergency_team = 0
return
sent_emergency_team = 1
- message_admins("[key_name_admin(usr)] has dispatched an Emergency Response Team.", 1)
+ message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1)
log_admin("[key_name(usr)] used Dispatch Response Team.")
var/member_number = members_possible
@@ -66,14 +66,14 @@ var/sent_emergency_team = 0
// I tried doing this differently. Ghosts get a pop-up box similar to pAIs and one-click-antag
// Biggest diff here is in how the candidates list is updated
- alert(usr, "Active ghosts are currently being given a chance to be considered to join the emergency response team. Please wait about 30 seconds.") // There's probably a better way to do this, with a fancy count-down timer or something
+ alert(usr, "Active ghosts will be given a chance to choose whether or not they want to be considered for the emergency reponse team. This will take about 30 seconds.") // There's probably a better way to do this, with a fancy count-down timer or something
var/list/candidates = list()
var/list/members = list()
var/time_passed = world.time
for(var/mob/dead/observer/G in player_list)
- if(!jobban_isbanned(G, "Syndicate") || !jobban_isbanned(G, "Emergency Response Team") || !jobban_isbanned(G, "Security Officer"))
+ if(!jobban_isbanned(G, "Syndicate") && !jobban_isbanned(G, "Emergency Response Team") && !jobban_isbanned(G, "Security Officer"))
spawn(0)
switch(alert(G, "Do you want to be considered for the Emergency Response Team? Please answer in 30 seconds!",,"Yes","No"))
if("Yes")
@@ -110,37 +110,79 @@ var/sent_emergency_team = 0
del(new_member)
break
- switch(alert(new_member, "You are an Emergency Response Team member! Are you a boy or a girl?",,"Male","Female"))
- if("Male")
- new_member.gender = MALE
- if("Female")
- new_member.gender = FEMALE
+ spawn(0)
+ switch(alert(new_member, "You are an Emergency Response Team member! Are you a boy or a girl?",,"Male","Female"))
+ if("Male")
+ new_member.gender = MALE
+ if("Female")
+ new_member.gender = FEMALE
- var/new_name = input(new_member, "...Erm, what was your name again?", "Choose your name") as text
+ var/new_name = input(new_member, "...Erm, what was your name again?", "Choose your name") as text
- if(!new_name)
- new_member.real_name = "Agent [pick("Red","Yellow","Orange","Silver","Gold", "Pink", "Purple", "Rainbow")]" // Choose a "random" agent name
- new_member.name = usr.real_name
- else
- new_member.real_name = new_name
- new_member.name = new_name
+ if(!new_name)
+ new_member.real_name = "Agent [pick("Red","Yellow","Orange","Silver","Gold", "Pink", "Purple", "Rainbow")]" // Choose a "random" agent name
+ new_member.name = usr.real_name
+ else
+ new_member.real_name = new_name
+ new_member.name = new_name
- new_member.dna.ready_dna(new_member)
- new_member.update_body(1)
+ // -- CHANGE APPEARANCE --
+ var/new_tone = input(new_member, "Please select your new skin tone: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as num
- new_member.mind_initialize()
- new_member.mind.assigned_role = "Emergency Response Team"
- new_member.mind.special_role = "Emergency Response Team"
- ticker.mode.traitors += new_member.mind // ERTs will show up at the end of the round on the "traitor" list
+ if(new_tone)
+ new_member.s_tone = max(min(round(text2num(new_tone)), 220), 1)
+ new_member.s_tone = -new_member.s_tone + 35
- new_member << "\blue You are the Emergency Response Team[!leader_selected?"!":" Leader!"] \nAs a response team [!leader_selected?"member":"leader"] you answer directly to [!leader_selected?"your team leader.":"Central Command."] \nYou have been deployed by NanoTrasen Central Command in Tau Ceti to resolve a Code Red alert aboard [station_name()], and have been provided with the following instructions and information regarding your mission: \red [situation]"
- new_member.mind.store_memory("Mission Parameters: \red [situation].")
+ var/new_hair = input(new_member, "Please select your new hair color.","Character Generation") as color
- if(leader_selected)
- new_member << "\red The Nuclear Authentication Code is: [nuke_code]. You are instructed not to detonate the nuclear device aboard [station_name()] unless absolutely necessary."
- new_member.mind.store_memory("Nuclear Authentication Code: \red [nuke_code]")
+ if(new_hair)
+ new_member.r_hair = hex2num(copytext(new_hair, 2, 4))
+ new_member.g_hair = hex2num(copytext(new_hair, 4, 6))
+ new_member.b_hair = hex2num(copytext(new_hair, 6, 8))
- new_member.equip_response_team(leader_selected) // Start equipping them
+ var/new_facial = input(new_member, "Please select your new facial hair color.","Character Generation") as color
+
+ if(new_facial)
+ new_member.r_facial = hex2num(copytext(new_facial, 2, 4))
+ new_member.g_facial = hex2num(copytext(new_facial, 4, 6))
+ new_member.b_facial = hex2num(copytext(new_facial, 6, 8))
+
+ var/new_eyes = input(new_member, "Please select eye color.", "Character Generation") as color
+
+ if(new_eyes)
+ new_member.r_eyes = hex2num(copytext(new_eyes, 2, 4))
+ new_member.g_eyes = hex2num(copytext(new_eyes, 4, 6))
+ new_member.b_eyes = hex2num(copytext(new_eyes, 6, 8))
+
+ var/new_hstyle = input(new_member, "Please select your new hair style!", "Grooming") as null|anything in hair_styles_list
+
+ if(new_hstyle)
+ new_member.h_style = new_hstyle
+
+ var/new_fstyle = input(new_member, "Please select your new facial hair style!", "Grooming") as null|anything in facial_hair_styles_list
+
+ if(new_fstyle)
+ new_member.f_style = new_fstyle
+
+ // -- END --
+
+ new_member.dna.ready_dna(new_member)
+ new_member.update_body(1)
+ new_member.update_hair(1)
+
+ new_member.mind_initialize()
+ new_member.mind.assigned_role = "Emergency Response Team"
+ new_member.mind.special_role = "Emergency Response Team"
+ ticker.mode.traitors += new_member.mind // ERTs will show up at the end of the round on the "traitor" list
+
+ new_member << "\blue You are the Emergency Response Team[!leader_selected?"!":" Leader!"] \nAs a response team [!leader_selected?"member":"leader"] you answer directly to [!leader_selected?"your team leader.":"Central Command."] \nYou have been deployed by NanoTrasen Central Command in Tau Ceti to resolve a Code Red alert aboard [station_name()], and have been provided with the following instructions and information regarding your mission: \red [situation]"
+ new_member.mind.store_memory("Mission Parameters: \red [situation].")
+
+ if(leader_selected)
+ new_member << "\red The Nuclear Authentication Code is: [nuke_code]. You are instructed not to detonate the nuclear device aboard [station_name()] unless absolutely necessary."
+ new_member.mind.store_memory("Nuclear Authentication Code: \red [nuke_code]")
+
+ new_member.equip_response_team(leader_selected) // Start equipping them
member_number--
return 1
diff --git a/code/WorkInProgress/periodic_news.dm b/code/WorkInProgress/periodic_news.dm
index 9218686926..8b8be52e2d 100644
--- a/code/WorkInProgress/periodic_news.dm
+++ b/code/WorkInProgress/periodic_news.dm
@@ -13,70 +13,108 @@
paycuts_suspicion
round_time = 60*10
- message = "Reports have leaked that Nanotrasen Inc. is planning to put paycuts into effect on many of its Research Stations in Tau Ceti. Apparently these research stations haven't been able to yield the expected revenue, and thus adjustments have to be made."
+ message = {"Reports have leaked that Nanotrasen Inc. is planning to put paycuts into
+ effect on many of its Research Stations in Tau Ceti. Apparently these research
+ stations haven't been able to yield the expected revenue, and thus adjustments
+ have to be made."}
author = "Unauthorized"
paycuts_confirmation
round_time = 60*40
- message = "Earlier rumours about paycuts on Research Stations in the Tau Ceti system have been confirmed. Shockingly, however, the cuts will only affect lower tier personnel. Heads of Staff will, according to our sources, not be affected."
+ message = {"Earlier rumours about paycuts on Research Stations in the Tau Ceti system have
+ been confirmed. Shockingly, however, the cuts will only affect lower tier
+ personnel. Heads of Staff will, according to our sources, not be affected."}
author = "Unauthorized"
human_experiments
round_time = 60*90
- message = "Unbelievable reports about human experimentation have reached our ears. According to a refugee from one of the Tau Ceti Research Stations, their station, in order to increase revenue, has refactored several of their facilities to perform experiments on live humans, including virology research, genetic manipulation, and \"feeding them to the slimes to see what happens\". Allegedly, these test subjects were neither humanified monkeys nor volunteers, but rather unqualified staff that were forced into the experiments, and reported to have died in a \"work accident\" by Nanotrasen Inc."
+ message = {"Unbelievable reports about human experimentation have reached our ears. According
+ to a refugee from one of the Tau Ceti Research Stations, their station, in order
+ to increase revenue, has refactored several of their facilities to perform experiments
+ on live humans, including virology research, genetic manipulation, and \"feeding them
+ to the slimes to see what happens\". Allegedly, these test subjects were neither
+ humanified monkeys nor volunteers, but rather unqualified staff that were forced into
+ the experiments, and reported to have died in a \"work accident\" by Nanotrasen Inc."}
author = "Unauthorized"
bluespace_research
announcement
round_time = 60*20
- message = "The new field of research trying to explain several interesting spacetime oddities, also known as \"Bluespace Research\", has reached new heights. Of the several hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped to experiment with and research Bluespace effects. Rumours have it some of these stations even sport functional \"travel gates\" that can instantly move a whole research team to an alternate reality."
+ message = {"The new field of research trying to explain several interesting spacetime oddities,
+ also known as \"Bluespace Research\", has reached new heights. Of the several
+ hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped
+ to experiment with and research Bluespace effects. Rumours have it some of these
+ stations even sport functional \"travel gates\" that can instantly move a whole research
+ team to an alternate reality."}
random_junk
+
cheesy_honkers
author = "Assistant Editor Carl Ritz"
- channel_name = "The Gibson Gazzette"
- message = "Do cheesy honkers increase risk of having a miscarriage? Several health administrations say so!"
+ channel_name = "The Gibson Gazette"
+ message = {"Do cheesy honkers increase risk of having a miscarriage? Several health administrations
+ say so!"}
round_time = 60 * 15
net_block
author = "Assistant Editor Carl Ritz"
- channel_name = "The Gibson Gazzette"
- message = "Several corporations banding together to block access to 'wetskrell.nt', site administrators claiming violation of net laws."
+ channel_name = "The Gibson Gazette"
+ message = {"Several corporations banding together to block access to 'wetskrell.nt', site administrators
+ claiming violation of net laws."}
round_time = 60 * 50
found_ssd
channel_name = "Tau Ceti Daily"
author = "Doctor Eric Hanfield"
- message = "Several people have been found unconscious at their terminals. It is thought that it was due to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage reveals that many of them were playing games instead of working and their pay has been docked accordingly."
+ message = {"Several people have been found unconscious at their terminals. It is thought that it was due
+ to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage
+ reveals that many of them were playing games instead of working and their pay has been docked
+ accordingly."}
round_time = 60 * 90
lotus_tree
+
explosions
channel_name = "Tau Ceti Daily"
author = "Reporter Leland H. Howards"
- message = "The newly-christened civillian transport Lotus Tree suffered two very large explosions near the bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of the explosions remain unknown, but there is speculation that it might have something to do with the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L announced that they were officially acknowledging inter-species marriage and providing couples with marriage tax-benefits."
+ message = {"The newly-christened civillian transport Lotus Tree suffered two very large explosions near the
+ bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of
+ the explosions remain unknown, but there is speculation that it might have something to do with
+ the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L
+ announced that they were officially acknowledging inter-species marriage and providing couples
+ with marriage tax-benefits."}
round_time = 60 * 30
food_riots
+
breaking_news
channel_name = "Tau Ceti Daily"
author = "Reporter Ro'kii Ar-Raqis"
- message = "Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae Lupus system. This comes only hours after NanoTrasen officials announced they will no longer trade with the colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to continue. NanoTrasen officials have not given any details about said factions. More on that at the top of the hour."
+ message = {"Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae
+ Lupus system. This comes only hours after NanoTrasen officials announced they will no longer trade with the
+ colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to
+ continue. NanoTrasen officials have not given any details about said factions. More on that at the top of
+ the hour."}
round_time = 60 * 10
more
channel_name = "Tau Ceti Daily"
author = "Reporter Ro'kii Ar-Raqis"
- message = "More on the Refuge food riots: The Refuge Council has condemned NanoTrasen's withdrawal from the colony, claiming \"there has been no increase in anti-NanoTrasen activity\", and \"\[the only] reason NanoTrasen withdrew was because the \[Tenebrae Lupus] system's Plasma deposits have been completely mined out. We have little to trade with them now\". NanoTrasen officials have denied these allegations, calling them \"further proof\" of the colony's anti-NanoTrasen stance. Meanwhile, Refuge Security has been unable to quell the riots. More on this at 6."
+ message = {"More on the Refuge food riots: The Refuge Council has condemned NanoTrasen's withdrawal from
+ the colony, claiming \"there has been no increase in anti-NanoTrasen activity\", and \"\[the only] reason
+ NanoTrasen withdrew was because the \[Tenebrae Lupus] system's Plasma deposits have been completely mined out.
+ We have little to trade with them now\". NanoTrasen officials have denied these allegations, calling them
+ \"further proof\" of the colony's anti-NanoTrasen stance. Meanwhile, Refuge Security has been unable to quell
+ the riots. More on this at 6."}
round_time = 60 * 60
-var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/lotus_tree)
+var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots)
proc/process_newscaster()
check_for_newscaster_updates(ticker.mode.newscaster_announcements)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index c472c22b58..175e622788 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -370,13 +370,13 @@ datum/mind
if(!def_value)//If it's a custom objective, it will be an empty string.
def_value = "custom"
- var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "prevent", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom")
+ var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "prevent", "harm", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom")
if (!new_obj_type) return
var/datum/objective/new_objective = null
switch (new_obj_type)
- if ("assassinate","protect","debrain")
+ if ("assassinate","protect","debrain", "harm", "brig")
//To determine what to name the objective in explanation text.
var/objective_type_capital = uppertext(copytext(new_obj_type, 1,2))//Capitalize first letter.
var/objective_type_text = copytext(new_obj_type, 2)//Leave the rest of the text.
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index f1ad3a10f8..ff19ce7764 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -47,6 +47,8 @@
dat += "
"
dat += "Staff of Change
"
dat += "
"
+ dat += "Mental Focus
"
+ dat += "
"
dat += "Six Soul Stone Shards and the spell Artificer
"
dat += "
"
dat += "Mastercrafted Armor Set
"
@@ -84,7 +86,7 @@
uses--
/*
*/
- var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", summonguns = "Summon Guns", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation")
+ var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", summonguns = "Summon Guns", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in H.spell_list)
if(available_spells[href_list["spell_choice"]] == aspell.name)
@@ -162,6 +164,11 @@
new /obj/item/weapon/gun/energy/staff(get_turf(H))
temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
max_uses--
+ if("mentalfocus")
+ feedback_add_details("wizard_spell_learned","MF") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ new /obj/item/weapon/gun/energy/staff/focus(get_turf(H))
+ temp = "An artefact that channels the will of the user into destructive bolts of force."
+ max_uses--
if("soulstone")
feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H))
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 4585837f80..3b6b584ee2 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -134,7 +134,40 @@ var/global/datum/controller/occupations/job_master
if(!job) continue
var/list/candidates = FindOccupationCandidates(job, level)
if(!candidates.len) continue
- var/mob/new_player/candidate = pick(candidates)
+
+ // Build a weighted list, weight by age.
+ var/list/weightedCandidates = list()
+
+ // Different head positions have different good ages.
+ var/good_age_minimal = 25
+ var/good_age_maximal = 60
+ if(command_position == "Captain")
+ good_age_minimal = 30
+ good_age_maximal = 70 // Old geezer captains ftw
+
+ for(var/mob/V in candidates)
+ // Log-out during round-start? What a bad boy, no head position for you!
+ if(!V.client) continue
+ var/age = V.client.prefs.age
+ switch(age)
+ if(good_age_minimal - 10 to good_age_minimal)
+ weightedCandidates[V] = 3 // Still a bit young.
+ if(good_age_minimal to good_age_minimal + 10)
+ weightedCandidates[V] = 6 // Better.
+ if(good_age_minimal + 10 to good_age_maximal - 10)
+ weightedCandidates[V] = 10 // Great.
+ if(good_age_maximal - 10 to good_age_maximal)
+ weightedCandidates[V] = 6 // Still good.
+ if(good_age_maximal to good_age_maximal + 10)
+ weightedCandidates[V] = 6 // Bit old, don't you think?
+ if(good_age_maximal to good_age_maximal + 50)
+ weightedCandidates[V] = 3 // Geezer.
+ else
+ // If there's ABSOLUTELY NOBODY ELSE
+ if(candidates.len == 1) weightedCandidates[V] = 1
+
+
+ var/mob/new_player/candidate = pickweight(weightedCandidates)
if(AssignRole(candidate, command_position))
return 1
return 0
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 58824777d1..56c9f74f49 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -368,7 +368,7 @@
src.desc = initial(src.desc)
if(being_built)
src.being_built.Move(get_step(src,SOUTH))
- src.visible_message("\icon[src] [src] beeps, \"The [src.being_built] is complete\".")
+ src.visible_message("\icon[src] [src] beeps, \"The following has been completed: [src.being_built] is built\".")
src.being_built = null
src.updateUsrDialog()
return 1
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 3d78561925..1c6c667a89 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -162,3 +162,28 @@
name = "double emergency oxygen tank"
icon_state = "emergency_double"
volume = 10
+
+/*
+ * Nitrogen
+ */
+/obj/item/weapon/tank/nitrogen
+ name = "nitrogen tank"
+ desc = "A tank of nitrogen."
+ icon_state = "oxygen_fr"
+ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
+
+
+/obj/item/weapon/tank/nitrogen/New()
+ ..()
+
+ src.air_contents.nitrogen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)
+ //
+ src.air_contents.update_values()
+ return
+
+/obj/item/weapon/tank/nitrogen/examine()
+ set src in usr
+ ..()
+ if(air_contents.nitrogen < 10)
+ usr << text("\red The meter on the [src.name] indicates you are almost out of air!")
+ playsound(usr, 'sound/effects/alert.ogg', 50, 1)
\ No newline at end of file
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 1d9b18db08..f28b649ba7 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -574,7 +574,7 @@ var/list/mechtoys = list(
temp += "Request from: [last_viewed_group]
"
for(var/supply_name in supply_shuttle.supply_packs )
var/datum/supply_packs/N = supply_shuttle.supply_packs[supply_name]
- if(N.hidden || (N.contraband && !can_order_contraband) || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
+ if((N.hidden && !hacked) || (N.contraband && !can_order_contraband) || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage
/*temp = "Supply points: [supply_shuttle.points]
Request what?
"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index a9ad1c223b..c36a0ab99d 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -67,9 +67,7 @@ var/list/admin_verbs_admin = list(
/client/proc/toggledebuglogs,
/datum/admins/proc/show_skills,
/client/proc/check_customitem_activity,
- /* Currently unticked.
- /client/proc/response_team
- */
+ ///client/proc/response_team
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 195a0be95b..e8ba6c4913 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -35,4 +35,26 @@
name = "medical mask"
icon_state = "medical"
item_state = "medical"
- permeability_coefficient = 0.01
+ permeability_coefficient = 0.01
+
+/obj/item/clothing/mask/breath/vox
+ desc = "A weirdly-shaped breath mask."
+ name = "vox breath mask"
+ icon_state = "voxmask"
+ item_state = "voxmask"
+ permeability_coefficient = 0.01
+
+ toggle()
+ set category = "Object"
+ set name = "Adjust mask"
+ set src in usr
+
+ usr << "You can't really adjust this mask - it's moulded to your beak!"
+
+/obj/item/clothing/mask/breath/vox/mob_can_equip(M as mob, slot)
+ var/mob/living/carbon/human/V = M
+ if(V.dna.mutantrace != "vox")
+ V << "This clearly isn't designed for your species!"
+ return 0
+
+ return ..()
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index 45e753c9ac..7a74d85516 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -1,6 +1,20 @@
/obj/item/clothing/head/helmet/space/unathi
var/up = 0 //So Unathi helmets play nicely with the weldervision check.
+ mob_can_equip(M as mob, slot)
+ var/mob/living/carbon/human/U = M
+ if(U.dna.mutantrace != "lizard")
+ U << "This clearly isn't designed for your species!"
+ return 0
+ return ..()
+
+/obj/item/clothing/suit/space/unathi/mob_can_equip(M as mob, slot)
+ var/mob/living/carbon/human/U = M
+ if(U.dna.mutantrace != "lizard")
+ U << "This clearly isn't designed for your species!"
+ return 0
+
+ return ..()
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
name = "NT breacher helmet"
@@ -39,7 +53,7 @@
item_state = "vox-pressure"
desc = "A huge, armoured, pressurized suit, designed for distinctly nonhuman proportions."
w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank)
slowdown = 2
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -56,7 +70,7 @@
item_state = "vox-carapace"
desc = "An armoured, segmented carapace with glowing purple lights. It looks pretty run-down."
w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 79be30e4c4..3ad4a6adb5 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -22,7 +22,6 @@ emp_act
var/obj/item/clothing/C = bp // Then call an argument C to be that clothing!
if(C.body_parts_covered & select_area.body_part) // Is that body part being targeted covered?
P.agony=P.agony*C.siemens_coefficient
- visible_message("\red [src]'s [C.name] absorbs some of the shock from the [P.name]!")
apply_effect(P.agony,AGONY,0)
del P
/* Commenting out new-old taser nerf.
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index be07fcba53..5d8dc1055b 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -394,6 +394,7 @@
var/oxygen_used = 0
var/nitrogen_used = 0
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
+ var/vox_oxygen_max = 1 // For vox.
//Partial pressure of the O2 in our breath
var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure
@@ -436,6 +437,7 @@
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
failed_last_breath = 1
oxygen_alert = max(oxygen_alert, 1)
+
else // We're in safe limits
failed_last_breath = 0
adjustOxyLoss(-5)
@@ -467,6 +469,10 @@
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
+ else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
+ var/ratio = (breath.oxygen/vox_oxygen_max) * 10
+ adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
+ toxins_alert = max(toxins_alert, 1)
else
toxins_alert = 0
@@ -596,7 +602,7 @@
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
pressure_alert = -1
else
- if( !(COLD_RESISTANCE in mutations) )
+ if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox")
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 7948a457c9..41c84823a6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -167,16 +167,18 @@
mouthshoot = 0
return
if (load_into_chamber())
- user.visible_message("[user] pulls the trigger. Ow.")
+ user.visible_message("[user] pulls the trigger.")
if(silenced)
playsound(user, fire_sound, 10, 1)
else
playsound(user, fire_sound, 50, 1)
in_chamber.on_hit(M)
if (!in_chamber.nodamage)
- user.apply_damage(in_chamber.damage*100, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]")
+ user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]")
+ user.death()
else
- user << "You feel dumb for trying this..."
+ user << "Ow..."
+ user.apply_effect(110,AGONY,0)
del(in_chamber)
mouthshoot = 0
return
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index f617533516..ccc6f932d4 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -12,6 +12,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
var/g_amount = 0
var/gold_amount = 0
var/diamond_amount = 0
+ var/uranium_amount = 0
var/max_material_amount = 75000.0
New()
@@ -46,7 +47,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
return
proc/TotalMaterials()
- return g_amount + gold_amount + diamond_amount
+ return g_amount + gold_amount + diamond_amount + uranium_amount
attackby(var/obj/item/O as obj, var/mob/user as mob)
if (shocked)
@@ -85,19 +86,23 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
if(diamond_amount >= 2000)
var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
G.amount = round(diamond_amount / 2000)
+ if(uranium_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(src.loc)
+ G.amount = round(uranium_amount / 2000)
del(src)
return 1
else
user << "\red You can't load the [src.name] while it's opened."
return 1
if (disabled)
+ user << "\The [name] appears to not be working!"
return
if (!linked_console)
user << "\The [name] must be linked to an R&D console first!"
return 1
if (O.is_open_container())
return 1
- if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond))
+ if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond) && !istype(O, /obj/item/stack/sheet/mineral/uranium))
user << "\red You cannot insert this item into the [name]!"
return 1
if (stat)
@@ -128,6 +133,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
gold_amount += amount * 2000
else if(istype(stack, /obj/item/stack/sheet/mineral/diamond))
diamond_amount += amount * 2000
+ else if(istype(stack, /obj/item/stack/sheet/mineral/uranium))
+ uranium_amount += amount * 2000
stack.use(amount)
busy = 0
src.updateUsrDialog()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index ab4d78570b..5b50efc41c 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -429,6 +429,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]))
if("$diamond")
linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]))
+ if("$uranium")
+ linked_imprinter.uranium_amount = max(0, (linked_imprinter.uranium_amount-being_built.materials[M]))
else
linked_imprinter.reagents.remove_reagent(M, being_built.materials[M])
var/obj/new_item = new being_built.build_path(src)
@@ -500,6 +502,9 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if("diamond")
type = /obj/item/stack/sheet/mineral/diamond
res_amount = "diamond_amount"
+ if("uranium")
+ type = /obj/item/stack/sheet/mineral/uranium
+ res_amount = "uranium_amount"
if(ispath(type) && hasvar(linked_imprinter, res_amount))
var/obj/item/stack/sheet/sheet = new type(linked_imprinter.loc)
var/available_num_sheets = round(linked_imprinter.vars[res_amount]/sheet.perunit)
@@ -851,6 +856,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(D.materials[M] > linked_imprinter.gold_amount) check_materials = 0
if("$diamond")
if(D.materials[M] > linked_imprinter.diamond_amount) check_materials = 0
+ if("$uranium")
+ if(D.materials[M] > linked_imprinter.uranium_amount) check_materials = 0
else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M]))
check_materials = 0
if (check_materials)
@@ -891,6 +898,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(linked_imprinter.diamond_amount >= 2000) dat += "(1 Sheet) "
if(linked_imprinter.diamond_amount >= 10000) dat += "(5 Sheets) "
if(linked_imprinter.diamond_amount >= 2000) dat += "(Max Sheets)"
+ dat += "
"
+ //Uranium
+ dat += "* [linked_imprinter.uranium_amount] cm3 of Uranium || "
+ dat += "Eject: "
+ if(linked_imprinter.uranium_amount >= 2000) dat += "(1 Sheet) "
+ if(linked_imprinter.uranium_amount >= 10000) dat += "(5 Sheets) "
+ if(linked_imprinter.uranium_amount >= 2000) dat += "(Max Sheets)"
user << browse("Research and Development Console
[dat]", "window=rdconsole;size=575x400")
onclose(user, "rdconsole")
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 137d0ed856..40b534bf0e 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -225,7 +225,7 @@ datum/tech/programming
datum/tech/syndicate
name = "Illegal Technologies Research"
- desc = "The study of technologies that violate Nanotrassen regulations."
+ desc = "The study of technologies that violate standard Nanotrasen regulations."
id = "syndicate"
/*
diff --git a/html/changelog.html b/html/changelog.html
index 6bf1da15e2..7c45588e85 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -57,6 +57,14 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
+
+
09.06.2013
+
Segrain updated:
+
+ - Emagged supply console can order SpecOp crates again.
+
+
+
Meyar
6/6/13 updated:
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 221f43ed0f..c6bf1e373e 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 4b002767f3..4f236bc2db 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 110ef9c2b5..797163e50f 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm
index ffd412c4cc..964abdc413 100644
--- a/maps/tgstation.2.1.0.0.1.dmm
+++ b/maps/tgstation.2.1.0.0.1.dmm
@@ -10033,6 +10033,7 @@
"dKW" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
"dKX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
"dKY" = (/obj/effect/landmark{name = "Response Team"; tag = "Response Team"},/turf/unsimulated/floor{tag = "icon-yellow (NORTHWEST)"; icon_state = "yellow"; dir = 9},/area/centcom/control)
+"dKZ" = (/obj/structure/rack,/obj/item/clothing/under/psysuit,/obj/item/clothing/suit/wizrobe/psypurple,/obj/item/clothing/head/wizard/amp,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10528,7 +10529,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPzcPzcPzcPzcPzcPzcP
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPJcPJcPzcPzcPzcPKcPwcPLcPMcPNcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPzcPzcPzcPzcPOcPOcPwcPwcPPcPwcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPQcPQcPzcPRcPScPTcPwcPUcPPcPVcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPzcPzcPzcPRcPWcPXcPwcPYcPPcPZcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPzcPzcPzcPRcPWcPXcPwcPYdKZcPZcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcPzcPzcPzcPzcPzcPwcPwcPwcPwcPwcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcQacQbcQccQdcPzcQecQfcQgcQhcQicPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPwcQjcQkcQlcPzcPzcPzcQmcQncQocQpcPwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa