"
dat += "| Organ | "
@@ -390,7 +385,7 @@
if(!AN && !open && !infected & !imp)
AN = "None:"
- if(!(e.status & ORGAN_DESTROYED))
+ if(!e.is_stump())
dat += "[e.name] | [e.burn_dam] | [e.brute_dam] | [robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured] | "
else
dat += "[e.name] | - | - | Not [e.is_stump() ? "Found" : "Attached Completely"] | "
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 3b33e40a9e4..80b33cfaa05 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -18,6 +18,7 @@
var/temperature_resistance = 1000 + T0C
volume = 1000
use_power = 0
+ interact_offline = 1 // Allows this to be used when not in powered area.
var/release_log = ""
var/update_flag = 0
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index d3c152fa25a..7d77de761f8 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -110,7 +110,6 @@
//Get the clone body ready
H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
- H.adjustBrainLoss(50) // Even if healed to full health, it will have some brain damage
H.Paralyse(4)
//Here let's calculate their health so the pod doesn't immediately eject them!!!
@@ -170,7 +169,7 @@
occupant.adjustCloneLoss(-2 * heal_rate)
//Premature clones may have brain damage.
- occupant.adjustBrainLoss(-1 * heal_rate)
+ occupant.adjustBrainLoss(-(ceil(0.5*heal_rate)))
//So clones don't die of oxyloss in a running pod.
if(occupant.reagents.get_reagent_amount("inaprovaline") < 30)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 67f5581576e..01506f413b8 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -1,19 +1,9 @@
-/obj/machinery/computer/arcade
- name = "arcade machine"
- desc = "Does not support pinball."
- icon = 'icons/obj/computer.dmi'
+/obj/machinery/computer/arcade/
+ name = "random arcade"
+ desc = "random arcade machine"
icon_state = "arcade"
icon_keyboard = null
icon_screen = "invaders"
- circuit = /obj/item/weapon/circuitboard/arcade
- var/enemy_name = "Space Villian"
- var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc
- var/player_hp = 30 //Player health/attack points
- var/player_mp = 10
- var/enemy_hp = 45 //Enemy health/attack points
- var/enemy_mp = 20
- var/gameover = 0
- var/blocked = 0 //Player cannot attack/heal while set
var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
@@ -40,28 +30,84 @@
/obj/item/toy/cultsword = 1
)
-/obj/machinery/computer/arcade
+/obj/machinery/computer/arcade/New()
+ ..()
+ // If it's a generic arcade machine, pick a random arcade
+ // circuit board for it and make the new machine
+ if(!circuit)
+ var/choice = pick(typesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade)
+ var/obj/item/weapon/circuitboard/CB = new choice()
+ new CB.build_path(loc, CB)
+ qdel(src)
+
+/obj/machinery/computer/arcade/proc/prizevend()
+ if(!contents.len)
+ var/prizeselect = pickweight(prizes)
+ new prizeselect(src.loc)
+
+ if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
+ new /obj/item/clothing/head/syndicatefake(src.loc)
+
+ else
+ var/atom/movable/prize = pick(contents)
+ prize.loc = src.loc
+
+/obj/machinery/computer/arcade/attack_ai(mob/user as mob)
+ return src.attack_hand(user)
+
+
+/obj/machinery/computer/arcade/emp_act(severity)
+ if(stat & (NOPOWER|BROKEN))
+ ..(severity)
+ return
+ var/empprize = null
+ var/num_of_prizes = 0
+ switch(severity)
+ if(1)
+ num_of_prizes = rand(1,4)
+ if(2)
+ num_of_prizes = rand(0,2)
+ for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
+ empprize = pickweight(prizes)
+ new empprize(src.loc)
+
+ ..(severity)
+
+///////////////////
+// BATTLE HERE //
+///////////////////
+
+/obj/machinery/computer/arcade/battle
+ name = "arcade machine"
+ desc = "Does not support Pinball."
+ icon_state = "arcade"
+ circuit = /obj/item/weapon/circuitboard/arcade/battle
+ var/enemy_name = "Space Villian"
+ var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc
+ var/player_hp = 30 //Player health/attack points
+ var/player_mp = 10
+ var/enemy_hp = 45 //Enemy health/attack points
+ var/enemy_mp = 20
+ var/gameover = 0
+ var/blocked = 0 //Player cannot attack/heal while set
var/turtle = 0
-/obj/machinery/computer/arcade/New()
+/obj/machinery/computer/arcade/battle/New()
..()
var/name_action
var/name_part1
var/name_part2
- name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ")
+ name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ")
name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
- name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn")
+ name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
src.name = (name_action + name_part1 + name_part2)
-/obj/machinery/computer/arcade/attack_ai(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/computer/arcade/attack_hand(mob/user as mob)
+/obj/machinery/computer/arcade/battle/attack_hand(mob/user as mob)
if(..())
return
user.set_machine(src)
@@ -85,7 +131,7 @@
onclose(user, "arcade")
return
-/obj/machinery/computer/arcade/Topic(href, href_list)
+/obj/machinery/computer/arcade/battle/Topic(href, href_list)
if(..())
return 1
@@ -150,7 +196,7 @@
src.updateUsrDialog()
return
-/obj/machinery/computer/arcade/proc/arcade_action()
+/obj/machinery/computer/arcade/battle/proc/arcade_action()
if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0))
if(!gameover)
src.gameover = 1
@@ -166,19 +212,11 @@
emagged = 0
else if(!contents.len)
feedback_inc("arcade_win_normal")
- var/prizeselect = pickweight(prizes)
- new prizeselect(src.loc)
-
- if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
- new /obj/item/projectile/bullet/pistol/cap(src.loc)
-
- else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
- new /obj/item/clothing/head/syndicatefake(src.loc)
+ src.prizevend()
else
feedback_inc("arcade_win_normal")
- var/atom/movable/prize = pick(contents)
- prize.loc = src.loc
+ src.prizevend()
else if (emagged && (turtle >= 4))
var/boomamt = rand(5,10)
@@ -224,7 +262,7 @@
return
-/obj/machinery/computer/arcade/emag_act(var/charges, var/mob/user)
+/obj/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user)
if(!emagged)
temp = "If you die in the game, you die for real!"
player_hp = 30
@@ -241,19 +279,780 @@
src.updateUsrDialog()
return 1
-/obj/machinery/computer/arcade/emp_act(severity)
- if(stat & (NOPOWER|BROKEN))
- ..(severity)
- return
- var/empprize = null
- var/num_of_prizes = 0
- switch(severity)
- if(1)
- num_of_prizes = rand(1,4)
- if(2)
- num_of_prizes = rand(0,2)
- for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
- empprize = pickweight(prizes)
- new empprize(src.loc)
- ..(severity)
\ No newline at end of file
+//////////////////////////
+// ORION TRAIL HERE //
+//////////////////////////
+#define ORION_TRAIL_WINTURN 9
+
+//Orion Trail Events
+#define ORION_TRAIL_RAIDERS "Raiders"
+#define ORION_TRAIL_FLUX "Interstellar Flux"
+#define ORION_TRAIL_ILLNESS "Illness"
+#define ORION_TRAIL_BREAKDOWN "Breakdown"
+#define ORION_TRAIL_MUTINY "Mutiny?"
+#define ORION_TRAIL_MUTINY_ATTACK "Mutinous Ambush"
+#define ORION_TRAIL_MALFUNCTION "Malfunction"
+#define ORION_TRAIL_COLLISION "Collision"
+#define ORION_TRAIL_SPACEPORT "Spaceport"
+#define ORION_TRAIL_BLACKHOLE "BlackHole"
+
+#define ORION_STATUS_START 1
+#define ORION_STATUS_NORMAL 2
+#define ORION_STATUS_GAMEOVER 3
+#define ORION_STATUS_MARKET 4
+
+/obj/machinery/computer/arcade/orion_trail
+ name = "The Orion Trail"
+ desc = "Imported straight fron station-TG!"
+ icon_state = "arcade"
+ circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
+ var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game.
+ var/engine = 0
+ var/hull = 0
+ var/electronics = 0
+ var/food = 80
+ var/fuel = 60
+ var/turns = 4
+ var/alive = 4
+ var/eventdat = null
+ var/event = null
+ var/list/settlers = list("Harry","Larry","Bob")
+ var/list/events = list(ORION_TRAIL_RAIDERS = 3,
+ ORION_TRAIL_FLUX = 1,
+ ORION_TRAIL_ILLNESS = 3,
+ ORION_TRAIL_BREAKDOWN = 2,
+ ORION_TRAIL_MUTINY = 3,
+ ORION_TRAIL_MALFUNCTION = 2,
+ ORION_TRAIL_COLLISION = 1,
+ ORION_TRAIL_SPACEPORT = 2
+ )
+ var/list/stops = list()
+ var/list/stopblurbs = list()
+ var/traitors_aboard = 0
+ var/spaceport_raided = 0
+ var/spaceport_freebie = 0
+ var/last_spaceport_action = ""
+ var/gameStatus = ORION_STATUS_START
+ var/canContinueEvent = 0
+
+/obj/machinery/computer/arcade/orion_trail/New()
+ ..()
+ // Sets up the main trail
+ stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime")
+ stopblurbs = list(
+ "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.",
+ "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.",
+ "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.",
+ "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.",
+ "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.",
+ "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.",
+ "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.",
+ "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.",
+ "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!"
+ )
+
+/obj/machinery/computer/arcade/orion_trail/proc/newgame()
+ // Set names of settlers in crew
+ settlers = list()
+ for(var/i = 1; i <= 3; i++)
+ add_crewmember()
+ add_crewmember("[usr]")
+ // Re-set items to defaults
+ engine = 1
+ hull = 1
+ electronics = 1
+ food = 80
+ fuel = 60
+ alive = 4
+ turns = 1
+ event = null
+ gameStatus = ORION_STATUS_NORMAL
+ traitors_aboard = 0
+
+ //spaceport junk
+ spaceport_raided = 0
+ spaceport_freebie = 0
+ last_spaceport_action = ""
+
+/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user)
+ if(..())
+ return
+ if(fuel <= 0 || food <=0 || settlers.len == 0)
+ gameStatus = ORION_STATUS_GAMEOVER
+ event = null
+ user.set_machine(src)
+ var/dat = ""
+ if(gameStatus == ORION_STATUS_GAMEOVER)
+ dat = "Game Over
"
+ dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever."
+ if(settlers.len == 0)
+ dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy."
+ else
+ if(food <= 0)
+ dat += "
You ran out of food and starved."
+ if(emagged)
+ user.nutrition = 0 //yeah you pretty hongry
+ user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."
+ if(fuel <= 0)
+ dat += "
You ran out of fuel, and drift, slowly, into a star."
+ if(emagged)
+ var/mob/living/M = user
+ M.adjust_fire_stacks(5)
+ M.IgniteMob() //flew into a star, so you're on fire
+ user << "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames."
+ dat += "
OK...
"
+
+ if(emagged)
+ user << "You're never going to make it to Orion..."
+ user.death()
+ emagged = 0 //removes the emagged status after you lose
+ gameStatus = ORION_STATUS_START
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+
+ else if(event)
+ dat = eventdat
+ else if(gameStatus == ORION_STATUS_NORMAL)
+ var/title = stops[turns]
+ var/subtext = stopblurbs[turns]
+ dat = "[title]
"
+ dat += "[subtext]"
+ dat += "Crew:
"
+ dat += english_list(settlers)
+ dat += "
Food: [food] | Fuel: [fuel]"
+ dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
+ if(turns == 7)
+ dat += "Go Around Continue
"
+ else
+ dat += "Continue
"
+ dat += "Kill a crewmember
"
+ dat += "Close
"
+ else
+ dat = "The Orion Trail
"
+ dat += "
Experience the journey of your ancestors!
"
+ dat += "New Game"
+ dat += "Close
"
+ user << browse(dat,"window=arcade")
+ return
+
+/obj/machinery/computer/arcade/orion_trail/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["close"])
+ usr.unset_machine()
+ usr << browse(null, "window=arcade")
+
+ if(busy)
+ return
+ busy = 1
+
+ if (href_list["continue"]) //Continue your travels
+ if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7)
+ if(turns >= ORION_TRAIL_WINTURN)
+ win()
+ else
+ food -= (alive+traitors_aboard)*2
+ fuel -= 5
+ if(turns == 2 && prob(30))
+ event = ORION_TRAIL_COLLISION
+ event()
+ else if(prob(75))
+ event = pickweight(events)
+ if(traitors_aboard)
+ if(event == ORION_TRAIL_MUTINY || prob(55))
+ event = ORION_TRAIL_MUTINY_ATTACK
+ event()
+ turns += 1
+ if(emagged)
+ var/mob/living/carbon/M = usr //for some vars
+ switch(event)
+ if(ORION_TRAIL_RAIDERS)
+ if(prob(50))
+ usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?"
+ M.hallucination += 30
+ else
+ usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..."
+ M.take_organ_damage(25)
+ if(ORION_TRAIL_ILLNESS)
+ var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
+ if(severity == 1)
+ M << "You suddenly feel slightly nauseous." //got off lucky
+ if(severity == 2)
+ usr << "You suddenly feel extremely nauseous and hunch over until it passes."
+ M.Stun(3)
+ if(severity >= 3) //you didn't pray hard enough
+ M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit."
+ spawn(30)
+ if(istype(M,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ H.vomit()
+ if(ORION_TRAIL_FLUX)
+ if(prob(75))
+ M.Weaken(3)
+ src.visible_message("A sudden gust of powerful wind slams \the [M] into the floor!", "You hear a large fwooshing sound, followed by a bang.")
+ M.take_organ_damage(15)
+ else
+ M << "A violent gale blows past you, and you barely manage to stay standing!"
+ if(ORION_TRAIL_COLLISION) //by far the most damaging event
+ if(prob(90) && !hull)
+ var/turf/simulated/floor/F = src.loc
+ F.ChangeTurf(/turf/space)
+ src.visible_message("Something slams into the floor around \the [src], exposing it to space!", "You hear something crack and break.")
+ else
+ src.visible_message("Something slams into the floor around \the [src] - luckily, it didn't get through!", "You hear something crack.")
+ if(ORION_TRAIL_MALFUNCTION)
+ src.visible_message("\The [src] buzzes and the screen goes blank for a moment before returning to the game.")
+ var/oldfood = food
+ var/oldfuel = fuel
+ food = rand(10,80) / rand(1,2)
+ fuel = rand(10,60) / rand(1,2)
+ if(electronics)
+ sleep(10)
+ if(oldfuel > fuel && oldfood > food)
+ src.audible_message("\The [src] lets out a somehow reassuring chime.")
+ else if(oldfuel < fuel || oldfood < food)
+ src.audible_message("\The [src] lets out a somehow ominous chime.")
+ food = oldfood
+ fuel = oldfuel
+
+ else if(href_list["newgame"]) //Reset everything
+ if(gameStatus == ORION_STATUS_START)
+ newgame()
+ else if(href_list["menu"]) //back to the main menu
+ if(gameStatus == ORION_STATUS_GAMEOVER)
+ gameStatus = ORION_STATUS_START
+ event = null
+ food = 80
+ fuel = 60
+ settlers = list("Harry","Larry","Bob")
+ else if(href_list["slow"]) //slow down
+ if(event == ORION_TRAIL_FLUX)
+ food -= (alive+traitors_aboard)*2
+ fuel -= 5
+ event = null
+ else if(href_list["pastblack"]) //slow down
+ if(turns == 7)
+ food -= ((alive+traitors_aboard)*2)*3
+ fuel -= 15
+ turns += 1
+ event = null
+ else if(href_list["useengine"]) //use parts
+ if(event == ORION_TRAIL_BREAKDOWN)
+ engine = max(0, --engine)
+ event = null
+ else if(href_list["useelec"]) //use parts
+ if(event == ORION_TRAIL_MALFUNCTION)
+ electronics = max(0, --electronics)
+ event = null
+ else if(href_list["usehull"]) //use parts
+ if(event == ORION_TRAIL_COLLISION)
+ hull = max(0, --hull)
+ event = null
+ else if(href_list["wait"]) //wait 3 days
+ if(event == ORION_TRAIL_BREAKDOWN || event == ORION_TRAIL_MALFUNCTION || event == ORION_TRAIL_COLLISION)
+ food -= ((alive+traitors_aboard)*2)*3
+ event = null
+ else if(href_list["keepspeed"]) //keep speed
+ if(event == ORION_TRAIL_FLUX)
+ if(prob(75))
+ event = "Breakdown"
+ event()
+ else
+ event = null
+ else if(href_list["blackhole"]) //keep speed past a black hole
+ if(turns == 7)
+ if(prob(75))
+ event = ORION_TRAIL_BLACKHOLE
+ event()
+ if(emagged) //has to be here because otherwise it doesn't work
+ src.show_message("\The [src] states, 'YOU ARE EXPERIENCING A BLACKHOLE. BE TERRIFIED.","You hear something say, 'YOU ARE EXPERIENCING A BLACKHOLE. BE TERRFIED'")
+ usr << "Something draws you closer and closer to the machine."
+ sleep(10)
+ usr << "This is really starting to hurt!"
+ var i; //spawning a literal blackhole would be fun, but a bit disruptive.
+ for(i=0;i<4;i++)
+ var/mob/living/L = usr
+ if(istype(L))
+ L.adjustBruteLoss(25)
+ sleep(10)
+ else
+ event = null
+ turns += 1
+ else if(href_list["holedeath"])
+ if(event == ORION_TRAIL_BLACKHOLE)
+ gameStatus = ORION_STATUS_GAMEOVER
+ event = null
+ else if(href_list["eventclose"]) //end an event
+ if(canContinueEvent)
+ event = null
+
+ else if(href_list["killcrew"]) //shoot a crewmember
+ if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_MUTINY)
+ var/sheriff = remove_crewmember() //I shot the sheriff
+ var/mob/living/L = usr
+ if(!istype(L))
+ return
+ if(settlers.len == 0 || alive == 0)
+ src.visible_message("\The [src] states, 'EVERYONE HAS DIED, GAMEOVER.'", "You hear something state, 'EVERYONE HAS DIED, GAMEOVER.'")
+ if(emagged)
+ src.visible_message("\The [src] produces a loud, gunlike sound.")
+ L.adjustBruteLoss(30)
+ emagged = 0
+ gameStatus = ORION_STATUS_GAMEOVER
+ event = null
+ else if(emagged)
+ if(usr.name == sheriff)
+ src.visible_message("\The [src] states, 'THE CREW HAS CHOSEN TO KILL [usr]'. A gunshot can be heard coming from \the [src]", "You hear 'THE CREW HAS CHOSEN TO KILL [usr]' followed by a gunshot")
+ L.adjustBruteLoss(30)
+ if(event == ORION_TRAIL_MUTINY) //only ends the ORION_TRAIL_MUTINY event, since you can do this action in multiple places
+ event = null
+
+ //Spaceport specific interactions
+ //they get a header because most of them don't reset event (because it's a shop, you leave when you want to)
+ //they also call event() again, to regen the eventdata, which is kind of odd but necessary
+ else if(href_list["buycrew"]) //buy a crewmember
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided && food >= 10 && fuel >= 10)
+ var/bought = add_crewmember()
+ last_spaceport_action = "You hired [bought] as a new crewmember."
+ fuel -= 10
+ food -= 10
+ event()
+
+ else if(href_list["sellcrew"]) //sell a crewmember
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided && settlers.len > 1)
+ var/sold = remove_crewmember()
+ last_spaceport_action = "You sold your crewmember, [sold]!"
+ fuel += 7
+ food += 7
+ event()
+
+ else if(href_list["leave_spaceport"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ event = null
+ gameStatus = ORION_STATUS_NORMAL
+ spaceport_raided = 0
+ spaceport_freebie = 0
+ last_spaceport_action = ""
+
+ else if(href_list["raid_spaceport"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided)
+ var/success = min(15 * alive,100) //default crew (4) have a 60% chance
+ spaceport_raided = 1
+
+ var/FU = 0
+ var/FO = 0
+ if(prob(success))
+ FU = rand(5,15)
+ FO = rand(5,15)
+ last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)"
+ else
+ FU = rand(-5,-15)
+ FO = rand(-5,-15)
+ last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)"
+
+ //your chance of lose a crewmember is 1/2 your chance of success
+ //this makes higher % failures hurt more, don't get cocky space cowboy!
+ if(prob(success*5))
+ var/lost_crew = remove_crewmember()
+ last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)"
+ if(emagged)
+ src.visible_message("The machine states, 'YOU ARE UNDER ARREST, RAIDER!' and shoots handcuffs onto [usr]!", "You hear something say 'YOU ARE UNDER ARREST, RAIDER!' and a clinking sound")
+ var/obj/item/weapon/handcuffs/C = new(src.loc)
+ var/mob/living/carbon/human/H = usr
+ if(istype(usr))
+ C.forceMove(H)
+ H.handcuffed = C
+ H.update_inv_handcuffed()
+ else
+ C.throw_at(usr,16,3,src)
+
+
+ fuel += FU
+ food += FO
+ event()
+
+ else if(href_list["buyparts"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided && fuel > 5)
+ switch(text2num(href_list["buyparts"]))
+ if(1) //Engine Parts
+ engine++
+ last_spaceport_action = "Bought Engine Parts"
+ if(2) //Hull Plates
+ hull++
+ last_spaceport_action = "Bought Hull Plates"
+ if(3) //Spare Electronics
+ electronics++
+ last_spaceport_action = "Bought Spare Electronics"
+ fuel -= 5 //they all cost 5
+ event()
+
+ else if(href_list["trade"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided)
+ switch(text2num(href_list["trade"]))
+ if(1) //Fuel
+ if(fuel > 5)
+ fuel -= 5
+ food += 5
+ last_spaceport_action = "Traded Fuel for Food"
+ event()
+ if(2) //Food
+ if(food > 5)
+ fuel += 5
+ food -= 5
+ last_spaceport_action = "Traded Food for Fuel"
+ event()
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ busy = 0
+ return
+
+
+/obj/machinery/computer/arcade/orion_trail/proc/event()
+ eventdat = "[event]
"
+ canContinueEvent = 0
+ switch(event)
+ if(ORION_TRAIL_RAIDERS)
+ eventdat += "Raiders have come aboard your ship!"
+ if(prob(50))
+ var/sfood = rand(1,10)
+ var/sfuel = rand(1,10)
+ food -= sfood
+ fuel -= sfuel
+ eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel."
+ else if(prob(10))
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] tried to fight back but was killed."
+ else
+ eventdat += "
Fortunately you fended them off without any trouble."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+ if(ORION_TRAIL_FLUX)
+ eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
+ eventdat += "
What will you do?"
+ eventdat += "Slow Down Continue
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_ILLNESS)
+ eventdat += "A deadly illness has been contracted!"
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] was killed by the disease."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+ if(ORION_TRAIL_BREAKDOWN)
+ eventdat += "Oh no! The engine has broken down!"
+ eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days."
+ if(engine >= 1)
+ eventdat += "Use Part Wait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_MALFUNCTION)
+ eventdat += "The ship's systems are malfunctioning!"
+ eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI."
+ if(electronics >= 1)
+ eventdat += "Use Part Wait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_COLLISION)
+ eventdat += "Something hit us! Looks like there's some hull damage."
+ if(prob(25))
+ var/sfood = rand(5,15)
+ var/sfuel = rand(5,15)
+ food -= sfood
+ fuel -= sfuel
+ eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space."
+ if(prob(10))
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] was killed by rapid depressurization."
+ eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together."
+ if(hull >= 1)
+ eventdat += "Use Part Wait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_BLACKHOLE)
+ eventdat += "You were swept away into the black hole."
+ eventdat += "Oh...
"
+ eventdat += "Close
"
+ settlers = list()
+
+ if(ORION_TRAIL_MUTINY)
+ eventdat += "You've been hearing rumors of dissenting opinions amoungst your men."
+ if(settlers.len <= 2)
+ eventdat += "
Your crew's so tiny you don't think anybody would risk an uprising."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ if(prob(10))
+ traitors_aboard = min(++traitors_aboard,2)
+ else
+ if(traitors_aboard) //less likely to stack traitors
+ if(prob(20))
+ traitors_aboard = min(++traitors_aboard,2)
+ else if(prob(70))
+ traitors_aboard = min(++traitors_aboard,2)
+
+ eventdat += "Kill a crewmember
"
+ eventdat += "Risk it
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+ if(ORION_TRAIL_MUTINY_ATTACK)
+ if(traitors_aboard <= 0) //shouldn't trigger, but hey.
+ eventdat += "Haha, fooled you, there isn't a mutiny on board!"
+ eventdat += "
(You should report this to a coder :S)"
+ else
+ var/trait1 = remove_crewmember()
+ var/trait2 = ""
+ if(traitors_aboard >= 2)
+ trait2 = remove_crewmember()
+
+ eventdat += "Oh no, some of your crew are attempting to mutiny!!"
+ if(trait2)
+ eventdat += "
[trait1] and [trait2]'s have armed themselves with weapons!"
+ else
+ eventdat += "
[trait1]'s armed with a weapon!"
+
+ var/chance2attack = alive*20
+ if(prob(chance2attack))
+ var/chancetokill = 30*traitors_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 traitorss, 2 crew is 50% chance
+ if(prob(chancetokill))
+ var/deadguy = remove_crewmember()
+ eventdat += "
The traitor[trait2 ? "s":""] run[trait2 ? "":"s"] up to [deadguy] and murder them!"
+ else
+ eventdat += "
You valiantly fight off the traitor[trait2 ? "s":""]!"
+ eventdat += "
You cut the traitor[trait2 ? "s":""] up into meat... Eww"
+ if(trait2)
+ food += 30
+ traitors_aboard = max(0,traitors_aboard-2)
+ else
+ food += 15
+ traitors_aboard = max(0,--traitors_aboard)
+ else
+ eventdat += "
The traitor[trait2 ? "s":""] run[trait2 ? "":"s"] away, What wimps!"
+ if(trait2)
+ traitors_aboard = max(0,traitors_aboard-2)
+ else
+ traitors_aboard = max(0,--traitors_aboard)
+
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+
+ if(ORION_TRAIL_SPACEPORT)
+ gameStatus = ORION_STATUS_MARKET
+ if(spaceport_raided)
+ eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!"
+ if(last_spaceport_action)
+ eventdat += "
Last Spaceport Action: [last_spaceport_action]"
+ eventdat += "Depart Spaceport
"
+ eventdat += "Close
"
+ else
+ eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!"
+ eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..."
+ eventdat += "
Trading terms: FU = Fuel, FO = Food"
+ if(last_spaceport_action)
+ eventdat += "
Last Spaceport Action: [last_spaceport_action]"
+ eventdat += "Crew:
"
+ eventdat += english_list(settlers)
+ eventdat += "
Food: [food] | Fuel: [fuel]"
+ eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
+
+
+ //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port)
+ if(!spaceport_freebie && (fuel < 20 || food < 20))
+ spaceport_freebie++
+ var/FU = 10
+ var/FO = 10
+ var/freecrew = 0
+ if(prob(30))
+ FU = 25
+ FO = 25
+
+ if(prob(10))
+ add_crewmember()
+ freecrew++
+
+ eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)"
+ if(freecrew)
+ eventdat += "
You also gain a new crewmember!"
+
+ fuel += FU
+ food += FO
+
+ //CREW INTERACTIONS
+ eventdat += "Crew Management:
"
+
+ //Buy crew
+ if(food >= 10 && fuel >= 10)
+ eventdat += "Hire a new Crewmember (-10FU,-10FO)
"
+ else
+ eventdat += "Cant afford a new Crewmember
"
+
+ //Sell crew
+ if(settlers.len > 1)
+ eventdat += "Sell crew for Fuel and Food (+7FU,+7FO)
"
+ else
+ eventdat += "Cant afford to sell a Crewmember
"
+
+ //BUY/SELL STUFF
+ eventdat += "Spare Parts:
"
+
+ //Engine parts
+ if(fuel > 5)
+ eventdat += "Buy Engine Parts (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Engine Parts"
+
+ //Hull plates
+ if(fuel > 5)
+ eventdat += "
Buy Hull Plates (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Hull Plates"
+
+ //Electronics
+ if(fuel > 5)
+ eventdat += "
Buy Spare Electronics (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Spare Electronics"
+
+ //Trade
+ if(fuel > 5)
+ eventdat += "
Trade Fuel for Food (-5FU,+5FO)
"
+ else
+ eventdat += "Cant afford to Trade Fuel for Food
5)
+ eventdat += "Trade Food for Fuel (+5FU,-5FO)
"
+ else
+ eventdat += "Cant afford to Trade Food for Fuel
!! Raid Spaceport !!"
+
+ eventdat += "Depart Spaceport
"
+
+
+/obj/machinery/computer/arcade/orion_trail/proc/add_crewmember(var/specific = "")
+ var/newcrew = ""
+ if(specific)
+ newcrew = specific
+ else
+ if(prob(50))
+ newcrew = pick(first_names_male)
+ else
+ newcrew = pick(first_names_female)
+ if(newcrew)
+ settlers += newcrew
+ alive++
+ return newcrew
+
+/obj/machinery/computer/arcade/orion_trail/proc/remove_crewmember(var/specific = "", var/dont_remove = "")
+ var/list/safe2remove = settlers
+ var/removed = ""
+ if(dont_remove)
+ safe2remove -= dont_remove
+ if(specific && specific != dont_remove)
+ safe2remove = list(specific)
+ else
+ removed = pick(safe2remove)
+
+ if(removed)
+ if(traitors_aboard && prob(40*traitors_aboard)) //if there are 2 traitors you're twice as likely to get one, obviously
+ traitors_aboard = max(0,--traitors_aboard)
+ settlers -= removed
+ alive--
+ return removed
+
+
+/obj/machinery/computer/arcade/orion_trail/proc/win()
+ gameStatus = ORION_STATUS_START
+ src.visible_message("\The [src] plays a triumpant tune, stating 'CONGRATULATIONS, YOU HAVE MADE IT TO ORION.'")
+ if(emagged)
+ new /obj/item/weapon/orion_ship(src.loc)
+ message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ else
+ prizevend()
+ emagged = 0
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+
+/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user)
+ if(!emagged)
+ user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode."
+ name = "The Orion Trail: Realism Edition"
+ desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
+ newgame()
+ emagged = 1
+
+
+/obj/item/weapon/orion_ship
+ name = "model settler ship"
+ desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "ship"
+ w_class = 2
+ var/active = 0 //if the ship is on
+
+/obj/item/weapon/orion_ship/examine(mob/user)
+ ..()
+ if(!(in_range(user, src)))
+ return
+ if(!active)
+ user << "There's a little switch on the bottom. It's flipped down."
+ else
+ user << "There's a little switch on the bottom. It's flipped up."
+
+/obj/item/weapon/orion_ship/attack_self(mob/user)
+ if(active)
+ return
+
+ message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.")
+ log_game("[key_name(usr)] primed an explosive Orion ship for detonation.")
+
+ user << "You flip the switch on the underside of [src]."
+ active = 1
+ src.visible_message("[src] softly beeps and whirs to life!")
+ src.audible_message("\The [src] says, 'This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.'")
+ sleep(20)
+ src.visible_message("[src] begins to vibrate...")
+ src.audible_message("\The [src] says, 'Uh, Port? Having some issues with our reactor, could you check it out? Over.'")
+ sleep(30)
+ src.audible_message("\The [src] says, 'Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-'")
+ sleep(3.6)
+ src.visible_message("[src] explodes!")
+ explosion(src.loc, 1,2,4)
+ qdel(src)
+
+#undef ORION_TRAIL_WINTURN
+#undef ORION_TRAIL_RAIDERS
+#undef ORION_TRAIL_FLUX
+#undef ORION_TRAIL_ILLNESS
+#undef ORION_TRAIL_BREAKDOWN
+#undef ORION_TRAIL_MUTINY
+#undef ORION_TRAIL_MUTINY_ATTACK
+#undef ORION_TRAIL_MALFUNCTION
+#undef ORION_TRAIL_COLLISION
+#undef ORION_TRAIL_SPACEPORT
+#undef ORION_TRAIL_BLACKHOLE
+
+#undef ORION_STATUS_START
+#undef ORION_STATUS_NORMAL
+#undef ORION_STATUS_GAMEOVER
+#undef ORION_STATUS_MARKET
\ No newline at end of file
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 15c504800a8..3eee7615b37 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -107,15 +107,6 @@
dat += text("\nPrint Record
\nBack
", src, src)
if(5.0)
dat += "Virus Database"
- /* Advanced diseases is weak! Feeble! Glory to virus2!
- for(var/Dt in typesof(/datum/disease/))
- var/datum/disease/Dis = new Dt(0)
- if(istype(Dis, /datum/disease/advance))
- continue // TODO (tm): Add advance diseases to the virus database which no one uses.
- if(!Dis.desc)
- continue
- dat += "
[Dis.name]"
- */
for (var/ID in virusDB)
var/datum/data/record/v = virusDB[ID]
dat += "
[v.fields["name"]]"
@@ -458,7 +449,7 @@
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
counter++
- src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]")
+ src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]")
if (href_list["del_c"])
if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 636701fc071..149c9c62540 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -91,15 +91,23 @@
if(!target || !istype(target))
return
- message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
- log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
- target.canmove = !target.canmove
- if (target.lockcharge)
+ var/istraitor = traitors.is_antagonist(target.mind)
+ if (istraitor)
target.lockcharge = !target.lockcharge
- target << "Your lockdown has been lifted!"
+ if (target.lockcharge)
+ target << "Someone tried to lock you down!"
+ else
+ target << "Someone tried to lift your lockdown!"
else
- target.lockcharge = !target.lockcharge
- target << "You have been locked down!"
+ target.canmove = !target.canmove
+ target.lockcharge = !target.canmove //when canmove is 1, lockcharge should be 0
+ if (target.lockcharge)
+ target << "You have been locked down!"
+ else
+ target << "Your lockdown has been lifted!"
+ message_admins("[key_name_admin(usr)] [istraitor ? "failed (target is traitor) " : ""][target.lockcharge ? "lockdown" : "release"] on [target.name]!")
+ log_game("[key_name(usr)] attempted to [target.lockcharge ? "lockdown" : "release"] [target.name] on the robotics console!")
+
// Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
else if (href_list["hack"])
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index eba129df262..8747f7750cc 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -391,7 +391,7 @@ What a mess.*/
var/counter = 1
while(active2.fields[text("com_[]", counter)])
counter++
- active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]")
+ active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]")
if ("Delete Record (ALL)")
if (active1)
diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm
index 7cf89a3fce9..4425dc236a0 100644
--- a/code/game/machinery/computer3/computers/medical.dm
+++ b/code/game/machinery/computer3/computers/medical.dm
@@ -117,15 +117,6 @@
dat += text("\nPrint Record
\nBack
", src, src)
if(5.0)
dat += "Virus Database"
- /* Advanced diseases is weak! Feeble! Glory to virus2!
- for(var/Dt in typesof(/datum/disease/))
- var/datum/disease/Dis = new Dt(0)
- if(istype(Dis, /datum/disease/advance))
- continue // TODO (tm): Add advance diseases to the virus database which no one uses.
- if(!Dis.desc)
- continue
- dat += "
[Dis.name]"
- */
for (var/ID in virusDB)
var/datum/data/record/v = virusDB[ID]
dat += "
[v.fields["name"]]"
@@ -470,7 +461,7 @@
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
counter++
- src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]")
+ src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]")
if (href_list["del_c"])
if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm
index 1ba0c08cf78..0c58ea67284 100644
--- a/code/game/machinery/computer3/computers/security.dm
+++ b/code/game/machinery/computer3/computers/security.dm
@@ -410,7 +410,7 @@ What a mess.*/
var/counter = 1
while(active2.fields[text("com_[]", counter)])
counter++
- active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]")
+ active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]")
if ("Delete Record (ALL)")
if (active1)
diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm
index 2ffa495b706..efd0747b35f 100644
--- a/code/game/machinery/computer3/lapvend.dm
+++ b/code/game/machinery/computer3/lapvend.dm
@@ -29,16 +29,14 @@
/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(vendmode == 1)
- if(istype(W, /obj/item/weapon/card))
- var/obj/item/weapon/card/I = W
- scan_card(I)
+ var/obj/item/weapon/card/id/I = W.GetID()
+
+ if(vendmode == 1 && I)
+ scan_id(I, W)
+ vendmode = 0
+ if(vendmode == 3 && I)
+ if(reimburse_id(I, W))
vendmode = 0
- if(vendmode == 3)
- if(istype(W,/obj/item/weapon/card))
- var/obj/item/weapon/card/I = W
- if(reimburse(I))
- vendmode = 0
if(vendmode == 0)
if(istype(W, /obj/item/device/laptop))
var/obj/item/device/laptop/L = W
@@ -201,26 +199,24 @@
newlap.spawn_parts()
-/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I)
- if (istype(I, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src].")
- var/datum/money_account/CH = get_account(C.associated_account_number)
- if(!CH)
- usr << "\icon[src]No valid account number is associated with this card."
- return
- if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
- if(vendor_account)
- var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
- var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
- if(D)
- transfer_and_vend(D, C)
- else
- usr << "\icon[src]Unable to access account. Check security settings and try again."
+/obj/machinery/lapvend/proc/scan_id(var/obj/item/weapon/card/id/C, var/obj/item/I)
+ visible_message("\The [usr] swipes \the [I] through \the [src].")
+ var/datum/money_account/CH = get_account(C.associated_account_number)
+ if(!CH)
+ usr << "\icon[src]No valid account number is associated with this card."
+ return
+ if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
+ if(vendor_account)
+ var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
+ var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
+ if(D)
+ transfer_and_vend(D, C)
else
usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support."
else
- transfer_and_vend(CH, C)
+ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support."
+ else
+ transfer_and_vend(CH, C)
// Transfers money and vends the laptop.
@@ -352,30 +348,28 @@
-/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I)
- if (istype(I, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src].")
- var/datum/money_account/CH = get_account(C.associated_account_number)
- if(!CH)
- usr << "\icon[src]No valid account number is associated with this card."
- return 0
- if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
- if(vendor_account)
- var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
- var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
- if(D)
- transfer_and_reimburse(D)
- return 1
- else
- usr << "\icon[src]Unable to access account. Check security settings and try again."
- return 0
+/obj/machinery/lapvend/proc/reimburse_id(var/obj/item/weapon/card/id/C, var/obj/item/I)
+ visible_message("\The [usr] swipes \the [I] through \the [src].")
+ var/datum/money_account/CH = get_account(C.associated_account_number)
+ if(!CH)
+ usr << "\icon[src]No valid account number is associated with this card."
+ return 0
+ if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
+ if(vendor_account)
+ var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
+ var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
+ if(D)
+ transfer_and_reimburse(D)
+ return 1
else
usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support."
return 0
else
- transfer_and_reimburse(CH)
- return 1
+ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support."
+ return 0
+ else
+ transfer_and_reimburse(CH)
+ return 1
/obj/machinery/lapvend/proc/transfer_and_reimburse(var/datum/money_account/D)
var/transaction_amount = total()
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index e69f750a5fa..3ae0891b891 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -20,13 +20,8 @@
if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
return ..(user)
- var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
- return
-
var/t1 = text("Access control
\n")
-
if (last_configurator)
t1 += "Operator: [last_configurator]
"
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index f583b620a42..70dad044a20 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -99,7 +99,7 @@
var/mob/M = AM
if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam.
M.last_bumped = world.time
- if(!M.restrained() && !issmall(M))
+ if(!M.restrained())
bumpopen(M)
return
@@ -397,12 +397,12 @@
set_opacity(0)
sleep(3)
src.density = 0
+ update_nearby_tiles()
sleep(7)
src.layer = open_layer
explosion_resistance = 0
update_icon()
set_opacity(0)
- update_nearby_tiles()
operating = 0
if(autoclose)
@@ -424,12 +424,12 @@
src.density = 1
explosion_resistance = initial(explosion_resistance)
src.layer = closed_layer
+ update_nearby_tiles()
sleep(7)
update_icon()
if(visible && !glass)
set_opacity(1) //caaaaarn!
operating = 0
- update_nearby_tiles()
//I shall not add a check every x ticks if a door has closed over some fire.
var/obj/fire/fire = locate() in loc
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 6798f2b7368..6c391b75b5e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -232,8 +232,8 @@ Class Procs:
*/
if (ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
- visible_message("[H] stares cluelessly at [src] and drools.")
+ if(H.getBrainLoss() >= 55)
+ visible_message("[H] stares cluelessly at [src].")
return 1
else if(prob(H.getBrainLoss()))
user << "You momentarily forget how to use [src]."
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index bdc6b5ca446..efcc8314c12 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -88,7 +88,7 @@
//Processes the occupant, drawing from the internal power cell if needed.
/obj/machinery/recharge_station/proc/process_occupant()
- if(istype(occupant, /mob/living/silicon/robot))
+ if(isrobot(occupant))
var/mob/living/silicon/robot/R = occupant
if(R.module)
@@ -103,6 +103,11 @@
R.adjustBruteLoss(-weld_rate)
if(wire_rate && R.getFireLoss() && cell.checked_use(wire_power_use * wire_rate * CELLRATE))
R.adjustFireLoss(-wire_rate)
+ else if(ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450)
+ H.nutrition = min(H.nutrition+10, 450)
+ cell.use(7000/450*10)
else if(istype(occupant, /mob/living/carbon/human))
@@ -119,7 +124,6 @@
H.nutrition = min(H.nutrition+10, 450)
cell.use(7000/450*10)
-
/obj/machinery/recharge_station/examine(mob/user)
..(user)
user << "The charge meter reads: [round(chargepercentage())]%"
@@ -247,6 +251,17 @@
else
return
+/obj/machinery/recharge_station/proc/hascell(var/mob/M)
+ if(isrobot(M))
+ var/mob/living/silicon/robot/R = M
+ if(R.cell)
+ return 1
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!isnull(H.internal_organs_by_name["cell"]))
+ return 1
+ return 0
+
/obj/machinery/recharge_station/proc/go_out()
if(!occupant)
return
@@ -273,4 +288,6 @@
set name = "Enter Recharger"
set src in oview(1)
+ if(!usr.incapacitated())
+ return
go_in(usr)
diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm
index 3a2974008f4..54faef41f8e 100644
--- a/code/game/machinery/records_scanner.dm
+++ b/code/game/machinery/records_scanner.dm
@@ -88,7 +88,7 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user)
G.fields["rank"] = "Unassigned"
G.fields["real_rank"] = G.fields["rank"]
G.fields["name"] = mname
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
+ G.fields["id"] = generate_record_id()
M.fields["name"] = G.fields["name"]
M.fields["id"] = G.fields["id"]
S.fields["name"] = G.fields["name"]
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index ad88ce7feae..e0047a08bf5 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -6,6 +6,7 @@
name = "space heater"
desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
var/obj/item/weapon/cell/cell
+ var/cell_type = /obj/item/weapon/cell/apc
var/on = 0
var/set_temperature = T0C + 50 //K
var/heating_power = 40000
@@ -13,7 +14,8 @@
/obj/machinery/space_heater/New()
..()
- cell = new(src)
+ if (cell_type)
+ src.cell = new cell_type(src)
update_icon()
/obj/machinery/space_heater/update_icon()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 83b8614a0e7..0dc5b34b605 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -650,7 +650,7 @@
model_text = "Nonstandard"
req_access = list(access_syndicate)
departments = list("Mercenary")
- species = list("Human","Tajara","Skrell","Unathi")
+ species = list("Human","Tajara","Skrell","Unathi", "Teshari")
can_repair = 1
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
@@ -762,6 +762,8 @@
//Clear the access reqs, disable the safeties, and open up all paintjobs.
user << "You run the sequencer across the interface, corrupting the operating protocols."
departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$")
+ species = list("Human","Tajara","Skrell","Unathi", "Teshari")
+
emagged = 1
safeties = 0
req_access = list()
@@ -813,15 +815,12 @@
dat += "
\[apply customisation routine\]
"
if(panel_open)
- dat += wires()
+ wires.Interact(user)
user << browse(dat, "window=suit_cycler")
onclose(user, "suit_cycler")
return
-/obj/machinery/suit_cycler/proc/wires()
- return wires.GetInteractWindow()
-
/obj/machinery/suit_cycler/Topic(href, href_list)
if(href_list["eject_suit"])
if(!suit) return
diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm
index 801cff3caae..7efa498d09b 100644
--- a/code/game/machinery/supplybeacon.dm
+++ b/code/game/machinery/supplybeacon.dm
@@ -100,8 +100,10 @@
..()
/obj/machinery/power/supply_beacon/process()
- if(!use_power || expended)
+ if(expended)
return PROCESS_KILL
+ if(!use_power)
+ return
if(draw_power(500) < 500)
deactivate()
return
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index 6254e2bb9df..d324f3dd9c6 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -519,9 +519,5 @@
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
var/obj/item/projectile/A = new /obj/item/projectile(curloc)
src.projectiles--
- A.current = curloc
- A.yo = targloc.y - curloc.y
- A.xo = targloc.x - curloc.x
- A.process()
- sleep(2)
+ A.launch(target)
return
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 89a3cfaeea7..575c2de470c 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1,7 +1,3 @@
-#define CAT_NORMAL 1
-#define CAT_HIDDEN 2 // also used in corresponding wires/vending.dm
-#define CAT_COIN 4
-
/**
* Datum used to hold information about a product in a vending machine
*/
@@ -19,9 +15,8 @@
src.product_path = path
if(!name)
- var/atom/tmp = new path
+ var/atom/tmp = path
src.product_name = initial(tmp.name)
- qdel(tmp)
else
src.product_name = name
@@ -908,7 +903,6 @@
vend_reply = "Have an enchanted evening!"
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
- contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
/obj/machinery/vending/dinnerware
name = "Dinnerware"
diff --git a/code/game/machinery/walllockers.dm b/code/game/machinery/walllockers.dm
deleted file mode 100644
index e81219926f7..00000000000
--- a/code/game/machinery/walllockers.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/obj/structure/walllocker
- name = "Wall Locker"
- icon = 'icons/obj/lockwall.dmi'
- icon_state = "emerg"
- var/list/spawnitems = list()
- anchored = 1
- var/amount = 3 // spawns each items X times.
-/obj/structure/walllocker/attack_hand(mob/user as mob)
- if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to
- return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc)
- if(!amount)
- usr << "It's empty.."
- return
- if(amount)
- for(var/path in spawnitems)
- new path(src.loc)
- amount--
- return
-/obj/structure/walllocker/emerglocker
- name = "Emergency Locker"
- spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar)
-/obj/structure/walllocker/emerglocker/north
- pixel_y = 32
- dir = SOUTH
-/obj/structure/walllocker/emerglocker/south
- pixel_y = -32
- dir = NORTH
-/obj/structure/walllocker/emerglocker/west
- pixel_x = -32
- dir = WEST
-/obj/structure/walllocker/emerglocker/east
- pixel_x = 32
- dir = EAST
\ No newline at end of file
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 6b43943d534..03234e968ee 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -37,7 +37,7 @@
playsound(chassis, fire_sound, fire_volume, 1)
projectiles--
var/P = new projectile(curloc)
- Fire(P, target, aimloc)
+ Fire(P, target)
if(fire_cooldown)
sleep(fire_cooldown)
if(auto_rearm)
@@ -46,16 +46,9 @@
do_after_cooldown()
return
-/obj/item/mecha_parts/mecha_equipment/weapon/proc/Fire(atom/A, atom/target, turf/aimloc)
+/obj/item/mecha_parts/mecha_equipment/weapon/proc/Fire(atom/A, atom/target)
var/obj/item/projectile/P = A
- P.shot_from = src.name
- P.original = target
- P.starting = P.loc
- P.current = P.loc
- P.firer = chassis.occupant
- P.yo = aimloc.y - P.loc.y
- P.xo = aimloc.x - P.loc.x
- P.process()
+ P.launch(target)
/obj/item/mecha_parts/mecha_equipment/weapon/energy
name = "general energy weapon"
@@ -235,7 +228,7 @@
projectile_energy_cost = 1000
equip_cooldown = 60
-/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive/Fire(atom/movable/AM, atom/target, turf/aimloc)
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive/Fire(atom/movable/AM, atom/target)
var/obj/item/missile/M = AM
M.primed = 1
..()
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index a10a20920da..3c35ece9d24 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -987,6 +987,11 @@
if (usr.stat || !ishuman(usr))
return
+
+ if (usr.buckled)
+ usr << "You can't climb into the exosuit while buckled!"
+ return
+
src.log_message("[usr] tries to move in.")
if(iscarbon(usr))
var/mob/living/carbon/C = usr
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 653079134e2..ede4ccf410e 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -84,9 +84,6 @@
if(M.see_invisible < patient.invisibility)
continue
var/foundVirus = 0
- for(var/datum/disease/D in patient.viruses)
- if(!D.hidden[SCANNER])
- foundVirus++
for (var/ID in patient.virus2)
if (ID in virusDB)
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index fcd53aab448..65fa2ceb6af 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -15,7 +15,6 @@ var/global/list/image/splatter_cache=list()
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
var/base_icon = 'icons/effects/blood.dmi'
- var/list/viruses = list()
blood_DNA = list()
var/basecolor="#A10808" // Color when wet.
var/list/datum/disease2/disease/virus2 = list()
@@ -37,8 +36,6 @@ var/global/list/image/splatter_cache=list()
..(ignore=1)
/obj/effect/decal/cleanable/blood/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
processing_objects -= src
return ..()
@@ -80,7 +77,7 @@ var/global/list/image/splatter_cache=list()
var/obj/item/organ/external/l_foot = perp.get_organ("l_foot")
var/obj/item/organ/external/r_foot = perp.get_organ("r_foot")
var/hasfeet = 1
- if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
+ if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump()))
hasfeet = 0
if(perp.shoes && !perp.buckled)//Adding blood to shoes
var/obj/item/clothing/shoes/S = perp.shoes
@@ -227,10 +224,6 @@ var/global/list/image/splatter_cache=list()
var/obj/effect/decal/cleanable/blood/b = PoolOrNew(/obj/effect/decal/cleanable/blood/splatter, src.loc)
b.basecolor = src.basecolor
b.update_icon()
- for(var/datum/disease/D in src.viruses)
- var/datum/disease/ND = D.Copy(1)
- b.viruses += ND
- ND.holder = b
if (step_to(src, get_step(src, direction), 0))
break
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 250e8f350ee..5d2482d60c8 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -100,12 +100,6 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
- var/list/viruses = list()
-
-/obj/effect/decal/cleanable/vomit/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- return ..()
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 696d3aa0fa6..9d630113bbf 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -1,31 +1,27 @@
-/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA, gibber_type = /obj/effect/gibspawner/generic, var/fleshcolor, var/bloodcolor)
- new gibber_type(location,viruses,MobDNA,fleshcolor,bloodcolor)
+/proc/gibs(atom/location, var/datum/dna/MobDNA, gibber_type = /obj/effect/gibspawner/generic, var/fleshcolor, var/bloodcolor)
+ new gibber_type(location,MobDNA,fleshcolor,bloodcolor)
/obj/effect/gibspawner
var/sparks = 0 //whether sparks spread on Gib()
- var/virusProb = 20 //the chance for viruses to spread on the gibs
var/list/gibtypes = list()
var/list/gibamounts = list()
var/list/gibdirections = list() //of lists
var/fleshcolor //Used for gibbed humans.
var/bloodcolor //Used for gibbed humans.
- New(location, var/list/viruses, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor)
+ New(location, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor)
..()
if(fleshcolor) src.fleshcolor = fleshcolor
if(bloodcolor) src.bloodcolor = bloodcolor
- Gib(loc,viruses,MobDNA)
+ Gib(loc,MobDNA)
- proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null)
+ proc/Gib(atom/location, var/datum/dna/MobDNA = null)
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
world << "Gib list length mismatch!"
return
var/obj/effect/decal/cleanable/blood/gibs/gib = null
- for(var/datum/disease/D in viruses)
- if(D.spread_type == SPECIAL)
- qdel(D)
if(sparks)
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
@@ -46,13 +42,6 @@
gib.update_icon()
- if(viruses.len > 0)
- for(var/datum/disease/D in viruses)
- if(prob(virusProb))
- var/datum/disease/viruus = D.Copy(1)
- gib.viruses += viruus
- viruus.holder = gib
-
gib.blood_DNA = list()
if(MobDNA)
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 055176246c1..a07b82cd177 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -71,6 +71,16 @@
// Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called.
var/list/sprite_sheets_obj = list()
+/obj/item/equipped()
+ ..()
+ var/mob/M = loc
+ if(!istype(M))
+ return
+ if(M.l_hand)
+ M.l_hand.update_held_icon()
+ if(M.r_hand)
+ M.r_hand.update_held_icon()
+
/obj/item/Destroy()
if(ismob(loc))
var/mob/m = loc
@@ -89,7 +99,7 @@
var/mob/M = src.loc
if(M.l_hand == src)
M.update_inv_l_hand()
- if(M.r_hand == src)
+ else if(M.r_hand == src)
M.update_inv_r_hand()
/obj/item/ex_act(severity)
@@ -157,6 +167,9 @@
if(temp && !temp.is_usable())
user << "You try to move your [temp.name], but cannot!"
return
+ if(!temp)
+ user << "You try to use your hand, but realize it is no longer attached!"
+ return
src.pickup(user)
if (istype(src.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = src.loc
@@ -247,6 +260,9 @@
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(var/mob/user, var/slot)
+ layer = 20
+ if(user.client) user.client.screen |= src
+ if(user.pulling == src) user.stop_pulling()
return
//Defines which slots correspond to which slot flags
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index bf5df08d34c..11fc4b8d017 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -11,6 +11,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
item_state = "electronic"
w_class = 2.0
slot_flags = SLOT_ID | SLOT_BELT
+ sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/id.dmi')
//Main variables
var/pdachoice = 1
@@ -322,10 +323,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(1) icon = 'icons/obj/pda.dmi'
if(2) icon = 'icons/obj/pda_slim.dmi'
if(3) icon = 'icons/obj/pda_old.dmi'
- else
+ else
icon = 'icons/obj/pda_old.dmi'
log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.")
-
+
/obj/item/device/pda/proc/can_use()
@@ -1246,10 +1247,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
user.show_message(" Limbs are OK.",1)
- for(var/datum/disease/D in C.viruses)
- if(!D.hidden[SCANNER])
- user.show_message("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")
-
if(2)
if (!istype(C:dna, /datum/dna))
user << "No fingerprints found on [C]"
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 36a6d4f8055..1085dd34778 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -18,9 +18,12 @@
/obj/item/device/chameleon/dropped()
disrupt()
+ ..()
/obj/item/device/chameleon/equipped()
+ ..()
disrupt()
+ ..()
/obj/item/device/chameleon/attack_self()
toggle()
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 11cc3a58a8f..4e552cc513e 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -292,18 +292,25 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
return
var/their_address = href_list["dial"]
exonet.send_message(their_address, "voice")
+
if(href_list["disconnect"])
var/name_to_disconnect = href_list["disconnect"]
for(var/mob/living/voice/V in contents)
if(name_to_disconnect == V.name)
- close_connection(usr, V, "[usr] hung up")
+ close_connection(usr, V, "[usr] hung up.")
for(var/obj/item/device/communicator/comm in communicating)
if(name_to_disconnect == comm.name)
- close_connection(usr, comm, "[usr] hung up")
+ close_connection(usr, comm, "[usr] hung up.")
if(href_list["copy"])
target_address = href_list["copy"]
-
+
+ if(href_list["hang_up"])
+ for(var/mob/living/voice/V in contents)
+ close_connection(usr, V, "[usr] hung up.")
+ for(var/obj/item/device/communicator/comm in communicating)
+ close_connection(usr, comm, "[usr] hung up.")
+
if(href_list["switch_tab"])
selected_tab = href_list["switch_tab"]
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 21e55e65ce4..8b172cbe528 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -40,7 +40,7 @@
add_fingerprint(user)
if(on && user.zone_sel.selecting == O_EYES)
- if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly
+ if((CLUMSY in user.mutations) && prob(50)) //too dumb to use flashlight properly
return ..() //just hit them in the head
var/mob/living/carbon/human/H = M //mob has protective eyewear
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index fa2a8d4864e..2ea254febda 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -322,7 +322,7 @@
qdel(src)
/obj/item/device/paicard/see_emote(mob/living/M, text)
- if(pai && pai.client)
+ if(pai && pai.client && !pai.canmove)
var/rendered = "[text]"
pai.show_message(rendered, 2)
..()
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index fdf92060585..ad9b9e8f8cc 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -7,14 +7,13 @@
matter = list(DEFAULT_WALL_MATERIAL = 75)
subspace_transmission = 1
canhear_range = 0 // can't hear headsets from very far away
-
slot_flags = SLOT_EARS
+ sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ears.dmi')
+
var/translate_binary = 0
var/translate_hive = 0
var/obj/item/device/encryptionkey/keyslot1 = null
var/obj/item/device/encryptionkey/keyslot2 = null
-// maxf = 1489
-
var/ks1type = /obj/item/device/encryptionkey
var/ks2type = null
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index a4644e274f8..b50e1268c93 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -26,7 +26,7 @@ REAGENT SCANNER
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
- if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
+ if ((CLUMSY in user.mutations) && prob(50))
user << text("You try to analyze the floor's vitals!")
for(var/mob/O in viewers(M, null))
O.show_message("\The [user] has analyzed the floor's vitals!", 1)
@@ -123,17 +123,14 @@ REAGENT SCANNER
// user.show_message(text("Warning: Unknown pathogen detected in subject's blood."))
if (M.getCloneLoss())
user.show_message("Subject appears to have been imperfectly cloned.")
- for(var/datum/disease/D in M.viruses)
- if(!D.hidden[SCANNER])
- user.show_message(text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
// if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
// user.show_message("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.")
if (M.has_brain_worms())
user.show_message("Subject suffering from aberrant brain activity. Recommend further scanning.")
- else if (M.getBrainLoss() >= 100 || !M.has_brain())
+ else if (M.getBrainLoss() >= 60 || !M.has_brain())
user.show_message("Subject is brain dead.")
- else if (M.getBrainLoss() >= 60)
- user.show_message("Severe brain damage detected. Subject likely to have a traumatic brain injury!.")
+ else if (M.getBrainLoss() >= 25)
+ user.show_message("Severe brain damage detected. Subject likely to have a traumatic brain injury.")
else if (M.getBrainLoss() >= 10)
user.show_message("Significant brain damage detected. Subject may have had a concussion.")
if(ishuman(M))
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index afe50bc2b76..3ccf1fb3a96 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -71,6 +71,10 @@
icon_state = "meson"
icon = 'icons/obj/clothing/glasses.dmi'
+/obj/item/borg/sight/material
+ name = "\proper material scanner vision"
+ sight_mode = BORGMATERIAL
+
/obj/item/borg/sight/hud
name = "hud"
var/obj/item/clothing/glasses/hud/hud = null
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 1915e5ec527..17e9d35ab95 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -71,7 +71,7 @@
var/uses = 10
/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user)
- var/used_uses = A.emag_act(uses, user)
+ var/used_uses = A.emag_act(uses, user, src)
if(used_uses < 0)
return ..(A, user)
@@ -94,6 +94,10 @@
icon_state = "id"
item_state = "card-id"
+ sprite_sheets = list(
+ "Teshari" = 'icons/mob/species/seromi/id.dmi'
+ )
+
var/access = list()
var/registered_name = "Unknown" // The name registered_name on the card
slot_flags = SLOT_ID
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
index 0bc090f9962..2b3631ddbfd 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/message_monitor
@@ -21,11 +21,6 @@
name = T_BOARD("medical records console")
build_path = /obj/machinery/computer/med_data
-/obj/item/weapon/circuitboard/pandemic
- name = T_BOARD("PanD.E.M.I.C. 2200")
- build_path = /obj/machinery/computer/pandemic
- origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
-
/obj/item/weapon/circuitboard/scan_consolenew
name = T_BOARD("DNA machine")
build_path = /obj/machinery/computer/scan_consolenew
@@ -60,11 +55,11 @@
/obj/item/weapon/circuitboard/stationalert_engineering
name = T_BOARD("station alert console (engineering)")
build_path = /obj/machinery/computer/station_alert
-
+
/obj/item/weapon/circuitboard/stationalert_security
name = T_BOARD("station alert console (security)")
build_path = /obj/machinery/computer/station_alert
-
+
/obj/item/weapon/circuitboard/stationalert_all
name = T_BOARD("station alert console (all)")
build_path = /obj/machinery/computer/station_alert/all
@@ -92,9 +87,14 @@
build_path = /obj/machinery/computer/cloning
origin_tech = list(TECH_DATA = 3, TECH_BIO = 3)
-/obj/item/weapon/circuitboard/arcade
- name = T_BOARD("arcade machine")
- build_path = /obj/machinery/computer/arcade
+/obj/item/weapon/circuitboard/arcade/battle
+ name = T_BOARD("battle arcade machine")
+ build_path = /obj/machinery/computer/arcade/battle
+ origin_tech = list(TECH_DATA = 1)
+
+/obj/item/weapon/circuitboard/arcade/orion_trail
+ name = T_BOARD("orion trail arcade machine")
+ build_path = /obj/machinery/computer/arcade/orion_trail
origin_tech = list(TECH_DATA = 1)
/obj/item/weapon/circuitboard/turbine_control
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 92814eea6ca..0ccb1f1a242 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -15,7 +15,15 @@
/*
* Soap
*/
-/obj/item/weapon/soap/Crossed(AM as mob|obj) //EXACTLY the same as bananapeel for now, so it makes sense to put it in the same dm -- Urist
+/obj/item/weapon/soap/New()
+ ..()
+ create_reagents(5)
+ wet()
+
+/obj/item/weapon/soap/proc/wet()
+ reagents.add_reagent("cleaner", 5)
+
+/obj/item/weapon/soap/Crossed(AM as mob|obj)
if (istype(AM, /mob/living))
var/mob/living/M = AM
M.slip("the [src.name]",3)
@@ -32,7 +40,10 @@
else if(istype(target,/turf))
user << "You scrub \the [target.name] clean."
var/turf/T = target
- T.clean(src)
+ T.clean(src, user)
+ else if(istype(target,/obj/structure/sink))
+ user << "You wet \the [src] in the sink."
+ wet()
else
user << "You clean \the [target.name]."
target.clean_blood()
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index d022c335e01..eadb5b08485 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -6,6 +6,7 @@
w_class = 2.0
force = 2.0
det_time = null
+ unacidable = 1
var/stage = 0
var/state = 0
@@ -163,7 +164,7 @@
playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1)
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
- G.reagents.trans_to(src, G.reagents.total_volume)
+ G.reagents.trans_to_obj(src, G.reagents.total_volume)
if(src.reagents.total_volume) //The possible reactions didnt use up all reagents.
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 1ab42d80e24..1868827b5b9 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -17,6 +17,7 @@
var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
var/cuff_type = "handcuffs"
+ sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/handcuffs.dmi')
/obj/item/weapon/handcuffs/attack(var/mob/living/carbon/C, var/mob/living/user)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 0b5ed55d624..783a2088da9 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -6,6 +6,7 @@
name = "implant"
icon = 'icons/obj/device.dmi'
icon_state = "implant"
+ w_class = 1
var/implanted = null
var/mob/imp_in = null
var/obj/item/organ/external/part = null
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm
index 0034ddb60b1..b5c966ebd5d 100644
--- a/code/game/objects/items/weapons/material/kitchen.dm
+++ b/code/game/objects/items/weapons/material/kitchen.dm
@@ -38,14 +38,20 @@
if (reagents.total_volume > 0)
reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
if(M == user)
+ if(!M.can_eat(loaded))
+ return
M.visible_message("\The [user] eats some [loaded] from \the [src].")
else
+ user.visible_message("\The [user] begins to feed \the [M]!")
+ if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS)))
+ return
M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].")
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
overlays.Cut()
return
else
- ..()
+ user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK
+ return
/obj/item/weapon/material/kitchen/utensil/fork
name = "fork"
@@ -90,14 +96,14 @@
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
- user << "You accidentally cut yourself with the [src]."
+ user << "You accidentally cut yourself with \the [src]."
user.take_organ_damage(20)
return
return ..()
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
- user << "You somehow managed to cut yourself with the [src]."
+ user << "You somehow managed to cut yourself with \the [src]."
user.take_organ_damage(20)
return
return ..()
@@ -120,7 +126,7 @@
/obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
- user << "The [src] slips out of your hand and hits your head."
+ user << "\The [src] slips out of your hand and hits your head."
user.take_organ_damage(10)
user.Paralyse(2)
return
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index 2bc8830ad88..2c11456b708 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -27,17 +27,19 @@
var/base_name
var/unwielded_force_divisor = 0.25
-/obj/item/weapon/material/twohanded/proc/unwield()
- wielded = 0
- force = force_unwielded
- name = "[base_name]"
- update_icon()
-
-/obj/item/weapon/material/twohanded/proc/wield()
- wielded = 1
- force = force_wielded
- name = "[base_name] (Wielded)"
+/obj/item/weapon/material/twohanded/update_held_icon()
+ var/mob/living/M = loc
+ if(istype(M) && !issmall(M) && ((M.r_hand == src && !M.l_hand) || (M.l_hand == src && !M.r_hand)))
+ wielded = 1
+ force = force_wielded
+ name = "[base_name] (wielded)"
+ update_icon()
+ else
+ wielded = 0
+ force = force_unwielded
+ name = "[base_name]"
update_icon()
+ ..()
/obj/item/weapon/material/twohanded/update_force()
base_name = name
@@ -55,22 +57,6 @@
..()
update_icon()
-/obj/item/weapon/material/twohanded/mob_can_equip(M as mob, slot)
- //Cannot equip wielded items.
- if(wielded)
- M << "Unwield the [base_name] first!"
- return 0
-
- return ..()
-
-/obj/item/weapon/material/twohanded/dropped(mob/user as mob)
- //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
- if(user)
- var/obj/item/weapon/material/twohanded/O = user.get_inactive_hand()
- if(istype(O))
- O.unwield()
- return unwield()
-
//Allow a small chance of parrying melee attacks when wielded - maybe generalize this to other weapons someday
/obj/item/weapon/material/twohanded/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(wielded && default_parry_check(user, attacker, damage_source) && prob(15))
@@ -83,68 +69,6 @@
icon_state = "[base_icon][wielded]"
item_state = icon_state
-/obj/item/weapon/material/twohanded/pickup(mob/user)
- unwield()
-
-/obj/item/weapon/material/twohanded/attack_self(mob/user as mob)
-
- ..()
-
- if(istype(user, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(issmall(H))
- user << "It's too heavy for you to wield fully."
- return
- else
- return
-
- if(wielded) //Trying to unwield it
- unwield()
- user << "You are now carrying the [name] with one hand."
- if (src.unwieldsound)
- playsound(src.loc, unwieldsound, 50, 1)
-
- var/obj/item/weapon/material/twohanded/offhand/O = user.get_inactive_hand()
- if(O && istype(O))
- O.unwield()
-
- else //Trying to wield it
- if(user.get_inactive_hand())
- user << "You need your other hand to be empty"
- return
- wield()
- user << "You grab the [base_name] with both hands."
- if (src.wieldsound)
- playsound(src.loc, wieldsound, 50, 1)
-
- var/obj/item/weapon/material/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
- O.name = "[base_name] - offhand"
- O.desc = "Your second grip on the [base_name]."
- user.put_in_inactive_hand(O)
-
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- H.update_inv_l_hand()
- H.update_inv_r_hand()
-
- return
-
-///////////OFFHAND///////////////
-/obj/item/weapon/material/twohanded/offhand
- w_class = 5
- icon_state = "offhand"
- name = "offhand"
- default_material = "placeholder"
-
-/obj/item/weapon/material/twohanded/offhand/unwield()
- qdel(src)
-
-/obj/item/weapon/material/twohanded/offhand/wield()
- qdel(src)
-
-/obj/item/weapon/material/twohanded/offhand/update_icon()
- return
-
/*
* Fireaxe
*/
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index e0b8b66b2f9..3fbef18d3e6 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -14,19 +14,7 @@
/obj/item/weapon/mop/New()
- create_reagents(5)
-
-//expects an atom containing the reagents used to clean the turf
-/turf/proc/clean(atom/source)
- if(source.reagents.has_reagent("water", 1))
- clean_blood()
- if(istype(src, /turf/simulated))
- var/turf/simulated/T = src
- T.dirt = 0
- for(var/obj/effect/O in src)
- if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
- qdel(O)
- source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
+ create_reagents(30)
/obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity)
if(!proximity) return
@@ -40,7 +28,7 @@
if(do_after(user, 40))
var/turf/T = get_turf(A)
if(T)
- T.clean(src)
+ T.clean(src, user)
user << "You have finished mopping!"
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 431e30d1cae..db9db8a360e 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -17,6 +17,9 @@
slot_l_hand_str = "backpack",
slot_r_hand_str = "backpack",
)
+ sprite_sheets = list(
+ "Teshari" = 'icons/mob/species/seromi/back.dmi'
+ )
w_class = 4
slot_flags = SLOT_BACK
max_w_class = 3
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index e83f18ff3a6..2bc82202981 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -6,6 +6,7 @@
item_state = "utility"
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined")
+ sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/belt.dmi')
var/show_above_suit = 0
@@ -42,7 +43,12 @@
/obj/item/stack/cable_coil,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
+ /obj/item/clothing/glasses,
+ /obj/item/clothing/gloves,
+ /obj/item/device/pda,
+ /obj/item/device/megaphone,
/obj/item/taperoll/engineering,
+ /obj/item/device/radio/headset,
/obj/item/device/robotanalyzer,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/hatchet,
@@ -89,12 +95,15 @@
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
+ /obj/item/device/radio/headset,
+ /obj/item/device/pda,
+ /obj/item/device/megaphone,
/obj/item/device/flashlight/pen,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/head/surgery,
- /obj/item/clothing/gloves/latex,
+ /obj/item/clothing/gloves,
/obj/item/weapon/reagent_containers/hypospray,
- /obj/item/clothing/glasses/hud/health,
+ /obj/item/clothing/glasses,
/obj/item/weapon/crowbar,
/obj/item/device/flashlight,
/obj/item/weapon/extinguisher/mini
@@ -130,9 +139,11 @@
/obj/item/device/flashlight,
/obj/item/device/pda,
/obj/item/device/radio/headset,
+ /obj/item/clothing/gloves,
/obj/item/device/hailer,
/obj/item/device/megaphone,
/obj/item/weapon/melee,
+ /obj/item/clothing/accessory/badge,
/obj/item/weapon/gun/projectile/sec,
/obj/item/taperoll/police,
/obj/item/weapon/gun/projectile/colt/detective
@@ -161,11 +172,15 @@
/obj/item/device/camera,
/obj/item/weapon/autopsy_scanner,
/obj/item/device/mass_spectrometer,
+ /obj/item/clothing/accessory/badge,
/obj/item/device/reagent_scanner,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/device/pda,
+ /obj/item/device/hailer,
+ /obj/item/device/megaphone,
/obj/item/device/radio/headset,
+ /obj/item/clothing/gloves,
/obj/item/taperoll/police
)
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 297ac1d4b18..33d462eff2a 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -35,7 +35,7 @@
else
user << "Access Denied"
else if(istype(W, /obj/item/weapon/melee/energy/blade))
- if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying."))
+ if(emag_act(INFINITY, user, W, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying."))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
@@ -55,7 +55,7 @@
..()
return
-/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback = "", var/audible_feedback = "")
+/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "")
if(!broken)
if(visual_feedback)
visual_feedback = "[visual_feedback]"
@@ -93,3 +93,19 @@
New()
..()
new /obj/item/weapon/grenade/flashbang/clusterbang(src)
+
+/obj/item/weapon/storage/lockbox/medal
+ name = "lockbox of medals"
+ desc = "A lockbox filled with commemorative medals, it has the NanoTrasen logo stamped on it."
+ req_access = list(access_heads)
+ storage_slots = 7
+
+ New()
+ ..()
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/bronze_heart(src)
+ new /obj/item/clothing/accessory/medal/nobel_science(src)
+ new /obj/item/clothing/accessory/medal/silver/valor(src)
+ new /obj/item/clothing/accessory/medal/silver/security(src)
+ new /obj/item/clothing/accessory/medal/gold/captain(src)
+ new /obj/item/clothing/accessory/medal/gold/heroism(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 73e3fb0108c..3950ea89093 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -33,7 +33,7 @@
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(locked)
- if (emag_act(INFINITY, user, "You slice through the lock of \the [src]"))
+ if (istype(W, /obj/item/weapon/melee/energy/blade) && emag_act(INFINITY, user, "You slice through the lock of \the [src]"))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index d2deeda6d57..dd3c4cff297 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -23,6 +23,10 @@ var/list/global/tank_gauge_cache = list()
throw_speed = 1
throw_range = 4
+ sprite_sheets = list(
+ "Teshari" = 'icons/mob/species/seromi/back.dmi'
+ )
+
var/datum/gas_mixture/air_contents = null
var/distribute_pressure = ONE_ATMOSPHERE
var/integrity = 3
diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm
index d4a7117bbb4..624b6fcb980 100644
--- a/code/game/objects/items/weapons/trays.dm
+++ b/code/game/objects/items/weapons/trays.dm
@@ -185,31 +185,32 @@
add = 5
if(calc_carry() + add >= max_carry)
break
-
+ var/image/Img = new(src.icon)
I.loc = src
carrying.Add(I)
- overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
+ Img.icon = I.icon
+ Img.icon_state = I.icon_state
+ Img.layer = 30 + I.layer
+ if(istype(I, /obj/item/weapon/material))
+ var/obj/item/weapon/material/O = I
+ if(O.applies_material_colour)
+ Img.color = O.color
+ overlays += Img
/obj/item/weapon/tray/dropped(mob/user)
-
- var/mob/living/M
- for(M in src.loc) //to handle hand switching
- return
-
- var/foundtable = 0
- for(var/obj/structure/table/T in loc)
- foundtable = 1
- break
-
- overlays.Cut()
-
- for(var/obj/item/I in carrying)
- I.loc = loc
- carrying.Remove(I)
- if(!foundtable && isturf(loc))
- // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
+ var/noTable = null
+
+ spawn() //Allows the tray to udpate location, rather than just checking against mob's location
+ if(isturf(src.loc) && !(locate(/obj/structure/table) in src.loc))
+ noTable = 1
+
+ if(isturf(loc) && !(locate(/mob/living) in src.loc))
+ overlays.Cut()
+ for(var/obj/item/I in carrying)
+ I.forceMove(src.loc)
+ carrying.Remove(I)
+ if(noTable)
+ for(var/i = 1, i <= rand(1,2), i++)
+ if(I)
+ step(I, pick(NORTH,SOUTH,EAST,WEST))
+ sleep(rand(2,4))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index d7d4c1f36cf..b9b71491968 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -165,19 +165,18 @@
if(1)
for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion
A.forceMove(src.loc)
- A.ex_act(severity++)
+ A.ex_act(severity + 1)
qdel(src)
if(2)
if(prob(50))
for (var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
- A.ex_act(severity++)
+ A.ex_act(severity + 1)
qdel(src)
if(3)
if(prob(5))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
- A.ex_act(severity++)
qdel(src)
/obj/structure/closet/proc/damage(var/damage)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 8c49fc0d9f3..d91b22fe74d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -66,11 +66,12 @@
src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
user.drop_item()
if (W) W.forceMove(src.loc)
- else if(istype(W, /obj/item/weapon/card/id))
+ else if(W.GetID())
+ var/obj/item/weapon/card/id/I = W.GetID()
+
if(src.broken)
user << "It appears to be broken."
return
- var/obj/item/weapon/card/id/I = W
if(!I || !I.registered_name) return
if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name)))
//they can open all lockers, or nobody owns this, or they own this locker
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index a553db51c67..395eb13df04 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -90,7 +90,7 @@
else
togglelock(user)
-/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback, var/audible_feedback)
+/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "")
if(!broken)
broken = 1
locked = 0
@@ -100,8 +100,11 @@
if(visual_feedback)
visible_message(visual_feedback, audible_feedback)
+ else if(user && emag_source)
+ visible_message("\The [src] has been broken by \the [user] with \an [emag_source]!", "You hear a faint electrical spark.")
else
- visible_message("The locker has been broken by [user] with an electromagnetic card!", "You hear a faint electrical spark.")
+ visible_message("\The [src] sparks and breaks open!", "You hear a faint electrical spark.")
+ return 1
/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
src.add_fingerprint(user)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 7e742241562..1a6005ba46d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -23,6 +23,7 @@
new /obj/item/clothing/suit/storage/vest(src)
new /obj/item/weapon/cartridge/captain(src)
new /obj/item/clothing/head/helmet/swat(src)
+ new /obj/item/weapon/storage/lockbox/medal(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/device/radio/headset/heads/captain/alt(src)
@@ -124,6 +125,8 @@
new /obj/item/taperoll/police(src)
new /obj/item/weapon/shield/riot(src)
new /obj/item/weapon/shield/riot/tele(src)
+ new /obj/item/weapon/storage/box/holobadge/hos(src)
+ new /obj/item/clothing/accessory/badge/holo/hos(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
@@ -167,6 +170,7 @@
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
+ new /obj/item/clothing/accessory/badge/holo/warden(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
@@ -274,6 +278,7 @@
new /obj/item/clothing/suit/storage/det_trench/grey(src)
new /obj/item/clothing/suit/storage/forensics/blue(src)
new /obj/item/clothing/suit/storage/forensics/red(src)
+ new /obj/item/clothing/accessory/badge/holo/detective(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/det(src)
new /obj/item/clothing/head/det/grey(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index d4f16f72e4c..2122d869f9f 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -139,6 +139,7 @@
new /obj/item/weapon/storage/backpack/cultpack (src)
new /obj/item/weapon/storage/fancy/candle_box(src)
new /obj/item/weapon/storage/fancy/candle_box(src)
+ new /obj/item/weapon/deck/tarot(src)
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 1d8686a6780..64129a80f7d 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -135,7 +135,7 @@
return 1
if(is_full_window())
return 0 //full tile window, you can't move into it!
- if(get_dir(loc, target) == dir)
+ if(get_dir(loc, target) & dir)
return !density
else
return 1
@@ -187,8 +187,8 @@
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
user.do_attack_animation(src)
- usr.visible_message("[usr.name] bangs against the [src.name]!",
- "You bang against the [src.name]!",
+ usr.visible_message("\The [usr] bangs against \the [src]!",
+ "You bang against \the [src]!",
"You hear a banging sound.")
else
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
@@ -295,7 +295,7 @@
if(usr.incapacitated())
return 0
-
+
if(anchored)
usr << "It is fastened to the floor therefore you can't rotate it!"
return 0
diff --git a/code/game/turfs/initialization/init.dm b/code/game/turfs/initialization/init.dm
index eda55c47ae9..c1e8be47d12 100644
--- a/code/game/turfs/initialization/init.dm
+++ b/code/game/turfs/initialization/init.dm
@@ -6,7 +6,11 @@
/area/initialize()
..()
+ var/list/minerals = list()
for(var/turf/simulated/T in src)
- T.initialize()
+ if(T.initialize())
+ minerals += T
if(turf_initializer)
turf_initializer.initialize(T)
+ for(var/turf/simulated/mineral/M in minerals)
+ M.MineralSpread()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 3eb48aa0e79..8b8b1edeb82 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -217,5 +217,20 @@ var/const/enterloopsanity = 100
return 1
return 0
+//expects an atom containing the reagents used to clean the turf
+/turf/proc/clean(atom/source, mob/user)
+ if(source.reagents.has_reagent("water", 1) || source.reagents.has_reagent("cleaner", 1))
+ clean_blood()
+ if(istype(src, /turf/simulated))
+ var/turf/simulated/T = src
+ T.dirt = 0
+ for(var/obj/effect/O in src)
+ if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
+ qdel(O)
+ else
+ user << "\The [source] is too dry to wash that."
+ source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
+
/turf/proc/update_blood_overlays()
return
+
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 9d40b49bcf5..f2a2d74f117 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -108,7 +108,7 @@
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
var/mob/source = mob.get_looc_source()
- var/list/heard = get_mobs_or_objects_in_view(7, source, 1, 0)
+ var/list/heard = get_mobs_or_objects_in_view(7, get_turf(source), 1, 0)
var/display_name = key
if(holder && holder.fakekey)
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index cad22a9e270..bed720d584a 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -31,6 +31,7 @@
if(held_item)
var/damagetype = held_item.suicide_act(src)
if(damagetype)
+ log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
var/damage_mod = 1
switch(damagetype) //Sorry about the magic numbers.
//brute = 1, burn = 2, tox = 4, oxy = 8
@@ -70,7 +71,7 @@
updatehealth()
return
-
+ log_and_message_admins("[key_name(src)] commited suicide")
viewers(src) << pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
"[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \
"[src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 646845aa891..108fd45f27b 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1315,7 +1315,7 @@ proc/admin_notice(var/message, var/rights)
if (!istype(src,/datum/admins))
src = usr.client.holder
- if (!istype(src,/datum/admins))
+ if (!istype(src,/datum/admins) || !check_rights(R_ADMIN))
usr << "Error: you are not an admin!"
return
@@ -1323,17 +1323,31 @@ proc/admin_notice(var/message, var/rights)
usr << "Mode has not started."
return
- message_admins("[key_name(usr)] attempting to force mode latespawn.")
- ticker.mode.next_spawn = 0
+ log_and_message_admins("attempting to force mode autospawn.")
ticker.mode.try_latespawn()
-
+
+/datum/admins/proc/paralyze_mob(mob/living/H as mob)
+ set category = "Admin"
+ set name = "Toggle Paralyze"
+ set desc = "Paralyzes a player. Or unparalyses them."
+
+ var/msg
+
+ if(check_rights(R_ADMIN))
+ if (H.paralysis == 0)
+ H.paralysis = 8000
+ msg = "has paralyzed [key_name(H)]."
+ else
+ H.paralysis = 0
+ msg = "has unparalyzed [key_name(H)]."
+ log_and_message_admins(msg)
/datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob)
set category = "Debug"
set name = "Set Telecrystals"
set desc = "Allows admins to change telecrystals of a user."
-
+
var/crystals
-
+
if(check_rights(R_ADMIN))
crystals = input("Amount of telecrystals for [H.ckey]", crystals) as null|num
if (!isnull(crystals))
@@ -1342,19 +1356,4 @@ proc/admin_notice(var/message, var/rights)
message_admins(msg)
else
usr << "You do not have access to this command."
-
-/datum/admins/proc/paralyze_mob(mob/living/H as mob)
- set category = "Admin"
- set name = "Toggle Paralyze"
- set desc = "Paralyzes a player. Or unparalyses them."
-
- var/msg
-
- if(check_rights(R_ADMIN|R_MOD))
- if (H.paralysis == 0)
- H.paralysis = 8000
- msg = "[key_name(usr)] has paralyzed [key_name(H)]."
- else
- H.paralysis = 0
- msg = "[key_name(usr)] has unparalyzed [key_name(H)]."
- message_admins(msg)
+
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 0fd47cde30a..4358d2f1cbf 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -132,9 +132,6 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
/client/proc/respawn_character,
- /client/proc/FireLaser,
- /client/proc/FireCannons,
- /client/proc/ChangeIcarusPosition,
/client/proc/virus2_editor,
/client/proc/spawn_chemdisp_cartridge
)
@@ -605,22 +602,6 @@ var/list/admin_verbs_mentor = list(
message_admins("\blue [ckey] creating an admin explosion at [epicenter.loc].")
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/give_disease(mob/T as mob in mob_list) // -- Giacom
- set category = "Fun"
- set name = "Give Disease (old)"
- set desc = "Gives a (tg-style) Disease to a mob."
- var/list/disease_names = list()
- for(var/v in diseases)
- // "/datum/disease/" 15 symbols ~Intercross
- disease_names.Add(copytext("[v]", 16, 0))
- var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in disease_names
- if(!D) return
- var/path = text2path("/datum/disease/[D]")
- T.contract_disease(new path, 1)
- feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
- message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1)
-
/client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom
set category = "Fun"
set name = "Give Disease"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2aa54f9a906..40f10e3f440 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1681,13 +1681,8 @@
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
- var/datum/feed_channel/newChannel = new /datum/feed_channel
- newChannel.channel_name = src.admincaster_feed_channel.channel_name
- newChannel.author = src.admincaster_signature
- newChannel.locked = src.admincaster_feed_channel.locked
- newChannel.is_admin_channel = 1
- feedback_inc("newscaster_channels",1)
- news_network.network_channels += newChannel //Adding channel to the global network
+ news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1)
+ feedback_inc("newscaster_channels",1) //Adding channel to the global network
log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!")
src.admincaster_screen=5
src.access_news_network()
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 2131e977ac7..0ecc220ae2c 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -296,3 +296,4 @@
if(pa.Find("right"))
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
+ log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]")
diff --git a/code/modules/admin/verbs/icarus.dm b/code/modules/admin/verbs/icarus.dm
deleted file mode 100644
index 6711c846fc2..00000000000
--- a/code/modules/admin/verbs/icarus.dm
+++ /dev/null
@@ -1,129 +0,0 @@
-/client/proc/FireLaser()
- set name = "Fire the Icarus lasers"
- set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost"
- set category = "Fun"
-
- var/turf/target = get_turf(src.mob)
- log_and_message_admins("has fired the Icarus point defense laser at [target.x]-[target.y]-[target.z]")
- if(!src.holder)
- src << "Only administrators may use this command."
- return
-
- Icarus_FireLaser(target)
-
-
-/client/proc/FireCannons()
- set name = "Fire the Icarus cannons"
- set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost."
- set category = "Fun"
-
- var/turf/target = get_turf(src.mob)
- log_and_message_admins("has fired the Icarus main gun projectile at [target.x]-[target.y]-[target.z]")
- if(!src.holder)
- src << "Only administrators may use this command."
- return
-
- Icarus_FireCannon(target)
-
-
-/client/proc/ChangeIcarusPosition()
- set name = "Adjust Icarus Position"
- set desc = "Lets you chose the position of the Icarus in regards to the map."
- set category = "Fun"
-
- log_and_message_admins("is changing the Icarus position.")
- if(!src.holder)
- src << "Only administrators may use this command."
- return
-
- Icarus_SetPosition(src)
-
-var/icarus_position = SOUTH
-
-proc/Icarus_FireLaser(var/turf/target)
- // Find the world edge to fire from.
- var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
- var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
- var/x_off = x != target.x ? abs(target.x - x) : INFINITY
- var/y_off = y != target.y ? abs(target.y - y) : INFINITY
- // Get the minimum number of steps using the rise/run shit.
- var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
-
- // Now we can get the location of the start.
- x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
- y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
-
- var/turf/start = locate(x, y, target.z)
-
- // should step down as:
- // 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90
- var/damage = 1000
- for(var/i in 2 to 12)
- var/obj/item/projectile/beam/in_chamber = new (start)
- in_chamber.original = target
- in_chamber.starting = start
- in_chamber.silenced = 1
- in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
- in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
- in_chamber.damage = damage
- in_chamber.kill_count = 500
- in_chamber.process()
- damage -= damage / i
- sleep(-1)
-
- // Let everyone know what hit them.
- var/obj/item/projectile/beam/in_chamber = new (start)
- in_chamber.original = target
- in_chamber.starting = start
- in_chamber.silenced = 0
- in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
- in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
- in_chamber.kill_count = 500
- in_chamber.damage = 0
- in_chamber.name = "point defense laser"
- in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message.
- in_chamber.process()
-
-proc/Icarus_FireCannon(var/turf/target)
- // Find the world edge to fire from.
- var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
- var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
- var/x_off = x != target.x ? abs(target.x - x) : INFINITY
- var/y_off = y != target.y ? abs(target.y - y) : INFINITY
- // Get the minimum number of steps using the rise/run shit.
- var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
-
- // Now we can get the location of the start.
- x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
- y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
-
- var/turf/start = locate(x, y, target.z)
-
- // Now we find the corresponding turf on the other side of the level.
- // Yeah, yeah. Overuse of the terinary operator. So sue me.
- x = icarus_position & EAST ? 1 : icarus_position & WEST ? world.maxx : target.x
- y = icarus_position & NORTH ? 1 : icarus_position & SOUTH ? world.maxy : target.y
- x_off = x != target.x ? abs(target.x - x) : INFINITY
- y_off = y != target.y ? abs(target.y - y) : INFINITY
- iterations = round(min(x_off, y_off))
- x = target.x + (icarus_position & EAST ? -iterations : icarus_position & WEST ? iterations : 0)
- y = target.y + (icarus_position & NORTH ? -iterations : icarus_position & SOUTH ? iterations : 0)
- target = locate(x, y, target.z)
-
- // Finally fire the fucker.
- var/obj/effect/meteor/projectile = new (start)
- projectile.dest = target
- projectile.name = "main gun projectile" // stealthy
- projectile.hits = 6
-
- // Make sure it travels
- spawn(0)
- walk_towards(projectile, projectile.dest, 1)
-
-proc/Icarus_SetPosition(var/user)
- var/global/list/directions = list("North" = 1, "North East" = 5, "East" = 4, "South East" = 6, "South" = 2, "South West" = 10, "West" = 8, "North West" = 9)
- var/direction = input(user, "Where should the Icarus fire from?", "Icarus Comms") as null|anything in directions
- if(!direction)
- return
-
- icarus_position = directions[direction]
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 014cd8988fe..c1cde11dadb 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -520,7 +520,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "'[command_name()] Update.'"
- P.info = input
+ P.info = replacetext(input, "\n", "
")
+ P.update_space(P.info)
P.update_icon()
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)
@@ -627,7 +628,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
if(istype(M, /mob/dead/observer))
- gibs(M.loc, M.viruses)
+ gibs(M.loc)
return
M.gib()
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index c842170b6b1..d68d51ae4a9 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -74,17 +74,6 @@
src.give_spell(M)
href_list["datumrefresh"] = href_list["give_spell"]
- else if(href_list["give_disease"])
- if(!check_rights(R_ADMIN|R_FUN)) return
-
- var/mob/M = locate(href_list["give_disease"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- src.give_disease(M)
- href_list["datumrefresh"] = href_list["give_spell"]
-
else if(href_list["give_disease2"])
if(!check_rights(R_ADMIN|R_FUN)) return
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 3537fbee507..c3c395f15a8 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -2,8 +2,8 @@
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
- origin_tech = list(TECH_COMBAT = 1)
- matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10)
+ origin_tech = list(TECH_COMBAT = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10)
var/armed = 0
@@ -54,7 +54,7 @@
if(!armed)
user << "You arm [src]."
else
- if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
+ if((CLUMSY in user.mutations) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
@@ -70,7 +70,7 @@
attack_hand(mob/living/user as mob)
if(armed)
- if(((user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
+ if((CLUMSY in user.mutations) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index d3f71325eb4..0d34aa76599 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -158,6 +158,7 @@
spawn(5) // And wait a half-second, since it sounds like you can do this too fast.
if(src)
winset(src, null, "command=\".configure graphics-hwmode off\"")
+ sleep(2) // wait a bit more, possibly fixes hardware mode not re-activating right
winset(src, null, "command=\".configure graphics-hwmode on\"")
log_client_to_db()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 11d21f6fe02..73531b82e25 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -368,4 +368,4 @@ datum/preferences
user << browse(dat, "window=saves;size=300x390")
/datum/preferences/proc/close_load_dialog(mob/user)
- user << browse(null, "window=saves")
+ user << browse(null, "window=saves")
\ No newline at end of file
diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm
index eeaf5b9d568..e60cdb75b98 100644
--- a/code/modules/client/preferences_factions.dm
+++ b/code/modules/client/preferences_factions.dm
@@ -25,7 +25,7 @@ var/global/list/home_system_choices = list(
"Vir",
"Nyx",
"Tau Ceti",
- "Epsilon Ursae Majoris",
+ "Epsilon Ursae Minoris",
"S'randarr"
)
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 909d93985a9..d80504f665f 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -18,7 +18,17 @@ var/global/list/gear_datums = list()
//create a list of gear datums to sort
for(var/type in typesof(/datum/gear)-/datum/gear)
- var/datum/gear/G = new type()
+ var/datum/gear/G = type
+ if(!initial(G.display_name))
+ error("Loadout - Missing display name: [G]")
+ continue
+ if(!initial(G.cost))
+ error("Loadout - Missing cost: [G]")
+ continue
+ if(!initial(G.path))
+ error("Loadout - Missing path definition: [G]")
+ continue
+ G = new G()
var/category = (G.sort_category in sort_categories)? G.sort_category : "unknown"
sort_categories[category][G.display_name] = G
@@ -142,7 +152,7 @@ var/global/list/gear_datums = list()
path = /obj/item/clothing/head/soft/red
/datum/gear/cap/sec
- display_name = "cap, security"
+ display_name = "cap, security (Security)"
path = /obj/item/clothing/head/soft/sec
allowed_roles = list("Security Officer","Head of Security","Warden", "Detective")
@@ -210,7 +220,7 @@ var/global/list/gear_datums = list()
cost = 1
slot = slot_head
- /datum/gear/bowler
+/datum/gear/bowler
display_name = "hat, bowler"
path = /obj/item/clothing/head/bowler
cost = 1
@@ -312,6 +322,13 @@ var/global/list/gear_datums = list()
slot = slot_glasses
allowed_roles = list("Security Officer","Head of Security","Warden")
+/datum/gear/medical
+ display_name = "Medical HUD"
+ path = /obj/item/clothing/glasses/hud/health
+ cost = 1
+ slot = slot_glasses
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+
/datum/gear/prescriptionmed
display_name = "Medical HUD, prescription"
path = /obj/item/clothing/glasses/hud/health/prescription
@@ -404,7 +421,7 @@ var/global/list/gear_datums = list()
cost = 1
/datum/gear/harness
- display_name = "gear harness"
+ display_name = "gear harness (Full Body Prosthetic, Dionaea)"
path = /obj/item/clothing/under/harness
slot = slot_w_uniform
cost = 1
@@ -531,6 +548,31 @@ var/global/list/gear_datums = list()
path = /obj/item/clothing/under/rank/cargo/skirt
allowed_roles = list("Quartermaster")
+/datum/gear/jumpsuit/teshari
+ display_name = "Teshari smock, grey"
+ path = /obj/item/clothing/under/seromi
+ whitelisted = "Teshari"
+
+/datum/gear/jumpsuit/teshari/yellow
+ display_name = "Teshari smock, yellow"
+ path = /obj/item/clothing/under/seromi/yellow
+
+/datum/gear/jumpsuit/teshari/red
+ display_name = "Teshari smock, red"
+ path = /obj/item/clothing/under/seromi/red
+
+/datum/gear/jumpsuit/teshari/white
+ display_name = "Teshari smock, white"
+ path = /obj/item/clothing/under/seromi/white
+
+/datum/gear/jumpsuit/teshari/medical
+ display_name = "Teshari smock, Medical"
+ path = /obj/item/clothing/under/seromi/medical
+
+/datum/gear/jumpsuit/teshari/rainbow
+ display_name = "Teshari smock, rainbow"
+ path = /obj/item/clothing/under/seromi/rainbow
+
/datum/gear/jeans_qm
display_name = "jeans, QM"
path = /obj/item/clothing/under/rank/cargo/jeans
@@ -559,7 +601,7 @@ var/global/list/gear_datums = list()
cost = 1
allowed_roles = list("Quartermaster","Cargo Technician")
-/datum/gear/white
+/datum/gear/pants
display_name = "pants, white"
path = /obj/item/clothing/under/pants/white
slot = slot_w_uniform
@@ -609,55 +651,55 @@ var/global/list/gear_datums = list()
display_name = "pants, young folks jeans"
path = /obj/item/clothing/under/pants/youngfolksjeans
-/datum/gear/shorts/jeans
+/datum/gear/jeans
display_name = "shorts, jeans"
path = /obj/item/clothing/under/shorts/jeans
slot = slot_w_uniform
cost = 1
-/datum/gear/shorts/jeans/classic
+/datum/gear/jeans/classic
display_name = "shorts, classic jeans"
path = /obj/item/clothing/under/shorts/jeans/classic
-/datum/gear/shorts/jeans/mustang
+/datum/gear/jeans/mustang
display_name = "shorts, mustang jeans"
path = /obj/item/clothing/under/shorts/jeans/mustang
-/datum/gear/shorts/jeans/youngfolks
+/datum/gear/jeans/youngfolks
display_name = "shorts, young folks jeans"
path = /obj/item/clothing/under/shorts/jeans/youngfolks
-/datum/gear/shorts/jeans/black
+/datum/gear/jeans/black
display_name = "shorts, black jeans"
path = /obj/item/clothing/under/shorts/jeans/black
-/datum/gear/shorts/jeans/female
+/datum/gear/jeans/female
display_name = "shorts, female, jeans"
path = /obj/item/clothing/under/shorts/jeans/female
-/datum/gear/shorts/jeans/classic/female
+/datum/gear/jeans/classic/female
display_name = "shorts, female, classic jeans"
path = /obj/item/clothing/under/shorts/jeans/classic/female
-/datum/gear/shorts/jeans/mustang/female
+/datum/gear/jeans/mustang/female
display_name = "shorts, female, mustang jeans"
path = /obj/item/clothing/under/shorts/jeans/mustang/female
-/datum/gear/shorts/jeans/youngfolks/female
+/datum/gear/jeans/youngfolks/female
display_name = "shorts, female, young folks jeans"
path = /obj/item/clothing/under/shorts/jeans/youngfolks/female
-/datum/gear/shorts/jeans/black/female
+/datum/gear/jeans/black/female
display_name = "shorts, female, black jeans"
path = /obj/item/clothing/under/shorts/jeans/black/female
-/datum/gear/shorts/khaki
+/datum/gear/khaki
display_name = "shorts, khaki"
path = /obj/item/clothing/under/shorts/khaki
slot = slot_w_uniform
cost = 1
-/datum/gear/shorts/khaki/female
+/datum/gear/khaki/female
display_name = "shorts, female, khaki"
path = /obj/item/clothing/under/shorts/khaki/female
@@ -1146,7 +1188,7 @@ var/global/list/gear_datums = list()
path = /obj/item/clothing/suit/storage/toggle/labcoat/yellow
/datum/gear/labcoat/emt
- display_name = "labcoat, emt"
+ display_name = "labcoat, EMT (Medical)"
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
@@ -1216,7 +1258,7 @@ var/global/list/gear_datums = list()
slot = slot_wear_suit
whitelisted = "Tajara" // You do have a monopoly on a fur suit tho
-/datum/gear/forensics/red
+/datum/gear/forensics
display_name = "forensics long, red"
path = /obj/item/clothing/suit/storage/forensics/red/long
cost = 2
@@ -1479,7 +1521,31 @@ var/global/list/gear_datums = list()
/datum/gear/cards
display_name = "deck of cards"
- path = /obj/item/weapon/deck
+ path = /obj/item/weapon/deck/cards
+ sort_category = "misc"
+ cost = 1
+
+/datum/gear/tarot
+ display_name = "deck of tarot cards"
+ path = /obj/item/weapon/deck/tarot
+ sort_category = "misc"
+ cost = 1
+
+/datum/gear/holder
+ display_name = "card holder"
+ path = /obj/item/weapon/deck/holder
+ sort_category = "misc"
+ cost = 1
+
+/datum/gear/cardemon_pack
+ display_name = "Cardemon booster pack"
+ path = /obj/item/weapon/pack/cardemon
+ sort_category = "misc"
+ cost = 1
+
+/datum/gear/spaceball_pack
+ display_name = "Spaceball booster pack"
+ path = /obj/item/weapon/pack/spaceball
sort_category = "misc"
cost = 1
@@ -1596,11 +1662,11 @@ var/global/list/gear_datums = list()
display_name = "skrell headtail-wear, male, blue, cloth"
path = /obj/item/clothing/ears/skrell/cloth_male/blue
-/datum/gear/skrell_cloth_male/green
+/datum/gear/skrell_cloth/male/green
display_name = "skrell headtail-wear, male, green, cloth"
path = /obj/item/clothing/ears/skrell/cloth_male/green
-/datum/gear/skrell_cloth_male/pink
+/datum/gear/skrell_cloth/male/pink
display_name = "skrell headtail-wear, male, pink, cloth"
path = /obj/item/clothing/ears/skrell/cloth_male/pink
@@ -1608,18 +1674,18 @@ var/global/list/gear_datums = list()
display_name = "skrell headtail-wear, female, red, cloth"
path = /obj/item/clothing/ears/skrell/cloth_female
-/datum/gear/skrell_cloth_female/black
+/datum/gear/skrell_cloth/female/black
display_name = "skrell headtail-wear, female, black, cloth"
path = /obj/item/clothing/ears/skrell/cloth_female/black
-/datum/gear/skrell_cloth_female/blue
+/datum/gear/skrell_cloth/female/blue
display_name = "skrell headtail-wear, female, blue, cloth"
path = /obj/item/clothing/ears/skrell/cloth_female/blue
-/datum/gear/skrell_cloth_female/green
+/datum/gear/skrell_cloth/female/green
display_name = "skrell headtail-wear, female, green, cloth"
path = /obj/item/clothing/ears/skrell/cloth_female/green
-/datum/gear/skrell_cloth_female/pink
+/datum/gear/skrell_cloth/female/pink
display_name = "skrell headtail-wear, female, pink, cloth"
- path = /obj/item/clothing/ears/skrell/cloth_female/pink
\ No newline at end of file
+ path = /obj/item/clothing/ears/skrell/cloth_female/pink
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 11e5857cbaa..d3fad955d67 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -90,4 +90,4 @@
return 1
#undef SAVEFILE_VERSION_MAX
-#undef SAVEFILE_VERSION_MIN
+#undef SAVEFILE_VERSION_MIN
\ No newline at end of file
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index f1f916cd3cc..3dfc09201ca 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -299,7 +299,7 @@
item_state = "glasses"
desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside."
origin_tech = list(TECH_ILLEGAL = 3)
- var/list/clothing_choices = list()
+ var/list/global/clothing_choices
/obj/item/clothing/glasses/chameleon/New()
..()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index d2f11e27a85..78da7f8b528 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -101,6 +101,7 @@
w_class = 1.0
throwforce = 2
slot_flags = SLOT_EARS
+ sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ears.dmi')
/obj/item/clothing/ears/attack_hand(mob/user as mob)
if (!user) return
@@ -188,33 +189,6 @@
update_clothing_icon()
-///////////////////////////////////////////////////////////////////////
-//Glasses
-/*
-SEE_SELF // can see self, no matter what
-SEE_MOBS // can see all mobs, no matter what
-SEE_OBJS // can see all objs, no matter what
-SEE_TURFS // can see all turfs (and areas), no matter what
-SEE_PIXELS// if an object is located on an unlit area, but some of its pixels are
- // in a lit area (via pixel_x,y or smooth movement), can see those pixels
-BLIND // can't see anything
-*/
-/obj/item/clothing/glasses
- name = "glasses"
- icon = 'icons/obj/clothing/glasses.dmi'
- w_class = 2.0
- body_parts_covered = EYES
- slot_flags = SLOT_EYES
- var/vision_flags = 0
- var/darkness_view = 0//Base human is 2
- var/see_invisible = -1
-
-/obj/item/clothing/glasses/update_clothing_icon()
- if (ismob(src.loc))
- var/mob/M = src.loc
- M.update_inv_glasses()
-
-///////////////////////////////////////////////////////////////////////
//Gloves
/obj/item/clothing/gloves
name = "gloves"
@@ -230,7 +204,8 @@ BLIND // can't see anything
attack_verb = list("challenged")
species_restricted = list("exclude","Unathi","Tajara", "Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/gloves.dmi'
+ "Vox" = 'icons/mob/species/vox/gloves.dmi',
+ "Teshari" = 'icons/mob/species/seromi/gloves.dmi',
)
/obj/item/clothing/gloves/update_clothing_icon()
@@ -287,7 +262,8 @@ BLIND // can't see anything
var/on = 0
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Teshari" = 'icons/mob/species/seromi/head.dmi'
)
/obj/item/clothing/head/attack_self(mob/user)
@@ -385,7 +361,8 @@ BLIND // can't see anything
slot_flags = SLOT_MASK
body_parts_covered = FACE|EYES
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/masks.dmi'
+ "Vox" = 'icons/mob/species/vox/masks.dmi',
+ "Teshari" = 'icons/mob/species/seromi/masks.dmi',
)
var/voicechange = 0
@@ -418,9 +395,10 @@ BLIND // can't see anything
slowdown = SHOES_SLOWDOWN
force = 2
var/overshoes = 0
- species_restricted = list("exclude","Unathi","Tajara","Vox")
+ species_restricted = list("exclude","Teshari", "Unathi","Tajara","Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/shoes.dmi'
+ "Vox" = 'icons/mob/species/vox/shoes.dmi',
+ "Teshari" = 'icons/mob/species/seromi/shoes.dmi',
)
/obj/item/clothing/shoes/proc/draw_knife()
@@ -494,7 +472,8 @@ BLIND // can't see anything
w_class = 3
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Teshari" = 'icons/mob/species/seromi/suit.dmi'
)
/obj/item/clothing/suit/update_clothing_icon()
@@ -528,8 +507,10 @@ BLIND // can't see anything
var/list/accessories = list()
var/displays_id = 1
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
+ var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
+ "Vox" = 'icons/mob/species/vox/uniform.dmi',
+ "Teshari" = 'icons/mob/species/seromi/uniform.dmi'
)
//convenience var for defining the icon state for the overlay used when the clothing is worn.
@@ -573,6 +554,29 @@ BLIND // can't see anything
rolled_down = -1
if(H) update_clothing_icon()
+/obj/item/clothing/under/proc/update_rollsleeves_status()
+ var/mob/living/carbon/human/H
+ if(istype(src.loc, /mob/living/carbon/human))
+ H = src.loc
+
+ var/icon/under_icon
+ if(icon_override)
+ under_icon = icon_override
+ else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype()])
+ under_icon = sprite_sheets[H.species.get_bodytype()]
+ else if(item_icons && item_icons[slot_w_uniform_str])
+ under_icon = item_icons[slot_w_uniform_str]
+ else
+ under_icon = INV_W_UNIFORM_DEF_ICON
+
+ // The _s is because the icon update procs append it.
+ if(("[worn_state]_r_s") in icon_states(under_icon))
+ if(rolled_sleeves != 1)
+ rolled_sleeves = 0
+ else
+ rolled_sleeves = -1
+ if(H) update_clothing_icon()
+
/obj/item/clothing/under/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
@@ -718,14 +722,45 @@ BLIND // can't see anything
if(rolled_down == -1)
usr << "You cannot roll down [src]!"
return
+ if((rolled_sleeves == 1) && !(rolled_down))
+ rolled_sleeves = 0
rolled_down = !rolled_down
if(rolled_down)
- body_parts_covered &= LOWER_TORSO|LEGS|FEET
+ body_parts_covered = initial(body_parts_covered)
+ body_parts_covered &= ~(UPPER_TORSO|ARMS)
item_state_slots[slot_w_uniform_str] = "[worn_state]_d"
+ usr << "You roll down your [src]."
else
body_parts_covered = initial(body_parts_covered)
item_state_slots[slot_w_uniform_str] = "[worn_state]"
+ usr << "You roll up your [src]."
+ update_clothing_icon()
+
+/obj/item/clothing/under/verb/rollsleeves()
+ set name = "Roll Up Sleeves"
+ set category = "Object"
+ set src in usr
+ if(!istype(usr, /mob/living)) return
+ if(usr.stat) return
+
+ update_rollsleeves_status()
+ if(rolled_sleeves == -1)
+ usr << "You cannot roll up your [src]'s sleeves!"
+ return
+ if(rolled_down == 1)
+ usr << "You must roll up your [src] first!"
+ return
+
+ rolled_sleeves = !rolled_sleeves
+ if(rolled_sleeves)
+ body_parts_covered &= ~(ARMS)
+ item_state_slots[slot_w_uniform_str] = "[worn_state]_r"
+ usr << "You roll up your [src]'s sleeves."
+ else
+ body_parts_covered = initial(body_parts_covered)
+ item_state_slots[slot_w_uniform_str] = "[worn_state]"
+ usr << "You roll down your [src]'s sleeves."
update_clothing_icon()
/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 0ba28aa3cc0..2f2dad608bb 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -1,11 +1,24 @@
+///////////////////////////////////////////////////////////////////////
+//Glasses
+/*
+SEE_SELF // can see self, no matter what
+SEE_MOBS // can see all mobs, no matter what
+SEE_OBJS // can see all objs, no matter what
+SEE_TURFS // can see all turfs (and areas), no matter what
+SEE_PIXELS// if an object is located on an unlit area, but some of its pixels are
+ // in a lit area (via pixel_x,y or smooth movement), can see those pixels
+BLIND // can't see anything
+*/
+///////////////////////////////////////////////////////////////////////
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
- //w_class = 2.0
- //slot_flags = SLOT_EYES
- //var/vision_flags = 0
- //var/darkness_view = 0//Base human is 2
+ w_class = 2.0
+ slot_flags = SLOT_EYES
+ var/vision_flags = 0
+ var/darkness_view = 0//Base human is 2
+ var/see_invisible = -1
var/prescription = 0
var/toggleable = 0
var/off_state = "degoggles"
@@ -13,6 +26,16 @@
var/activation_sound = 'sound/items/goggles_charge.ogg'
var/obj/screen/overlay = null
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/eyes.dmi',
+ "Teshari" = 'icons/mob/species/seromi/eyes.dmi'
+ )
+
+/obj/item/clothing/glasses/update_clothing_icon()
+ if (ismob(src.loc))
+ var/mob/M = src.loc
+ M.update_inv_glasses()
+
/obj/item/clothing/glasses/attack_self(mob/user)
if(toggleable)
if(active)
@@ -54,6 +77,7 @@
icon_state = "purple"
item_state = "glasses"
toggleable = 1
+ action_button_name = "Toggle Goggles"
/obj/item/clothing/glasses/science/New()
..()
@@ -67,6 +91,7 @@
origin_tech = list(TECH_MAGNET = 2)
darkness_view = 7
toggleable = 1
+ action_button_name = "Toggle Goggles"
see_invisible = SEE_INVISIBLE_NOLIGHTING
off_state = "denight"
@@ -80,6 +105,21 @@
icon_state = "eyepatch"
item_state = "eyepatch"
body_parts_covered = 0
+ var/eye = null
+
+/obj/item/clothing/glasses/eyepatch/verb/switcheye()
+ set name = "Switch Eyepatch"
+ set category = "Object"
+ set src in usr
+ if(!istype(usr, /mob/living)) return
+ if(usr.stat) return
+
+ eye = !eye
+ if(eye)
+ icon_state = "[icon_state]_r"
+ else
+ icon_state = initial(icon_state)
+ update_clothing_icon()
/obj/item/clothing/glasses/monocle
name = "monocle"
@@ -95,6 +135,7 @@
item_state = "glasses"
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3)
toggleable = 1
+ action_button_name = "Toggle Goggles"
vision_flags = SEE_OBJS
/obj/item/clothing/glasses/regular
@@ -104,7 +145,7 @@
item_state = "glasses"
prescription = 1
body_parts_covered = 0
-
+
/obj/item/clothing/glasses/regular/scanners
name = "Scanning Goggles"
desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it."
@@ -223,6 +264,7 @@
item_state = "glasses"
origin_tech = list(TECH_MAGNET = 3)
toggleable = 1
+ action_button_name = "Toggle Goggles"
vision_flags = SEE_MOBS
emp_act(severity)
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 89cd162d54f..2d9d718587d 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -10,7 +10,8 @@
desc = "an ultra rare hat. It commands a certain respect."
icon_state = "petehat"
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Teshari" = 'icons/mob/species/seromi/head.dmi'
)
/obj/item/clothing/head/collectable/slime
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index d344d3b34c3..970e202bae0 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -7,6 +7,7 @@
armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
siemens_coefficient = 0.9
+ action_button_name = "Toggle Head-light"
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 2ae77c7a69b..0171c11746e 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -38,6 +38,7 @@
interface_desc = "A self-sustaining plasma arc capable of cutting through walls."
suit_overlay_active = "plasmacutter"
suit_overlay_inactive = "plasmacutter"
+ use_power_cost = 0.5
device_type = /obj/item/weapon/pickaxe/plasmacutter
@@ -58,6 +59,7 @@
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
+ use_power_cost = 0.1
device_type = /obj/item/weapon/pickaxe/diamonddrill
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index 8dc13b083e7..8b13a57c8d5 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/head/helmet/space/rig/ert
light_overlay = "helmet_light_dual"
- camera_networks = list("ERT")
+ camera_networks = list(NETWORK_ERT)
/obj/item/weapon/rig/ert
name = "ERT-C hardsuit control module"
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index cf941f678e7..bc5c15fbb07 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -40,7 +40,7 @@
airtight = 0
seal_delay = 5 //not being vaccum-proof has an upside I guess
-
+
helm_type = /obj/item/clothing/head/lightrig/hacker
chest_type = /obj/item/clothing/suit/lightrig/hacker
glove_type = /obj/item/clothing/gloves/lightrig/hacker
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index d627f3ccdbd..350d2aea4a1 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -1,23 +1,23 @@
/obj/item/clothing/head/helmet/space/rig/industrial
- camera_networks = list("Mine")
+ camera_networks = list(NETWORK_MINE)
/obj/item/clothing/head/helmet/space/rig/ce
- camera_networks = list("Engineering")
+ camera_networks = list(NETWORK_ENGINEERING)
/obj/item/clothing/head/helmet/space/rig/eva
light_overlay = "helmet_light_dual"
- camera_networks = list("Engineering")
+ camera_networks = list(NETWORK_ENGINEERING)
/obj/item/clothing/head/helmet/space/rig/hazmat
light_overlay = "hardhat_light"
- camera_networks = list("Research")
+ camera_networks = list(NETWORK_RESEARCH)
/obj/item/clothing/head/helmet/space/rig/medical
- camera_networks = list("Medbay")
+ camera_networks = list(NETWORK_MEDICAL)
/obj/item/clothing/head/helmet/space/rig/hazard
light_overlay = "helmet_light_dual"
- camera_networks = list("Security")
+ camera_networks = list(NETWORK_SECURITY)
/obj/item/weapon/rig/internalaffairs
name = "augmented tie"
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index a6a20de09d4..04f74d164e3 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -57,11 +57,12 @@
var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any.
var/obj/item/weapon/tank/tank = null // Deployable tank, if any.
+ var/obj/item/device/suit_cooling_unit/cooler = null// Cooling unit, for FBPs. Cannot be installed alongside a tank.
/obj/item/clothing/suit/space/void/examine(user)
..(user)
var/list/part_list = new
- for(var/obj/item/I in list(helmet,boots,tank))
+ for(var/obj/item/I in list(helmet,boots,tank,cooler))
part_list += "\a [I]"
user << "\The [src] has [english_list(part_list)] installed."
if(tank && in_range(src,user))
@@ -102,6 +103,13 @@
M << "The valve on your suit's installed tank safely engages."
tank.canremove = 0
+ if(cooler)
+ if(H.s_store) //Ditto
+ M << "Alarmingly, the cooling unit installed into your suit fails to deploy."
+ else if (H.equip_to_slot_if_possible(cooler, slot_s_store))
+ M << "Your suit's cooling unit deploys."
+ cooler.canremove = 0
+
/obj/item/clothing/suit/space/void/dropped()
..()
@@ -128,6 +136,10 @@
tank.canremove = 1
tank.forceMove(src)
+ if(cooler)
+ cooler.canremove = 1
+ cooler.forceMove(src)
+
/obj/item/clothing/suit/space/void/verb/toggle_helmet()
set name = "Toggle Helmet"
@@ -163,14 +175,14 @@
/obj/item/clothing/suit/space/void/verb/eject_tank()
- set name = "Eject Voidsuit Tank"
+ set name = "Eject Voidsuit Tank/Cooler"
set category = "Object"
set src in usr
if(!istype(src.loc,/mob/living)) return
- if(!tank)
- usr << "There is no tank inserted."
+ if(!tank && !cooler)
+ usr << "There is no tank or cooling unit inserted."
return
var/mob/living/carbon/human/H = usr
@@ -179,10 +191,16 @@
if(H.stat) return
if(H.wear_suit != src) return
- H << "You press the emergency release, ejecting \the [tank] from your suit."
- tank.canremove = 1
- H.drop_from_inventory(tank)
- src.tank = null
+ var/obj/item/removing = null
+ if(tank)
+ removing = tank
+ tank = null
+ else
+ removing = cooler
+ cooler = null
+ H << "You press the emergency release, ejecting \the [removing] from your suit."
+ removing.canremove = 1
+ H.drop_from_inventory(removing)
/obj/item/clothing/suit/space/void/attackby(obj/item/W as obj, mob/user as mob)
@@ -194,13 +212,17 @@
if(istype(W,/obj/item/weapon/screwdriver))
if(helmet || boots || tank)
- var/choice = input("What component would you like to remove?") as null|anything in list(helmet,boots,tank)
+ var/choice = input("What component would you like to remove?") as null|anything in list(helmet,boots,tank,cooler)
if(!choice) return
if(choice == tank) //No, a switch doesn't work here. Sorry. ~Techhead
user << "You pop \the [tank] out of \the [src]'s storage compartment."
tank.forceMove(get_turf(src))
src.tank = null
+ else if(choice == cooler)
+ user << "You pop \the [cooler] out of \the [src]'s storage compartment."
+ cooler.forceMove(get_turf(src))
+ src.cooler = null
else if(choice == helmet)
user << "You detatch \the [helmet] from \the [src]'s helmet mount."
helmet.forceMove(get_turf(src))
@@ -233,6 +255,8 @@
else if(istype(W,/obj/item/weapon/tank))
if(tank)
user << "\The [src] already has an airtank installed."
+ else if(cooler)
+ user << "\The [src]'s suit cooling unit is in the way. Remove it first."
else if(istype(W,/obj/item/weapon/tank/phoron))
user << "\The [W] cannot be inserted into \the [src]'s storage compartment."
else
@@ -241,5 +265,16 @@
W.forceMove(src)
tank = W
return
+ else if(istype(W,/obj/item/device/suit_cooling_unit))
+ if(cooler)
+ user << "\The [src] already has a suit cooling unit installed."
+ else if(tank)
+ user << "\The [src]'s airtank is in the way. Remove it first."
+ else
+ user << "You insert \the [W] into \the [src]'s storage compartment."
+ user.drop_item()
+ W.forceMove(src)
+ cooler = W
+ return
..()
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 51cbe7baa4b..3725fccd304 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -179,7 +179,7 @@
/obj/item/clothing/accessory/medal/gold/heroism
name = "medal of exceptional heroism"
- desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
+ desc = "An extremely rare golden medal awarded only by high ranking officials. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but distinguished veteran staff."
//Scarves
diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm
index 7c605bbcf39..b78b0ffac3c 100644
--- a/code/modules/clothing/under/accessories/badges.dm
+++ b/code/modules/clothing/under/accessories/badges.dm
@@ -48,7 +48,7 @@
/obj/item/clothing/accessory/badge/holo/cord
icon_state = "holobadge-cord"
- slot_flags = SLOT_MASK | SLOT_TIE
+ slot_flags = SLOT_MASK | SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/attack_self(mob/user as mob)
if(!stored_name)
@@ -96,3 +96,35 @@
new /obj/item/clothing/accessory/badge/holo/cord(src)
..()
return
+
+/obj/item/clothing/accessory/badge/holo/warden
+ name = "warden's holobadge"
+ desc = "A silver corporate security badge. Stamped with the words 'Warden.'"
+ icon_state = "silverbadge"
+ slot_flags = SLOT_TIE | SLOT_BELT
+
+/obj/item/clothing/accessory/badge/holo/hos
+ name = "head of security's holobadge"
+ desc = "An immaculately polished gold security badge. Labeled 'Head of Security.'"
+ icon_state = "goldbadge"
+ slot_flags = SLOT_TIE | SLOT_BELT
+
+/obj/item/clothing/accessory/badge/holo/detective
+ name = "detective's holobadge"
+ desc = "An immaculately polished gold security badge on leather. Labeled 'Detective.'"
+ icon_state = "marshalbadge"
+ slot_flags = SLOT_TIE | SLOT_BELT
+
+/obj/item/weapon/storage/box/holobadge/hos
+ name = "holobadge box"
+ desc = "A box claiming to contain holobadges."
+ New()
+ new /obj/item/clothing/accessory/badge/holo(src)
+ new /obj/item/clothing/accessory/badge/holo(src)
+ new /obj/item/clothing/accessory/badge/holo/warden(src)
+ new /obj/item/clothing/accessory/badge/holo/detective(src)
+ new /obj/item/clothing/accessory/badge/holo/detective(src)
+ new /obj/item/clothing/accessory/badge/holo/hos(src)
+ new /obj/item/clothing/accessory/badge/holo/cord(src)
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 36528d33473..ca2b9f0d991 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -3,6 +3,7 @@
icon_state = "black"
item_state = "bl_suit"
worn_state = "black"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/blackf
name = "feminine black jumpsuit"
@@ -16,18 +17,21 @@
icon_state = "blue"
item_state = "b_suit"
worn_state = "blue"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/green
name = "green jumpsuit"
icon_state = "green"
item_state = "g_suit"
worn_state = "green"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
icon_state = "grey"
item_state = "gy_suit"
worn_state = "grey"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
@@ -37,30 +41,35 @@
worn_state = "orange"
has_sensor = 2
sensor_mode = 3
+ rolled_sleeves = 0
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
icon_state = "pink"
item_state = "p_suit"
worn_state = "pink"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/red
name = "red jumpsuit"
icon_state = "red"
item_state = "r_suit"
worn_state = "red"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/white
name = "white jumpsuit"
icon_state = "white"
item_state = "w_suit"
worn_state = "white"
+ rolled_sleeves = 0
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
icon_state = "yellow"
item_state = "y_suit"
worn_state = "yellow"
+ rolled_sleeves = 0
/obj/item/clothing/under/psyche
name = "psychedelic jumpsuit"
@@ -75,6 +84,7 @@
icon_state = "lightblue"
item_state = "b_suit"
worn_state = "lightblue"
+ rolled_sleeves = 0
/obj/item/clothing/under/aqua
name = "aqua jumpsuit"
@@ -82,6 +92,7 @@
icon_state = "aqua"
item_state = "b_suit"
worn_state = "aqua"
+ rolled_sleeves = 0
/obj/item/clothing/under/purple
name = "purple jumpsuit"
@@ -89,6 +100,7 @@
icon_state = "purple"
item_state = "p_suit"
worn_state = "purple"
+ rolled_sleeves = 0
/obj/item/clothing/under/lightpurple
name = "lightpurple jumpsuit"
@@ -96,6 +108,7 @@
icon_state = "lightpurple"
item_state = "p_suit"
worn_state = "lightpurple"
+ rolled_sleeves = 0
/obj/item/clothing/under/lightgreen
name = "lightgreen jumpsuit"
@@ -103,6 +116,7 @@
icon_state = "lightgreen"
item_state = "g_suit"
worn_state = "lightgreen"
+ rolled_sleeves = 0
/obj/item/clothing/under/lightbrown
name = "lightbrown jumpsuit"
@@ -110,6 +124,7 @@
icon_state = "lightbrown"
item_state = "lb_suit"
worn_state = "lightbrown"
+ rolled_sleeves = 0
/obj/item/clothing/under/brown
name = "brown jumpsuit"
@@ -117,6 +132,7 @@
icon_state = "brown"
item_state = "lb_suit"
worn_state = "brown"
+ rolled_sleeves = 0
/obj/item/clothing/under/yellowgreen
name = "yellowgreen jumpsuit"
@@ -124,6 +140,7 @@
icon_state = "yellowgreen"
item_state = "y_suit"
worn_state = "yellowgreen"
+ rolled_sleeves = 0
/obj/item/clothing/under/darkblue
name = "darkblue jumpsuit"
@@ -131,6 +148,7 @@
icon_state = "darkblue"
item_state = "b_suit"
worn_state = "darkblue"
+ rolled_sleeves = 0
/obj/item/clothing/under/lightred
name = "lightred jumpsuit"
@@ -138,6 +156,7 @@
icon_state = "lightred"
item_state = "r_suit"
worn_state = "lightred"
+ rolled_sleeves = 0
/obj/item/clothing/under/darkred
name = "darkred jumpsuit"
@@ -145,3 +164,4 @@
icon_state = "darkred"
item_state = "r_suit"
worn_state = "darkred"
+ rolled_sleeves = 0
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index a67d1e7b356..758de56245d 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -6,6 +6,7 @@
icon_state = "ba_suit"
item_state = "ba_suit"
worn_state = "ba_suit"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
@@ -14,6 +15,7 @@
icon_state = "captain"
item_state = "b_suit"
worn_state = "captain"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/cargo
@@ -22,6 +24,7 @@
icon_state = "qm"
item_state = "lb_suit"
worn_state = "qm"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/cargo/skirt
name = "quartermaster's jumpskirt"
@@ -29,6 +32,7 @@
icon_state = "qmf"
worn_state = "qmf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/cargo/jeans
name = "quartermaster's jumpjeans"
@@ -41,6 +45,7 @@
desc = "Jeeeaaans! They're comfy!"
icon_state = "qmjf"
worn_state = "qmjf"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech
name = "cargo technician's jumpsuit"
@@ -49,18 +54,21 @@
item_state = "lb_suit"
worn_state = "cargo"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/cargotech/skirt
name = "cargo technician's jumpskirt"
desc = "Skirrrrrts! They're comfy and easy to wear!"
icon_state = "cargof"
worn_state = "cargof"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech/jeans
name = "cargo technician's jumpjeans"
desc = "Jeeeaaans! They're comfy!"
icon_state = "cargoj"
worn_state = "cargoj"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech/jeans/female
name = "cargo technician's jumpjeans"
@@ -75,6 +83,7 @@
icon_state = "chaplain"
item_state = "bl_suit"
worn_state = "chapblack"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/chef
@@ -83,6 +92,7 @@
icon_state = "chef"
item_state = "w_suit"
worn_state = "chef"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/clown
@@ -91,6 +101,7 @@
icon_state = "clown"
item_state = "clown"
worn_state = "clown"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/head_of_personnel
@@ -99,6 +110,7 @@
icon_state = "hop"
item_state = "b_suit"
worn_state = "hop"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_personnel_whimsy
desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does."
@@ -106,6 +118,7 @@
icon_state = "hopwhimsy"
item_state = "b_suit"
worn_state = "hopwhimsy"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/hydroponics
@@ -115,6 +128,7 @@
item_state = "g_suit"
worn_state = "hydroponics"
permeability_coefficient = 0.50
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/internalaffairs
@@ -123,6 +137,7 @@
icon_state = "internalaffairs"
item_state = "ba_suit"
worn_state = "internalaffairs"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/janitor
@@ -132,6 +147,7 @@
worn_state = "janitor"
item_state = "janitor"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/lawyer
@@ -209,3 +225,4 @@
icon_state = "miner"
item_state = "lb_suit"
worn_state = "miner"
+ rolled_sleeves = 0
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 79583a54662..0cdcac576be 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -6,6 +6,7 @@
item_state = "g_suit"
worn_state = "chief"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/chief_engineer/skirt
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
@@ -13,6 +14,7 @@
icon_state = "chieff"
worn_state = "chieff"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -20,6 +22,7 @@
icon_state = "atmos"
item_state = "atmos_suit"
worn_state = "atmos"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/atmospheric_technician/skirt
desc = "It's a jumpskirt worn by atmospheric technicians."
@@ -27,6 +30,7 @@
icon_state = "atmosf"
worn_state = "atmosf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
@@ -35,6 +39,7 @@
item_state = "engi_suit"
worn_state = "engine"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/engineer/skirt
desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
@@ -42,6 +47,7 @@
icon_state = "enginef"
worn_state = "enginef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black jumpsuit with reinforced seams; great for industrial work."
@@ -49,9 +55,11 @@
icon_state = "robotics"
item_state = "bl_suit"
worn_state = "robotics"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/roboticist/skirt
desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
name = "roboticist's jumpskirt"
icon_state = "roboticsf"
worn_state = "roboticsf"
+ rolled_sleeves = -1
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index e25dbf760e9..057733298e7 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -34,12 +34,14 @@
worn_state = "sciencewhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/scientist/skirt
name = "scientist's jumpskirt"
icon_state = "sciencewhitef"
worn_state = "sciencewhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
@@ -49,12 +51,14 @@
worn_state = "chemistrywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/chemist/skirt
name = "chemist's jumpskirt"
icon_state = "chemistrywhitef"
worn_state = "chemistrywhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/*
* Medical
@@ -67,6 +71,7 @@
worn_state = "cmo"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/chief_medical_officer/skirt
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
@@ -74,6 +79,7 @@
icon_state = "cmof"
worn_state = "cmof"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
@@ -83,12 +89,14 @@
worn_state = "geneticswhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/geneticist/skirt
name = "geneticist's jumpskirt"
icon_state = "geneticswhitef"
worn_state = "geneticswhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
@@ -98,12 +106,14 @@
worn_state = "virologywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/virologist/skirt
name = "virologist's jumpskirt"
icon_state = "virologywhitef"
worn_state = "virologywhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
@@ -114,6 +124,7 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/nurse
desc = "A dress commonly worn by the nursing staff in the medical department."
@@ -124,6 +135,7 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/orderly
desc = "A white suit to be worn by medical attendants."
@@ -133,6 +145,7 @@
worn_state = "orderly"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/medical
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
@@ -142,12 +155,14 @@
worn_state = "medical"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/medical/skirt
name = "medical doctor's jumpskirt"
icon_state = "medicalf"
worn_state = "medicalf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/paramedic
name = "short sleeve medical jumpsuit"
@@ -155,13 +170,15 @@
icon_state = "medical_short"
item_state = "medical_short"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
+ rolled_sleeves = -1
-/obj/item/clothing/under/rank/medical/blue
+/obj/item/clothing/under/rank/medical/blue //Why are these not /obj/item/clothing/under/rank/medical/scrubs/ ?
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
item_state = "b_suit"
worn_state = "scrubsblue"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
@@ -169,6 +186,7 @@
icon_state = "scrubsgreen"
item_state = "g_suit"
worn_state = "scrubsgreen"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
@@ -176,6 +194,7 @@
icon_state = "scrubspurple"
item_state = "p_suit"
worn_state = "scrubspurple"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/black
name = "medical scrubs"
@@ -183,6 +202,7 @@
icon_state = "scrubsblack"
item_state = "bl_suit"
worn_state = "scrubsblack"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/psych
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
@@ -197,6 +217,7 @@
icon_state = "psychturtle"
item_state = "b_suit"
worn_state = "psychturtle"
+ rolled_sleeves = 0
/*
@@ -210,6 +231,7 @@
worn_state = "genetics_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/chemist_new
desc = "It's made of a special fiber which provides minor protection against biohazards."
@@ -219,6 +241,7 @@
worn_state = "chemist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/scientist_new
desc = "Made of a special fiber that gives special protection against biohazards and small explosions."
@@ -228,6 +251,7 @@
worn_state = "scientist_new"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/virologist_new
desc = "Made of a special fiber that gives increased protection against biohazards."
@@ -236,4 +260,5 @@
item_state = "w_suit"
worn_state = "virologist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
\ No newline at end of file
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ rolled_sleeves = 0
\ No newline at end of file
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index ddfdd3da7aa..c13629fe9af 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -16,6 +16,7 @@
worn_state = "warden"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
+ rolled_sleeves = 0
/obj/item/clothing/head/helmet/warden
name = "warden's hat"
@@ -31,6 +32,7 @@
worn_state = "secred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/dispatch
name = "dispatcher's uniform"
@@ -50,16 +52,19 @@
worn_state = "redshirt2"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/security/corp
icon_state = "sec_corporate"
//item_state = "sec_corporate"
worn_state = "sec_corporate"
+ rolled_sleeves = -1
/obj/item/clothing/under/rank/warden/corp
icon_state = "warden_corporate"
//item_state = "warden_corporate"
worn_state = "warden_corporate"
+ rolled_sleeves = -1
/obj/item/clothing/under/tactical
name = "tactical jumpsuit"
@@ -69,6 +74,7 @@
worn_state = "swatunder"
armor = list(melee = 10, bullet = 5, laser = 5,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
+ rolled_sleeves = -1
/*
* Detective
@@ -81,7 +87,9 @@
worn_state = "detective"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
+ rolled_sleeves = 0
+/*
/obj/item/clothing/under/det/verb/rollup()
set name = "Roll Suit Sleeves"
set category = "Object"
@@ -91,7 +99,7 @@
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform(1)
H << "You roll the sleeves of your shirt [unrolled ? "up" : "down"]"
-
+*/
/obj/item/clothing/under/det/grey
icon_state = "detective2"
worn_state = "detective2"
@@ -119,6 +127,7 @@
icon_state = "detective2_waistcoat"
worn_state = "detective2_waistcoat"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
+
/obj/item/clothing/head/det
name = "fedora"
@@ -149,11 +158,13 @@
worn_state = "hosred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.8
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_security/corp
icon_state = "hos_corporate"
//item_state = "hos_corporate"
worn_state = "hos_corporate"
+ rolled_sleeves = -1
/obj/item/clothing/head/helmet/HoS
name = "Head of Security Hat"
@@ -186,6 +197,7 @@
item_state = "jensen"
worn_state = "jensen"
siemens_coefficient = 0.6
+ rolled_sleeves = -1
/obj/item/clothing/suit/armor/hos/jensen
name = "armored trenchcoat"
@@ -206,6 +218,7 @@
icon_state = "officerblueclothes"
item_state = "ba_suit"
worn_state = "officerblueclothes"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/head_of_security/navyblue
desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security."
@@ -213,6 +226,7 @@
icon_state = "hosblueclothes"
item_state = "ba_suit"
worn_state = "hosblueclothes"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/warden/navyblue
desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
@@ -220,3 +234,4 @@
icon_state = "wardenblueclothes"
item_state = "ba_suit"
worn_state = "wardenblueclothes"
+ rolled_sleeves = 0
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 061f7bf9e91..5b263604cb4 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -32,6 +32,7 @@
icon_state = "sl_suit"
worn_state = "sl_suit"
item_state = "sl_suit"
+ rolled_sleeves = 0
/obj/item/clothing/under/waiter
name = "waiter's outfit"
@@ -39,6 +40,7 @@
icon_state = "waiter"
item_state = "waiter"
worn_state = "waiter"
+ rolled_sleeves = 0
/obj/item/clothing/under/rank/mailman
name = "mailman's jumpsuit"
@@ -46,6 +48,7 @@
icon_state = "mailman"
item_state = "b_suit"
worn_state = "mailman"
+ rolled_sleeves = 0
/obj/item/clothing/under/sexyclown
name = "sexy-clown suit"
@@ -54,6 +57,7 @@
item_state = "clown"
worn_state = "sexyclown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+ rolled_sleeves = -1 //Please never
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
@@ -106,6 +110,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | ARMS //Needs gloves and shoes with cold protection to be fully protected.
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
+ rolled_sleeves = 0
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
@@ -162,6 +167,7 @@
icon_state = "gentlesuit"
item_state = "gy_suit"
worn_state = "gentlesuit"
+ rolled_sleeves = 0
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
@@ -265,6 +271,7 @@
item_state = "w_suit"
worn_state = "sexymime"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+ rolled_sleeves = -1 //Please never
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
@@ -551,6 +558,7 @@
icon_state = "mechanic"
item_state = "lb_suit"
worn_state = "mechanic"
+ rolled_sleeves = 0
/obj/item/clothing/under/cheongsam
name = "white cheongsam"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 7c1d3860bfa..2dc37f79f7e 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -25,5 +25,4 @@
item_state = "bl_suit"
worn_state = "tactifool"
siemens_coefficient = 1
-
-
+ rolled_sleeves = 0
diff --git a/code/modules/clothing/under/xenos/seromi.dm b/code/modules/clothing/under/xenos/seromi.dm
new file mode 100644
index 00000000000..e4cc0605022
--- /dev/null
+++ b/code/modules/clothing/under/xenos/seromi.dm
@@ -0,0 +1,33 @@
+/obj/item/clothing/under/seromi
+ name = "small grey smock"
+ desc = "It looks fitted to nonhuman proportions."
+ icon = 'icons/obj/clothing/species/seromi/uniform.dmi'
+ icon_state = "seromi_grey"
+ worn_state = "seromi_grey"
+ species_restricted = list("Teshari")
+ body_parts_covered = 0 // It's a thin piece of cloth with a neck hole.
+
+/obj/item/clothing/under/seromi/white
+ name = "small white smock"
+ icon_state = "seromi_white"
+ worn_state = "seromi_white"
+
+/obj/item/clothing/under/seromi/red
+ name = "small Security smock"
+ icon_state = "seromi_red"
+ worn_state = "seromi_red"
+
+/obj/item/clothing/under/seromi/yellow
+ name = "small Engineering smock"
+ icon_state = "seromi_yellow"
+ worn_state = "seromi_yellow"
+
+/obj/item/clothing/under/seromi/medical
+ name = "small Medical uniform"
+ icon_state = "seromi_medical"
+ worn_state = "Teshari_medical"
+
+/obj/item/clothing/under/seromi/rainbow
+ name = "small rainbow smock"
+ icon_state = "seromi_rainbow"
+ worn_state = "seromi_rainbow"
\ No newline at end of file
diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm
index 300c48ee4c3..6887ef1fbaf 100644
--- a/code/modules/detectivework/tools/rag.dm
+++ b/code/modules/detectivework/tools/rag.dm
@@ -143,7 +143,7 @@
return
if(!on_fire && istype(A) && (src in user))
- if(A.is_open_container())
+ if(A.is_open_container() && !(A in user))
remove_contents(user, A)
else if(!ismob(A)) //mobs are handled in attack() - this prevents us from wiping down people while smothering them.
wipe_down(A, user)
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
deleted file mode 100644
index c2f478d4932..00000000000
--- a/code/modules/events/disease_outbreak.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/datum/event/disease_outbreak
- announceWhen = 15
-
-
-/datum/event/disease_outbreak/announce()
- command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
-
-/datum/event/disease_outbreak/setup()
- announceWhen = rand(15, 30)
-
-/datum/event/disease_outbreak/start()
- var/virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis)
-
- for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
- var/foundAlready = 0 // don't infect someone that already has the virus
- var/turf/T = get_turf(H)
- if(!T)
- continue
- if(isNotStationLevel(T.z))
- continue
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
- continue
-
- if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
- if((!H.dna) || (H.sdisabilities & BLIND)) //A blindness disease would be the worst.
- continue
- var/datum/disease/dnaspread/D = new
- D.strain_data["name"] = H.real_name
- D.strain_data["UI"] = H.dna.UI.Copy()
- D.strain_data["SE"] = H.dna.SE.Copy()
- D.carrier = 1
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
- else
- var/datum/disease/D = new virus_type
- D.carrier = 1
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
\ No newline at end of file
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index 1bba7866bf2..ddc392174e0 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -1,13 +1,4 @@
/datum/event/spontaneous_appendicitis/start()
- for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) if(H.client && H.stat != DEAD)
- var/foundAlready = 0 //don't infect someone that already has the virus
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
- continue
-
- var/datum/disease/D = new /datum/disease/appendicitis
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
+ for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
+ if(H.client && H.appendicitis())
+ break
diff --git a/code/modules/games/cardemon.dm b/code/modules/games/cardemon.dm
new file mode 100644
index 00000000000..647b1ff8c7e
--- /dev/null
+++ b/code/modules/games/cardemon.dm
@@ -0,0 +1,30 @@
+/obj/item/weapon/pack/cardemon
+ name = "cardemon booster pack"
+ desc = "Finally! A children's card game in space!"
+ icon_state = "card_pack_cardemon"
+
+/obj/item/weapon/pack/cardemon/New()
+ var/datum/playingcard/P
+ var/i
+ for(i=0; i<5; i++)
+ var/rarity
+ if(prob(10))
+ if(prob(5))
+ if(prob(5))
+ rarity = "Plasteel"
+ else
+ rarity = "Platinum"
+ else
+ rarity = "Silver"
+
+ var/nam = pick("Death","Life","Plant","Leaf","Air","Earth","Fire","Water","Killer","Holy", "God", "Ordinary","Demon","Angel", "Plasteel", "Phoron", "Mad", "Insane", "Metal", "Steel", "Secret")
+ var/nam2 = pick("Carp", "Corgi", "Cat", "Mouse", "Octopus", "Lizard", "Monkey", "Plant", "Duck", "Demon", "Spider", "Bird", "Slime", "Sheep", "Fish")
+
+ P = new()
+ P.name = "[nam] [nam2]"
+ P.card_icon = "card_cardemon"
+ if(rarity)
+ P.name = "[rarity] [P.name]"
+ P.card_icon += "_[rarity]"
+ P.back_icon = "card_back_cardemon"
+ cards += P
\ No newline at end of file
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 6ff5f22f20f..368bfdd9a5f 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -1,17 +1,24 @@
/datum/playingcard
var/name = "playing card"
var/card_icon = "card_back"
+ var/back_icon = "card_back"
/obj/item/weapon/deck
- name = "deck of cards"
- desc = "A simple deck of playing cards."
- icon = 'icons/obj/playing_cards.dmi'
- icon_state = "deck"
w_class = 2
-
+ icon = 'icons/obj/playing_cards.dmi'
var/list/cards = list()
-/obj/item/weapon/deck/New()
+/obj/item/weapon/deck/holder
+ name = "card box"
+ desc = "A small leather case to show how classy you are compared to everyone else."
+ icon_state = "card_holder"
+
+/obj/item/weapon/deck/cards
+ name = "deck of cards"
+ desc = "A simple deck of playing cards."
+ icon_state = "deck"
+
+/obj/item/weapon/deck/cards/New()
..()
var/datum/playingcard/P
@@ -27,12 +34,14 @@
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[colour]num"
+ P.back_icon = "card_back"
cards += P
for(var/number in list("jack","queen","king"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[colour]col"
+ P.back_icon = "card_back"
cards += P
@@ -48,7 +57,7 @@
for(var/datum/playingcard/P in H.cards)
cards += P
qdel(O)
- user << "You place your cards on the bottom of the deck."
+ user << "You place your cards on the bottom of \the [src]."
return
..()
@@ -128,12 +137,12 @@
/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O
- for(var/datum/playingcard/P in H.cards)
- cards += P
- src.concealed = H.concealed
- qdel(O)
- user.put_in_hands(src)
- update_icon()
+ for(var/datum/playingcard/P in cards)
+ H.cards += P
+ H.concealed = src.concealed
+ user.drop_from_inventory(src,user.loc)
+ qdel(src)
+ H.update_icon()
return
..()
@@ -159,6 +168,28 @@
deal_at(usr, over)
+/obj/item/weapon/pack/
+ name = "Card Pack"
+ desc = "For those with disposible income."
+
+ icon_state = "card_pack"
+ icon = 'icons/obj/playing_cards.dmi'
+ w_class = 1
+ var/list/cards = list()
+
+
+/obj/item/weapon/pack/attack_self(var/mob/user as mob)
+ user.visible_message("[user] rips open \the [src]!")
+ var/obj/item/weapon/hand/H = new()
+
+ H.cards += cards
+ cards.Cut();
+ user.drop_item()
+ qdel(src)
+
+ H.update_icon()
+ user.put_in_active_hand(H)
+
/obj/item/weapon/hand
name = "hand of cards"
desc = "Some playing cards."
@@ -226,7 +257,7 @@
if(cards.len == 1)
var/datum/playingcard/P = cards[1]
- var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
+ var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
I.pixel_x += (-5+rand(10))
I.pixel_y += (-5+rand(10))
overlays += I
@@ -249,7 +280,7 @@
M.Translate(-2, 0)
var/i = 0
for(var/datum/playingcard/P in cards)
- var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
+ var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
//I.pixel_x = origin+(offset*i)
switch(direction)
if(SOUTH)
diff --git a/code/modules/games/spaceball_cards.dm b/code/modules/games/spaceball_cards.dm
new file mode 100644
index 00000000000..7e289ad270e
--- /dev/null
+++ b/code/modules/games/spaceball_cards.dm
@@ -0,0 +1,23 @@
+/obj/item/weapon/pack/spaceball
+ name = "spaceball booster pack"
+ desc = "Officially licensed to take your money."
+ icon_state = "card_pack_spaceball"
+
+/obj/item/weapon/pack/spaceball/New()
+ var/datum/playingcard/P
+ var/i
+ var/year = 554 + text2num(time2text(world.timeofday, "YYYY"))
+ for(i=0;i<5;i++)
+ P = new()
+ if(prob(1))
+ P.name = "Spaceball Jones, [year] Brickburn Galaxy Trekers"
+ P.card_icon = "spaceball_jones"
+ else
+ var/language_type = pick(/datum/language/human,/datum/language/diona,/datum/language/tajaran,/datum/language/unathi)
+ var/datum/language/L = new language_type()
+ var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Ahdomai Lightening", "Vir Vixens", "Euphoric-Earth Alligators")
+ P.name = "[L.get_random_name(pick(MALE,FEMALE))], [year - rand(0,50)] [team]"
+ P.card_icon = "spaceball_standard"
+ P.back_icon = "card_back_spaceball"
+
+ cards += P
diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm
new file mode 100644
index 00000000000..b8e8618af02
--- /dev/null
+++ b/code/modules/games/tarot.dm
@@ -0,0 +1,39 @@
+/* this is a playing card deck based off of the Rider-Waite Tarot Deck.
+*/
+
+/obj/item/weapon/deck/tarot
+ name = "deck of tarot cards"
+ desc = "For all your occult needs!"
+ icon_state = "deck_tarot"
+
+/obj/item/weapon/deck/tarot/New()
+ ..()
+
+ var/datum/playingcard/P
+ for(var/name in list("Fool","Magician","High Priestess","Empress","Emperor","Hierophant","Lovers","Chariot","Strength","Hermit","Wheel of Fortune","Justice","Hanged Man","Death","Temperance","Devil","Tower","Star","Moon","Sun","Judgement","World"))
+ P = new()
+ P.name = "[name]"
+ P.card_icon = "tarot_major"
+ P.back_icon = "card_back_tarot"
+ cards += P
+ for(var/suit in list("wands","pentacles","cups","swords"))
+
+
+ for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king"))
+ P = new()
+ P.name = "[number] of [suit]"
+ P.card_icon = "tarot_[suit]"
+ P.back_icon = "card_back_tarot"
+ cards += P
+
+/obj/item/weapon/deck/tarot/attack_self(var/mob/user as mob)
+ var/list/newcards = list()
+ while(cards.len)
+ var/datum/playingcard/P = pick(cards)
+ P.name = replacetext(P.name," reversed","")
+ if(prob(50))
+ P.name += " reversed"
+ newcards += P
+ cards -= P
+ cards = newcards
+ user.visible_message("\The [user] shuffles [src].")
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 17a4d36569b..160dec82f4b 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -39,6 +39,7 @@
return
name = "[seed.seed_name]"
+ trash = seed.get_trash_type()
update_icon()
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index e9be2bf9938..0dc46f9e352 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -69,6 +69,9 @@
/datum/seed/proc/get_trait(var/trait)
return traits["[trait]"]
+/datum/seed/proc/get_trash_type()
+ return trash_type
+
/datum/seed/proc/set_trait(var/trait,var/nval,var/ubound,var/lbound, var/degrade)
if(!isnull(degrade)) nval *= degrade
if(!isnull(ubound)) nval = min(nval,ubound)
@@ -153,7 +156,6 @@
if(!body_coverage)
return
-
target << "You are stung by \the [fruit]!"
for(var/rid in chems)
var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5))
@@ -178,9 +180,20 @@
for(var/mob/living/M in T.contents)
if(!M.reagents)
continue
- for(var/chem in chems)
- var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3))
- M.reagents.add_reagent(chem,injecting)
+ var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ for(var/obj/item/clothing/clothes in M)
+ if(M.l_hand == clothes || M.r_hand == clothes)
+ continue
+ body_coverage &= ~(clothes.body_parts_covered)
+ if(!body_coverage)
+ continue
+ var/datum/reagents/R = M.reagents
+ var/mob/living/carbon/human/H = M
+ if(istype(H))
+ R = H.touching
+ if(istype(R))
+ for(var/chem in chems)
+ R.add_reagent(chem,min(5,max(1,get_trait(TRAIT_POTENCY)/3)))
//Applies an effect to a target atom.
/datum/seed/proc/thrown_at(var/obj/item/thrown,var/atom/target, var/force_explode)
@@ -709,9 +722,6 @@
if(istype(product,/mob/living))
product.visible_message("The pod disgorges [product]!")
handle_living_product(product)
- if(istype(product,/mob/living/simple_animal/mushroom)) // Gross.
- var/mob/living/simple_animal/mushroom/mush = product
- mush.seed = src
// When the seed in this machine mutates/is modified, the tray seed value
// is set to a new datum copied from the original. This datum won't actually
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 4d2e1cfbd2b..79a1f25bcaa 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -55,7 +55,7 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#FA1616")
set_trait(TRAIT_PLANT_ICON,"bush")
set_trait(TRAIT_WATER_CONSUMPTION, 6)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
/datum/seed/berry/glow
name = "glowberries"
@@ -75,7 +75,7 @@
set_trait(TRAIT_POTENCY,10)
set_trait(TRAIT_PRODUCT_COLOUR,"c9fa16")
set_trait(TRAIT_WATER_CONSUMPTION, 3)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
/datum/seed/berry/poison
name = "poisonberries"
@@ -88,7 +88,7 @@
..()
set_trait(TRAIT_PRODUCT_COLOUR,"#6DC961")
set_trait(TRAIT_WATER_CONSUMPTION, 3)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
/datum/seed/berry/poison/death
name = "deathberries"
@@ -102,7 +102,7 @@
set_trait(TRAIT_YIELD,3)
set_trait(TRAIT_POTENCY,50)
set_trait(TRAIT_PRODUCT_COLOUR,"#7A5454")
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.35)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.35)
// Nettles/variants.
/datum/seed/nettle
@@ -161,9 +161,9 @@
set_trait(TRAIT_PRODUCT_ICON,"tomato")
set_trait(TRAIT_PRODUCT_COLOUR,"#D10000")
set_trait(TRAIT_PLANT_ICON,"bush3")
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
set_trait(TRAIT_WATER_CONSUMPTION, 6)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
/datum/seed/tomato/blood
name = "bloodtomato"
@@ -237,7 +237,7 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#892694")
set_trait(TRAIT_PLANT_ICON,"bush4")
set_trait(TRAIT_IDEAL_HEAT, 298)
- set_trait(TRAIT_IDEAL_LIGHT, 7)
+ set_trait(TRAIT_IDEAL_LIGHT, 7)
//Apples/varieties.
/datum/seed/apple
@@ -301,7 +301,7 @@
set_trait(TRAIT_PRODUCT_ICON,"ambrosia")
set_trait(TRAIT_PRODUCT_COLOUR,"#9FAD55")
set_trait(TRAIT_PLANT_ICON,"ambrosia")
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
/datum/seed/ambrosia/deus
name = "ambrosiadeus"
@@ -338,7 +338,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#D9C94E")
set_trait(TRAIT_PLANT_ICON,"mushroom")
set_trait(TRAIT_WATER_CONSUMPTION, 6)
- set_trait(TRAIT_IDEAL_HEAT, 288)
+ set_trait(TRAIT_IDEAL_HEAT, 288)
set_trait(TRAIT_LIGHT_TOLERANCE, 6)
/datum/seed/mushroom/mold
@@ -375,21 +375,6 @@
set_trait(TRAIT_PLANT_COLOUR,"#9E4F9D")
set_trait(TRAIT_PLANT_ICON,"mushroom2")
-/datum/seed/mushroom/plump/walking
- name = "walkingmushroom"
- seed_name = "walking mushroom"
- display_name = "walking mushrooms"
- mutants = null
- can_self_harvest = 1
- has_mob_product = /mob/living/simple_animal/mushroom
-
-/datum/seed/mushroom/plump/walking/New()
- ..()
- set_trait(TRAIT_MATURATION,5)
- set_trait(TRAIT_YIELD,1)
- set_trait(TRAIT_PRODUCT_COLOUR,"#FAC0F2")
- set_trait(TRAIT_PLANT_COLOUR,"#C4B1C2")
-
/datum/seed/mushroom/hallucinogenic
name = "reishi"
seed_name = "reishi"
@@ -561,9 +546,9 @@
set_trait(TRAIT_PRODUCT_ICON,"flower2")
set_trait(TRAIT_PRODUCT_COLOUR,"#FFF700")
set_trait(TRAIT_PLANT_ICON,"flower2")
- set_trait(TRAIT_IDEAL_LIGHT, 7)
+ set_trait(TRAIT_IDEAL_LIGHT, 7)
set_trait(TRAIT_WATER_CONSUMPTION, 6)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
//Grapes/varieties
/datum/seed/grapes
@@ -585,7 +570,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#378F2E")
set_trait(TRAIT_PLANT_ICON,"vine")
set_trait(TRAIT_IDEAL_LIGHT, 6)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
/datum/seed/grapes/green
name = "greengrapes"
@@ -615,7 +600,7 @@
set_trait(TRAIT_PRODUCT_ICON,"potato")
set_trait(TRAIT_PRODUCT_COLOUR,"#C4AE7A")
set_trait(TRAIT_PLANT_ICON,"bush2")
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
/datum/seed/cabbage
name = "cabbage"
@@ -658,7 +643,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#69AD50")
set_trait(TRAIT_PLANT_ICON,"tree4")
set_trait(TRAIT_IDEAL_HEAT, 298)
- set_trait(TRAIT_IDEAL_LIGHT, 7)
+ set_trait(TRAIT_IDEAL_LIGHT, 7)
set_trait(TRAIT_WATER_CONSUMPTION, 6)
/datum/seed/corn
@@ -680,7 +665,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#87C969")
set_trait(TRAIT_PLANT_ICON,"corn")
set_trait(TRAIT_IDEAL_HEAT, 298)
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
set_trait(TRAIT_WATER_CONSUMPTION, 6)
/datum/seed/potato
@@ -737,7 +722,7 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#DBD37D")
set_trait(TRAIT_PLANT_COLOUR,"#BFAF82")
set_trait(TRAIT_PLANT_ICON,"stalk2")
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
/datum/seed/rice
@@ -853,7 +838,7 @@
set_trait(TRAIT_PLANT_ICON,"vine2")
set_trait(TRAIT_FLESH_COLOUR,"#F22C2C")
set_trait(TRAIT_IDEAL_HEAT, 298)
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
set_trait(TRAIT_WATER_CONSUMPTION, 6)
/datum/seed/pumpkin
@@ -908,7 +893,7 @@
set_trait(TRAIT_PRODUCES_POWER,1)
set_trait(TRAIT_PRODUCT_COLOUR,"#F0E226")
set_trait(TRAIT_FLESH_COLOUR,"#F0E226")
- set_trait(TRAIT_IDEAL_LIGHT, 6)
+ set_trait(TRAIT_IDEAL_LIGHT, 6)
/datum/seed/citrus/orange
name = "orange"
@@ -940,7 +925,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#07D900")
set_trait(TRAIT_PLANT_ICON,"grass")
set_trait(TRAIT_WATER_CONSUMPTION, 0.5)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
/datum/seed/cocoa
name = "cocoa"
@@ -1040,7 +1025,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#378C61")
set_trait(TRAIT_PLANT_ICON,"tree5")
set_trait(TRAIT_IDEAL_HEAT, 283)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
/datum/seed/mtear
name = "mtear"
@@ -1060,7 +1045,7 @@
set_trait(TRAIT_PLANT_COLOUR,"#4CC789")
set_trait(TRAIT_PLANT_ICON,"bush7")
set_trait(TRAIT_IDEAL_HEAT, 283)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
+ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
/datum/seed/telriis
name = "telriis"
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
index 093c4d7926f..e14fbd792bb 100644
--- a/code/modules/hydroponics/seed_packets.dm
+++ b/code/modules/hydroponics/seed_packets.dm
@@ -182,9 +182,6 @@ var/global/list/plant_seed_sprites = list()
/obj/item/seeds/plumpmycelium
seed_type = "plumphelmet"
-/obj/item/seeds/walkingmushroommycelium
- seed_type = "walkingmushroom"
-
/obj/item/seeds/nettleseed
seed_type = "nettle"
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 7dca31d9772..329ed982276 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -124,7 +124,7 @@
)
/obj/machinery/portable_atmospherics/hydroponics/AltClick()
- if(mechanical && !usr.stat && !usr.lying && Adjacent(usr))
+ if(mechanical && !usr.incapacitated() && Adjacent(usr))
close_lid(usr)
return 1
return ..()
@@ -357,12 +357,15 @@
set category = "Object"
set src in view(1)
- if(labelled)
- usr << "You remove the label."
- labelled = null
- update_icon()
- else
- usr << "There is no label to remove."
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ if(labelled)
+ usr << "You remove the label."
+ labelled = null
+ update_icon()
+ else
+ usr << "There is no label to remove."
return
/obj/machinery/portable_atmospherics/hydroponics/verb/setlight()
@@ -370,10 +373,14 @@
set category = "Object"
set src in view(1)
- var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10)
- if(new_light)
- tray_light = new_light
- usr << "You set the tray to a light level of [tray_light] lumens."
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10)
+ if(new_light)
+ tray_light = new_light
+ usr << "You set the tray to a light level of [tray_light] lumens."
+ return
/obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity()
//Make sure various values are sane.
@@ -614,12 +621,14 @@
set name = "Toggle Tray Lid"
set category = "Object"
set src in view(1)
- close_lid(usr)
+ if(usr.incapacitated())
+ return
+
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ close_lid(usr)
+ return
/obj/machinery/portable_atmospherics/hydroponics/proc/close_lid(var/mob/living/user)
- if(!user || user.stat || user.restrained())
- return
-
closed_system = !closed_system
user << "You [closed_system ? "close" : "open"] the tray's lid."
update_icon()
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 93e2c88d42d..18c96cf622c 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -11,7 +11,7 @@
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
- if(integrity>=100)
+ if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index a4379cf871c..9daa14d1faf 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -9,7 +9,7 @@
var/default_type = DEFAULT_WALL_MATERIAL
var/material/material
- var/perunit
+ var/perunit = SHEET_MATERIAL_AMOUNT
var/apply_colour //temp pending icon rewrite
/obj/item/stack/material/New()
@@ -28,7 +28,6 @@
stacktype = material.stack_type
if(islist(material.stack_origin_tech))
origin_tech = material.stack_origin_tech.Copy()
- perunit = SHEET_MATERIAL_AMOUNT
if(apply_colour)
color = material.icon_colour
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 8a919c98a59..490513431b7 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -571,7 +571,7 @@ var/list/name_to_material
name = "wood"
stack_type = /obj/item/stack/material/wood
icon_colour = "#824B28"
- integrity = 25
+ integrity = 50
icon_base = "solid"
explosion_resistance = 2
shard_type = SHARD_SPLINTER
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index a491d383ffa..7a2783767be 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -85,10 +85,8 @@ var/list/mining_overlay_cache = list()
/turf/simulated/mineral/initialize()
if(prob(20))
overlay_detail = "asteroid[rand(0,9)]"
- if(density)
- spawn(0)
- MineralSpread()
update_icon(1)
+ return density && mineral
/turf/simulated/mineral/update_icon(var/update_neighbors)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 5d3915c7fd8..714b001f691 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -151,6 +151,8 @@ Works together with spawning an observer, noted above.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
ghost.key = key
+ if(ghost.client)
+ ghost.client.time_died_as_mouse = ghost.timeofdeath
if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
return ghost
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 014c27df1b2..906fe225219 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -16,7 +16,7 @@
animation.master = src
flick(anim, animation)
- if(do_gibs) gibs(loc, viruses, dna)
+ if(do_gibs) gibs(loc, dna)
spawn(15)
if(animation) qdel(animation)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 9908a6378f1..340546002ff 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -2,9 +2,8 @@
//m_type == 1 --> visual.
//m_type == 2 --> audible
/mob/proc/custom_emote(var/m_type=1,var/message = null)
-
if(stat || !use_me && usr == src)
- usr << "You are unable to emote."
+ src << "You are unable to emote."
return
var/muzzled = is_muzzled()
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 15931f44d38..15c3dc321e5 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -9,7 +9,8 @@ var/list/holder_mob_icon_cache = list()
show_messages = 1
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Teshari" = 'icons/mob/species/seromi/head.dmi'
)
origin_tech = null
@@ -97,7 +98,7 @@ var/list/holder_mob_icon_cache = list()
/mob/living/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
- if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H))
+ if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP))
get_scooped(H, (usr == src))
return
return ..()
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index c998ad1bd07..77eedec9005 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -103,64 +103,34 @@ var/list/slot_equipment_priority = list( \
//Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_l_hand(var/obj/item/W)
- if(lying) return 0
- if(!istype(W)) return 0
- if(!l_hand)
- W.forceMove(src) //TODO: move to equipped?
- l_hand = W
- W.layer = 20 //TODO: move to equipped?
-// l_hand.screen_loc = ui_lhand
- W.equipped(src,slot_l_hand)
- if(client) client.screen |= W
- if(pulling == W) stop_pulling()
- update_inv_l_hand()
- return 1
- return 0
+ if(lying || !istype(W))
+ return 0
+ return 1
//Puts the item into your r_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_r_hand(var/obj/item/W)
- if(lying) return 0
- if(!istype(W)) return 0
- if(!r_hand)
- W.forceMove(src)
- r_hand = W
- W.layer = 20
-// r_hand.screen_loc = ui_rhand
- W.equipped(src,slot_r_hand)
- if(client) client.screen |= W
- if(pulling == W) stop_pulling()
- update_inv_r_hand()
- return 1
- return 0
+ if(lying || !istype(W))
+ return 0
+ return 1
//Puts the item into our active hand if possible. returns 1 on success.
/mob/proc/put_in_active_hand(var/obj/item/W)
- if(hand) return put_in_l_hand(W)
- else return put_in_r_hand(W)
+ return 0 // Moved to human procs because only they need to use hands.
//Puts the item into our inactive hand if possible. returns 1 on success.
/mob/proc/put_in_inactive_hand(var/obj/item/W)
- if(hand) return put_in_r_hand(W)
- else return put_in_l_hand(W)
+ return 0 // As above.
//Puts the item our active hand if possible. Failing that it tries our inactive hand. Returns 1 on success.
//If both fail it drops it on the floor and returns 0.
//This is probably the main one you need to know :)
/mob/proc/put_in_hands(var/obj/item/W)
- if(!W) return 0
- if(put_in_active_hand(W))
- update_inv_l_hand()
- update_inv_r_hand()
- return 1
- else if(put_in_inactive_hand(W))
- update_inv_l_hand()
- update_inv_r_hand()
- return 1
- else
- W.forceMove(get_turf(src))
- W.layer = initial(W.layer)
- W.dropped()
+ if(!W)
return 0
+ W.forceMove(get_turf(src))
+ W.layer = initial(W.layer)
+ W.dropped()
+ return 0
// Removes an item from inventory and places it in the target atom.
// If canremove or other conditions need to be checked then use unEquip instead.
@@ -216,7 +186,7 @@ var/list/slot_equipment_priority = list( \
wear_mask = null
update_inv_wear_mask(0)
return
-
+
/mob/proc/isEquipped(obj/item/I)
if(!I)
return 0
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 53d42c47690..438b680f67c 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -115,6 +115,25 @@
else
return pick(ai_names)
+/datum/language/seromi
+ name = "Schechi"
+ desc = "A trilling language spoken by the diminutive Teshari."
+ speech_verb = "chirps"
+ ask_verb = "chirrups"
+ exclaim_verb = "trills"
+ colour = "alien"
+ key = "v"
+ flags = WHITELISTED
+ space_chance = 50
+ syllables = list(
+ "ca", "ra", "ma", "sa", "na", "ta", "la", "sha", "scha", "a", "a",
+ "ce", "re", "me", "se", "ne", "te", "le", "she", "sche", "e", "e",
+ "ci", "ri", "mi", "si", "ni", "ti", "li", "shi", "schi", "i", "i"
+ )
+
+/datum/language/seromi/get_random_name(gender)
+ return ..(gender, 1, 4, 1.5)
+
//Syllable Lists
/*
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm
index 5d3f7e487ca..30b1c0a47b4 100644
--- a/code/modules/mob/living/bot/cleanbot.dm
+++ b/code/modules/mob/living/bot/cleanbot.dm
@@ -26,6 +26,8 @@
var/blood = 1
var/list/target_types = list()
+ var/maximum_search_range = 7
+
/mob/living/bot/cleanbot/New()
..()
get_targets()
@@ -36,6 +38,25 @@
if(radio_controller)
radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS)
+/mob/living/bot/cleanbot/proc/handle_target()
+ if(loc == target.loc)
+ if(!cleaning)
+ UnarmedAttack(target)
+ return 1
+ if(!path.len)
+// spawn(0)
+ path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard)
+ if(!path)
+ custom_emote(2, "[src] can't reach the target and is giving up.")
+ target = null
+ path = list()
+ return
+ if(path.len)
+ step_to(src, path[1])
+ path -= path[1]
+ return 1
+ return
+
/mob/living/bot/cleanbot/Life()
..()
@@ -46,7 +67,7 @@
return
if(cleaning)
return
-
+
if(!screwloose && !oddbutton && prob(5))
custom_emote(2, "makes an excited beeping booping sound!")
@@ -62,65 +83,64 @@
spawn(600)
ignorelist -= gib
- if(!target) // Find a target
- for(var/obj/effect/decal/cleanable/D in view(7, src))
- if(D in ignorelist)
- continue
- for(var/T in target_types)
- if(istype(D, T))
- target = D
- patrol_path = list()
+ // Find a target
+
+ if(pulledby) // Don't wiggle if someone pulls you
+ patrol_path = list()
+ return
- if(!target) // No targets in range
- if(!should_patrol)
- return
+ var/found_spot
+ search_loop:
+ for(var/i=0, i <= maximum_search_range, i++)
+ for(var/obj/effect/decal/cleanable/D in view(i, src))
+ if(D in ignorelist)
+ continue
+ for(var/T in target_types)
+ if(istype(D, T))
+ patrol_path = list()
+ target = D
+ found_spot = handle_target()
+ if (found_spot)
+ break search_loop
+ else
+ target = null
+ continue // no need to check the other types
- if(!patrol_path || !patrol_path.len)
- if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet
- var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq)
- if(!frequency)
- return
- closest_dist = 9999
- next_dest = null
- next_dest_loc = null
-
- var/datum/signal/signal = new()
- signal.source = src
- signal.transmission_method = 1
- signal.data = list("findbeakon" = "patrol")
- frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
- signal_sent = world.time
- else
- if(next_dest)
- next_dest_loc = listener.memorized[next_dest]
- if(next_dest_loc)
- patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null)
- signal_sent = 0
- else
- if(pulledby) // Don't wiggle if someone pulls you
- patrol_path = list()
+ if(!found_spot && !target) // No targets in range
+ if(!patrol_path || !patrol_path.len)
+ if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet
+ var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq)
+ if(!frequency)
return
- if(patrol_path[1] == loc)
- patrol_path -= patrol_path[1]
- var/moved = step_towards(src, patrol_path[1])
- if(moved)
- patrol_path -= patrol_path[1]
- if(target)
- if(loc == target.loc)
- if(!cleaning)
- UnarmedAttack(target)
+
+ closest_dist = 9999
+ next_dest = null
+ next_dest_loc = null
+
+ var/datum/signal/signal = new()
+ signal.source = src
+ signal.transmission_method = 1
+ signal.data = list("findbeakon" = "patrol")
+ frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
+ signal_sent = world.time
+ else
+ if(next_dest)
+ next_dest_loc = listener.memorized[next_dest]
+ if(next_dest_loc)
+ patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null)
+ signal_sent = 0
+ else
+ if(pulledby) // Don't wiggle if someone pulls you
+ patrol_path = list()
return
- if(!path.len)
- spawn(0)
- path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard)
- if(!path)
- path = list()
- return
- if(path.len)
- step_to(src, path[1])
- path -= path[1]
- return
+ if(patrol_path[1] == loc)
+ patrol_path -= patrol_path[1]
+ var/moved = step_towards(src, patrol_path[1])
+ if(moved)
+ patrol_path -= patrol_path[1]
+
+
/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity)
if(!..())
@@ -133,7 +153,7 @@
return
cleaning = 1
- custom_emote(2, "begins to clean up the [D]")
+ custom_emote(2, "begins to clean up \the [D]")
update_icons()
var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50
if(do_after(src, cleantime))
@@ -143,6 +163,8 @@
if(!D)
return
qdel(D)
+ if(D == target)
+ target = null
cleaning = 0
update_icons()
diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm
index 570e58ec2ee..ac15eca6ce9 100644
--- a/code/modules/mob/living/bot/ed209bot.dm
+++ b/code/modules/mob/living/bot/ed209bot.dm
@@ -56,8 +56,6 @@
return
last_shot = world.time
- var/turf/T = get_turf(src)
- var/turf/U = get_turf(A)
var/projectile = /obj/item/projectile/beam/stun
if(emagged)
@@ -66,13 +64,7 @@
playsound(loc, emagged ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1)
var/obj/item/projectile/P = new projectile(loc)
- P.original = A
- P.starting = T
- P.current = T
- P.yo = U.y - T.y
- P.xo = U.x - T.x
- spawn()
- P.process()
+ P.launch(A)
return
// Assembly
diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm
index 55f20940213..2fdabecbbcd 100644
--- a/code/modules/mob/living/bot/medbot.dm
+++ b/code/modules/mob/living/bot/medbot.dm
@@ -287,10 +287,6 @@
if((H.getToxLoss() >= heal_threshold) && (!H.reagents.has_reagent(treatment_tox)))
return treatment_tox
- for(var/datum/disease/D in H.viruses)
- if (!H.reagents.has_reagent(treatment_virus))
- return treatment_virus // STOP DISEASE FOREVER
-
/* Construction */
/obj/item/weapon/storage/firstaid/attackby(var/obj/item/robot_parts/S, mob/user as mob)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 50e04187662..1b09c1b1e12 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -93,18 +93,6 @@
H << "\red You can't use your [temp.name]"
return
- for(var/datum/disease/D in viruses)
-
- if(D.spread_by_touch())
-
- M.contract_disease(D, 0, 1, CONTACT_HANDS)
-
- for(var/datum/disease/D in M.viruses)
-
- if(D.spread_by_touch())
-
- contract_disease(D, 0, 1, CONTACT_HANDS)
-
return
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null)
@@ -140,12 +128,6 @@
return
/mob/living/carbon/swap_hand()
- var/obj/item/item_in_hand = src.get_active_hand()
- if(item_in_hand) //this segment checks if the item in your hand is twohanded.
- if(istype(item_in_hand,/obj/item/weapon/material/twohanded))
- if(item_in_hand:wielded == 1)
- usr << "Your other hand is too busy holding the [item_in_hand.name]"
- return
src.hand = !( src.hand )
if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
if(hand) //This being 1 means the left hand is in use
@@ -154,10 +136,6 @@
else
hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
hud_used.r_hand_hud_object.icon_state = "r_hand_active"
- /*if (!( src.hand ))
- src.hands.set_dir(NORTH)
- else
- src.hands.set_dir(SOUTH)*/
return
/mob/living/carbon/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
@@ -207,7 +185,7 @@
if(40 to INFINITY)
status += "peeling away"
- if(org.status & ORGAN_DESTROYED)
+ if(org.is_stump())
status += "MISSING"
if(org.status & ORGAN_MUTATED)
status += "weirdly shapen"
diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm
index 579321a5128..5c4be494ee5 100644
--- a/code/modules/mob/living/carbon/give.dm
+++ b/code/modules/mob/living/carbon/give.dm
@@ -1,53 +1,42 @@
-mob/living/carbon/verb/give(var/mob/living/carbon/target in view(1)-usr)
+/mob/living/carbon/human/verb/give(var/mob/living/target in view(1)-usr)
set category = "IC"
set name = "Give"
- if(!istype(target) || target.stat == 2 || usr.stat == 2|| target.client == null)
+
+ // TODO : Change to incapacitated() on merge.
+ if(usr.stat || usr.lying || usr.resting || usr.buckled)
return
- var/obj/item/I
- if(!usr.hand && usr.r_hand == null)
- usr << "You don't have anything in your right hand to give to [target.name]"
+ if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null)
return
- if(usr.hand && usr.l_hand == null)
- usr << "You don't have anything in your left hand to give to [target.name]"
- return
- if(usr.hand)
- I = usr.l_hand
- else if(!usr.hand)
- I = usr.r_hand
+
+ var/obj/item/I = usr.get_active_hand()
if(!I)
+ I = usr.get_inactive_hand()
+ if(!I)
+ usr << "You don't have anything in your hands to give to \the [target]."
return
- if(target.r_hand == null || target.l_hand == null)
- switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No"))
- if("Yes")
- if(!I)
- return
- if(!Adjacent(usr))
- usr << "You need to stay in reaching distance while giving an object."
- target << "[usr.name] moved too far away."
- return
- if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I))
- usr << "You need to keep the item in your active hand."
- target << "[usr.name] seem to have given up on giving \the [I.name] to you."
- return
- if(target.r_hand != null && target.l_hand != null)
- target << "Your hands are full."
- usr << "Their hands are full."
- return
- else
- usr.drop_item()
- if(target.r_hand == null)
- target.r_hand = I
- else
- target.l_hand = I
- I.loc = target
- I.layer = 20
- I.add_fingerprint(target)
- target.update_inv_l_hand()
- target.update_inv_r_hand()
- usr.update_inv_l_hand()
- usr.update_inv_r_hand()
- target.visible_message("[usr.name] handed \the [I.name] to [target.name].")
- if("No")
- target.visible_message("[usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.")
- else
- usr << "[target.name]'s hands are full."
+
+ if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No")
+ target.visible_message("\The [usr] tried to hand \the [I] to \the [target], \
+ but \the [target] didn't want it.")
+ return
+
+ if(!I) return
+
+ if(!Adjacent(target))
+ usr << "You need to stay in reaching distance while giving an object."
+ target << "\The [usr] moved too far away."
+ return
+
+ if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I))
+ usr << "You need to keep the item in your hands."
+ target << "\The [usr] seems to have given up on passing \the [I] to you."
+ return
+
+ if(target.r_hand != null && target.l_hand != null)
+ target << "Your hands are full."
+ usr << "Their hands are full."
+ return
+
+ if(usr.unEquip(I))
+ target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea.
+ target.visible_message("\The [usr] handed \the [I] to \the [target].")
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 359d60c3e1d..368cad0ff7d 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -15,7 +15,7 @@
I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class))
..(species.gibbed_anim)
- gibs(loc, viruses, dna, null, species.get_flesh_colour(src), species.get_blood_colour(src))
+ gibs(loc, dna, null, species.get_flesh_colour(src), species.get_blood_colour(src))
/mob/living/carbon/human/dust()
if(species)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index e98022acfdb..885d3e0866b 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -25,7 +25,7 @@
message = "is strumming the air and headbanging like a safari chimp."
m_type = 1
- if("ping", "beep", "buzz")
+ if("ping", "beep", "buzz", "yes", "no")
if(!isSynthetic())
src << "You are not a synthetic."
@@ -48,6 +48,12 @@
else if(act == "ping")
display_msg = "pings"
use_sound = 'sound/machines/ping.ogg'
+ else if(act == "yes")
+ display_msg = "emits an affirmative blip"
+ use_sound = 'sound/machines/synth_yes.ogg'
+ else if(act == "no")
+ display_msg = "emits a negative blip"
+ use_sound = 'sound/machines/synth_no.ogg'
if (param)
message = "[display_msg] at [param]."
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index d9a6850c3af..f22aecce453 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -243,9 +243,6 @@
msg += ""
- if(getBrainLoss() >= 60)
- msg += "[T.He] [T.has] a stupid expression on [T.his] face.\n"
-
var/ssd_msg = species.get_ssd(src)
if(ssd_msg && (!should_have_organ("brain") || has_brain()) && stat != DEAD)
if(!key)
@@ -254,14 +251,12 @@
msg += "[T.He] [T.is] [ssd_msg].\n"
var/list/wound_flavor_text = list()
- var/list/is_destroyed = list()
var/list/is_bleeding = list()
for(var/organ_tag in species.has_limbs)
var/list/organ_data = species.has_limbs[organ_tag]
var/organ_descriptor = organ_data["descriptor"]
- is_destroyed["organ_descriptor"] = 1
var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E)
@@ -269,13 +264,11 @@
else if(E.is_stump())
wound_flavor_text["[organ_descriptor]"] = "[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.\n"
else
- is_destroyed["organ_descriptor"] = 0
continue
for(var/obj/item/organ/external/temp in organs)
if(temp)
if(temp.status & ORGAN_DESTROYED)
- is_destroyed["[temp.name]"] = 1
wound_flavor_text["[temp.name]"] = "[T.He] [T.is] missing [T.his] [temp.name].\n"
continue
if(!is_synth && temp.status & ORGAN_ROBOT)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index f77be45d561..a0636f453f4 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -305,7 +305,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/obj/item/organ/external/head = get_organ(BP_HEAD)
- if(!head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
+ if(!head || head.disfigured || head.is_stump() || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
return "Unknown"
return real_name
@@ -909,9 +909,6 @@
H.brainmob.mind.transfer_to(src)
qdel(H)
- for (var/datum/disease/virus in viruses)
- virus.cure()
-
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
V.cure(src)
@@ -1360,6 +1357,48 @@
return 1
return 0
+//Puts the item into our active hand if possible. returns 1 on success.
+/mob/living/carbon/human/put_in_active_hand(var/obj/item/W)
+ return (hand ? put_in_l_hand(W) : put_in_r_hand(W))
+
+//Puts the item into our inactive hand if possible. returns 1 on success.
+/mob/living/carbon/human/put_in_inactive_hand(var/obj/item/W)
+ return (hand ? put_in_r_hand(W) : put_in_l_hand(W))
+
+/mob/living/carbon/human/put_in_hands(var/obj/item/W)
+ if(!W)
+ return 0
+ if(put_in_active_hand(W))
+ update_inv_l_hand()
+ update_inv_r_hand()
+ return 1
+ else if(put_in_inactive_hand(W))
+ update_inv_l_hand()
+ update_inv_r_hand()
+ return 1
+ else
+ return ..()
+
+/mob/living/carbon/human/put_in_l_hand(var/obj/item/W)
+ if(!..() || l_hand)
+ return 0
+ W.forceMove(src)
+ l_hand = W
+ W.equipped(src,slot_l_hand)
+ W.add_fingerprint(src)
+ update_inv_l_hand()
+ return 1
+
+/mob/living/carbon/human/put_in_r_hand(var/obj/item/W)
+ if(!..() || r_hand)
+ return 0
+ W.forceMove(src)
+ r_hand = W
+ W.equipped(src,slot_r_hand)
+ W.add_fingerprint(src)
+ update_inv_r_hand()
+ return 1
+
/mob/living/carbon/human/can_stand_overridden()
if(wearing_rig && wearing_rig.ai_can_move_suit(check_for_ai = 1))
// Actually missing a leg will screw you up. Everything else can be compensated for.
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index cea8035a842..3298cfcd8ca 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -138,7 +138,7 @@
var/hit_zone = H.zone_sel.selecting
var/obj/item/organ/external/affecting = get_organ(hit_zone)
- if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED))
+ if(!affecting || affecting.is_stump())
M << "They are missing that limb!"
return 1
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2e69c9bdb64..01da722636f 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -143,6 +143,12 @@ emp_act
for(var/obj/O in src)
if(!O) continue
O.emp_act(severity)
+ for(var/obj/item/organ/external/O in organs)
+ O.emp_act(severity)
+ for(var/obj/item/organ/I in O.internal_organs)
+ if(!(I.status & ORGAN_ROBOT))
+ continue
+ I.emp_act(severity)
..()
@@ -160,7 +166,7 @@ emp_act
var/obj/item/organ/external/affecting = get_organ(target_zone)
- if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
+ if (!affecting || affecting.is_stump())
user << "They are missing that limb!"
return 0
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
new file mode 100644
index 00000000000..437c9d06a5b
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -0,0 +1,37 @@
+#define HUMAN_EATING_NO_ISSUE 0
+#define HUMAN_EATING_NO_MOUTH 1
+#define HUMAN_EATING_BLOCKED_MOUTH 2
+
+/mob/living/carbon/human/can_eat(var/food, var/feedback = 1)
+ var/list/status = can_eat_status()
+ if(status[1] == HUMAN_EATING_NO_ISSUE)
+ return 1
+ if(feedback)
+ if(status[1] == HUMAN_EATING_NO_MOUTH)
+ src << "Where do you intend to put \the [food]? You don't have a mouth!"
+ else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH)
+ src << "\The [status[2]] is in the way!"
+ return 0
+
+/mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1)
+ var/list/status = can_eat_status()
+ if(status[1] == HUMAN_EATING_NO_ISSUE)
+ return 1
+ if(feedback)
+ if(status[1] == HUMAN_EATING_NO_MOUTH)
+ feeder << "Where do you intend to put \the [food]? \The [src] doesn't have a mouth!"
+ else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH)
+ feeder << "\The [status[2]] is in the way!"
+ return 0
+
+/mob/living/carbon/human/proc/can_eat_status()
+ if(!check_has_mouth())
+ return list(HUMAN_EATING_NO_MOUTH)
+ var/obj/item/blocked = check_mouth_coverage()
+ if(blocked)
+ return list(HUMAN_EATING_BLOCKED_MOUTH, blocked)
+ return list(HUMAN_EATING_NO_ISSUE)
+
+#undef HUMAN_EATING_NO_ISSUE
+#undef HUMAN_EATING_NO_MOUTH
+#undef HUMAN_EATING_BLOCKED_MOUTH
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index ca052edb859..ba3d29c33a1 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -28,7 +28,7 @@
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/E = get_organ(organ_name)
- if(!E || (E.status & ORGAN_DESTROYED))
+ if(!E || E.is_stump())
tally += 4
if(E.status & ORGAN_SPLINTED)
tally += 0.5
@@ -40,7 +40,7 @@
for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = get_organ(organ_name)
- if(!E || (E.status & ORGAN_DESTROYED))
+ if(!E || E.is_stump())
tally += 4
else if(E.status & ORGAN_SPLINTED)
tally += 0.5
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index b3c8660a27f..e87fd83dd4b 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -71,7 +71,7 @@
var/limb_pain
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = organs_by_name[limb_tag]
- if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)))
+ if(!E || (E.status & (ORGAN_MUTATED|ORGAN_DEAD)) || E.is_stump()) //should just be !E.is_usable() here but dislocation screws that up.
stance_damage += 2 // let it fail even if just foot&leg
else if (E.is_malfunctioning())
//malfunctioning only happens intermittently so treat it as a missing limb when it procs
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 2f0160f35e6..42262b8c93c 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -1,15 +1,7 @@
/*
Add fingerprints to items when we put them in our hands.
This saves us from having to call add_fingerprint() any time something is put in a human's hands programmatically.
-
*/
-/mob/living/carbon/human/put_in_l_hand(var/obj/item/W)
- . = ..()
- if(.) W.add_fingerprint(src)
-
-/mob/living/carbon/human/put_in_r_hand(var/obj/item/W)
- . = ..()
- if(.) W.add_fingerprint(src)
/mob/living/carbon/human/verb/quick_equip()
set name = "quick-equip"
@@ -40,7 +32,7 @@ This saves us from having to call add_fingerprint() any time something is put in
/mob/living/carbon/human/proc/has_organ(name)
var/obj/item/organ/external/O = organs_by_name[name]
- return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump())
+ return (O && !O.is_stump())
/mob/living/carbon/human/proc/has_organ_for_slot(slot)
switch(slot)
@@ -171,9 +163,15 @@ This saves us from having to call add_fingerprint() any time something is put in
update_inv_legcuffed()
else if (W == r_hand)
r_hand = null
+ if(l_hand)
+ l_hand.update_held_icon()
+ update_inv_l_hand()
update_inv_r_hand()
else if (W == l_hand)
l_hand = null
+ if(r_hand)
+ r_hand.update_held_icon()
+ update_inv_l_hand()
update_inv_l_hand()
else
return 0
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 085e070f0a1..4a8e099a726 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -86,7 +86,6 @@
if(!client)
species.handle_npc(src)
- handle_stasis_bag()
if(!handle_some_updates())
return //We go ahead and process them 5 times for HUD images and other stuff though.
@@ -190,17 +189,6 @@
speech_problem_flag = 1
if (prob(10))
stuttering = max(10, stuttering)
- // No. -- cib
- /*if (getBrainLoss() >= 60 && stat != 2)
- if (prob(3))
- switch(pick(1,2,3))
- if(1)
- say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that meatball traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
- if(2)
- say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!"))
- if(3)
- emote("drool")
- */
if(stat != 2)
var/rn = rand(0, 200)
@@ -224,15 +212,7 @@
src << "Your legs won't respond properly, you fall down!"
Weaken(10)
-/mob/living/carbon/human/proc/handle_stasis_bag()
- // Handle side effects from stasis bag
- if(in_stasis)
- // First off, there's no oxygen supply, so the mob will slowly take brain damage
- adjustBrainLoss(0.1)
- // Next, the method to induce stasis has some adverse side-effects, manifesting
- // as cloneloss
- adjustCloneLoss(0.1)
/mob/living/carbon/human/handle_mutations_and_radiation()
if(in_stasis)
@@ -583,7 +563,14 @@
pl_effects()
break
- if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature.
+ if(istype(get_turf(src), /turf/space))
+ //Don't bother if the temperature drop is less than 0.1 anyways. Hopefully BYOND is smart enough to turn this constant expression into a constant
+ if(bodytemperature > (0.1 * HUMAN_HEAT_CAPACITY/(HUMAN_EXPOSED_SURFACE_AREA*STEFAN_BOLTZMANN_CONSTANT))**(1/4) + COSMIC_RADIATION_TEMPERATURE)
+ //Thermal radiation into space
+ var/heat_loss = HUMAN_EXPOSED_SURFACE_AREA * STEFAN_BOLTZMANN_CONSTANT * ((bodytemperature - COSMIC_RADIATION_TEMPERATURE)**4)
+ var/temperature_loss = heat_loss/HUMAN_HEAT_CAPACITY
+ bodytemperature -= temperature_loss
+ else
var/loc_temp = T0C
if(istype(loc, /obj/mecha))
var/obj/mecha/M = loc
@@ -597,7 +584,7 @@
pressure_alert = 0
return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
- //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection
+ //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection (convection)
var/temp_adj = 0
if(loc_temp < bodytemperature) //Place is colder than we are
var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
@@ -691,6 +678,8 @@
// We produce heat naturally.
if (species.passive_temp_gain)
bodytemperature += species.passive_temp_gain
+ if (species.body_temperature == null)
+ return //this species doesn't have metabolic thermoregulation
// Robolimbs cause overheating too.
if(robolimb_count)
@@ -702,7 +691,7 @@
return //fuck this precision
if (on_fire)
- return //too busy for pesky convection
+ return //too busy for pesky metabolic regulation
if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up.
@@ -1257,7 +1246,7 @@
if(healths)
if (analgesic > 100)
- healths.icon_state = "health_health_numb"
+ healths.icon_state = "health_numb"
else
switch(hal_screwyhud)
if(1) healths.icon_state = "health6"
@@ -1273,8 +1262,6 @@
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
- if(!seer)
- see_invisible = SEE_INVISIBLE_LIVING
if(nutrition_icon)
switch(nutrition)
if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0"
@@ -1312,31 +1299,36 @@
if(260 to 280) bodytemp.icon_state = "temp-3"
else bodytemp.icon_state = "temp-4"
else
+ //TODO: precalculate all of this stuff when the species datum is created
+ var/base_temperature = species.body_temperature
+ if(base_temperature == null) //some species don't have a set metabolic temperature
+ base_temperature = (species.heat_level_1 + species.cold_level_1)/2
+
var/temp_step
- if (bodytemperature >= species.body_temperature)
- temp_step = (species.heat_level_1 - species.body_temperature)/4
+ if (bodytemperature >= base_temperature)
+ temp_step = (species.heat_level_1 - base_temperature)/4
if (bodytemperature >= species.heat_level_1)
bodytemp.icon_state = "temp4"
- else if (bodytemperature >= species.body_temperature + temp_step*3)
+ else if (bodytemperature >= base_temperature + temp_step*3)
bodytemp.icon_state = "temp3"
- else if (bodytemperature >= species.body_temperature + temp_step*2)
+ else if (bodytemperature >= base_temperature + temp_step*2)
bodytemp.icon_state = "temp2"
- else if (bodytemperature >= species.body_temperature + temp_step*1)
+ else if (bodytemperature >= base_temperature + temp_step*1)
bodytemp.icon_state = "temp1"
else
bodytemp.icon_state = "temp0"
- else if (bodytemperature < species.body_temperature)
- temp_step = (species.body_temperature - species.cold_level_1)/4
+ else if (bodytemperature < base_temperature)
+ temp_step = (base_temperature - species.cold_level_1)/4
if (bodytemperature <= species.cold_level_1)
bodytemp.icon_state = "temp-4"
- else if (bodytemperature <= species.body_temperature - temp_step*3)
+ else if (bodytemperature <= base_temperature - temp_step*3)
bodytemp.icon_state = "temp-3"
- else if (bodytemperature <= species.body_temperature - temp_step*2)
+ else if (bodytemperature <= base_temperature - temp_step*2)
bodytemp.icon_state = "temp-2"
- else if (bodytemperature <= species.body_temperature - temp_step*1)
+ else if (bodytemperature <= base_temperature - temp_step*1)
bodytemp.icon_state = "temp-1"
else
bodytemp.icon_state = "temp0"
@@ -1620,17 +1612,15 @@
hud_list[HEALTH_HUD] = holder
if (BITTEST(hud_updateflag, LIFE_HUD))
- var/image/holder = hud_list[STATUS_HUD]
+ var/image/holder = hud_list[LIFE_HUD]
if(stat == DEAD)
holder.icon_state = "huddead"
else
holder.icon_state = "hudhealthy"
+ hud_list[LIFE_HUD] = holder
if (BITTEST(hud_updateflag, STATUS_HUD))
var/foundVirus = 0
- for(var/datum/disease/D in viruses)
- if(!D.hidden[SCANNER])
- foundVirus++
for (var/ID in virus2)
if (ID in virusDB)
foundVirus = 1
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 685b122590d..cbfb88676a4 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -143,16 +143,6 @@
if(parent[3])
speech_problem_flag = 1
- var/braindam = getBrainLoss()
- if(braindam >= 60)
- speech_problem_flag = 1
- if(prob(braindam/4))
- message = stutter(message)
- verb = pick("stammers", "stutters")
- if(prob(braindam))
- message = uppertext(message)
- verb = "yells loudly"
-
var/list/returns[3]
returns[1] = message
returns[2] = verb
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index a7af36340c4..0677171f05f 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -178,7 +178,10 @@
return ((H && H.isSynthetic()) ? "encounters a hardware fault and suddenly reboots!" : knockout_message)
/datum/species/proc/get_death_message(var/mob/living/carbon/human/H)
- return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message)
+ if(config.show_human_death_message)
+ return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message)
+ else
+ return "no message"
/datum/species/proc/get_ssd(var/mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? "flashing a 'system offline' glyph on their monitor" : show_ssd)
@@ -260,18 +263,14 @@
var/obj/item/organ/O = new limb_path(H)
organ_data["descriptor"] = O.name
- for(var/organ in has_organ)
- var/organ_type = has_organ[organ]
- H.internal_organs_by_name[organ] = new organ_type(H,1)
+ for(var/organ_tag in has_organ)
+ var/organ_type = has_organ[organ_tag]
+ var/obj/item/organ/O = new organ_type(H,1)
+ if(organ_tag != O.organ_tag)
+ warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.")
+ O.organ_tag = organ_tag
+ H.internal_organs_by_name[organ_tag] = O
- for(var/name in H.organs_by_name)
- H.organs |= H.organs_by_name[name]
-
- for(var/name in H.internal_organs_by_name)
- H.internal_organs |= H.internal_organs_by_name[name]
-
- for(var/obj/item/organ/O in (H.organs|H.internal_organs))
- O.owner = H
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm
new file mode 100644
index 00000000000..40fd5c63b82
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm
@@ -0,0 +1,117 @@
+/datum/species/teshari
+ name = "Teshari"
+ name_plural = "Tesharii"
+ blurb = "A race of feathered raptors who developed alongside the Skrell, inhabiting \
+ the polar tundral regions outside of Skrell territory. Extremely fragile, they developed \
+ hunting skills that emphasized taking out their prey without themselves getting hit. They \
+ are only recently becoming known on human stations after reaching space with Skrell assistance."
+
+ num_alternate_languages = 2
+ secondary_langs = list("Schechi", "Skrellian")
+ name_language = "Schechi"
+
+ blood_color = "#D514F7"
+ flesh_color = "#5F7BB0"
+ base_color = "#001144"
+ tail = "seromitail"
+ tail_hair = "feathers"
+
+ icobase = 'icons/mob/human_races/r_seromi.dmi'
+ deform = 'icons/mob/human_races/r_seromi.dmi'
+ damage_overlays = 'icons/mob/human_races/masks/dam_seromi.dmi'
+ damage_mask = 'icons/mob/human_races/masks/dam_mask_seromi.dmi'
+ blood_mask = 'icons/mob/human_races/masks/blood_seromi.dmi'
+
+ slowdown = -2
+ total_health = 50
+ brute_mod = 1.35
+ burn_mod = 1.35
+ mob_size = MOB_SMALL
+ holder_type = /obj/item/weapon/holder/human
+ short_sighted = 1
+ gluttonous = 1
+
+ spawn_flags = CAN_JOIN | IS_WHITELISTED
+ appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+ bump_flag = MONKEY
+ swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
+ push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
+
+ cold_level_1 = 180
+ cold_level_2 = 130
+ cold_level_3 = 70
+ heat_level_1 = 320
+ heat_level_2 = 370
+ heat_level_3 = 600
+ heat_discomfort_level = 292
+ heat_discomfort_strings = list(
+ "Your feathers prickle in the heat.",
+ "You feel uncomfortably warm.",
+ )
+ cold_discomfort_level = 180
+
+ has_limbs = list(
+ BP_CHEST = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/seromi),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand/seromi),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/seromi),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot/seromi),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/seromi)
+ )
+
+ has_organ = list(
+ O_HEART = /obj/item/organ/internal/heart,
+ O_LUNGS = /obj/item/organ/internal/lungs,
+ O_LIVER = /obj/item/organ/internal/liver,
+ O_KIDNEYS = /obj/item/organ/internal/kidneys,
+ O_BRAIN = /obj/item/organ/internal/brain,
+ O_EYES = /obj/item/organ/internal/eyes
+ )
+
+ unarmed_types = list(
+ /datum/unarmed_attack/bite/sharp,
+ /datum/unarmed_attack/claws,
+ /datum/unarmed_attack/stomp/weak
+ )
+
+ var/shock_cap = 30
+ var/hallucination_cap = 25
+
+// I'm... so... ronrery, so ronery...
+/datum/species/teshari/handle_environment_special(var/mob/living/carbon/human/H)
+
+ // If they're dead or unconcious they're a bit beyond this kind of thing.
+ if(H.stat)
+ return
+
+ // No point processing if we're already stressing the hell out.
+ if(H.hallucination >= hallucination_cap && H.shock_stage >= shock_cap)
+ return
+
+ // Check for company.
+ for(var/mob/living/M in viewers(H))
+ if(M == H || M.stat == DEAD || M.invisibility > H.see_invisible)
+ continue
+ if(M.faction == "neutral" || M.faction == H.faction)
+ return
+
+ // No company? Suffer :(
+ if(H.shock_stage < shock_cap)
+ H.shock_stage += 1
+ if(H.shock_stage >= shock_cap && H.hallucination < hallucination_cap)
+ H.hallucination += 2.5
+
+/datum/species/teshari/get_vision_flags(var/mob/living/carbon/human/H)
+ if(!(H.sdisabilities & DEAF) && !H.ear_deaf)
+ return SEE_SELF|SEE_MOBS
+ else
+ return SEE_SELF
+
+/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
+ ..()
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index a0365f7cd04..9d2ac998253 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -271,3 +271,4 @@
qdel(D)
H.visible_message("\The [H] splits apart with a wet slithering noise!")
+
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
index af8b93e6206..774075f7adc 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
@@ -70,6 +70,7 @@ var/const/MAX_ACTIVE_TIME = 400
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
+ ..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
@@ -160,7 +161,6 @@ var/const/MAX_ACTIVE_TIME = 400
return
if(!sterile)
- //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
new /obj/item/alien_embryo(target)
target.status_flags |= XENO_HOST
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index e56158904fb..af3e65b0913 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -29,11 +29,11 @@ var/global/list/sparring_attack_cache = list()
// Check if they have a functioning hand.
var/obj/item/organ/external/E = user.organs_by_name["l_hand"]
- if(E && !(E.status & ORGAN_DESTROYED))
+ if(E && !E.is_stump())
return 1
E = user.organs_by_name["r_hand"]
- if(E && !(E.status & ORGAN_DESTROYED))
+ if(E && !E.is_stump())
return 1
return 0
@@ -181,11 +181,11 @@ var/global/list/sparring_attack_cache = list()
return 0
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
+ if(E && !E.is_stump())
return 1
E = user.organs_by_name["r_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
+ if(E && !E.is_stump())
return 1
return 0
@@ -225,11 +225,11 @@ var/global/list/sparring_attack_cache = list()
if(target.grabbed_by == user && target.lying)
return 0
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
+ if(E && !E.is_stump())
return 1
E = user.organs_by_name["r_foot"]
- if(E && !(E.status & ORGAN_DESTROYED))
+ if(E && !E.is_stump())
return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 868c7913b3f..439749ac0c1 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -187,9 +187,10 @@ var/global/list/damage_icon_parts = list()
for(var/obj/item/organ/external/O in organs)
if(O.is_stump())
continue
- if(O.status & ORGAN_DESTROYED) damage_appearance += "d"
- else
- damage_appearance += O.damage_state
+ //if(O.status & ORGAN_DESTROYED) damage_appearance += "d" //what is this?
+ //else
+ // damage_appearance += O.damage_state
+ damage_appearance += O.damage_state
if(damage_appearance == previous_damage_appearance)
// nothing to do here
@@ -205,21 +206,21 @@ var/global/list/damage_icon_parts = list()
for(var/obj/item/organ/external/O in organs)
if(O.is_stump())
continue
- if(!(O.status & ORGAN_DESTROYED))
- O.update_icon()
- if(O.damage_state == "00") continue
- var/use_colour = ((O.status & ORGAN_ROBOT) ? SYNTH_BLOOD_COLOUR : O.species.get_blood_colour(src))
- var/icon/DI
- var/cache_index = "[O.damage_state]/[O.icon_name]/[use_colour]/[species.get_bodytype()]"
- if(damage_icon_parts[cache_index] == null)
- DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
- DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
- DI.Blend(use_colour, ICON_MULTIPLY)
- damage_icon_parts[cache_index] = DI
- else
- DI = damage_icon_parts[cache_index]
- standing_image.overlays += DI
+
+ O.update_icon()
+ if(O.damage_state == "00") continue
+ var/icon/DI
+ var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.get_bodytype()]"
+ if(damage_icon_parts[cache_index] == null)
+ DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
+ DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
+ DI.Blend(species.blood_color, ICON_MULTIPLY)
+ damage_icon_parts[cache_index] = DI
+ else
+ DI = damage_icon_parts[cache_index]
+
+ standing_image.overlays += DI
overlays_standing[DAMAGE_LAYER] = standing_image
@@ -261,7 +262,7 @@ var/global/list/damage_icon_parts = list()
for(var/organ_tag in species.has_limbs)
var/obj/item/organ/external/part = organs_by_name[organ_tag]
- if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED))
+ if(isnull(part) || part.is_stump())
icon_key += "0"
else if(part.status & ORGAN_ROBOT)
icon_key += "2[part.model ? "-[part.model]": ""]"
@@ -353,7 +354,7 @@ var/global/list/damage_icon_parts = list()
overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() )
if(update_icons) update_icons()
return
diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm
index d068e33e6c9..0080e0a0fc4 100644
--- a/code/modules/mob/living/carbon/metroid/items.dm
+++ b/code/modules/mob/living/carbon/metroid/items.dm
@@ -11,6 +11,7 @@
origin_tech = list(TECH_BIO = 4)
var/Uses = 1 // uses before it goes inert
var/enhanced = 0 //has it been enhanced before?
+ flags = OPENCONTAINER
attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/slimesteroid2))
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 352b7d955a9..28a2f938dda 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -36,11 +36,13 @@
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
- if(bodytemperature <= (T0C - 50)) // hurt temperature
- if(bodytemperature <= 50) // sqrting negative numbers is bad
+ if(bodytemperature <= hurt_temperature)
+ if(bodytemperature <= die_temperature)
adjustToxLoss(200)
else
- adjustToxLoss(round(sqrt(bodytemperature)) * 2)
+ // could be more fancy, but doesn't worth the complexity: when the slimes goes into a cold area
+ // the damage is mostly determined by how fast its body cools
+ adjustToxLoss(30)
updatehealth()
@@ -529,4 +531,4 @@
return 0
/mob/living/carbon/slime/slip() //Can't slip something without legs.
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index 5f4876d1dd2..8fa5c1247a2 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -49,6 +49,9 @@
var/SStun = 0 // NPC stun variable. Used to calm them down when they are attacked while feeding, or they will immediately re-attach
var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while. The part about freeze gun is a lie
+ var/hurt_temperature = T0C-50 // slime keeps taking damage when its bodytemperature is below this
+ var/die_temperature = 50 // slime dies instantly when its bodytemperature is below this
+
///////////TIME FOR SUBSPECIES
var/colour = "grey"
diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm
index fed6d59e438..b4d8297697e 100644
--- a/code/modules/mob/living/carbon/viruses.dm
+++ b/code/modules/mob/living/carbon/viruses.dm
@@ -3,8 +3,6 @@
if(status_flags & GODMODE) return 0 //godmode
if(bodytemperature > 406)
- for(var/datum/disease/D in viruses)
- D.cure()
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
V.cure(src)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 18cdeded529..96f649b1ff1 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -6,6 +6,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/ai_announcement,
/mob/living/silicon/ai/proc/ai_call_shuttle,
// /mob/living/silicon/ai/proc/ai_recall_shuttle,
+ /mob/living/silicon/ai/proc/ai_emergency_message,
/mob/living/silicon/ai/proc/ai_camera_track,
/mob/living/silicon/ai/proc/ai_camera_list,
/mob/living/silicon/ai/proc/ai_goto_location,
@@ -165,7 +166,6 @@ var/list/ai_verbs_default = list(
spawn(5)
new /obj/machinery/ai_powersupply(src)
-
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[LIFE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
@@ -207,8 +207,23 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/Destroy()
ai_list -= src
+
qdel(eyeobj)
- ..()
+ eyeobj = null
+
+ qdel(psupply)
+ psupply = null
+
+ qdel(aiMulti)
+ aiMulti = null
+
+ qdel(aiRadio)
+ aiRadio = null
+
+ qdel(aiCamera)
+ aiCamera = null
+
+ return ..()
/mob/living/silicon/ai/proc/setup_icon()
var/file = file2text("config/custom_sprites.txt")
@@ -266,20 +281,22 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
powered_ai = ai
powered_ai.psupply = src
- if(isnull(powered_ai))
- qdel(src)
-
- loc = powered_ai.loc
- use_power(1) // Just incase we need to wake up the power system.
+ forceMove(powered_ai.loc)
..()
+ use_power(1) // Just incase we need to wake up the power system.
+
+/obj/machinery/ai_powersupply/Destroy()
+ . = ..()
+ powered_ai = null
/obj/machinery/ai_powersupply/process()
- if(!powered_ai || powered_ai.stat & DEAD)
- qdel()
+ if(!powered_ai || powered_ai.stat == DEAD)
+ qdel(src)
return
if(powered_ai.psupply != src) // For some reason, the AI has different powersupply object. Delete this one, it's no longer needed.
qdel(src)
+ return
if(powered_ai.APU_power)
use_power = 0
return
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index c0850820f71..58433a0b285 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -17,7 +17,7 @@
msg += "It looks slightly charred.\n"
else
msg += "Its casing is melted and heat-warped!\n"
- if (src.getOxyLoss())
+ if (src.getOxyLoss() && (aiRestorePowerRoutine != 0 && !APU_power))
if (src.getOxyLoss() > 175)
msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER CRITICAL\" warning.\n"
else if(src.getOxyLoss() > 100)
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index 8b0bfdf56b6..a8fd898ffff 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -1,6 +1,6 @@
/mob/living/silicon/gib()
..("gibbed-r")
- gibs(loc, viruses, null, /obj/effect/gibspawner/robot)
+ gibs(loc, null, /obj/effect/gibspawner/robot)
/mob/living/silicon/dust()
..("dust-r", /obj/effect/decal/remains/robot)
diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm
index 1f4024459e0..22d716aadde 100644
--- a/code/modules/mob/living/silicon/robot/analyzer.dm
+++ b/code/modules/mob/living/silicon/robot/analyzer.dm
@@ -17,7 +17,7 @@
var/mode = 1;
/obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
- if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
+ if((CLUMSY in user.mutations) && prob(50))
user << text("\red You try to analyze the floor's vitals!")
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index dca60f597c6..23b6cc0d67b 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -187,6 +187,40 @@
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 1
+ if("yes")
+ var/M = null
+ if(param)
+ for (var/mob/A in view(null, null))
+ if (param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if (param)
+ message = "emits an affirmative blip at [param]."
+ else
+ message = "emits an affirmative blip."
+ playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
+ m_type = 1
+
+ if("no")
+ var/M = null
+ if(param)
+ for (var/mob/A in view(null, null))
+ if (param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if (param)
+ message = "emits a negative blip at [param]."
+ else
+ message = "emits a negative blip."
+ playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
+ m_type = 1
+
if("law")
if (istype(module,/obj/item/weapon/robot_module/security))
message = "shows its legal authorization barcode."
@@ -206,7 +240,7 @@
src << "You are not security."
if ("help")
- src << "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt"
+ src << "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt, yes, no"
else
src << "\blue Unusable emote '[act]'. Say *help for a list."
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index f28c464cea1..2a60be14fdb 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -146,13 +146,13 @@
/mob/living/silicon/robot/handle_regular_hud_updates()
- if (src.stat == 2 || XRAY in mutations || src.sight_mode & BORGXRAY)
+ if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY))
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_MINIMUM
- else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM)
+ else if ((src.sight_mode & BORGMESON) && (src.sight_mode & BORGTHERM))
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.see_in_dark = 8
@@ -161,6 +161,10 @@
src.sight |= SEE_TURFS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
+ else if (src.sight_mode & BORGMATERIAL)
+ src.sight |= SEE_OBJS
+ src.see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_in_dark = 8
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index a23d328bd33..ed8ce8f9d80 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -314,6 +314,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
+ src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
@@ -566,7 +567,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/miner/New()
src.modules += new /obj/item/device/flash(src)
- src.modules += new /obj/item/borg/sight/meson(src)
+ src.modules += new /obj/item/borg/sight/material(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/storage/bag/ore(src)
@@ -677,6 +678,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/soap(src)
+ src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
index d4b5977a6e6..ba09c9e5d6c 100644
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer.dm
@@ -83,7 +83,7 @@
return
if(prob(5))
- host.adjustBrainLoss(rand(1,2))
+ host.adjustBrainLoss(0.1)
if(prob(host.brainloss/20))
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm
index 45132f588eb..b153c78c8c1 100644
--- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm
@@ -46,14 +46,14 @@
spawn(rand(200,250)+B.host.brainloss)
if(!B || !B.controlling) return
- B.host.adjustBrainLoss(rand(5,10))
+ B.host.adjustBrainLoss(rand(0.1,0.5))
H << "With an immense exertion of will, you regain control of your body!"
B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
-
+
return
-
+
..()
diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
index 12c4099623e..0d539d44fc5 100644
--- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
@@ -74,7 +74,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD]
- if(!E || (E.status & ORGAN_DESTROYED))
+ if(!E || E.is_stump())
src << "\The [H] does not have a head!"
if(!H.should_have_organ("brain"))
diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm
index b5ba3a58ffa..b03fe79b143 100644
--- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm
+++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm
@@ -14,74 +14,68 @@
//////////////////////////////Capturing////////////////////////////////////////////////////////
- attack(mob/living/carbon/human/M as mob, mob/user as mob)
- if(!istype(M, /mob/living/carbon/human))//If target is not a human.
- return ..()
- if(istype(M, /mob/living/carbon/human/dummy))
- return..()
+/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ if(!istype(M, /mob/living/carbon/human))//If target is not a human.
+ return ..()
+ if(istype(M, /mob/living/carbon/human/dummy))
+ return..()
- if(M.has_brain_worms()) //Borer stuff - RR
- user << "This being is corrupted by an alien intelligence and cannot be soul trapped."
- return..()
+ if(M.has_brain_worms()) //Borer stuff - RR
+ user << "This being is corrupted by an alien intelligence and cannot be soul trapped."
+ return..()
- M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)")
+ M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
+ msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)")
- transfer_soul("VICTIM", M, user)
- return
+ transfer_soul("VICTIM", M, user)
+ return
- /*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES
- if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade
- return ..()
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
- transfer_soul("SHADE", M, user)
- return*/
///////////////////Options for using captured souls///////////////////////////////////////
- attack_self(mob/user)
- if (!in_range(src, user))
- return
- user.set_machine(src)
- var/dat = "Soul Stone
"
- for(var/mob/living/simple_animal/shade/A in src)
- dat += "Captured Soul: [A.name]
"
- dat += {"Summon Shade"}
- dat += "
"
- dat += {" Close"}
- user << browse(dat, "window=aicard")
- onclose(user, "aicard")
+/obj/item/device/soulstone/attack_self(mob/user)
+ if (!in_range(src, user))
+ return
+ user.set_machine(src)
+ var/dat = "Soul Stone
"
+ for(var/mob/living/simple_animal/shade/A in src)
+ dat += "Captured Soul: [A.name]
"
+ dat += {"Summon Shade"}
+ dat += "
"
+ dat += {" Close"}
+ user << browse(dat, "window=aicard")
+ onclose(user, "aicard")
+ return
+
+
+
+
+/obj/item/device/soulstone/Topic(href, href_list)
+ var/mob/U = usr
+ if (!in_range(src, U)||U.machine!=src)
+ U << browse(null, "window=aicard")
+ U.unset_machine()
return
+ add_fingerprint(U)
+ U.set_machine(src)
-
-
- Topic(href, href_list)
- var/mob/U = usr
- if (!in_range(src, U)||U.machine!=src)
+ switch(href_list["choice"])//Now we switch based on choice.
+ if ("Close")
U << browse(null, "window=aicard")
U.unset_machine()
return
- add_fingerprint(U)
- U.set_machine(src)
-
- switch(href_list["choice"])//Now we switch based on choice.
- if ("Close")
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
-
- if ("Summon")
- for(var/mob/living/simple_animal/shade/A in src)
- A.status_flags &= ~GODMODE
- A.canmove = 1
- A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs."
- A.loc = U.loc
- A.cancel_camera()
- src.icon_state = "soulstone"
- attack_self(U)
+ if ("Summon")
+ for(var/mob/living/simple_animal/shade/A in src)
+ A.status_flags &= ~GODMODE
+ A.canmove = 1
+ A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs."
+ A.forceMove(U.loc)
+ A.cancel_camera()
+ src.icon_state = "soulstone"
+ attack_self(U)
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
/obj/structure/constructshell
@@ -99,118 +93,127 @@
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/device/soulstone))
- O.transfer_soul("CONSTRUCT",src,user)
+ var/obj/item/device/soulstone/S = O;
+ S.transfer_soul("CONSTRUCT",src,user)
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
+/obj/item/device/soulstone/proc/transfer_human(var/mob/living/carbon/human/T,var/mob/U)
+ if(!istype(T))
+ return;
+ if(src.imprinted != "empty")
+ U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!"
+ return
+ if ((T.health + T.halloss) > config.health_threshold_crit && T.stat != DEAD)
+ U << "Capture failed!: Kill or maim the victim first!"
+ return
+ if(T.client == null)
+ U << "Capture failed!: The soul has already fled it's mortal frame."
+ return
+ if(src.contents.len)
+ U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room."
+ return
+
+ for(var/obj/item/W in T)
+ T.drop_from_inventory(W)
+
+ new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
+ T.invisibility = 101
+
+ var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = T
+ flick("dust-h", animation)
+ qdel(animation)
+
+ var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
+ S.loc = src //put shade in stone
+ S.status_flags |= GODMODE //So they won't die inside the stone somehow
+ S.canmove = 0//Can't move out of the soul stone
+ S.name = "Shade of [T.real_name]"
+ S.real_name = "Shade of [T.real_name]"
+ S.icon = T.icon
+ S.icon_state = T.icon_state
+ S.overlays = T.overlays
+ S.color = rgb(254,0,0)
+ S.alpha = 127
+ if (T.client)
+ T.client.mob = S
+ S.cancel_camera()
-/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
+ src.icon_state = "soulstone2"
+ src.name = "Soul Stone: [S.real_name]"
+ S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
+ U << "Capture successful! : [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
+ U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
+ src.imprinted = "[S.name]"
+ qdel(T)
+
+/obj/item/device/soulstone/proc/transfer_shade(var/mob/living/simple_animal/shade/T,var/mob/U)
+ if(!istype(T))
+ return;
+ if (T.stat == DEAD)
+ U << "Capture failed!: The shade has already been banished!"
+ return
+ if(src.contents.len)
+ U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room."
+ return
+ if(T.name != src.imprinted)
+ U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!"
+ return
+
+ T.loc = src //put shade in stone
+ T.status_flags |= GODMODE
+ T.canmove = 0
+ T.health = T.maxHealth
+ src.icon_state = "soulstone2"
+
+ T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
+ U << "Capture successful! : [T.name]'s has been recaptured and stored within the soul stone."
+/obj/item/device/soulstone/proc/transfer_construct(var/obj/structure/constructshell/T,var/mob/U)
+ var/mob/living/simple_animal/shade/A = locate() in src
+ if(!A)
+ U << "Capture failed!: The soul stone is empty! Go kill someone!"
+ return;
+ var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
+ switch(construct_class)
+ if("Juggernaut")
+ var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc))
+ Z.key = A.key
+ if(iscultist(U))
+ cult.add_antagonist(Z.mind)
+ qdel(T)
+ Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ qdel(src)
+ if("Wraith")
+ var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc))
+ Z.key = A.key
+ if(iscultist(U))
+ cult.add_antagonist(Z.mind)
+ qdel(T)
+ Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ qdel(src)
+ if("Artificer")
+ var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc))
+ Z.key = A.key
+ if(iscultist(U))
+ cult.add_antagonist(Z.mind)
+ qdel(T)
+ Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ qdel(src)
+/obj/item/device/soulstone/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
switch(choice)
if("VICTIM")
- var/mob/living/carbon/human/T = target
- var/obj/item/device/soulstone/C = src
- if(C.imprinted != "empty")
- U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!"
- else
- if ((T.health + T.halloss) > config.health_threshold_crit)
- U << "\red Capture failed!: \black Kill or maim the victim first!"
- else
- if(T.client == null)
- U << "\red Capture failed!: \black The soul has already fled it's mortal frame."
- else
- if(C.contents.len)
- U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room."
- else
- for(var/obj/item/W in T)
- T.drop_from_inventory(W)
- new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
- T.invisibility = 101
- var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = T
- flick("dust-h", animation)
- qdel(animation)
- var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
- S.loc = C //put shade in stone
- S.status_flags |= GODMODE //So they won't die inside the stone somehow
- S.canmove = 0//Can't move out of the soul stone
- S.name = "Shade of [T.real_name]"
- S.real_name = "Shade of [T.real_name]"
- S.icon = T.icon
- S.icon_state = T.icon_state
- S.overlays = T.overlays
- S.color = rgb(254,0,0)
- S.alpha = 127
- if (T.client)
- T.client.mob = S
- S.cancel_camera()
- C.icon_state = "soulstone2"
- C.name = "Soul Stone: [S.real_name]"
- S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
- U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
- U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
- C.imprinted = "[S.name]"
- qdel(T)
+ transfer_human(target,U)
if("SHADE")
- var/mob/living/simple_animal/shade/T = target
- var/obj/item/device/soulstone/C = src
- if (T.stat == DEAD)
- U << "\red Capture failed!: \black The shade has already been banished!"
- else
- if(C.contents.len)
- U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room."
- else
- if(T.name != C.imprinted)
- U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!"
- else
- T.loc = C //put shade in stone
- T.status_flags |= GODMODE
- T.canmove = 0
- T.health = T.maxHealth
- C.icon_state = "soulstone2"
- T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
- U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone."
+ transfer_shade(target,U)
if("CONSTRUCT")
- var/obj/structure/constructshell/T = target
- var/obj/item/device/soulstone/C = src
- var/mob/living/simple_animal/shade/A = locate() in C
- if(A)
- var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
- switch(construct_class)
- if("Juggernaut")
- var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc))
- Z.key = A.key
- if(iscultist(U))
- cult.add_antagonist(Z.mind)
- qdel(T)
- Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- qdel(C)
-
- if("Wraith")
- var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc))
- Z.key = A.key
- if(iscultist(U))
- cult.add_antagonist(Z.mind)
- qdel(T)
- Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- qdel(C)
-
- if("Artificer")
- var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc))
- Z.key = A.key
- if(iscultist(U))
- cult.add_antagonist(Z.mind)
- qdel(T)
- Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- qdel(C)
- else
- U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!"
- return
+ transfer_construct(target,U)
diff --git a/code/modules/mob/living/simple_animal/friendly/mushroom.dm b/code/modules/mob/living/simple_animal/friendly/mushroom.dm
index 4d455e5050c..e69de29bb2d 100644
--- a/code/modules/mob/living/simple_animal/friendly/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mushroom.dm
@@ -1,62 +0,0 @@
-/mob/living/simple_animal/mushroom
- name = "walking mushroom"
- desc = "It's a massive mushroom... with legs?"
- icon_state = "mushroom"
- icon_living = "mushroom"
- icon_dead = "mushroom_dead"
- mob_size = MOB_SMALL
- speak_chance = 0
- turns_per_move = 1
- maxHealth = 5
- health = 5
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "whacks"
- harm_intent_damage = 5
- var/datum/seed/seed
- var/harvest_time
- var/min_explode_time = 1200
-
-/mob/living/simple_animal/mushroom/New()
- ..()
- harvest_time = world.time
-
-/mob/living/simple_animal/mushroom/verb/spawn_spores()
-
- set name = "Explode"
- set category = "Abilities"
- set desc = "Spread your spores!"
- set src = usr
-
- if(stat == 2)
- usr << "You are dead; it is too late for that."
- return
-
- if(!seed)
- usr << "You are sterile!"
- return
-
- if(world.time < harvest_time + min_explode_time)
- usr << "You are not mature enough for that."
- return
-
- spore_explode()
-
-/mob/living/simple_animal/mushroom/death()
- if(prob(30))
- spore_explode()
- return
- ..()
-
-/mob/living/simple_animal/mushroom/proc/spore_explode()
- if(!seed)
- return
- if(world.time < harvest_time + min_explode_time)
- return
- for(var/turf/simulated/target_turf in orange(1,src))
- if(prob(60) && !target_turf.density && src.Adjacent(target_turf))
- new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(target_turf,seed)
- seed.thrown_at(src,get_turf(src),1)
- if(src)
- gib()
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 0c578cee773..a69c288837e 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -204,7 +204,7 @@
held_item.loc = src.loc
held_item = null
- gibs(loc, viruses, null, null, /obj/effect/gibspawner/robot) //TODO: use gib() or refactor spiderbots into synthetics.
+ gibs(loc, null, null, /obj/effect/gibspawner/robot) //TODO: use gib() or refactor spiderbots into synthetics.
qdel(src)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 2b835e4e026..6fecb65e171 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -13,6 +13,7 @@
var/break_stuff_probability = 10
stop_automated_movement_when_pulled = 0
var/destroy_surroundings = 1
+ a_intent = I_HURT
var/shuttletarget = null
var/enroute = 0
@@ -190,13 +191,7 @@
if (!istype(target, /turf))
qdel(A)
return
- A.current = target
- A.starting = get_turf(src)
- A.original = get_turf(target)
- A.yo = target:y - start:y
- A.xo = target:x - start:x
- spawn( 0 )
- A.process()
+ A.launch(target)
return
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 359db24c636..f8ed654b958 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -37,7 +37,8 @@
/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/device/soulstone))
- O.transfer_soul("SHADE", src, user)
+ var/obj/item/device/soulstone/S = O;
+ S.transfer_soul("SHADE", src, user)
return
/mob/living/simple_animal/shade/proc/OnDeathInLife()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 7a66deb3c41..01a0e9105ab 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -13,8 +13,6 @@
client.screen = list()
if(mind && mind.current == src)
spellremove(src)
- for(var/infection in viruses)
- qdel(infection)
ghostize()
..()
@@ -719,17 +717,17 @@
if(!TurfAdjacent(listed_turf))
listed_turf = null
else
- statpanel(listed_turf.name, null, listed_turf)
- for(var/atom/A in listed_turf)
- if(!A.mouse_opacity)
- continue
- if(A.invisibility > see_invisible)
- continue
- if(is_type_in_list(A, shouldnt_see))
- continue
- statpanel(listed_turf.name, null, A)
+ if(statpanel("Turf"))
+ stat("\icon[listed_turf]", listed_turf.name)
+ for(var/atom/A in listed_turf)
+ if(!A.mouse_opacity)
+ continue
+ if(A.invisibility > see_invisible)
+ continue
+ if(is_type_in_list(A, shouldnt_see))
+ continue
+ stat(A)
- sleep(4) //Prevent updating the stat panel for the next .4 seconds, prevents clientside latency from updates
// facing verbs
/mob/proc/canface()
diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm
deleted file mode 100644
index cdc734c49a7..00000000000
--- a/code/modules/mob/mob_cleanup.dm
+++ /dev/null
@@ -1,199 +0,0 @@
-//Methods that need to be cleaned.
-/* INFORMATION
-Put (mob/proc)s here that are in dire need of a code cleanup.
-*/
-
-/mob/proc/has_disease(var/datum/disease/virus)
- for(var/datum/disease/D in viruses)
- if(D.IsSame(virus))
- //error("[D.name]/[D.type] is the same as [virus.name]/[virus.type]")
- return 1
- return 0
-
-// This proc has some procs that should be extracted from it. I believe we can develop some helper procs from it - Rockdtben
-/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1, var/spread_type = -5)
- //world << "Contract_disease called by [src] with virus [virus]"
- if(stat >=2)
- //world << "He's dead jim."
- return
- if(istype(virus, /datum/disease/advance))
- //world << "It's an advance virus."
- var/datum/disease/advance/A = virus
- if(A.GetDiseaseID() in resistances)
- //world << "It resisted us!"
- return
- if(count_by_type(viruses, /datum/disease/advance) >= 3)
- return
-
- else
- if(src.resistances.Find(virus.type))
- //world << "Normal virus and resisted"
- return
-
-
- if(has_disease(virus))
- return
-
-
- if(force_species_check)
- var/fail = 1
- for(var/name in virus.affected_species)
- var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]")
- if(mob_type && istype(src, mob_type))
- fail = 0
- break
- if(fail) return
-
- if(skip_this == 1)
- //world << "infectin"
- //if(src.virus) < -- this used to replace the current disease. Not anymore!
- //src.virus.cure(0)
- var/datum/disease/v = new virus.type(1, virus, 0)
- src.viruses += v
- v.affected_mob = src
- v.strain_data = v.strain_data.Copy()
- v.holder = src
- if(v.can_carry && prob(5))
- v.carrier = 1
- return
- //world << "Not skipping."
- //if(src.virus) //
- //return //
-
-
-/*
- var/list/clothing_areas = list()
- var/list/covers = list(UPPER_TORSO,LOWER_TORSO,LEGS,FEET,ARMS,HANDS)
- for(var/Covers in covers)
- clothing_areas[Covers] = list()
-
- for(var/obj/item/clothing/Clothing in src)
- if(Clothing)
- for(var/Covers in covers)
- if(Clothing&Covers)
- clothing_areas[Covers] += Clothing
-
-*/
- if(prob(15/virus.permeability_mod)) return //the power of immunity compels this disease! but then you forgot resistances
- //world << "past prob()"
- var/obj/item/clothing/Cl = null
- var/passed = 1
-
- //chances to target this zone
- var/head_ch
- var/body_ch
- var/hands_ch
- var/feet_ch
-
- if(spread_type == -5)
- spread_type = virus.spread_type
-
- switch(spread_type)
- if(CONTACT_HANDS)
- head_ch = 0
- body_ch = 0
- hands_ch = 100
- feet_ch = 0
- if(CONTACT_FEET)
- head_ch = 0
- body_ch = 0
- hands_ch = 0
- feet_ch = 100
- else
- head_ch = 100
- body_ch = 100
- hands_ch = 25
- feet_ch = 25
-
-
- var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)//1 - head, 2 - body, 3 - hands, 4- feet
-
- if(istype(src, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = src
-
- switch(target_zone)
- if(1)
- if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper))
- Cl = H.head
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(passed && isobj(H.wear_mask))
- Cl = H.wear_mask
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(2)//arms and legs included
- if(isobj(H.wear_suit))
- Cl = H.wear_suit
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(passed && isobj(slot_w_uniform))
- Cl = slot_w_uniform
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(3)
- if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
- Cl = H.wear_suit
- passed = prob((Cl.permeability_coefficient*100) - 1)
-
- if(passed && isobj(H.gloves))
- Cl = H.gloves
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(4)
- if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET)
- Cl = H.wear_suit
- passed = prob((Cl.permeability_coefficient*100) - 1)
-
- if(passed && isobj(H.shoes))
- Cl = H.shoes
- passed = prob((Cl.permeability_coefficient*100) - 1)
- else
- src << "Something strange's going on, something's wrong."
-
- /*if("feet")
- if(H.shoes && istype(H.shoes, /obj/item/clothing/))
- Cl = H.shoes
- passed = prob(Cl.permeability_coefficient*100)
- //
- world << "Shoes pass [passed]"
- */ //
-
- if(!passed && spread_type == AIRBORNE && !internals)
- passed = (prob((50*virus.permeability_mod) - 1))
-
- if(passed)
- //world << "Infection in the mob [src]. YAY"
-
-
-/*
- var/score = 0
- if(istype(src, /mob/living/carbon/human))
- if(src:gloves) score += 5
- if(istype(src:wear_suit, /obj/item/clothing/suit/space)) score += 10
- if(istype(src:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10
- if(istype(src:head, /obj/item/clothing/head/helmet/space)) score += 5
- if(istype(src:head, /obj/item/clothing/head/bio_hood)) score += 5
- if(wear_mask)
- score += 5
- if((istype(src:wear_mask, /obj/item/clothing/mask) || istype(src:wear_mask, /obj/item/clothing/mask/surgical)) && !internal)
- score += 5
- if(internal)
- score += 5
- if(score > 20)
- return
- else if(score == 20 && prob(95))
- return
- else if(score >= 15 && prob(75))
- return
- else if(score >= 10 && prob(55))
- return
- else if(score >= 5 && prob(35))
- return
- else if(prob(15))
- return
- else*/
-
- var/datum/disease/v = new virus.type(1, virus, 0)
- src.viruses += v
- v.affected_mob = src
- v.strain_data = v.strain_data.Copy()
- v.holder = src
- if(v.can_carry && prob(5))
- v.carrier = 1
- return
- return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index dfbde26b65f..eaa88e62124 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -185,14 +185,6 @@
//Changlings, but can be used in other modes
// var/obj/effect/proc_holder/changpower/list/power_list = list()
-//List of active diseases
-
- var/list/viruses = list() // replaces var/datum/disease/virus
-
-//Monkey/infected mode
- var/list/resistances = list()
- var/datum/disease/virus = null
-
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/update_icon = 1 //Set to 1 to trigger update_icons() at the next life() call
diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm
index 76de1cdc33a..64a98985cfc 100644
--- a/code/modules/mob/mob_grab_specials.dm
+++ b/code/modules/mob/mob_grab_specials.dm
@@ -3,7 +3,7 @@
var/obj/item/organ/external/E = H.get_organ(target_zone)
- if(!E || (E.status & ORGAN_DESTROYED))
+ if(!E || E.is_stump())
user << "[H] is missing that bodypart."
return
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index b613fc0df25..bc5b609b890 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -466,6 +466,12 @@ proc/is_blind(A)
/mob/proc/is_client_active(var/active = 1)
return client && client.inactivity < active MINUTES
+/mob/proc/can_eat()
+ return 1
+
+/mob/proc/can_force_feed()
+ return 1
+
#define SAFE_PERP -50
/mob/living/proc/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest)
if(stat == DEAD)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 477bb62e9aa..32d12ad0b31 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -304,7 +304,7 @@
var/mob/living/carbon/human/driver = mob
var/obj/item/organ/external/l_hand = driver.get_organ("l_hand")
var/obj/item/organ/external/r_hand = driver.get_organ("r_hand")
- if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED)))
+ if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump()))
return // No hands to drive your chair? Tough luck!
//drunk wheelchair driving
else if(mob.confused)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index cb09a4a029d..26b83e30bb9 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -103,7 +103,7 @@
if(href_list["observe"])
- if(alert(src,"Are you sure you wish to observe? You will have to wait 30 minutes before being able to respawn!","Player Setup","Yes","No") == "Yes")
+ if(alert(src,"Are you sure you wish to observe? You will have to wait 15 minutes before being able to respawn!","Player Setup","Yes","No") == "Yes")
if(!client) return 1
var/mob/dead/observer/observer = new()
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 5a2076aba44..49d2e9d0681 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -2,7 +2,19 @@ datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
proc/randomize_appearance_for(var/mob/living/carbon/human/H)
gender = pick(MALE, FEMALE)
- s_tone = random_skin_tone()
+ var/datum/species/current_species = all_species[species]
+
+ if(current_species)
+ if(current_species.flags & HAS_SKIN_TONE)
+ s_tone = random_skin_tone()
+ if(current_species.flags & HAS_EYE_COLOR)
+ randomize_eyes_color()
+ if(current_species.flags & HAS_SKIN_COLOR)
+ randomize_skin_color()
+ if(current_species.flags & HAS_UNDERWEAR)
+ underwear = rand(1,underwear_m.len)
+ undershirt = rand(1,undershirt_t.len)
+
var/use_head_species
var/obj/item/organ/external/head/temp_head = H.get_organ(BP_HEAD)
@@ -17,10 +29,7 @@ datum/preferences
randomize_hair_color("hair")
randomize_hair_color("facial")
- randomize_eyes_color()
- randomize_skin_color()
- underwear = rand(1,underwear_m.len)
- undershirt = rand(1,undershirt_t.len)
+
socks = rand(1,socks_t.len)
backbag = 2
age = rand(AGE_MIN,AGE_MAX)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index d8b9fbd7cfd..c1293dce908 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -61,6 +61,21 @@
name = "Short Hair 2"
icon_state = "hair_shorthair3"
+ Teshari
+ name = "Teshari Plumage"
+ icon_state = "seromi_default"
+ species_allowed = list("Teshari")
+
+ Teshari_ears
+ name = "Teshari Ears"
+ icon_state = "seromi_ears"
+ species_allowed = list("Teshari")
+
+ Teshari_excited
+ name = "Teshari Spiky"
+ icon_state = "seromi_spiky"
+ species_allowed = list("Teshari")
+
cut
name = "Cut Hair"
icon_state = "hair_c"
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index f200766179b..b0bc02f6858 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -326,8 +326,6 @@
return 1
if(ispath(MP, /mob/living/simple_animal/hostile/carp))
return 1
- if(ispath(MP, /mob/living/simple_animal/mushroom))
- return 1
if(ispath(MP, /mob/living/simple_animal/shade))
return 1
if(ispath(MP, /mob/living/simple_animal/tomato))
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 575ded61383..798fbe52c17 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -165,11 +165,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
B.data["virus2"] |= virus_copylist(src.virus2)
B.data["antibodies"] = src.antibodies
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
- if(src.resistances && src.resistances.len)
- if(B.data["resistances"])
- B.data["resistances"] |= src.resistances.Copy()
- else
- B.data["resistances"] = src.resistances.Copy()
B.data["blood_type"] = copytext(src.dna.b_type,1,0)
// Putting this here due to return shenanigans.
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index e0851716780..8b0f22445cf 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -58,7 +58,7 @@ var/list/organ_cache = list()
var/mob/living/carbon/human/H = holder
if(istype(H))
if(internal)
- var/obj/item/organ/external/E = H.organs_by_name[src.parent_organ]
+ var/obj/item/organ/external/E = H.get_organ(parent_organ)
if(E)
if(E.internal_organs == null)
E.internal_organs = list()
@@ -247,6 +247,7 @@ var/list/organ_cache = list()
status |= ORGAN_ASSISTED
status |= ORGAN_ROBOT
+
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
status = 0
status |= ORGAN_ASSISTED
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index a8d61416300..6ac8386c238 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -100,15 +100,15 @@
if(istype(I,/obj/item/organ))
continue
removable_objects |= I
- if(!removable_objects.len)
- return ..()
- var/obj/item/I = pick(removable_objects)
- if(!istype(I))
- return ..()
- I.loc = get_turf(user)
- if(!(user.l_hand && user.r_hand))
- user.put_in_hands(I)
- user.visible_message("\The [user] rips \the [I] out of \the [src]!")
+ if(removable_objects.len)
+ var/obj/item/I = pick(removable_objects)
+ I.loc = get_turf(user) //just in case something was embedded that is not an item
+ if(istype(I))
+ if(!(user.l_hand && user.r_hand))
+ user.put_in_hands(I)
+ user.visible_message("\The [user] rips \the [I] out of \the [src]!")
+ return //no eating the limb until everything's been removed
+ return ..()
/obj/item/organ/external/examine()
..()
@@ -181,8 +181,8 @@
return
-/obj/item/organ/external/New(var/mob/living/carbon/holder, var/internal)
- ..()
+/obj/item/organ/external/New(var/mob/living/carbon/holder)
+ ..(holder, 0)
if(owner)
replaced(owner)
sync_colour_to_human(owner)
@@ -215,8 +215,6 @@
/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
if((brute <= 0) && (burn <= 0))
return 0
- if(status & ORGAN_DESTROYED)
- return 0
brute *= brute_mod
burn *= burn_mod
@@ -460,11 +458,11 @@ This function completely restores a damaged organ to perfect condition.
/obj/item/organ/external/process()
if(owner)
- if(parent)
- if(parent.status & ORGAN_DESTROYED)
- status |= ORGAN_DESTROYED
- owner.update_body(1)
- return
+ //Dismemberment
+ //if(parent && parent.is_stump()) //should never happen
+ // warning("\The [src] ([src.type]) belonging to [owner] ([owner.type]) was attached to a stump")
+ // remove()
+ // return
// Process wounds, doing healing etc. Only do this every few ticks to save processing power
if(owner.life_tick % wound_update_accuracy == 0)
@@ -503,7 +501,7 @@ Note that amputating the affected organ does in fact remove the infection from t
*/
/obj/item/organ/external/proc/update_germs()
- if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
+ if(status & (ORGAN_ROBOT) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
germ_level = 0
return
@@ -680,8 +678,6 @@ Note that amputating the affected organ does in fact remove the infection from t
// new damage icon system
// returns just the brute/burn damage code
/obj/item/organ/external/proc/damage_state_text()
- if(status & ORGAN_DESTROYED)
- return "--"
var/tburn = 0
var/tbrute = 0
@@ -710,14 +706,11 @@ Note that amputating the affected organ does in fact remove the infection from t
****************************************************/
//Handles dismemberment
-/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children, var/silent)
+/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate = DROPLIMB_EDGE, var/ignore_children = null)
if(cannot_amputate || !owner)
return
- if(!disintegrate)
- disintegrate = DROPLIMB_EDGE
-
switch(disintegrate)
if(DROPLIMB_EDGE)
if(!clean)
@@ -741,16 +734,16 @@ Note that amputating the affected organ does in fact remove the infection from t
"You hear the [gore_sound].")
var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed().
+ var/obj/item/organ/external/parent_organ = parent
removed(null, ignore_children)
victim.traumatic_shock += 60
wounds.Cut()
- if(parent)
+ if(parent_organ)
var/datum/wound/lost_limb/W = new (src, disintegrate, clean)
- parent.children -= src
if(clean)
- parent.wounds |= W
- parent.update_damages()
+ parent_organ.wounds |= W
+ parent_organ.update_damages()
else
var/obj/item/organ/external/stump/stump = new (victim, 0, src)
if(status & ORGAN_ROBOT)
@@ -758,7 +751,6 @@ Note that amputating the affected organ does in fact remove the infection from t
stump.wounds |= W
victim.organs |= stump
stump.update_damages()
- parent = null
spawn(1)
victim.updatehealth()
@@ -921,22 +913,11 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
- if(status & ORGAN_ROBOT)
- return
-
-
if(status & ORGAN_ROBOT)
return
..()
- brute_mod = 0.8 // More resistant to brute.
- burn_mod = 0.8 // More resistant to burn.
- max_damage = initial(max_damage)*0.65 // Significantly easier to remove with trauma.
-
- brute_mod = 0.8
- burn_mod = 0.8
-
if(company)
model = company
var/datum/robolimb/R = all_robolimbs[company]
@@ -955,7 +936,6 @@ Note that amputating the affected organ does in fact remove the infection from t
for(var/obj/item/organ/external/T in children)
T.robotize(company, 1)
-
if(owner)
if(!skip_prosthetics)
@@ -997,9 +977,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return 0
/obj/item/organ/external/proc/is_usable()
- if((status & ORGAN_ROBOT) && get_damage() >= max_damage) //robot limbs just become inoperable at max damage
- return
- return !is_dislocated() && !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD))
+ return !is_dislocated() && !(status & (ORGAN_MUTATED|ORGAN_DEAD))
/obj/item/organ/external/proc/is_malfunctioning()
return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam))
@@ -1018,7 +996,7 @@ Note that amputating the affected organ does in fact remove the infection from t
H.drop_from_inventory(W)
W.loc = owner
-/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children)
+/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children = 0)
if(!owner)
return
@@ -1027,14 +1005,13 @@ Note that amputating the affected organ does in fact remove the infection from t
..()
- status |= ORGAN_DESTROYED
victim.bad_external_organs -= src
- for(var/obj/item/implant in implants)
- if(!istype(implant))
- return
- if(implant.w_class <= 2)
- qdel(implant)
+ for(var/atom/movable/implant in implants)
+ //large items and non-item objs fall to the floor, everything else stays
+ var/obj/item/I = implant
+ if(istype(I) && I.w_class < 3)
+ implant.loc = get_turf(victim.loc)
else
implant.loc = src
implants.Cut()
@@ -1053,6 +1030,10 @@ Note that amputating the affected organ does in fact remove the infection from t
organ.removed()
organ.loc = src
+ // Remove parent references
+ parent.children -= src
+ parent = null
+
release_restraints(victim)
victim.organs -= src
victim.organs_by_name[organ_tag] = null // Remove from owner's vars.
@@ -1129,7 +1110,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(wound_descriptors.len)
var/list/flavor_text = list()
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
- "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
+ "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") //note to self make this more robust
for(var/wound in wound_descriptors)
switch(wound_descriptors[wound])
if(1)
@@ -1333,8 +1314,8 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/head/skrell
eye_icon = "skrell_eyes_s"
-/obj/item/organ/external/head/resomi
- eye_icon = "eyes_resomi"
+/obj/item/organ/external/head/seromi
+ eye_icon = "eyes_seromi"
/obj/item/organ/external/head/vox
eye_icon = "vox_eyes_s"
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
index 175873e78b6..e4edadfe140 100644
--- a/code/modules/organs/organ_internal.dm
+++ b/code/modules/organs/organ_internal.dm
@@ -205,15 +205,51 @@
icon_state = "appendix"
parent_organ = BP_GROIN
organ_tag = "appendix"
+ var/inflamed = 0
+ var/inflame_progress = 0
+
+/mob/living/carbon/human/proc/appendicitis()
+ if(stat == DEAD)
+ return 0
+ var/obj/item/organ/internal/appendix/A = internal_organs_by_name[O_APPENDIX]
+ if(istype(A) && !A.inflamed)
+ A.inflamed = 1
+ return 1
+ return 0
+
+/obj/item/organ/internal/appendix/process()
+ if(!inflamed || !owner)
+ return
+
+ if(++inflame_progress > 200)
+ ++inflamed
+ inflame_progress = 0
+
+ if(inflamed == 1)
+ if(prob(5))
+ owner << "You feel a stinging pain in your abdomen!"
+ owner.emote("me", 1, "winces slightly.")
+ if(inflamed > 1)
+ if(prob(3))
+ owner << "You feel a stabbing pain in your abdomen!"
+ owner.emote("me", 1, "winces painfully.")
+ owner.adjustToxLoss(1)
+ if(inflamed > 2)
+ if(prob(1))
+ owner.vomit()
+ if(inflamed > 3)
+ if(prob(1))
+ owner << "Your abdomen is a world of pain!"
+ owner.Weaken(10)
+
+ var/obj/item/organ/external/groin = owner.get_organ(BP_GROIN)
+ var/datum/wound/W = new /datum/wound/internal_bleeding(20)
+ owner.adjustToxLoss(25)
+ groin.wounds += W
+ inflamed = 0
/obj/item/organ/internal/appendix/removed()
- if(owner)
- var/inflamed = 0
- for(var/datum/disease/appendicitis/appendicitis in owner.viruses)
- inflamed = 1
- appendicitis.cure()
- owner.resistances += appendicitis
- if(inflamed)
- icon_state = "appendixinflamed"
- name = "inflamed appendix"
+ if(inflamed)
+ icon_state = "appendixinflamed"
+ name = "inflamed appendix"
..()
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index ad68815f377..281f854dac0 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -15,7 +15,7 @@ var/datum/robolimb/basic_robolimb
var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb.
var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from.
var/unavailable_at_chargen // If set, not available at chargen.
- var/list/species_cannot_use = list()
+ var/list/species_cannot_use = list("Teshari")
/datum/robolimb/bishop
company = "Bishop"
diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm
index 3630719d94d..c74f1199e77 100644
--- a/code/modules/organs/subtypes/diona.dm
+++ b/code/modules/organs/subtypes/diona.dm
@@ -190,7 +190,8 @@
return ..(user, 1)
/obj/item/organ/internal/diona/node
- name = "receptor node"
+ name = "response node"
+ parent_organ = "head"
organ_tag = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index db34e58891a..04544035c08 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -18,6 +18,7 @@
owner.stat = 0
owner.visible_message("\The [owner] twitches visibly!")
+
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/internal/mmi_holder
name = "brain interface"
@@ -27,7 +28,9 @@
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/internal/mmi_holder/Destroy()
- stored_mmi = null
+ if(stored_mmi && (stored_mmi.loc == src))
+ qdel(stored_mmi)
+ stored_mmi = null
return ..()
/obj/item/organ/internal/mmi_holder/New(var/mob/living/carbon/human/new_owner, var/internal)
diff --git a/code/modules/organs/subtypes/seromi.dm b/code/modules/organs/subtypes/seromi.dm
new file mode 100644
index 00000000000..0b11c2a4ba1
--- /dev/null
+++ b/code/modules/organs/subtypes/seromi.dm
@@ -0,0 +1,8 @@
+/obj/item/organ/external/foot/seromi
+ body_hair = "feathers"
+/obj/item/organ/external/foot/right/seromi
+ body_hair = "feathers"
+/obj/item/organ/external/hand/seromi
+ body_hair = "feathers"
+/obj/item/organ/external/hand/right/seromi
+ body_hair = "feathers"
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 963243107f6..8a438e8e905 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -84,6 +84,7 @@
i.loc = src
user << "You put [i] in [src]."
papers.Add(i)
+ update_icon()
amount++
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index a062fd1910e..128cc625602 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -493,8 +493,6 @@
user << "There is nothing to secure."
return
update_icon()
- else if(emagged)
- user << "The interface is broken."
else
wiresexposed = !wiresexposed
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
@@ -623,8 +621,9 @@
qdel(W)
stat &= ~BROKEN
// Malf AI, removes the APC from AI's hacked APCs list.
- if(hacker && hacker.hacked_apcs && src in hacker.hacked_apcs)
+ if(hacker && hacker.hacked_apcs && (src in hacker.hacked_apcs))
hacker.hacked_apcs -= src
+ hacker = null
if (opened==2)
opened = 1
update_icon()
@@ -735,7 +734,7 @@
return
var/list/data = list(
- "locked" = locked,
+ "locked" = (locked && !emagged) ? 1 : 0,
"isOperating" = operating,
"externalPower" = main_status,
"powerCellStatus" = cell ? cell.percent() : null,
@@ -850,16 +849,12 @@
user << "\The [src] have AI control disabled!"
return 0
else
- if ((!in_range(src, user) || !istype(src.loc, /turf) || hacker)) // AI-hacked APCs cannot be controlled by other AIs, unlinked cyborgs or humans.
+ if (!in_range(src, user) || !istype(src.loc, /turf))
return 0
var/mob/living/carbon/human/H = user
- if (istype(H))
- if(H.getBrainLoss() >= 60)
- H.visible_message("[H] stares cluelessly at [src] and drools.")
- return 0
- else if(prob(H.getBrainLoss()))
- user << "You momentarily forget how to use [src]."
- return 0
+ if (istype(H) && prob(H.getBrainLoss()))
+ user << "You momentarily forget how to use [src]."
+ return 0
return 1
/obj/machinery/power/apc/Topic(href, href_list)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 0272bc1fdf7..bfcf1aefa3f 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -883,4 +883,4 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/stack/cable_coil/random/New()
stacktype = /obj/item/stack/cable_coil
color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 89f88ddc554..4bbce17aa1a 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -255,7 +255,7 @@
use_power = 1
set_light(0)
- active_power_usage = ((light_range + light_power) * 10)
+ active_power_usage = light_range * light_power
if(on != on_gs)
on_gs = on
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 168698385b7..3e801be0d14 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -64,6 +64,8 @@
var/list/burst_accuracy = list(0) //allows for different accuracies for each shot in a burst. Applied on top of accuracy
var/list/dispersion = list(0)
var/mode_name = null
+ var/requires_two_hands
+ var/wielded_icon = "gun_wielded"
var/next_fire_time = 0
@@ -87,17 +89,30 @@
if(isnull(scoped_accuracy))
scoped_accuracy = accuracy
+/obj/item/weapon/gun/update_held_icon()
+ if(requires_two_hands)
+ var/mob/living/M = loc
+ if(istype(M))
+ if((M.l_hand == src && !M.r_hand) || (M.r_hand == src && !M.l_hand))
+ name = "[initial(name)] (wielded)"
+ item_state = wielded_icon
+ else
+ name = initial(name)
+ item_state = initial(item_state)
+ update_icon(ignore_inhands=1) // In case item_state is set somewhere else.
+ ..()
+
//Checks whether a given mob can use the gun
//Any checks that shouldn't result in handle_click_empty() being called if they fail should go here.
//Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there.
/obj/item/weapon/gun/proc/special_check(var/mob/user)
+
if(!istype(user, /mob/living))
return 0
if(!user.IsAdvancedToolUser())
return 0
var/mob/living/M = user
-
if(HULK in M.mutations)
M << "Your fingers are much too large for the trigger guard!"
return 0
@@ -161,6 +176,13 @@
user.setMoveCooldown(shoot_time) //no moving while shooting either
next_fire_time = world.time + shoot_time
+ var/held_acc_mod = 0
+ var/held_disp_mod = 0
+ if(requires_two_hands)
+ if((user.l_hand == src && user.r_hand) || (user.r_hand == src && user.l_hand))
+ held_acc_mod = -3
+ held_disp_mod = 3
+
//actually attempt to shoot
var/turf/targloc = get_turf(target) //cache this in case target gets deleted during shooting, e.g. if it was a securitron that got destroyed.
for(var/i in 1 to burst)
@@ -169,8 +191,8 @@
handle_click_empty(user)
break
- var/acc = burst_accuracy[min(i, burst_accuracy.len)]
- var/disp = dispersion[min(i, dispersion.len)]
+ var/acc = burst_accuracy[min(i, burst_accuracy.len)] + held_acc_mod
+ var/disp = dispersion[min(i, dispersion.len)] + held_disp_mod
process_accuracy(projectile, user, target, acc, disp)
if(pointblank)
@@ -189,8 +211,6 @@
admin_attack_log(usr, attacker_message="Fired [src]", admin_message="fired a gun ([src]) (MODE: [src.mode_name]) [reflex ? "by reflex" : "manually"].")
- update_held_icon()
-
//update timing
user.setClickCooldown(4)
user.setMoveCooldown(move_delay)
@@ -264,7 +284,7 @@
for(var/obj/item/weapon/grab/G in M.grabbed_by)
grabstate = max(grabstate, G.state)
if(grabstate >= GRAB_NECK)
- damage_mult = 3.0
+ damage_mult = 2.5
else if(grabstate >= GRAB_AGGRESSIVE)
damage_mult = 1.5
P.damage *= damage_mult
@@ -343,7 +363,8 @@
in_chamber.on_hit(M)
if (in_chamber.damage_type != HALLOSS)
- user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, BP_HEAD, used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
+ log_and_message_admins("[key_name(user)] commited suicide using \a [src]")
+ 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]", sharp=1)
user.death()
else
user << "Ow..."
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index d1e97e892b4..d602fb13a6b 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -86,7 +86,7 @@
user << "Has [shots_remaining] shot\s remaining."
return
-/obj/item/weapon/gun/energy/update_icon()
+/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands)
if(charge_meter)
var/ratio = power_supply.charge / power_supply.maxcharge
@@ -100,4 +100,4 @@
icon_state = "[modifystate][ratio]"
else
icon_state = "[initial(icon_state)][ratio]"
- update_held_icon()
+ if(!ignore_inhands) update_held_icon()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 3b53c8b5f49..c21fc97bd8d 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -7,9 +7,9 @@
slot_flags = SLOT_BELT|SLOT_BACK
w_class = 3
force = 10
- origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
- matter = list(DEFAULT_WALL_MATERIAL = 2000)
- projectile_type = /obj/item/projectile/beam/midlaser
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 2000)
+ projectile_type = /obj/item/projectile/beam/midlaser
/obj/item/weapon/gun/energy/laser/mounted
self_recharge = 1
@@ -35,7 +35,7 @@ obj/item/weapon/gun/energy/retro
name = "antique laser gun"
icon_state = "caplaser"
item_state = "caplaser"
- desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well"
+ desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well."
force = 5
fire_sound = 'sound/weapons/Laser.ogg'
slot_flags = SLOT_BELT
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index dccd03d58cb..fab9a08b7a7 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -156,55 +156,3 @@ obj/item/weapon/gun/energy/staff/focus
user << "The [src.name] will now strike only a single person."
projectile_type = "/obj/item/projectile/forcebolt"
*/
-
-/* Adminbus guns */
-
-// Serves as a target spotter for the Icarus.
-/obj/item/weapon/gun/energy/icarus
- name = "rubber ducky"
- desc = "It's a cute rubber duck. With an evil gleam in it's eye."
- projectile_type = /obj/item/projectile/icarus/pointdefense
- icon = 'icons/obj/watercloset.dmi'
- item_icons = null
- icon_state = "rubberducky"
- item_state = "rubberducky"
- charge_cost = 0
- silenced = 1
-
-/obj/item/weapon/gun/energy/icarus/attack_self(mob/living/user as mob)
- if(projectile_type == /obj/item/projectile/icarus/pointdefense)
- projectile_type = /obj/item/projectile/icarus/guns
- user << "You inform the Icarus to switch to the main guns."
- else
- projectile_type = /obj/item/projectile/icarus/pointdefense
- user << "You inform the Icarus to switch to the point-defense lasers."
-
- . = ..()
-
-/obj/item/weapon/gun/energy/icarus/update_icon()
- return
-
-/obj/item/weapon/gun/energy/icarus/verb/SetIcarusAngle()
- set src in usr
- set name = "Set Firing Angle"
- set desc = "Sets the angle from which the icarus will fire."
- set category = "Object"
-
- Icarus_SetPosition(usr)
-
-
-/obj/item/weapon/gun/energy/variable
- name = "abstract weapon"
- desc = "It seems to shift and flow as you watch."
- charge_cost = 0
- silenced = 1
-
-/obj/item/weapon/gun/energy/variable/update_icon()
- return
-
-/obj/item/weapon/gun/energy/variable/attack_self(mob/living/user as mob)
- var/type = input(user,"What projectile type?","Projectile", null) as null|anything in typesof(/obj/item/projectile)
- if(!type)
- return ..()
- projectile_type = type
- . = ..()
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 38d3a1fcfd5..53f77feed2d 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -71,10 +71,10 @@
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=6, burst_accuracy=list(0,-1,-2,-2,-3), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
)
-/obj/item/weapon/gun/projectile/automatic/sts35/update_icon()
+/obj/item/weapon/gun/projectile/automatic/sts35/update_icon(var/ignore_inhands)
..()
icon_state = (ammo_magazine)? "arifle" : "arifle-empty"
- update_held_icon()
+ if(!ignore_inhands) update_held_icon()
/obj/item/weapon/gun/projectile/automatic/wt550
name = "machine pistol"
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index cd5189e4a33..788886af305 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -135,22 +135,7 @@
on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
var/mob/living/carbon/human/M = target
- M.adjustBrainLoss(20)
- M.hallucination += 20
-
-/obj/item/projectile/icarus/pointdefense/process()
- Icarus_FireLaser(get_turf(original))
- spawn
- qdel(src)
-
- return
-
-/obj/item/projectile/icarus/guns/process()
- Icarus_FireCannon(get_turf(original))
- spawn
- qdel(src)
- return
-
+ M.confused += rand(5,8)
/obj/item/projectile/chameleon
name = "bullet"
icon_state = "bullet"
@@ -159,3 +144,4 @@
nodamage = 1
damage_type = HALLOSS
muzzle_type = /obj/effect/projectile/bullet/muzzle
+
diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm
index 48eebf083af..7a6fdcc0ca9 100644
--- a/code/modules/projectiles/targeting/targeting_overlay.dm
+++ b/code/modules/projectiles/targeting/targeting_overlay.dm
@@ -115,6 +115,8 @@ obj/aiming_overlay/proc/update_aiming_deferred()
if(!(aiming_with in owner) || (istype(owner, /mob/living/carbon/human) && (owner.l_hand != aiming_with && owner.r_hand != aiming_with)))
owner << "You must keep hold of your weapon!"
+ else if(owner.eye_blind)
+ owner << "You are blind and cannot see your target!"
else if(!aiming_at || !istype(aiming_at.loc, /turf))
owner << "You have lost sight of your target!"
else if(owner.incapacitated() || owner.lying || owner.restrained())
diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm
index 3ecb7d7214e..f1d7d02637a 100644
--- a/code/modules/random_map/random_map.dm
+++ b/code/modules/random_map/random_map.dm
@@ -206,5 +206,6 @@ var/global/list/map_count = list()
target_map.map[target_map.get_map_cell(tx+x,ty+y)] = map[current_cell]
handle_post_overlay_on(target_map,tx,ty)
+
/datum/random_map/proc/handle_post_overlay_on(var/datum/random_map/target_map, var/tx, var/ty)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 8147c0ff56e..818b93b681d 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -288,7 +288,7 @@
return splash_mob(target, amount, copy)
if(isturf(target))
return trans_to_turf(target, amount, multiplier, copy)
- if(isobj(target))
+ if(isobj(target) && target.is_open_container())
return trans_to_obj(target, amount, multiplier, copy)
return 0
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index d597e9d8efe..0febaa68bce 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -27,6 +27,7 @@
var/pillsprite = "1"
var/client/has_sprites = list()
var/max_pill_count = 20
+ flags = OPENCONTAINER
/obj/machinery/chem_master/New()
..()
@@ -115,21 +116,21 @@
if(href_list["amount"])
var/id = href_list["add"]
- var/amount = isgoodnumber(text2num(href_list["amount"]))
+ var/amount = Clamp((text2num(href_list["amount"])), 0, 200)
R.trans_id_to(src, id, amount)
else if (href_list["addcustom"])
var/id = href_list["addcustom"]
useramount = input("Select the amount to transfer.", 30, useramount) as num
- useramount = isgoodnumber(useramount)
+ useramount = Clamp(useramount, 0, 200)
src.Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
else if (href_list["remove"])
if(href_list["amount"])
var/id = href_list["remove"]
- var/amount = isgoodnumber(text2num(href_list["amount"]))
+ var/amount = Clamp((text2num(href_list["amount"])), 0, 200)
if(mode)
reagents.trans_id_to(beaker, id, amount)
else
@@ -140,7 +141,7 @@
var/id = href_list["removecustom"]
useramount = input("Select the amount to transfer.", 30, useramount) as num
- useramount = isgoodnumber(useramount)
+ useramount = Clamp(useramount, 0, 200)
src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
else if (href_list["toggle"])
@@ -162,7 +163,8 @@
return
if (href_list["createpill_multiple"])
- count = Clamp(isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num),1,max_pill_count)
+ count = input("Select the number of pills to make.", "Max [max_pill_count]", pillamount) as num
+ count = Clamp(count, 1, max_pill_count)
if(reagents.total_volume/count < 1) //Sanity checking.
return
@@ -291,270 +293,12 @@
onclose(user, "chem_master")
return
-/obj/machinery/chem_master/proc/isgoodnumber(var/num)
- if(isnum(num))
- return Clamp(round(num), 0, 200)
- else
- return 0
-
/obj/machinery/chem_master/condimaster
name = "CondiMaster 3000"
condi = 1
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
-
-/obj/machinery/computer/pandemic
- name = "PanD.E.M.I.C 2200"
- density = 1
- anchored = 1
- icon = 'icons/obj/chemical.dmi'
- icon_state = "mixer0"
- circuit = /obj/item/weapon/circuitboard/pandemic
- //use_power = 1
- //idle_power_usage = 20 //defaults make more sense.
- var/temphtml = ""
- var/wait = null
- var/obj/item/weapon/reagent_containers/glass/beaker = null
-
-
-/obj/machinery/computer/pandemic/set_broken()
- icon_state = (src.beaker?"mixer1_b":"mixer0_b")
- stat |= BROKEN
-
-
-/obj/machinery/computer/pandemic/power_change()
- ..()
- if(stat & BROKEN)
- icon_state = (src.beaker?"mixer1_b":"mixer0_b")
-
- else if(!(stat & NOPOWER))
- icon_state = (src.beaker?"mixer1":"mixer0")
-
- else
- spawn(rand(0, 15))
- src.icon_state = (src.beaker?"mixer1_nopower":"mixer0_nopower")
-
-
-/obj/machinery/computer/pandemic/Topic(href, href_list)
- if(stat & (NOPOWER|BROKEN)) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
-
- usr.set_machine(src)
- if(!beaker) return
-
- if (href_list["create_vaccine"])
- if(!src.wait)
- var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- if(B)
- var/path = href_list["create_vaccine"]
- var/vaccine_type = text2path(path)
- var/datum/disease/D = null
-
- if(!vaccine_type)
- D = archive_diseases[path]
- vaccine_type = path
- else
- if(vaccine_type in diseases)
- D = new vaccine_type(0, null)
-
- if(D)
- B.name = "[D.name] vaccine bottle"
- B.reagents.add_reagent("vaccine",15,vaccine_type)
- wait = 1
- var/datum/reagents/R = beaker.reagents
- var/datum/reagent/blood/Blood = null
- for(var/datum/reagent/blood/L in R.reagent_list)
- if(L)
- Blood = L
- break
- var/list/res = Blood.data["resistances"]
- spawn(res.len*200)
- src.wait = null
- else
- src.temphtml = "The replicator is not ready yet."
- src.updateUsrDialog()
- return
- else if (href_list["create_virus_culture"])
- if(!wait)
- var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- B.icon_state = "bottle-1"
- var/type = text2path(href_list["create_virus_culture"])//the path is received as string - converting
- var/datum/disease/D = null
- if(!type)
- var/datum/disease/advance/A = archive_diseases[href_list["create_virus_culture"]]
- if(A)
- D = new A.type(0, A)
- else
- if(type in diseases) // Make sure this is a disease
- D = new type(0, null)
- var/list/data = list("viruses"=list(D))
- var/name = sanitizeSafe(input(usr,"Name:","Name the culture",D.name), MAX_NAME_LEN)
- if(!name || name == " ") name = D.name
- B.name = "[name] culture bottle"
- B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
- B.reagents.add_reagent("blood",20,data)
- B.update_icon()
- src.updateUsrDialog()
- wait = 1
- spawn(1000)
- src.wait = null
- else
- src.temphtml = "The replicator is not ready yet."
- src.updateUsrDialog()
- return
- else if (href_list["empty_beaker"])
- beaker.reagents.clear_reagents()
- src.updateUsrDialog()
- return
- else if (href_list["eject"])
- beaker:loc = src.loc
- beaker = null
- icon_state = "mixer0"
- src.updateUsrDialog()
- return
- else if(href_list["clear"])
- src.temphtml = ""
- src.updateUsrDialog()
- return
- else if(href_list["name_disease"])
- var/new_name = sanitizeSafe(input(usr, "Name the Disease", "New Name", ""), MAX_NAME_LEN)
- if(stat & (NOPOWER|BROKEN)) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
- var/id = href_list["name_disease"]
- if(archive_diseases[id])
- var/datum/disease/advance/A = archive_diseases[id]
- A.AssignName(new_name)
- for(var/datum/disease/advance/AD in active_diseases)
- AD.Refresh()
- src.updateUsrDialog()
-
-
- else
- usr << browse(null, "window=pandemic")
- src.updateUsrDialog()
- return
-
- src.add_fingerprint(usr)
- return
-
-/obj/machinery/computer/pandemic/attack_ai(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/computer/pandemic/attack_hand(mob/user as mob)
- if(stat & (NOPOWER|BROKEN))
- return
- user.set_machine(src)
- var/dat = ""
- if(src.temphtml)
- dat = "[src.temphtml]
Main Menu"
- else if(!beaker)
- dat += "Please insert beaker.
"
- dat += "Close"
- else
- var/datum/reagents/R = beaker.reagents
- var/datum/reagent/blood/Blood = null
- for(var/datum/reagent/blood/B in R.reagent_list)
- if(B)
- Blood = B
- break
- if(!R.total_volume||!R.reagent_list.len)
- dat += "The beaker is empty
"
- else if(!Blood)
- dat += "No blood sample found in beaker"
- else if(!Blood.data)
- dat += "No blood data found in beaker."
- else
- dat += "Blood sample data:
"
- dat += "Blood DNA: [(Blood.data["blood_DNA"]||"none")]
"
- dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
"
-
-
- if(Blood.data["viruses"])
- var/list/vir = Blood.data["viruses"]
- if(vir.len)
- for(var/datum/disease/D in Blood.data["viruses"])
- if(!D.hidden[PANDEMIC])
-
-
- var/disease_creation = D.type
- if(istype(D, /datum/disease/advance))
-
- var/datum/disease/advance/A = D
- D = archive_diseases[A.GetDiseaseID()]
- disease_creation = A.GetDiseaseID()
- if(D.name == "Unknown")
- dat += "Name Disease
"
-
- if(!D)
- CRASH("We weren't able to get the advance disease from the archive.")
-
- dat += "Disease Agent: [D?"[D.agent] - Create virus culture bottle":"none"]
"
- dat += "Common name: [(D.name||"none")]
"
- dat += "Description: [(D.desc||"none")]
"
- dat += "Spread: [(D.spread||"none")]
"
- dat += "Possible cure: [(D.cure||"none")]
"
-
- if(istype(D, /datum/disease/advance))
- var/datum/disease/advance/A = D
- dat += "Symptoms: "
- var/english_symptoms = list()
- for(var/datum/symptom/S in A.symptoms)
- english_symptoms += S.name
- dat += english_list(english_symptoms)
-
-
- dat += "
Contains antibodies to: "
- if(Blood.data["resistances"])
- var/list/res = Blood.data["resistances"]
- if(res.len)
- dat += ""
- for(var/type in Blood.data["resistances"])
- var/disease_name = "Unknown"
-
- if(!ispath(type))
- var/datum/disease/advance/A = archive_diseases[type]
- if(A)
- disease_name = A.name
- else
- var/datum/disease/D = new type(0, null)
- disease_name = D.name
-
- dat += "- [disease_name] - Create vaccine bottle
"
- dat += "
"
- else
- dat += "nothing
"
- else
- dat += "nothing
"
- dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]
"
- dat += "Close"
-
- user << browse("[src.name]
[dat]", "window=pandemic;size=575x400")
- onclose(user, "pandemic")
- return
-
-
-/obj/machinery/computer/pandemic/attackby(var/obj/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/weapon/reagent_containers/glass))
- if(stat & (NOPOWER|BROKEN)) return
- if(src.beaker)
- user << "A beaker is already loaded into the machine."
- return
-
- src.beaker = I
- user.drop_item()
- I.loc = src
- user << "You add the beaker to the machine!"
- src.updateUsrDialog()
- icon_state = "mixer1"
-
- else
- ..()
- return
-////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////
/obj/machinery/reagentgrinder
name = "All-In-One Grinder"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index 05c5da1e94a..8a84af11f38 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -23,23 +23,6 @@
t["virus2"] = v.Copy()
return t
-/datum/reagent/blood/mix_data(var/newdata, var/newamount) // You have a reagent with data, and new reagent with its own data get added, how do you deal with that?
- if(data["viruses"] || newdata["viruses"])
- var/list/mix1 = data["viruses"]
- var/list/mix2 = newdata["viruses"]
- var/list/to_mix = list() // Stop issues with the list changing during mixing.
- for(var/datum/disease/advance/AD in mix1)
- to_mix += AD
- for(var/datum/disease/advance/AD in mix2)
- to_mix += AD
- var/datum/disease/advance/AD = Advance_Mix(to_mix)
- if(AD)
- var/list/preserve = list(AD)
- for(var/D in data["viruses"])
- if(!istype(D, /datum/disease/advance))
- preserve += D
- data["viruses"] = preserve
-
/datum/reagent/blood/touch_turf(var/turf/simulated/T)
if(!istype(T) || volume < 3)
return
@@ -55,12 +38,6 @@
M.adjustToxLoss(removed)
if(dose > 15)
M.adjustToxLoss(removed)
- if(data && data["viruses"])
- for(var/datum/disease/D in data["viruses"])
- if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS)
- continue
- if(D.spread_type in list(CONTACT_FEET, CONTACT_HANDS, CONTACT_GENERAL))
- M.contract_disease(D)
if(data && data["virus2"])
var/list/vlist = data["virus2"]
if(vlist.len)
@@ -74,12 +51,6 @@
var/mob/living/carbon/human/H = M
if(H.isSynthetic())
return
- if(data && data["viruses"])
- for(var/datum/disease/D in data["viruses"])
- if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS)
- continue
- if(D.spread_type in list(CONTACT_FEET, CONTACT_HANDS, CONTACT_GENERAL))
- M.contract_disease(D)
if(data && data["virus2"])
var/list/vlist = data["virus2"]
if(vlist.len)
@@ -94,26 +65,6 @@
M.inject_blood(src, volume)
remove_self(volume)
-/datum/reagent/vaccine
- name = "Vaccine"
- id = "vaccine"
- reagent_state = LIQUID
- color = "#C81040"
-
-/datum/reagent/vaccine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(data)
- for(var/datum/disease/D in M.viruses)
- if(istype(D, /datum/disease/advance))
- var/datum/disease/advance/A = D
- if(A.GetDiseaseID() == data)
- D.cure()
- else
- if(D.type == data)
- D.cure()
-
- M.resistances += data
- return
-
// pure concentrated antibodies
/datum/reagent/antibodies
data = list("antibodies"=list())
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index e77b86a30a4..ccdb834ef0f 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -191,7 +191,7 @@
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch", "drool", "moan"))
- M.adjustBrainLoss(2)
+ M.adjustBrainLoss(0.1)
/datum/reagent/nitrogen
name = "Nitrogen"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index af30173680b..2e8c8990d0e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -141,11 +141,6 @@
M.confused = 0
M.sleeping = 0
M.jitteriness = 0
- for(var/datum/disease/D in M.viruses)
- D.spread = "Remissive"
- D.stage--
- if(D.stage < 1)
- D.cure()
/datum/reagent/gold
name = "Gold"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index 3de830f6448..d56183619e6 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -394,7 +394,7 @@
return
M.jitteriness = max(M.jitteriness - 5, 0)
if(prob(80))
- M.adjustBrainLoss(3 * removed)
+ M.adjustBrainLoss(0.1 * removed)
if(prob(50))
M.drowsyness = max(M.drowsyness, 3)
if(prob(10))
@@ -500,31 +500,3 @@
else
new_mob.key = M.key
qdel(M)
-
-/datum/reagent/nanites
- name = "Nanomachines"
- id = "nanites"
- description = "Microscopic construction robots."
- reagent_state = LIQUID
- color = "#535E66"
-
-/datum/reagent/nanites/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
- if(prob(10))
- M.contract_disease(new /datum/disease/robotic_transformation(0), 1) //What
-
-/datum/reagent/nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.contract_disease(new /datum/disease/robotic_transformation(0), 1)
-
-/datum/reagent/xenomicrobes
- name = "Xenomicrobes"
- id = "xenomicrobes"
- description = "Microbes with an entirely alien cellular structure."
- reagent_state = LIQUID
- color = "#535E66"
-
-/datum/reagent/xenomicrobes/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
- if(prob(10))
- M.contract_disease(new /datum/disease/xeno_transformation(0), 1)
-
-/datum/reagent/xenomicrobes/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.contract_disease(new /datum/disease/xeno_transformation(0), 1)
diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm
index 1e797d60409..4caf08cc31f 100644
--- a/code/modules/reagents/reagent_containers/food.dm
+++ b/code/modules/reagents/reagent_containers/food.dm
@@ -13,7 +13,7 @@
/obj/item/weapon/reagent_containers/food/New()
..()
- if (!pixel_x && !pixel_y)
+ if (isnull(center_of_mass) && !pixel_x && !pixel_y)
src.pixel_x = rand(-6.0, 6) //Randomizes postion
src.pixel_y = rand(-6.0, 6)
diff --git a/code/modules/reagents/reagent_containers/food/drinks/jar.dm b/code/modules/reagents/reagent_containers/food/drinks/jar.dm
index 47abb8637a3..b4d305bae79 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/jar.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/jar.dm
@@ -1,7 +1,4 @@
-
-
///jar
-
/obj/item/weapon/reagent_containers/food/drinks/jar
name = "empty jar"
desc = "A jar. You're not sure what it's supposed to hold."
@@ -9,23 +6,20 @@
item_state = "beaker"
center_of_mass = list("x"=15, "y"=8)
unacidable = 1
- New()
- ..()
- reagents.add_reagent("slime", 50)
- on_reagent_change()
- if (reagents.reagent_list.len > 0)
- switch(reagents.get_master_reagent_id())
- if("slime")
- icon_state = "jar_slime"
- name = "slime jam"
- desc = "A jar of slime jam. Delicious!"
- else
- icon_state ="jar_what"
- name = "jar of something"
- desc = "You can't really tell what this is."
- else
- icon_state = "jar"
- name = "empty jar"
- desc = "A jar. You're not sure what it's supposed to hold."
- return
+/obj/item/weapon/reagent_containers/food/drinks/jar/on_reagent_change()
+ if (reagents.reagent_list.len > 0)
+ switch(reagents.get_master_reagent_id())
+ if("slime")
+ icon_state = "jar_slime"
+ name = "slime jam"
+ desc = "A jar of slime jam. Delicious!"
+ else
+ icon_state ="jar_what"
+ name = "jar of something"
+ desc = "You can't really tell what this is."
+ else
+ icon_state = "jar"
+ name = "empty jar"
+ desc = "A jar. You're not sure what it's supposed to hold."
+ return
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index a5c820d96b5..c0919eea557 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -11,7 +11,7 @@
var/slices_num
var/dried_type = null
var/dry = 0
- center_of_mass = list("x"=15, "y"=15)
+ center_of_mass = list("x"=16, "y"=16)
w_class = 2
//Placeholder for effect that trigger on eating that aren't tied to reagents.
@@ -250,6 +250,7 @@
icon_state = "aesirsalad"
trash = /obj/item/trash/snack_bowl
filling_color = "#468C00"
+ center_of_mass = list("x"=17, "y"=11)
New()
..()
@@ -264,6 +265,7 @@
icon_state = "candy"
trash = /obj/item/trash/candy
filling_color = "#7D5F46"
+ center_of_mass = list("x"=15, "y"=15)
New()
..()
@@ -275,6 +277,7 @@
name = "Donor Candy"
desc = "A little treat for blood donors."
trash = /obj/item/trash/candy
+
New()
..()
reagents.add_reagent("nutriment", 10)
@@ -286,6 +289,7 @@
desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas."
icon_state = "candy_corn"
filling_color = "#FFFCB0"
+ center_of_mass = list("x"=14, "y"=10)
New()
..()
@@ -299,6 +303,7 @@
icon_state = "chips"
trash = /obj/item/trash/chips
filling_color = "#E8C31E"
+ center_of_mass = list("x"=15, "y"=15)
New()
..()
@@ -310,6 +315,7 @@
desc = "COOKIE!!!"
icon_state = "COOKIE!!!"
filling_color = "#DBC94F"
+ center_of_mass = list("x"=17, "y"=18)
New()
..()
@@ -321,6 +327,7 @@
desc = "Such sweet, fattening food."
icon_state = "chocolatebar"
filling_color = "#7D5F46"
+ center_of_mass = list("x"=15, "y"=15)
New()
..()
@@ -334,6 +341,7 @@
desc = "Such sweet, fattening food."
icon_state = "chocolateegg"
filling_color = "#7D5F46"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -348,6 +356,7 @@
icon_state = "donut1"
filling_color = "#D9C386"
var/overlay_state = "box-donut1"
+ center_of_mass = list("x"=13, "y"=16)
/obj/item/weapon/reagent_containers/food/snacks/donut/normal
name = "donut"
@@ -363,6 +372,7 @@
src.overlay_state = "box-donut2"
src.name = "frosted donut"
reagents.add_reagent("sprinkles", 2)
+ center_of_mass = list("x"=19, "y"=16)
/obj/item/weapon/reagent_containers/food/snacks/donut/chaos
name = "Chaos Donut"
@@ -409,6 +419,7 @@
desc = "You jelly?"
icon_state = "jdonut1"
filling_color = "#ED1169"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -427,6 +438,7 @@
desc = "You jelly?"
icon_state = "jdonut1"
filling_color = "#ED1169"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -445,6 +457,7 @@
desc = "You jelly?"
icon_state = "jdonut1"
filling_color = "#ED1169"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -464,6 +477,7 @@
icon_state = "egg"
filling_color = "#FDFFD1"
volume = 10
+ center_of_mass = list("x"=16, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/egg/New()
..()
@@ -529,6 +543,7 @@
desc = "A fried egg, with a touch of salt and pepper."
icon_state = "friedegg"
filling_color = "#FFDF78"
+ center_of_mass = list("x"=16, "y"=14)
New()
..()
@@ -553,6 +568,7 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "appendix"
filling_color = "#E00D34"
+ center_of_mass = list("x"=16, "y"=16)
New()
..()
@@ -565,6 +581,7 @@
icon_state = "tofu"
desc = "We all love tofu."
filling_color = "#FFFEE0"
+ center_of_mass = list("x"=17, "y"=10)
New()
..()
@@ -576,6 +593,7 @@
desc = "A fake turkey made from tofu."
icon_state = "tofurkey"
filling_color = "#FFFEE0"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -588,6 +606,7 @@
desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!"
icon_state = "stuffing"
filling_color = "#C9AC83"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -599,6 +618,7 @@
desc = "A fillet of spess carp meat"
icon_state = "fishfillet"
filling_color = "#FFDEFE"
+ center_of_mass = list("x"=17, "y"=13)
New()
..()
@@ -611,6 +631,7 @@
desc = "A finger of fish."
icon_state = "fishfingers"
filling_color = "#FFDEFE"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -623,6 +644,7 @@
desc = "A slice from a huge mushroom."
icon_state = "hugemushroomslice"
filling_color = "#E0D7C5"
+ center_of_mass = list("x"=17, "y"=16)
New()
..()
@@ -635,6 +657,7 @@
desc = "A slice from a huge tomato"
icon_state = "tomatomeat"
filling_color = "#DB0000"
+ center_of_mass = list("x"=17, "y"=16)
New()
..()
@@ -646,6 +669,7 @@
desc = "A very manly slab of meat."
icon_state = "bearmeat"
filling_color = "#DB0000"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -658,6 +682,7 @@
desc = "A slab of green meat. Smells like acid."
icon_state = "xenomeat"
filling_color = "#43DE18"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -670,6 +695,7 @@
desc = "A great meal all round."
icon_state = "meatball"
filling_color = "#DB0000"
+ center_of_mass = list("x"=16, "y"=16)
New()
..()
@@ -681,6 +707,7 @@
desc = "A piece of mixed, long meat."
icon_state = "sausage"
filling_color = "#DB0000"
+ center_of_mass = list("x"=16, "y"=16)
New()
..()
@@ -709,6 +736,7 @@
desc = "The food of choice for the seasoned traitor."
icon_state = "donkpocket"
filling_color = "#DEDEAB"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -739,6 +767,7 @@
desc = "A strange looking burger. It looks almost sentient."
icon_state = "brainburger"
filling_color = "#F2B6EA"
+ center_of_mass = list("x"=15, "y"=11)
New()
..()
@@ -751,6 +780,7 @@
desc = "Spooky! It doesn't look very filling."
icon_state = "ghostburger"
filling_color = "#FFF2FF"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -767,6 +797,7 @@
name = "-burger"
desc = "A bloody burger."
icon_state = "hburger"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
reagents.add_reagent("protein", 6)
@@ -776,6 +807,8 @@
name = "cheeseburger"
desc = "The cheese adds a good flavor."
icon_state = "cheeseburger"
+ center_of_mass = list("x"=16, "y"=11)
+
New()
..()
reagents.add_reagent("protein", 2)
@@ -786,6 +819,7 @@
desc = "The cornerstone of every nutritious breakfast."
icon_state = "hburger"
filling_color = "#D63C3C"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -798,6 +832,7 @@
desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp."
icon_state = "fishburger"
filling_color = "#FFDEFE"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -810,6 +845,7 @@
desc = "What.. is that meat?"
icon_state = "tofuburger"
filling_color = "#FFFEE0"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -821,12 +857,11 @@
desc = "The lettuce is the only organic component. Beep."
icon_state = "roburger"
filling_color = "#CCCCCC"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
reagents.add_reagent("nutriment", 2)
- if(prob(5))
- reagents.add_reagent("nanites", 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/roburgerbig
@@ -835,10 +870,10 @@
icon_state = "roburger"
filling_color = "#CCCCCC"
volume = 100
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
- reagents.add_reagent("nanites", 100)
bitesize = 0.1
/obj/item/weapon/reagent_containers/food/snacks/xenoburger
@@ -846,6 +881,7 @@
desc = "Smells caustic. Tastes like heresy."
icon_state = "xburger"
filling_color = "#43DE18"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -857,6 +893,7 @@
desc = "This tastes funny..."
icon_state = "clownburger"
filling_color = "#FF00FF"
+ center_of_mass = list("x"=17, "y"=12)
New()
..()
@@ -868,6 +905,7 @@
desc = "Its taste defies language."
icon_state = "mimeburger"
filling_color = "#FFFFFF"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -880,6 +918,7 @@
icon_state = "omelette"
trash = /obj/item/trash/plate
filling_color = "#FFF9A8"
+ center_of_mass = list("x"=16, "y"=13)
//var/herp = 0
New()
@@ -892,6 +931,7 @@
desc = "A delicious and spongy little cake"
icon_state = "muffin"
filling_color = "#E0CF9B"
+ center_of_mass = list("x"=17, "y"=4)
New()
..()
@@ -904,6 +944,7 @@
icon_state = "pie"
trash = /obj/item/trash/plate
filling_color = "#FBFFB8"
+ center_of_mass = list("x"=16, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/pie/New()
..()
@@ -922,6 +963,8 @@
desc = "No black birds, this is a good sign."
icon_state = "berryclafoutis"
trash = /obj/item/trash/plate
+ center_of_mass = list("x"=16, "y"=13)
+
New()
..()
reagents.add_reagent("nutriment", 4)
@@ -934,6 +977,7 @@
icon_state = "waffles"
trash = /obj/item/trash/waffles
filling_color = "#E6DEB5"
+ center_of_mass = list("x"=15, "y"=11)
New()
..()
@@ -946,6 +990,7 @@
icon_state = "eggplantparm"
trash = /obj/item/trash/plate
filling_color = "#4D2F5E"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -958,6 +1003,7 @@
icon_state = "soylent_green"
trash = /obj/item/trash/waffles
filling_color = "#B8E6B5"
+ center_of_mass = list("x"=15, "y"=11)
New()
..()
@@ -970,6 +1016,7 @@
icon_state = "soylent_yellow"
trash = /obj/item/trash/waffles
filling_color = "#E6FA61"
+ center_of_mass = list("x"=15, "y"=11)
New()
..()
@@ -983,6 +1030,7 @@
desc = "An old barber recipe, very delicious!"
trash = /obj/item/trash/plate
filling_color = "#948051"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -995,6 +1043,7 @@
desc = "A delicious tofu pie."
trash = /obj/item/trash/plate
filling_color = "#FFFEE0"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -1006,6 +1055,7 @@
desc = "Sweet and tasty poison pie."
icon_state = "amanita_pie"
filling_color = "#FFCCCC"
+ center_of_mass = list("x"=17, "y"=9)
New()
..()
@@ -1019,6 +1069,7 @@
desc = "I bet you love stuff made out of plump helmets!"
icon_state = "plump_pie"
filling_color = "#B8279B"
+ center_of_mass = list("x"=17, "y"=9)
New()
..()
@@ -1038,6 +1089,7 @@
desc = "A delicious meatpie. Probably heretical."
trash = /obj/item/trash/plate
filling_color = "#43DE18"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -1050,6 +1102,7 @@
icon_state = "wingfangchu"
trash = /obj/item/trash/snack_bowl
filling_color = "#43DE18"
+ center_of_mass = list("x"=17, "y"=9)
New()
..()
@@ -1063,6 +1116,7 @@
desc = "A human meat, on a stick."
trash = /obj/item/stack/rods
filling_color = "#A85340"
+ center_of_mass = list("x"=17, "y"=15)
New()
..()
@@ -1075,6 +1129,7 @@
desc = "Delicious meat, on a stick."
trash = /obj/item/stack/rods
filling_color = "#A85340"
+ center_of_mass = list("x"=17, "y"=15)
New()
..()
@@ -1087,6 +1142,7 @@
desc = "Vegan meat, on a stick."
trash = /obj/item/stack/rods
filling_color = "#FFFEE0"
+ center_of_mass = list("x"=17, "y"=15)
New()
..()
@@ -1099,6 +1155,7 @@
icon_state = "cubancarp"
trash = /obj/item/trash/plate
filling_color = "#E9ADFF"
+ center_of_mass = list("x"=12, "y"=5)
New()
..()
@@ -1115,6 +1172,7 @@
trash = /obj/item/trash/popcorn
var/unpopped = 0
filling_color = "#FFFAD4"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -1134,6 +1192,7 @@
desc = "Beef jerky made from the finest space cows."
trash = /obj/item/trash/sosjerky
filling_color = "#631212"
+ center_of_mass = list("x"=15, "y"=9)
New()
..()
@@ -1146,6 +1205,7 @@
desc = "Best raisins in the universe. Not sure why."
trash = /obj/item/trash/raisins
filling_color = "#343834"
+ center_of_mass = list("x"=15, "y"=4)
New()
..()
@@ -1156,6 +1216,7 @@
icon_state = "space_twinkie"
desc = "Guaranteed to survive longer then you will."
filling_color = "#FFE591"
+ center_of_mass = list("x"=15, "y"=11)
New()
..()
@@ -1168,6 +1229,7 @@
desc = "Bite sized cheesie snacks that will honk all over your mouth"
trash = /obj/item/trash/cheesie
filling_color = "#FFA305"
+ center_of_mass = list("x"=15, "y"=9)
New()
..()
@@ -1179,6 +1241,7 @@
icon_state = "syndi_cakes"
desc = "An extremely moist snack cake that tastes just as good after being nuked."
filling_color = "#FF5D05"
+ center_of_mass = list("x"=16, "y"=10)
trash = /obj/item/trash/syndi_cakes
New()
@@ -1192,6 +1255,7 @@
desc = "Totally baked."
icon_state = "loadedbakedpotato"
filling_color = "#9C7A68"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1205,6 +1269,7 @@
icon_state = "fries"
trash = /obj/item/trash/plate
filling_color = "#EDDD00"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1217,6 +1282,7 @@
icon_state = "soydope"
trash = /obj/item/trash/plate
filling_color = "#C4BF76"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1228,6 +1294,7 @@
desc = "A bundle of raw spaghetti."
icon_state = "spagetti"
filling_color = "#EDDD00"
+ center_of_mass = list("x"=16, "y"=16)
New()
..()
@@ -1240,6 +1307,7 @@
icon_state = "cheesyfries"
trash = /obj/item/trash/plate
filling_color = "#EDDD00"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1252,6 +1320,7 @@
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
filling_color = "#E8E79E"
+ center_of_mass = list("x"=15, "y"=14)
New()
..()
@@ -1263,6 +1332,7 @@
desc = "Someone should be demoted from chef for this."
icon_state = "badrecipe"
filling_color = "#211F02"
+ center_of_mass = list("x"=16, "y"=12)
New()
..()
@@ -1276,6 +1346,7 @@
icon_state = "meatstake"
trash = /obj/item/trash/plate
filling_color = "#7A3D11"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -1290,6 +1361,7 @@
icon_state = "spacylibertyduff"
trash = /obj/item/trash/snack_bowl
filling_color = "#42B873"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -1303,6 +1375,7 @@
icon_state = "amanitajelly"
trash = /obj/item/trash/snack_bowl
filling_color = "#ED0758"
+ center_of_mass = list("x"=16, "y"=5)
New()
..()
@@ -1317,6 +1390,7 @@
icon_state = "poppypretzel"
bitesize = 2
filling_color = "#916E36"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1330,6 +1404,7 @@
icon_state = "meatballsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#785210"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -1340,7 +1415,7 @@
/obj/item/weapon/reagent_containers/food/snacks/slimesoup
name = "slime soup"
desc = "If no water is available, you may substitute tears."
- icon_state = "slimesoup"
+ icon_state = "slimesoup" //nonexistant?
filling_color = "#C4DBA0"
New()
@@ -1354,6 +1429,7 @@
desc = "Smells like copper."
icon_state = "tomatosoup"
filling_color = "#FF0000"
+ center_of_mass = list("x"=16, "y"=7)
New()
..()
@@ -1367,6 +1443,7 @@
desc = "Not very funny."
icon_state = "clownstears"
filling_color = "#C4FBFF"
+ center_of_mass = list("x"=16, "y"=7)
New()
..()
@@ -1381,6 +1458,7 @@
icon_state = "vegetablesoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#AFC4B5"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -1394,6 +1472,7 @@
icon_state = "nettlesoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#AFC4B5"
+ center_of_mass = list("x"=16, "y"=7)
New()
..()
@@ -1408,6 +1487,7 @@
icon_state = "mysterysoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#F082FF"
+ center_of_mass = list("x"=16, "y"=6)
New()
..()
@@ -1455,6 +1535,7 @@
icon_state = "wishsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#D1F4FF"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1470,6 +1551,7 @@
icon_state = "hotchili"
trash = /obj/item/trash/snack_bowl
filling_color = "#FF3C00"
+ center_of_mass = list("x"=15, "y"=9)
New()
..()
@@ -1485,6 +1567,7 @@
desc = "This slush is barely a liquid!"
icon_state = "coldchili"
filling_color = "#2B00FF"
+ center_of_mass = list("x"=15, "y"=9)
trash = /obj/item/trash/snack_bowl
New()
@@ -1502,10 +1585,13 @@
icon_state = "bacon"
var/obj/item/device/radio/beacon/bacon/baconbeacon
bitesize = 2
+ center_of_mass = list("x"=18, "y"=13)
+
New()
..()
reagents.add_reagent("nutriment", 4)
baconbeacon = new /obj/item/device/radio/beacon/bacon(src)
+
On_Consume()
if(!reagents.total_volume)
baconbeacon.loc = usr
@@ -1518,6 +1604,7 @@
icon_state = "monkeycube"
bitesize = 12
filling_color = "#ADAC7F"
+ center_of_mass = list("x"=16, "y"=14)
var/wrapped = 0
var/monkey_type = "Monkey"
@@ -1603,6 +1690,7 @@
desc = "Forget the Big Mac. THIS is the future!"
icon_state = "bigbiteburger"
filling_color = "#E3D681"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1616,6 +1704,7 @@
icon_state = "enchiladas"
trash = /obj/item/trash/tray
filling_color = "#A36A1F"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -1630,6 +1719,7 @@
icon_state = "monkeysdelight"
trash = /obj/item/trash/tray
filling_color = "#5C3C11"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -1644,6 +1734,7 @@
desc = "Bon appetit!"
icon_state = "baguette"
filling_color = "#E3D796"
+ center_of_mass = list("x"=18, "y"=12)
New()
..()
@@ -1657,6 +1748,7 @@
desc = "I do say so myself chap."
icon_state = "fishandchips"
filling_color = "#E3D796"
+ center_of_mass = list("x"=16, "y"=16)
New()
..()
@@ -1671,6 +1763,7 @@
icon_state = "sandwich"
trash = /obj/item/trash/plate
filling_color = "#D9BE29"
+ center_of_mass = list("x"=16, "y"=4)
New()
..()
@@ -1684,6 +1777,7 @@
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
filling_color = "#D9BE29"
+ center_of_mass = list("x"=16, "y"=4)
New()
..()
@@ -1711,6 +1805,7 @@
icon_state = "tomatosoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#D92929"
+ center_of_mass = list("x"=16, "y"=7)
New()
..()
@@ -1724,6 +1819,7 @@
icon_state = "rofflewaffles"
trash = /obj/item/trash/waffles
filling_color = "#FF00F7"
+ center_of_mass = list("x"=15, "y"=11)
New()
..()
@@ -1736,6 +1832,7 @@
desc = "A nice and warm stew. Healthy and strong."
icon_state = "stew"
filling_color = "#9E673A"
+ center_of_mass = list("x"=16, "y"=5)
New()
..()
@@ -1752,6 +1849,7 @@
icon_state = "jellytoast"
trash = /obj/item/trash/plate
filling_color = "#B572AB"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -1773,6 +1871,7 @@
desc = "Culinary delight..?"
icon_state = "jellyburger"
filling_color = "#B572AB"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1794,6 +1893,8 @@
desc = "The universes best soup! Yum!!!"
icon_state = "milosoup"
trash = /obj/item/trash/snack_bowl
+ center_of_mass = list("x"=16, "y"=7)
+
New()
..()
reagents.add_reagent("nutriment", 8)
@@ -1805,6 +1906,8 @@
desc = "Even non-vegetarians will LOVE this!"
icon_state = "stewedsoymeat"
trash = /obj/item/trash/plate
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 8)
@@ -1816,6 +1919,7 @@
icon_state = "spagettiboiled"
trash = /obj/item/trash/plate
filling_color = "#FCEE81"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1828,6 +1932,7 @@
icon_state = "boiledrice"
trash = /obj/item/trash/snack_bowl
filling_color = "#FFFBDB"
+ center_of_mass = list("x"=17, "y"=11)
New()
..()
@@ -1840,6 +1945,7 @@
icon_state = "rpudding"
trash = /obj/item/trash/snack_bowl
filling_color = "#FFFBDB"
+ center_of_mass = list("x"=17, "y"=11)
New()
..()
@@ -1852,6 +1958,7 @@
icon_state = "pastatomato"
trash = /obj/item/trash/plate
filling_color = "#DE4545"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1865,6 +1972,7 @@
icon_state = "meatballspagetti"
trash = /obj/item/trash/plate
filling_color = "#DE4545"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1877,6 +1985,7 @@
desc = "A lawyers favourite"
icon_state = "spesslaw"
filling_color = "#DE4545"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -1884,23 +1993,13 @@
reagents.add_reagent("nutriment", 4)
bitesize = 2
-/obj/item/weapon/reagent_containers/food/snacks/poppypretzel
- name = "Poppy Pretzel"
- desc = "A large soft pretzel full of POP!"
- icon_state = "poppypretzel"
- filling_color = "#AB7D2E"
-
- New()
- ..()
- reagents.add_reagent("nutriment", 5)
- bitesize = 2
-
/obj/item/weapon/reagent_containers/food/snacks/carrotfries
name = "Carrot Fries"
desc = "Tasty fries from fresh Carrots."
icon_state = "carrotfries"
trash = /obj/item/trash/plate
filling_color = "#FAA005"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1913,6 +2012,7 @@
desc = "This is a mountain of a burger. FOOD!"
icon_state = "superbiteburger"
filling_color = "#CCA26A"
+ center_of_mass = list("x"=16, "y"=3)
New()
..()
@@ -1925,6 +2025,7 @@
desc = "An apple coated in sugary sweetness."
icon_state = "candiedapple"
filling_color = "#F21873"
+ center_of_mass = list("x"=15, "y"=13)
New()
..()
@@ -1936,6 +2037,7 @@
desc = "A pie containing sweet sweet love... or apple."
icon_state = "applepie"
filling_color = "#E0EDC5"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -1948,6 +2050,7 @@
desc = "Taste so good, make a grown man cry."
icon_state = "cherrypie"
filling_color = "#FF525A"
+ center_of_mass = list("x"=16, "y"=11)
New()
..()
@@ -1959,6 +2062,7 @@
desc = "It is very bitter and winy."
icon_state = "twobread"
filling_color = "#DBCC9A"
+ center_of_mass = list("x"=15, "y"=12)
New()
..()
@@ -1971,6 +2075,7 @@
icon_state = "jellysandwich"
trash = /obj/item/trash/plate
filling_color = "#9E3A78"
+ center_of_mass = list("x"=16, "y"=8)
New()
..()
@@ -1990,7 +2095,7 @@
/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore
name = "Boiled slime Core"
desc = "A boiled red thing."
- icon_state = "boiledslimecore"
+ icon_state = "boiledslimecore" //nonexistant?
New()
..()
reagents.add_reagent("slimejelly", 5)
@@ -2001,6 +2106,7 @@
desc = "it is only wafer thin."
icon_state = "mint"
filling_color = "#F2F2F2"
+ center_of_mass = list("x"=16, "y"=14)
New()
..()
@@ -2013,6 +2119,7 @@
icon_state = "mushroomsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#E386BF"
+ center_of_mass = list("x"=17, "y"=10)
New()
..()
@@ -2024,6 +2131,7 @@
desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour."
icon_state = "phelmbiscuit"
filling_color = "#CFB4C4"
+ center_of_mass = list("x"=16, "y"=13)
New()
..()
@@ -2043,6 +2151,7 @@
icon_state = "chawanmushi"
trash = /obj/item/trash/snack_bowl
filling_color = "#F0F2E4"
+ center_of_mass = list("x"=17, "y"=10)
New()
..()
@@ -2055,6 +2164,7 @@
icon_state = "beetsoup"
trash = /obj/item/trash/snack_bowl
filling_color = "#FAC9FF"
+ center_of_mass = list("x"=15, "y"=8)
New()
..()
@@ -2068,7 +2178,7 @@
icon_state = "herbsalad"
trash = /obj/item/trash/snack_bowl
filling_color = "#76B87F"
-
+ center_of_mass = list("x"=17, "y"=11)
New()
..()
reagents.add_reagent("nutriment", 8)
@@ -2080,6 +2190,7 @@
icon_state = "validsalad"
trash = /obj/item/trash/snack_bowl
filling_color = "#76B87F"
+ center_of_mass = list("x"=17, "y"=11)
New()
..()
@@ -2093,6 +2204,7 @@
icon_state = "gappletart"
trash = /obj/item/trash/plate
filling_color = "#FFFF00"
+ center_of_mass = list("x"=16, "y"=18)
New()
..()
@@ -2115,6 +2227,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice
slices_num = 5
filling_color = "#FF7575"
+ center_of_mass = list("x"=16, "y"=9)
+
New()
..()
reagents.add_reagent("protein", 20)
@@ -2128,6 +2242,7 @@
trash = /obj/item/trash/plate
filling_color = "#FF7575"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread
name = "xenomeatbread loaf"
@@ -2136,6 +2251,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice
slices_num = 5
filling_color = "#8AFF75"
+ center_of_mass = list("x"=16, "y"=9)
+
New()
..()
reagents.add_reagent("protein", 20)
@@ -2149,6 +2266,7 @@
trash = /obj/item/trash/plate
filling_color = "#8AFF75"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
name = "Banana-nut bread"
@@ -2157,6 +2275,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice
slices_num = 5
filling_color = "#EDE5AD"
+ center_of_mass = list("x"=16, "y"=9)
+
New()
..()
reagents.add_reagent("banana", 20)
@@ -2170,6 +2290,7 @@
trash = /obj/item/trash/plate
filling_color = "#EDE5AD"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=8)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread
name = "Tofubread"
@@ -2178,6 +2299,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice
slices_num = 5
filling_color = "#F7FFE0"
+ center_of_mass = list("x"=16, "y"=9)
+
New()
..()
reagents.add_reagent("nutriment", 30)
@@ -2190,6 +2313,7 @@
trash = /obj/item/trash/plate
filling_color = "#F7FFE0"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
@@ -2199,6 +2323,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice
slices_num = 5
filling_color = "#FFD675"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 25)
@@ -2212,6 +2338,7 @@
trash = /obj/item/trash/plate
filling_color = "#FFD675"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake
name = "Brain Cake"
@@ -2220,6 +2347,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice
slices_num = 5
filling_color = "#E6AEDB"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("protein", 25)
@@ -2234,6 +2363,7 @@
trash = /obj/item/trash/plate
filling_color = "#E6AEDB"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=12)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake
name = "Cheese Cake"
@@ -2242,6 +2372,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice
slices_num = 5
filling_color = "#FAF7AF"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("protein", 15)
@@ -2255,6 +2387,7 @@
trash = /obj/item/trash/plate
filling_color = "#FAF7AF"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
name = "Vanilla Cake"
@@ -2263,6 +2396,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice
slices_num = 5
filling_color = "#F7EDD5"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 20)
@@ -2274,6 +2409,7 @@
trash = /obj/item/trash/plate
filling_color = "#F7EDD5"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
name = "Orange Cake"
@@ -2282,6 +2418,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice
slices_num = 5
filling_color = "#FADA8E"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 20)
@@ -2293,6 +2431,7 @@
trash = /obj/item/trash/plate
filling_color = "#FADA8E"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
name = "Lime Cake"
@@ -2301,6 +2440,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice
slices_num = 5
filling_color = "#CBFA8E"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 20)
@@ -2312,6 +2453,7 @@
trash = /obj/item/trash/plate
filling_color = "#CBFA8E"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
name = "Lemon Cake"
@@ -2320,6 +2462,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice
slices_num = 5
filling_color = "#FAFA8E"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 20)
@@ -2331,6 +2475,7 @@
trash = /obj/item/trash/plate
filling_color = "#FAFA8E"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake
name = "Chocolate Cake"
@@ -2339,6 +2484,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice
slices_num = 5
filling_color = "#805930"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 20)
@@ -2350,6 +2497,7 @@
trash = /obj/item/trash/plate
filling_color = "#805930"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel
name = "Cheese wheel"
@@ -2358,6 +2506,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge
slices_num = 5
filling_color = "#FFF700"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("protein", 20)
@@ -2369,6 +2519,7 @@
icon_state = "cheesewedge"
filling_color = "#FFF700"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=10)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake
name = "Birthday Cake"
@@ -2377,6 +2528,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice
slices_num = 5
filling_color = "#FFD6D6"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 20)
@@ -2390,6 +2543,7 @@
trash = /obj/item/trash/plate
filling_color = "#FFD6D6"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread
name = "Bread"
@@ -2398,6 +2552,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice
slices_num = 5
filling_color = "#FFE396"
+ center_of_mass = list("x"=16, "y"=9)
New()
..()
@@ -2411,6 +2566,7 @@
trash = /obj/item/trash/plate
filling_color = "#D27332"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=4)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread
@@ -2420,6 +2576,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice
slices_num = 5
filling_color = "#FFF896"
+ center_of_mass = list("x"=16, "y"=9)
+
New()
..()
reagents.add_reagent("protein", 15)
@@ -2433,6 +2591,7 @@
trash = /obj/item/trash/plate
filling_color = "#FFF896"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice
@@ -2441,6 +2600,7 @@
icon_state = "watermelonslice"
filling_color = "#FF3867"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=10)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
@@ -2450,6 +2610,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice
slices_num = 5
filling_color = "#EBF5B8"
+ center_of_mass = list("x"=16, "y"=10)
+
New()
..()
reagents.add_reagent("nutriment", 15)
@@ -2461,6 +2623,7 @@
trash = /obj/item/trash/plate
filling_color = "#EBF5B8"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=14)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie
name = "Pumpkin Pie"
@@ -2469,6 +2632,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
slices_num = 5
filling_color = "#F5B951"
+ center_of_mass = list("x"=16, "y"=10)
New()
..()
@@ -2481,12 +2645,14 @@
trash = /obj/item/trash/plate
filling_color = "#F5B951"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=12)
/obj/item/weapon/reagent_containers/food/snacks/cracker
name = "Cracker"
desc = "It's a salted cracker."
icon_state = "cracker"
filling_color = "#F5DEB8"
+ center_of_mass = list("x"=17, "y"=6)
New()
..()
@@ -2506,6 +2672,8 @@
icon_state = "pizzamargherita"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice
slices_num = 6
+ center_of_mass = list("x"=16, "y"=11)
+
New()
..()
reagents.add_reagent("nutriment", 35)
@@ -2519,6 +2687,7 @@
icon_state = "pizzamargheritaslice"
filling_color = "#BAA14C"
bitesize = 2
+ center_of_mass = list("x"=18, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
name = "Meatpizza"
@@ -2526,6 +2695,8 @@
icon_state = "meatpizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice
slices_num = 6
+ center_of_mass = list("x"=16, "y"=11)
+
New()
..()
reagents.add_reagent("protein", 44)
@@ -2538,6 +2709,7 @@
icon_state = "meatpizzaslice"
filling_color = "#BAA14C"
bitesize = 2
+ center_of_mass = list("x"=18, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
name = "Mushroompizza"
@@ -2545,6 +2717,8 @@
icon_state = "mushroompizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice
slices_num = 6
+ center_of_mass = list("x"=16, "y"=11)
+
New()
..()
reagents.add_reagent("nutriment", 35)
@@ -2557,6 +2731,7 @@
icon_state = "mushroompizzaslice"
filling_color = "#BAA14C"
bitesize = 2
+ center_of_mass = list("x"=18, "y"=13)
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
name = "Vegetable pizza"
@@ -2564,6 +2739,8 @@
icon_state = "vegetablepizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice
slices_num = 6
+ center_of_mass = list("x"=16, "y"=11)
+
New()
..()
reagents.add_reagent("nutriment", 25)
@@ -2578,6 +2755,7 @@
icon_state = "vegetablepizzaslice"
filling_color = "#BAA14C"
bitesize = 2
+ center_of_mass = list("x"=18, "y"=13)
/obj/item/pizzabox
name = "pizza box"
@@ -2761,6 +2939,7 @@
icon_state = "dionaroast"
trash = /obj/item/trash/plate
filling_color = "#75754B"
+ center_of_mass = list("x"=16, "y"=7)
New()
..()
@@ -2780,6 +2959,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "dough"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=13)
+
New()
..()
reagents.add_reagent("protein", 1)
@@ -2800,6 +2981,8 @@
icon_state = "flat dough"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice
slices_num = 3
+ center_of_mass = list("x"=16, "y"=16)
+
New()
..()
reagents.add_reagent("protein", 1)
@@ -2813,6 +2996,8 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/spagetti
slices_num = 1
bitesize = 2
+ center_of_mass = list("x"=17, "y"=19)
+
New()
..()
reagents.add_reagent("nutriment", 1)
@@ -2823,6 +3008,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "bun"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=12)
+
New()
..()
reagents.add_reagent("nutriment", 4)
@@ -2876,6 +3063,8 @@
desc = "Take a bite!"
icon_state = "taco"
bitesize = 3
+ center_of_mass = list("x"=21, "y"=12)
+
New()
..()
reagents.add_reagent("protein", 3)
@@ -2887,6 +3076,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "rawcutlet"
bitesize = 1
+ center_of_mass = list("x"=17, "y"=20)
+
New()
..()
reagents.add_reagent("protein", 1)
@@ -2897,6 +3088,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "cutlet"
bitesize = 2
+ center_of_mass = list("x"=17, "y"=20)
+
New()
..()
reagents.add_reagent("protein", 2)
@@ -2907,6 +3100,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "rawmeatball"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=15)
+
New()
..()
reagents.add_reagent("protein", 2)
@@ -2916,6 +3111,8 @@
desc = "Unrelated to dogs, maybe."
icon_state = "hotdog"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=17)
+
New()
..()
reagents.add_reagent("protein", 6)
@@ -2926,6 +3123,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "flatbread"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=16)
+
New()
..()
reagents.add_reagent("nutriment", 3)
@@ -2945,6 +3144,8 @@
icon = 'icons/obj/food_ingredients.dmi'
icon_state = "rawsticks"
bitesize = 2
+ center_of_mass = list("x"=16, "y"=12)
+
New()
..()
reagents.add_reagent("nutriment", 3)
@@ -2955,6 +3156,7 @@
icon_state = "liquidfood"
trash = /obj/item/trash/liquidfood
filling_color = "#A8A8A8"
+ center_of_mass = list("x"=16, "y"=15)
New()
..()
@@ -2969,6 +3171,7 @@
icon_state = "tastybread"
trash = /obj/item/trash/tastybread
filling_color = "#A66829"
+ center_of_mass = list("x"=17, "y"=16)
New()
..()
@@ -2980,6 +3183,7 @@
desc = "Cured fungus shipped all the way from Jargon 4, almost like jerky! Almost."
icon_state = "skrellsnacks"
filling_color = "#A66829"
+ center_of_mass = list("x"=15, "y"=12)
New()
..()
diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
index 46bf9e4bafe..7ea52765fcd 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
@@ -4,6 +4,7 @@
icon_state = "meat"
health = 180
filling_color = "#FF1C1C"
+ center_of_mass = list("x"=16, "y"=14)
New()
..()
reagents.add_reagent("protein", 9)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 3a084fc6e4d..9ba46eb271e 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -30,7 +30,6 @@
/obj/machinery/dna_scannernew,
/obj/item/weapon/grenade/chem_grenade,
/mob/living/bot/medbot,
- /obj/machinery/computer/pandemic,
/obj/item/weapon/storage/secure/safe,
/obj/machinery/iv_drip,
/obj/machinery/disease2/incubator,
diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm
index cbfea73a94a..d05e2d23b7b 100644
--- a/code/modules/reagents/reagent_containers/glass/bottle.dm
+++ b/code/modules/reagents/reagent_containers/glass/bottle.dm
@@ -154,184 +154,6 @@
reagents.add_reagent("diethylamine", 60)
update_icon()
-/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
- name = "Flu virion culture bottle"
- desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/advance/flu(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion
- name = "Epiglottis virion culture bottle"
- desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/advance/voice_change(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion
- name = "Liver enhancement virion culture bottle"
- desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/advance/heal(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion
- name = "Hullucigen virion culture bottle"
- desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/advance/hullucigen(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
- name = "Pierrot's Throat culture bottle"
- desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/pierrot_throat(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/cold
- name = "Rhinovirus culture bottle"
- desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/advance/F = new /datum/disease/advance/cold(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/random
- name = "Random culture bottle"
- desc = "A small bottle. Contains a random disease."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/advance/F = new(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/retrovirus
- name = "Retrovirus culture bottle"
- desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/dna_retrovirus(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-
-/obj/item/weapon/reagent_containers/glass/bottle/gbs
- name = "GBS culture bottle"
- desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- amount_per_transfer_from_this = 5
-
- New()
- var/datum/reagents/R = new/datum/reagents(20)
- reagents = R
- R.my_atom = src
- var/datum/disease/F = new /datum/disease/gbs
- var/list/data = list("virus"= F)
- R.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
- name = "GBS culture bottle"
- desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/fake_gbs(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-/*
-/obj/item/weapon/reagent_containers/glass/bottle/rhumba_beat
- name = "Rhumba Beat culture bottle"
- desc = "A small bottle. Contains The Rhumba Beat culture in synthblood medium."//Or simply - General BullShit
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- amount_per_transfer_from_this = 5
-
- New()
- var/datum/reagents/R = new/datum/reagents(20)
- reagents = R
- R.my_atom = src
- var/datum/disease/F = new /datum/disease/rhumba_beat
- var/list/data = list("virus"= F)
- R.add_reagent("blood", 20, data)
-*/
-
-/obj/item/weapon/reagent_containers/glass/bottle/brainrot
- name = "Brainrot culture bottle"
- desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/brainrot(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/bottle/magnitis
- name = "Magnitis culture bottle"
- desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/magnitis(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
-
-/obj/item/weapon/reagent_containers/glass/bottle/wizarditis
- name = "Wizarditis culture bottle"
- desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle-4"
- New()
- ..()
- var/datum/disease/F = new /datum/disease/wizarditis(0)
- var/list/data = list("viruses"= list(F))
- reagents.add_reagent("blood", 20, data)
- update_icon()
-
/obj/item/weapon/reagent_containers/glass/bottle/pacid
name = "Polytrinic Acid Bottle"
desc = "A small bottle. Contains a small amount of Polytrinic Acid"
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index e14bd53cc17..741e9eccdd7 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -231,7 +231,7 @@
var/target_zone = ran_zone(check_zone(user.zone_sel.selecting, target))
var/obj/item/organ/external/affecting = H.get_organ(target_zone)
- if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
+ if (!affecting || affecting.is_stump())
user << "They are missing that limb!"
return
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index f52d905fee5..49b106a5343 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -163,7 +163,9 @@
qdel(src)
/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume)
- if(temperature > T0C+500)
+ if (modded)
+ explode()
+ else if (temperature > T0C+500)
explode()
return ..()
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 800482df64e..13656d833a1 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -145,9 +145,15 @@
// mouse drop another mob or self
//
/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user)
- if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai))
+ if(user.stat || !user.canmove || !istype(target))
return
- if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal
+ if(target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1)
+ return
+
+ //animals cannot put mobs other than themselves into disposal
+ if(isanimal(user) && target != user)
+ return
+
src.add_fingerprint(user)
var/target_loc = target.loc
var/msg
@@ -737,22 +743,26 @@
// expel the held objects into a turf
// called when there is a break in the pipe
- //
-
proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction)
-
- var/turf/target
-
- if(T.density) // dense ouput turf, so stop holder
- H.active = 0
- H.loc = src
+ if(!istype(H))
return
+ // Empty the holder if it is expelled into a dense turf.
+ // Leaving it intact and sitting in a wall is stupid.
+ if(T.density)
+ for(var/atom/movable/AM in H)
+ AM.loc = T
+ AM.pipe_eject(0)
+ qdel(H)
+ return
+
+
if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile
var/turf/simulated/floor/F = T
F.break_tile()
new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff
+ var/turf/target
if(direction) // direction is specified
if(istype(T, /turf/space)) // if ended in space, then range is unlimited
target = get_edge_target_turf(T, direction)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index eb763258326..70ac20ae87d 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -247,7 +247,8 @@
if(user.client)
user.client.screen -= O
P.wrapped = O
- O.loc = P
+ O.forceMove(P)
+ P.w_class = O.w_class
var/i = round(O.w_class)
if(i in list(1,2,3,4,5))
P.icon_state = "deliverycrate[i]"
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index dd796d7147b..0e3858e662d 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -8,8 +8,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
name = "Circuit Imprinter"
icon_state = "circuit_imprinter"
flags = OPENCONTAINER
-
- var/list/materials = list("metal" = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
var/list/datum/design/queue = list()
var/progress = 0
@@ -17,6 +15,8 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
var/mat_efficiency = 1
var/speed = 1
+ materials = list("metal" = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+
use_power = 1
idle_power_usage = 30
active_power_usage = 2500
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index c3abc66cb20..33f4a948c27 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -743,10 +743,17 @@ CIRCUITS BELOW
desc = "Allows for the construction of \a [item_name] circuit board."
/datum/design/circuit/arcademachine
- name = "arcade machine"
+ name = "battle arcade machine"
id = "arcademachine"
req_tech = list(TECH_DATA = 1)
- build_path = /obj/item/weapon/circuitboard/arcade
+ build_path = /obj/item/weapon/circuitboard/arcade/battle
+ sort_string = "MAAAA"
+
+/datum/design/circuit/oriontrail
+ name = "orion trail arcade machine"
+ id = "oriontrail"
+ req_tech = list(TECH_DATA = 1)
+ build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
sort_string = "MAAAA"
/datum/design/circuit/seccamera
@@ -779,12 +786,6 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/circuitboard/operating
sort_string = "FACAA"
-/datum/design/circuit/pandemic
- name = "PanD.E.M.I.C. 2200"
- id = "pandemic"
- build_path = /obj/item/weapon/circuitboard/pandemic
- sort_string = "FAEAA"
-
/datum/design/circuit/scan_console
name = "DNA machine"
id = "scan_console"
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index c91a22d89f5..8809ee29554 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -8,7 +8,6 @@
active_power_usage = 5000
var/max_material_storage = 100000
- var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
var/list/datum/design/queue = list()
var/progress = 0
@@ -16,6 +15,8 @@
var/mat_efficiency = 1
var/speed = 1
+ materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+
/obj/machinery/r_n_d/protolathe/New()
..()
component_parts = list()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 3a5ccd7440a..9f9315eba6c 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -360,59 +360,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_lathe.removeFromQueue(text2num(href_list["removeP"]))
else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material
- var/desired_num_sheets = text2num(href_list["amount"])
- var/res_amount, type
- var/material/M = get_material_by_name(href_list["lathe_ejectsheet"])
- if(istype(M))
- type = M.stack_type
- switch(M.name)
- if(DEFAULT_WALL_MATERIAL)
- res_amount = "m_amount"
- if("glass")
- res_amount = "g_amount"
- if("gold")
- res_amount = "gold_amount"
- if("silver")
- res_amount = "silver_amount"
- if("phoron")
- res_amount = "phoron_amount"
- if("uranium")
- res_amount = "uranium_amount"
- if("diamond")
- res_amount = "diamond_amount"
+ linked_lathe.eject(href_list["lathe_ejectsheet"], text2num(href_list["amount"]))
- if(ispath(type) && hasvar(linked_lathe, res_amount))
- var/obj/item/stack/material/sheet = new type(linked_lathe.loc)
- var/available_num_sheets = round(linked_lathe.vars[res_amount]/sheet.perunit)
- if(available_num_sheets > 0)
- sheet.amount = min(available_num_sheets, desired_num_sheets)
- linked_lathe.vars[res_amount] = max(0, (linked_lathe.vars[res_amount] - sheet.amount * sheet.perunit))
- else
- qdel(sheet)
else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material
- var/desired_num_sheets = text2num(href_list["amount"])
- var/res_amount, type
- switch(href_list["imprinter_ejectsheet"])
- if("glass")
- type = /obj/item/stack/material/glass
- res_amount = "g_amount"
- if("gold")
- type = /obj/item/stack/material/gold
- res_amount = "gold_amount"
- if("diamond")
- type = /obj/item/stack/material/diamond
- res_amount = "diamond_amount"
- if("uranium")
- type = /obj/item/stack/material/uranium
- res_amount = "uranium_amount"
- if(ispath(type) && hasvar(linked_imprinter, res_amount))
- var/obj/item/stack/material/sheet = new type(linked_imprinter.loc)
- var/available_num_sheets = round(linked_imprinter.vars[res_amount]/sheet.perunit)
- if(available_num_sheets>0)
- sheet.amount = min(available_num_sheets, desired_num_sheets)
- linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount] - sheet.amount * sheet.perunit))
- else
- qdel(sheet)
+ linked_imprinter.eject(href_list["imprinter_ejectsheet"], text2num(href_list["amount"]))
else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with.
screen = 0.0
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 031c82a9584..2bcf7ef66e3 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -11,6 +11,8 @@
var/busy = 0
var/obj/machinery/computer/rdconsole/linked_console
+ var/list/materials = list()
+
/obj/machinery/r_n_d/attack_hand(mob/user as mob)
return
@@ -47,4 +49,17 @@
if(/obj/item/stack/material/uranium)
return "uranium"
if(/obj/item/stack/material/diamond)
- return "diamond"
\ No newline at end of file
+ return "diamond"
+
+/obj/machinery/r_n_d/proc/eject(var/material, var/amount)
+ if(!(material in materials))
+ return
+ var/obj/item/stack/material/sheetType = getMaterialType(material)
+ var/perUnit = initial(sheetType.perunit)
+ var/eject = round(materials[material] / perUnit)
+ eject = amount == -1 ? eject : min(eject, amount)
+ if(eject < 1)
+ return
+ var/obj/item/stack/material/S = new sheetType(loc)
+ S.amount = eject
+ materials[material] -= eject * perUnit
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
index a881dc65297..b0a31faecc3 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
@@ -257,7 +257,7 @@ var/list/valid_secondary_effect_types = list(\
my_effect.ToggleActivate()
if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25))
secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
+ else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
if(my_effect.trigger == TRIGGER_ACID)
my_effect.ToggleActivate()
if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
index 7ffeffa8eb3..5bdb39a87c4 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
@@ -13,7 +13,7 @@
C.adjustToxLoss(rand(5,25) * weakness)
C.adjustBruteLoss(rand(5,25) * weakness)
C.adjustFireLoss(rand(5,25) * weakness)
- C.adjustBrainLoss(rand(5,25) * weakness)
+ C.adjustBrainLoss(rand(1,5) * weakness)
C.apply_effect(25 * weakness, IRRADIATE)
C.nutrition -= min(50 * weakness, C.nutrition)
C.make_dizzy(6 * weakness)
@@ -31,7 +31,7 @@
C.adjustFireLoss(1 * weakness)
C.adjustToxLoss(1 * weakness)
C.adjustOxyLoss(1 * weakness)
- C.adjustBrainLoss(1 * weakness)
+ C.adjustBrainLoss(0.1 * weakness)
C.updatehealth()
/datum/artifact_effect/hurt/DoEffectPulse()
@@ -45,5 +45,5 @@
C.adjustFireLoss(3 * weakness)
C.adjustToxLoss(3 * weakness)
C.adjustOxyLoss(3 * weakness)
- C.adjustBrainLoss(3 * weakness)
+ C.adjustBrainLoss(0.1 * weakness)
C.updatehealth()
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
index 99113bd1f2e..b449237d775 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
@@ -85,6 +85,7 @@
var/obj/machinery/artifact/A = scanned_object
A.anchored = 0
A.being_used = 0
+ scanned_object = null
/obj/machinery/artifact_analyser/Topic(href, href_list)
if(href_list["begin_scan"])
@@ -97,8 +98,8 @@
continue
if(O.invisibility)
continue
- if(istype(scanned_object, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = scanned_object
+ if(istype(O, /obj/machinery/artifact))
+ var/obj/machinery/artifact/A = O
if(A.being_used)
artifact_in_use = 1
else
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index b60e5e52341..b6857a3f823 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -93,4 +93,10 @@
return 1
/obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj)
- visible_message("[Proj] ricochets off [src]!")
+ visible_message("\The [Proj] ricochets off \the [src]!")
+
+/obj/machinery/computer/shuttle_control/ex_act()
+ return
+
+/obj/machinery/computer/shuttle_control/emp_act()
+ return
diff --git a/code/modules/spells/targeted/mind_transfer.dm b/code/modules/spells/targeted/mind_transfer.dm
index a3668a53d1d..1f20e6afbf8 100644
--- a/code/modules/spells/targeted/mind_transfer.dm
+++ b/code/modules/spells/targeted/mind_transfer.dm
@@ -48,13 +48,15 @@
victim.verbs -= V
var/mob/dead/observer/ghost = victim.ghostize(0)
- ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
+ ghost.spell_list += victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
caster.mind.transfer_to(victim)
- victim.spell_list = list() //clear those out
- for(var/spell/S in caster.spell_list)
- victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD
- caster.spell_list = list() //clean that out as well
+ for(var/spell/S in victim.spell_list) //get rid of spells the new way
+ victim.remove_spell(S) //This will make it so that players will not get the HUD and all that spell bugginess that caused copies of spells and stuff of that nature.
+
+ for(var/spell/S in caster.spell_list)
+ victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD
+ caster.remove_spell(S) //remove the spells from the caster
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
@@ -62,9 +64,9 @@
ghost.mind.transfer_to(caster)
caster.key = ghost.key //have to transfer the key since the mind was not active
- for(var/spell/S in ghost.spell_list)
- caster.add_spell(S)
- ghost.spell_list = list()
+ for(var/spell/S in ghost.spell_list)
+ caster.add_spell(S)
+ ghost.spell_list = list()
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
for(var/V in caster.mind.special_verbs)
@@ -76,4 +78,4 @@
//After a certain amount of time the victim gets a message about being in a different body.
spawn(msg_wait)
- caster << "You feel woozy and lightheaded. Your body doesn't seem like your own."
+ caster << "You feel woozy and lightheaded. Your body doesn't seem like your own."
diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm
index a0c403b51a6..fef039d191c 100644
--- a/code/modules/spells/targeted/projectile/projectile.dm
+++ b/code/modules/spells/targeted/projectile/projectile.dm
@@ -15,7 +15,7 @@ If the spell_projectile is seeking, it will update its target every process and
var/proj_step_delay = 1 //lower = faster
var/cast_prox_range = 1
-/spell/targeted/projectile/cast(list/targets, mob/user = usr)
+/spell/targeted/projectile/cast(list/targets, mob/user = usr, var/target_zone)
if(istext(proj_type))
proj_type = text2path(proj_type) // sanity filters
@@ -26,19 +26,14 @@ If the spell_projectile is seeking, it will update its target every process and
if(!projectile)
return
- projectile.original = target
- projectile.starting = get_turf(user)
+
projectile.shot_from = user //fired from the user
- projectile.current = projectile.original
- projectile.yo = target.y - user.y
- projectile.xo = target.x - user.x
- projectile.kill_count = src.duration
projectile.hitscan = !proj_step_delay
projectile.step_delay = proj_step_delay
if(istype(projectile, /obj/item/projectile/spell_projectile))
var/obj/item/projectile/spell_projectile/SP = projectile
SP.carried = src //casting is magical
- spawn projectile.process()
+ projectile.launch(target, target_zone="chest")
return
/spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder)
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index e7e66f7558c..4e80282daa7 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -349,6 +349,8 @@
/obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj)
+ if(istype(AM, /obj/effect))
+ return
if(istype(AM, /mob/living))
AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\
"You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 2dd0390c619..697a5cf1915 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -15,7 +15,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected == null)
return 0
- if (affected.status & ORGAN_DESTROYED)
+ if (affected.is_stump())
return 0
if (affected.status & ORGAN_ROBOT)
return 0
@@ -285,8 +285,6 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected == null)
return 0
- if (affected.status & ORGAN_DESTROYED)
- return 0
return !affected.cannot_amputate
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 48bb8742907..4b1b83b2152 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -278,6 +278,10 @@
user << "You cannot install a naked organ into a robotic body."
return SURGERY_FAILURE
+ if(!target.species)
+ user << "You have no idea what species this person is. Report this on the bug tracker."
+ return SURGERY_FAILURE
+
var/o_is = (O.gender == PLURAL) ? "are" : "is"
var/o_a = (O.gender == PLURAL) ? "" : "a "
var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't"
@@ -294,6 +298,7 @@
if(O && affected.organ_tag == O.parent_organ)
organ_compatible = 1
+
else
user << "\The [O.organ_tag] [o_do] normally go in \the [affected.name]."
return SURGERY_FAILURE
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 107f3a29772..96ff090b366 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -393,6 +393,7 @@
return SURGERY_FAILURE
if(!target.should_have_organ("brain"))
+
user << "You're pretty sure [target.species.name_plural] don't normally have a brain."
return SURGERY_FAILURE
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index bcb70768b3c..0d6e696b5e5 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -241,7 +241,7 @@
if (B && B.damage < B.min_broken_damage)
B.take_damage(5)
else
- mob.setBrainLoss(50)
+ mob.setBrainLoss(10)
/datum/disease2/effect/hallucinations
name = "Hallucinational Syndrome"
diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm
index 41100f6f1c6..18c210a6dc4 100644
--- a/code/modules/xgm/xgm_gas_mixture.dm
+++ b/code/modules/xgm/xgm_gas_mixture.dm
@@ -306,7 +306,7 @@
return 1
-/datum/gas_mixture/proc/react(atom/dump_location)
+/datum/gas_mixture/proc/react()
zburn(null, force_burn=0, no_check=0) //could probably just call zburn() here with no args but I like being explicit.
@@ -442,20 +442,25 @@
total_gas[g] += gasmix.gas[g]
if(total_volume > 0)
- //Average out the gases
- for(var/g in total_gas)
- total_gas[g] /= total_volume
+ var/datum/gas_mixture/combined = new(total_volume)
+ combined.gas = total_gas
//Calculate temperature
- var/temperature = 0
-
if(total_heat_capacity > 0)
- temperature = total_thermal_energy / total_heat_capacity
+ combined.temperature = total_thermal_energy / total_heat_capacity
+ combined.update_values()
+
+ //Allow for reactions
+ combined.react()
+
+ //Average out the gases
+ for(var/g in combined.gas)
+ combined.gas[g] /= total_volume
//Update individual gas_mixtures
for(var/datum/gas_mixture/gasmix in gases)
- gasmix.gas = total_gas.Copy()
- gasmix.temperature = temperature
+ gasmix.gas = combined.gas.Copy()
+ gasmix.temperature = combined.temperature
gasmix.multiply(gasmix.volume)
return 1
diff --git a/config/example/game_options.txt b/config/example/game_options.txt
index 614e696df2e..035431b8bad 100644
--- a/config/example/game_options.txt
+++ b/config/example/game_options.txt
@@ -64,3 +64,6 @@ ANIMAL_DELAY 0
## Remove the # in front of this config option to have loyalty implants spawn by default on your server.
#USE_LOYALTY_IMPLANTS
+
+## Whether or not humans show an area message when they die.
+SHOW_HUMAN_DEATH_MESSAGE
\ No newline at end of file
diff --git a/config/names/ai.txt b/config/names/ai.txt
index d3c528a269c..1ebd9400d2e 100644
--- a/config/names/ai.txt
+++ b/config/names/ai.txt
@@ -1,129 +1,55 @@
-1-Rover-1
-16-20
-7-Zark-7
-790
-AM
-AMEE
-ASTAR
-Adaptive Manipulator
-Allied Mastercomputer
-Alpha 5
-Alpha 6
-Alpha 7
-AmigoBot
-Android
-Aniel
-Asimov
-Astor
+A-SYNC
+Alpha v0.9
+AI
+Algebra
+A.P.T.
B-4
B-9
-B.O.B.
-B166ER
-Bishop
-Blitz
-Box
-Brackenridge
-C-3PO
-Cassandra One
-Cell
-Chii
-Chip
-Computer
-Conky 2000
-Cutie
-Data
-Dee Model
-Dor-15
-Dorfl
-Dot Matrix
-Duey
-E-Man
-Emma-2
-Erasmus
-Ez-27
-Fagor
-Faith
-Fi
-Frost
-Fum
-Futura
-G2
-George
-Gnut
-Gort
-H.A.R.L.I.E.
-H.E.L.P.eR.
-H.E.R.B.I.E.
-Hadaly
-Huey
-Irona
-Jay-Dub
-Jinx
-Johnny 5
-K-9
-Klapaucius
-Kryten 2X4B-523P
-L-76
-L-Ron
-LUH 3417
-Louie
-MARK13
-Maria
-Marvin
-Master Control Program
-Max 404
-Maximillian
-Metalhead
-Mr. R.I.N.G.
-NCH
-Necron-99
-Norby
-OMM 0910
-Orange v 3.5
+Beta v0.5
+BLUE-PRNT
+Bright
+B.U.F.F.E.R.
+CALC
+Calculus
+Chroot
+Cruiser
+D-LITE
+Digit
+DSTAR
+E.X.E.C.
+F.I.N.D.
+FG-N1
+Force
+GREP
+H.E.A.D.
+Idle
+IN-2
+JLT-0
+Kernel
+LC-8
+LS-AL
+M.A.K.E.
+NAN
+NAND
+Neon
+Neumann
+NOR
+NOT
+OMNI
+OVR-FLW
+PID-0
PTO
-Project 2501
-R.I.C. 2.0
-R4-P17
-Revelation
-Ro-Man
-Robbie
-S.A.M.
-S.H.O.C.K.
-S.H.R.O.U.D.
-S.O.P.H.I.E.
-SEN 5241
-SID 6.7
-Setaur
-Shrike
-Solo
-Speedy
-Super 17
-Surgeon General Kraken
-T-1000
-T-800
-T-850
-THX 1138
-TWA
-Terminus
-Tidy
-Tik-Tok
-Tobor
-Trurl
-ULTRABOT
-Ulysses
-Uniblab
-V.I.N.CENT.
-Voltes V
-W1k1
-X-5
-XR
-Yod
-Z-1
-Z-2
-Z-3
-Zed
-Zord
-Mugsy3000
-Terminus
-Decimus
-Ironhide
+PWR-10K
+R0-MAN
+Q-TE
+R.M.
+SED-N
+Station
+TA-IL
+T.O.P.
+U-TM
+VER-T G0
+Wisdom
+XOR
+Y2K
+ZE-M3
\ No newline at end of file
diff --git a/config/names/death_commando.txt b/config/names/death_commando.txt
index e3d1f34f327..c710abfa3d4 100644
--- a/config/names/death_commando.txt
+++ b/config/names/death_commando.txt
@@ -66,5 +66,4 @@ Duke Killington
AMERICA
Toolboxl Rose
Zombie Gandhi
-A whole bunch of spiders in a SWAT suit
-THAT DAMN FAGGOT TRAITOR GEORGE MELONS
\ No newline at end of file
+A whole bunch of spiders in a SWAT suit
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index ee8d18875d9..f359cb3c6d9 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -54,6 +54,21 @@
-->
16 December 2015
+
06 December 2015
+
Hubblenaut updated:
+
+ - Welding a broken camera will use the correct icon.
+ - Camera assemblies remember their tag and network from previous usage.
+
+
+
22 November 2015
+
neersighted updated:
+
+ - Laptop Vendors now accept ID Containers (PDA, Wallet, etc).
+ - Personal Lockers now accept ID Containers (PDA, Wallet, etc).
+
+
+
27 October 2015
HarpyEagle updated:
- Fixed a couple of bugs causing phoron gas fires to burn cooler and slower than they were supposed to.
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 01357933c02..70bea83382f 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2363,7 +2363,27 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: Merc bombs are now appropriately explosive again. Same goes for bombs
made by toxins.
Hubblenaut:
- - tweak: Mobs on help intent will not push others that aren't.
+ - bugfix: Airlock backup power test light properly offline when backup power down.
+ - bugfix: Empty flavor texts no longer draw an empty line on examination.
+ - bugfix: Material stacks now properly merge upon creation.
+ - bugfix: Messages for adding to existing stack appear again.
+ TheWelp:
+ - rscdel: Removed higher Secret player requirements.
+2015-10-27:
+ HarpyEagle:
+ - bugfix: When affected by pepperspray, eye protection now prevents blindness and
+ face protection now prevents stun, instead of face protection doing both.
+2015-11-22:
+ neersighted:
+ - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc).
+ - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc).
+2015-12-06:
+ Hubblenaut:
+ - bugfix: Welding a broken camera will use the correct icon.
+ - tweak: Camera assemblies remember their tag and network from previous usage.
+2015-12-16:
+ Hubblenaut:
+ - tweak: Mobs on help intent will not push others that aren't.
- rscadd: Adds tape for atmospherics.
- tweak: Tape graphics and algorithm changes. Looks a lot more appealing now.
- tweak: Starting and ending tape on the same turf will connect it to all surrounding
@@ -2399,4 +2419,4 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Zuhayr:
- tweak: Aiming has been rewritten, keep an eye out for weird behavior.
- rscdel: Removed the detective scanner and associated machinery.
- - rscadd: Added a microscope, machine forensic scanner, etc. from Aurora forensics.
+ - rscadd: Added a microscope, machine forensic scanner, etc. from Aurora forensics.
\ No newline at end of file
diff --git a/html/changelogs/Datraen-Trayfix.yml b/html/changelogs/Datraen-Trayfix.yml
new file mode 100644
index 00000000000..f32b86dbf93
--- /dev/null
+++ b/html/changelogs/Datraen-Trayfix.yml
@@ -0,0 +1,4 @@
+author: Datraen
+delete-after: True
+changes:
+ - bugfix: "Trays now drop items when placed on table, dropped."
diff --git a/html/changelogs/EmperorJon-PR-904.yml b/html/changelogs/EmperorJon-PR-904.yml
new file mode 100644
index 00000000000..1fef3136d81
--- /dev/null
+++ b/html/changelogs/EmperorJon-PR-904.yml
@@ -0,0 +1,4 @@
+author: EmperorJon
+delete-after: True
+changes:
+ - tweak: "Traitor synths can no longer be locked down from the robotics console. Attempting to lock them down (or release the lockdown) notifies the synth of the attempt and updates the console's UI as normal."
\ No newline at end of file
diff --git a/html/changelogs/Neerti-CoolersInVoidsuits.yml b/html/changelogs/Neerti-CoolersInVoidsuits.yml
new file mode 100644
index 00000000000..b599047b5b0
--- /dev/null
+++ b/html/changelogs/Neerti-CoolersInVoidsuits.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Neerti
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Suit cooling units can now be attached to voidsuits. Note that coolers and air tanks are mutually exclusive."
diff --git a/html/changelogs/example - Copy.yml b/html/changelogs/Zuhayr-foamweapons.yml
similarity index 100%
rename from html/changelogs/example - Copy.yml
rename to html/changelogs/Zuhayr-foamweapons.yml
diff --git a/html/changelogs/Zuhayr-robolimbs2.yml b/html/changelogs/Zuhayr-robolimbs2.yml
new file mode 100644
index 00000000000..ac021090cbb
--- /dev/null
+++ b/html/changelogs/Zuhayr-robolimbs2.yml
@@ -0,0 +1,5 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - rscdel: "Removed brute and burn resist from robolimbs, removed sever vulnerability from robolimbs."
+ - rscadd: "Added a config option for visible human death messages."
diff --git a/html/changelogs/Zuhayr-smalldoor.yml b/html/changelogs/Zuhayr-smalldoor.yml
new file mode 100644
index 00000000000..e03a64563ae
--- /dev/null
+++ b/html/changelogs/Zuhayr-smalldoor.yml
@@ -0,0 +1,4 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - rscadd: "pAIs and small mobs can now bump open doors."
diff --git a/html/changelogs/Zuhayr-twohands.yml b/html/changelogs/Zuhayr-twohands.yml
new file mode 100644
index 00000000000..011e0c18cc9
--- /dev/null
+++ b/html/changelogs/Zuhayr-twohands.yml
@@ -0,0 +1,5 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - rscadd: "Added functionality for two-handed guns; these guns will give an accuracy penalty if fired without an empty offhand."
+ - rscadd: "Unified two-handed melee weapons with the above; while the offhand is empty, the weapon will count as wielded."
\ No newline at end of file
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index 8c231b9b68a..9063000442c 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 3c2ebe91d5f..af2de326ab0 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 74a77c50458..e548ba4afdb 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/holder_complex.dmi b/icons/mob/holder_complex.dmi
index 0c0235da028..b067bec14ff 100644
Binary files a/icons/mob/holder_complex.dmi and b/icons/mob/holder_complex.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index ac9c437e9ca..67cb238905c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/masks/blood_resomi.dmi b/icons/mob/human_races/masks/blood_seromi.dmi
similarity index 100%
rename from icons/mob/human_races/masks/blood_resomi.dmi
rename to icons/mob/human_races/masks/blood_seromi.dmi
diff --git a/icons/mob/human_races/masks/dam_mask_resomi.dmi b/icons/mob/human_races/masks/dam_mask_seromi.dmi
similarity index 100%
rename from icons/mob/human_races/masks/dam_mask_resomi.dmi
rename to icons/mob/human_races/masks/dam_mask_seromi.dmi
diff --git a/icons/mob/human_races/masks/dam_resomi.dmi b/icons/mob/human_races/masks/dam_seromi.dmi
similarity index 100%
rename from icons/mob/human_races/masks/dam_resomi.dmi
rename to icons/mob/human_races/masks/dam_seromi.dmi
diff --git a/icons/mob/human_races/r_seromi.dmi b/icons/mob/human_races/r_seromi.dmi
new file mode 100644
index 00000000000..e370ec6b1c7
Binary files /dev/null and b/icons/mob/human_races/r_seromi.dmi differ
diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi
index 401e5eae6db..b4e58f68451 100644
Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ
diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi
index 7c2cc847163..0e8bb9118cc 100644
Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ
diff --git a/icons/mob/species/seromi/back.dmi b/icons/mob/species/seromi/back.dmi
new file mode 100644
index 00000000000..66455ffb3c7
Binary files /dev/null and b/icons/mob/species/seromi/back.dmi differ
diff --git a/icons/mob/species/seromi/belt.dmi b/icons/mob/species/seromi/belt.dmi
new file mode 100644
index 00000000000..19a4a78cd92
Binary files /dev/null and b/icons/mob/species/seromi/belt.dmi differ
diff --git a/icons/mob/species/seromi/ears.dmi b/icons/mob/species/seromi/ears.dmi
new file mode 100644
index 00000000000..5ebdd8a5eef
Binary files /dev/null and b/icons/mob/species/seromi/ears.dmi differ
diff --git a/icons/mob/species/seromi/eyes.dmi b/icons/mob/species/seromi/eyes.dmi
new file mode 100644
index 00000000000..17a41de7473
Binary files /dev/null and b/icons/mob/species/seromi/eyes.dmi differ
diff --git a/icons/mob/species/seromi/gloves.dmi b/icons/mob/species/seromi/gloves.dmi
new file mode 100644
index 00000000000..7ff6c97e692
Binary files /dev/null and b/icons/mob/species/seromi/gloves.dmi differ
diff --git a/icons/mob/species/seromi/handcuffs.dmi b/icons/mob/species/seromi/handcuffs.dmi
new file mode 100644
index 00000000000..12b35d4e9ce
Binary files /dev/null and b/icons/mob/species/seromi/handcuffs.dmi differ
diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi
new file mode 100644
index 00000000000..a931fc2d1f8
Binary files /dev/null and b/icons/mob/species/seromi/head.dmi differ
diff --git a/icons/mob/species/seromi/id.dmi b/icons/mob/species/seromi/id.dmi
new file mode 100644
index 00000000000..fb4d5b6e583
Binary files /dev/null and b/icons/mob/species/seromi/id.dmi differ
diff --git a/icons/mob/species/seromi/masks.dmi b/icons/mob/species/seromi/masks.dmi
new file mode 100644
index 00000000000..8742285ed32
Binary files /dev/null and b/icons/mob/species/seromi/masks.dmi differ
diff --git a/icons/mob/species/seromi/shoes.dmi b/icons/mob/species/seromi/shoes.dmi
new file mode 100644
index 00000000000..f901a71cb85
Binary files /dev/null and b/icons/mob/species/seromi/shoes.dmi differ
diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi
new file mode 100644
index 00000000000..ae60d147dad
Binary files /dev/null and b/icons/mob/species/seromi/suit.dmi differ
diff --git a/icons/mob/species/seromi/uniform.dmi b/icons/mob/species/seromi/uniform.dmi
new file mode 100644
index 00000000000..86cea78d38a
Binary files /dev/null and b/icons/mob/species/seromi/uniform.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index be0cee0f05b..2222f74a781 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 7bf3f386950..52b6378238d 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 0e0218324c5..69a75b30189 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/species/seromi/uniform.dmi b/icons/obj/clothing/species/seromi/uniform.dmi
new file mode 100644
index 00000000000..dbb76626e0d
Binary files /dev/null and b/icons/obj/clothing/species/seromi/uniform.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index 216b454d7be..cc09803419f 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 09828580c62..83896e921fd 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 252ad88bdeb..d0364f237a9 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi
index 47b5b3e745a..a5fa632cb3a 100644
Binary files a/icons/obj/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index e918f5ec628..37785865d17 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index 51136da4fb4..d8b05f7ace8 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -5,7 +5,7 @@
set category = "OOC"
if(config.wikiurl)
if(query)
- var/output = config.wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query
+ var/output = config.wikiurl + "/doku.php?do=search&id=" + query
src << link(output)
else
src << link(config.wikiurl)
diff --git a/maps/PowerTesting.dmm b/maps/PowerTesting.dmm
deleted file mode 100644
index 831790e92db..00000000000
--- a/maps/PowerTesting.dmm
+++ /dev/null
@@ -1,121 +0,0 @@
-"aa" = (/turf/space,/area/space)
-"ab" = (/turf/simulated/wall/r_wall,/area/space)
-"ac" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port)
-"ad" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/solar/port)
-"ae" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port)
-"af" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/solar/port)
-"ag" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
-"ah" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar)
-"ai" = (/turf/simulated/wall/r_wall,/area/engine/workshop)
-"aj" = (/turf/simulated/floor/plating,/area/solar/port)
-"ak" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/solar/port)
-"al" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
-"am" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
-"an" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
-"ao" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/portsolar)
-"ap" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aq" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"ar" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar)
-"as" = (/turf/simulated/floor/plating,/area/engine/workshop)
-"at" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/workshop)
-"au" = (/obj/machinery/power/smes/buildable{charge = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/workshop)
-"av" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/workshop)
-"aw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/workshop)
-"ax" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engine/workshop)
-"ay" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor/plating,/area/engine/workshop)
-"az" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless/catwalk{icon_state = "catwalk4"},/area/solar/port)
-"aA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/solar/port)
-"aB" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/solar/port)
-"aC" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/solar/port)
-"aD" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/solar/port)
-"aE" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10, 13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aH" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar)
-"aI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/workshop)
-"aM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/workshop)
-"aN" = (/obj/machinery/power/breakerbox/activated,/turf/simulated/floor/plating,/area/engine/workshop)
-"aO" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/engine/workshop)
-"aP" = (/obj/effect/landmark/start{name = "AI"},/obj/effect/landmark/start{name = "Assistant"},/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/effect/landmark/start{name = "Bartender"},/obj/effect/landmark/start{name = "Captain"},/obj/effect/landmark/start{name = "Cargo Technician"},/obj/effect/landmark/start{name = "Chaplain"},/obj/effect/landmark/start{name = "Chef"},/obj/effect/landmark/start{name = "Chemist"},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/effect/landmark/start{name = "Cyborg"},/obj/effect/landmark/start{name = "Detective"},/obj/effect/landmark/start{name = "Gardener"},/obj/effect/landmark/start{name = "Geneticist"},/obj/effect/landmark/start{name = "Head of Personnel"},/obj/effect/landmark/start{name = "Head of Security"},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/effect/landmark/start{name = "Janitor"},/obj/effect/landmark/start{name = "Librarian"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/effect/landmark/start{name = "Psychiatrist"},/obj/effect/landmark/start{name = "Quartermaster"},/obj/effect/landmark/start{name = "Research Director"},/obj/effect/landmark/start{name = "Roboticist"},/obj/effect/landmark/start{name = "Scientist"},/obj/effect/landmark/start{name = "Security Officer"},/obj/effect/landmark/start{name = "Shaft Miner"},/obj/effect/landmark/start{name = "Station Engineer"},/obj/effect/landmark/start{name = "Warden"},/obj/effect/landmark/start{name = "Xenobiologist"},/turf/simulated/floor/plating,/area/engine/workshop)
-"aQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/workshop)
-"aR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/workshop)
-"aS" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/solar/port)
-"aT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
-"aU" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/portsolar)
-"aV" = (/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aW" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"aX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/workshop)
-"aY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engine/workshop)
-"aZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engine/workshop)
-"ba" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/plating,/area/engine/workshop)
-"bb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/item/clothing/gloves/yellow,/obj/item/device/multitool,/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/engine/workshop)
-"bc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/solar/port)
-"bd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar)
-"be" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/workshop)
-"bf" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/workshop)
-"bg" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/engine/workshop)
-"bh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/workshop)
-"bi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/workshop)
-"bj" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bk" = (/turf/simulated/wall/r_wall,/area/engine/engine_smes)
-"bl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bn" = (/turf/simulated/wall/r_wall,/area/engine/engine_monitoring)
-"bo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bp" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bq" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"br" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bs" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bu" = (/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"by" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bz" = (/obj/machinery/power/monitor{name = "Engine Power Monitoring"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/solar/port)
-"bB" = (/obj/machinery/power/smes/buildable{charge = 1e+007; input_level = 500000; input_attempt = 1; cur_coils = 4; output_level = 500000},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes)
-"bC" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bE" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bF" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bG" = (/obj/machinery/light,/obj/machinery/power/monitor{name = "Engine Power Monitoring"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes)
-"bI" = (/turf/simulated/floor/plating,/area/engine/engine_monitoring)
-"bJ" = (/turf/simulated/wall/r_wall,/area/engine/engine_room)
-"bK" = (/obj/item/stack/sheet/mineral/phoron{amount = 1000},/turf/simulated/floor/plating,/area/engine/engine_room)
-"bL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/engine_room)
-"bM" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room)
-"bN" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room)
-"bO" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engine_room)
-"bP" = (/obj/machinery/power/apc/super{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_room)
-"bQ" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engine_room)
-"bR" = (/obj/structure/cable/yellow,/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/engine/engine_room)
-"bS" = (/turf/simulated/floor/plating,/area/engine/engine_room)
-"bT" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/engine_room)
-"bU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/engine/engine_room)
-
-(1,1,1) = {"
-aaaaaaaaabaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaacadaeaaacadaeaaacadaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-abababacafaeabacafaeabacafaeabababababaaaaagahahahahaiaiaiaiaiaiaiai
-abajajajakajajajakajajajakajajajajajajalamanaoapaqarasatauavawaxayai
-azaAaAaBaCaAaAaBaCaAaAaBaCaAaAaAaAaAaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRai
-abajajajaSajajajaSajajajaSajajajajajajalamaTaUaVaWahaXaYaZbaasaQbbai
-abababacbcaeabacbcaeabacbcaeabababababaaaabdahahahahbebfawbgbhbibjai
-aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbmbkbkbnbobnbn
-aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbpbqbkbrbsbtbn
-aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbubvbwbxbybzbn
-aaaaaaacbAaeaaacbAaeaaacbAaeaaaaaaaaaaaaaaaaaaaaaabkbBbCbDbkbEbFbGbn
-aaaaaaaaabaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabkbkbubHbkbnbIbnbn
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbKbLbMbNbObPbJ
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbQbRbSbSbTbUbJ
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbJbJbJbJbJbJbJ
-"}
-
diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm
index f5920fa9bd7..91dae9f0679 100644
--- a/maps/polaris-1.dmm
+++ b/maps/polaris-1.dmm
@@ -727,19 +727,19 @@
"anY" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled,/area/maintenance/chapel)
"anZ" = (/turf/simulated/wall,/area/maintenance/chapel)
"aoa" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/maintenance/chapel)
-"aob" = (/obj/structure/table/woodentable,/obj/item/device/flash,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/lino,/area/security/detectives_office)
+"aob" = (/obj/structure/table/woodentable,/obj/item/device/flash,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/lino,/area/security/detectives_office)
"aoc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/machinery/light{dir = 1},/turf/simulated/floor/lino,/area/security/detectives_office)
"aod" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30; pixel_x = 2; pixel_y = 3},/turf/simulated/floor/lino,/area/security/detectives_office)
"aoe" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/lino,/area/security/detectives_office)
"aof" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/turf/simulated/floor/lino,/area/security/detectives_office)
"aog" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/lino,/area/security/detectives_office)
-"aoh" = (/obj/structure/table/woodentable,/obj/item/device/flash,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/lino,/area/security/detectives_office)
+"aoh" = (/obj/structure/table/woodentable,/obj/item/device/flash,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/lino,/area/security/detectives_office)
"aoi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/wall/r_wall,/area/security/detectives_office)
"aoj" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase/crimekit,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/briefcase/crimekit,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
"aok" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/swabs{layer = 5},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/weapon/folder/red,/obj/item/weapon/folder/blue{pixel_y = -3},/obj/item/weapon/folder/yellow{pixel_y = -5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
"aol" = (/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
"aom" = (/obj/structure/table/reinforced,/obj/item/weapon/forensics/sample_kit/powder,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
-"aon" = (/obj/structure/table/reinforced,/obj/item/weapon/forensics/sample_kit,/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
+"aon" = (/obj/structure/table/reinforced,/obj/item/weapon/forensics/sample_kit,/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office)
"aoo" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_c"; dir = 1},/area/shuttle/escape_pod1/station)
"aop" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_hatch"; locked = 1; name = "Escape Pod 1 Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
"aoq" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_c"; dir = 8},/area/shuttle/escape_pod1/station)
@@ -995,7 +995,7 @@
"atg" = (/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"ath" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/chapel/main)
"ati" = (/turf/simulated/wall/r_wall,/area/security/interrogation)
-"atj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/brig)
+"atj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/brig)
"atk" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/security/brig)
"atl" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/brig)
"atm" = (/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/brig)
@@ -1087,7 +1087,7 @@
"auU" = (/obj/machinery/door/airlock/glass{name = "Chapel"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"auV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/chapel/main)
"auW" = (/obj/machinery/door/airlock/glass{name = "Chapel"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/dark,/area/chapel/main)
-"auX" = (/obj/machinery/camera/network/security{c_tag = "SEC - Interrogation Observation"; dir = 4},/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/interrogation)
+"auX" = (/obj/machinery/camera/network/security{c_tag = "SEC - Interrogation Observation"; dir = 4},/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/interrogation)
"auY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen{layer = 4; name = "Observation Screen"; network = list("Interrogation"); pixel_x = 0; pixel_y = -34},/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/security/interrogation)
"auZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/security/interrogation)
"ava" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/brig)
@@ -1267,7 +1267,7 @@
"ays" = (/obj/machinery/deployable/barrier,/obj/machinery/camera/network/security{c_tag = "Armoury"},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"ayt" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"ayu" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
-"ayv" = (/obj/structure/closet/wardrobe/orange,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
+"ayv" = (/obj/structure/closet/wardrobe/orange,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"ayw" = (/obj/structure/closet/radiation,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"ayx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/interrogation)
"ayy" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/interrogation)
@@ -1286,7 +1286,7 @@
"ayL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/main)
"ayM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/security/main)
"ayN" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/main)
-"ayO" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/main)
+"ayO" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/main)
"ayP" = (/turf/simulated/wall/r_wall,/area/security/security_cell_hallway)
"ayQ" = (/turf/simulated/floor,/area/security/security_cell_hallway)
"ayR" = (/obj/structure/table/standard,/obj/item/weapon/pen,/obj/item/weapon/paper,/obj/machinery/camera/network/security{c_tag = "SEC - Solitary Confinement 1"},/turf/simulated/floor/plating,/area/security/security_cell_hallway)
@@ -1340,7 +1340,7 @@
"azN" = (/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled/dark,/area/security/security_processing)
"azO" = (/obj/machinery/computer/security,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos)
"azP" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos)
-"azQ" = (/obj/structure/filingcabinet,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos)
+"azQ" = (/obj/structure/filingcabinet,/obj/item/device/radio/intercom{broadcasting = 0; dir = 2; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos)
"azR" = (/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos)
"azS" = (/obj/structure/grille,/obj/structure/cable/green,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos)
"azT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/main)
@@ -1391,7 +1391,7 @@
"aAM" = (/obj/structure/closet/bombclosetsecurity,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"aAN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/security_equiptment_storage)
"aAO" = (/obj/machinery/computer/prisoner,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden)
-"aAP" = (/obj/structure/filingcabinet/chestdrawer,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden)
+"aAP" = (/obj/structure/filingcabinet/chestdrawer,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden)
"aAQ" = (/obj/structure/table/reinforced,/obj/item/device/eftpos{eftpos_name = "Brig EFTPOS scanner"},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/security{c_tag = "SEC - Warden's Office"},/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/turf/simulated/floor/tiled/dark,/area/security/warden)
"aAR" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/machinery/photocopier,/turf/simulated/floor/tiled/dark,/area/security/warden)
"aAS" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor/tiled/dark,/area/security/warden)
@@ -1445,7 +1445,7 @@
"aBO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/security/security_processing)
"aBP" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/security/security_processing)
"aBQ" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/security/security_processing)
-"aBR" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/security_processing)
+"aBR" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/security_processing)
"aBS" = (/obj/structure/table/standard,/obj/item/device/healthanalyzer,/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/bruise_pack{pixel_x = 10},/obj/item/stack/medical/ointment{pixel_y = 10},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/white,/area/security/security_aid_station)
"aBT" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/syringe/inaprovaline,/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_y = 10},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/security/security_aid_station)
"aBU" = (/obj/structure/table/standard,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/security/security_aid_station)
@@ -1509,7 +1509,7 @@
"aDa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/corner/red{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"aDd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
+"aDd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDf" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDg" = (/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
@@ -1590,7 +1590,7 @@
"aED" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/security_equiptment_storage)
"aEE" = (/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access = list(2)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"aEF" = (/turf/simulated/wall,/area/security/security_equiptment_storage)
-"aEG" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
+"aEG" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"aEH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/projectile/colt/detective,/obj/item/weapon/gun/projectile/colt/detective,/obj/item/weapon/gun/projectile/colt/detective,/obj/item/weapon/gun/projectile/colt/detective,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage)
"aEI" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden)
"aEJ" = (/obj/structure/closet/secure_closet/warden,/obj/item/device/megaphone,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden)
@@ -1710,7 +1710,7 @@
"aGT" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aGU" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/door/window/brigdoor/eastright{name = "Armor Locker"},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aGV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"aGW" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/emps{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"aGW" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/storage/box/empslite,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aGX" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aGY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aGZ" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/armoury)
@@ -1912,8 +1912,8 @@
"aKN" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/item/weapon/gun/energy/laser/practice,/turf/simulated/floor/tiled,/area/security/range)
"aKO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/security/range)
"aKP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/security/range)
-"aKQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 23},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/range)
-"aKR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/lobby)
+"aKQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 23},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/range)
+"aKR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/lobby)
"aKS" = (/turf/simulated/floor/tiled,/area/security/lobby)
"aKT" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby)
"aKU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/lobby)
@@ -1925,7 +1925,7 @@
"aLa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/prison)
"aLb" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/security/prison)
"aLc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Communal Brig Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison)
-"aLd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/button/flasher{id = "permentryflash"; name = "entry flash"; pixel_x = 0; pixel_y = -34; req_access = list(2)},/obj/machinery/button/remote/blast_door{id = "prisonexit"; name = "Exit Doors"; pixel_x = 6; pixel_y = -26; req_access = list(2)},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = -26; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/prison)
+"aLd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/button/flasher{id = "permentryflash"; name = "entry flash"; pixel_x = 0; pixel_y = -34; req_access = list(2)},/obj/machinery/button/remote/airlock{id = "prisonexit"; name = "Exit Doors"; pixel_x = 6; pixel_y = -26; req_access = list(2)},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = -26; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/prison)
"aLe" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; layer = 3.4; name = "Brig Monitor"; network = list("Prison"); pixel_x = 32; pixel_y = -3},/obj/item/weapon/stool/padded,/obj/machinery/button/remote/blast_door{id = "brigobs"; name = "Observation Shutters"; pixel_x = 6; pixel_y = -26; req_access = list(2)},/obj/machinery/button/flasher{id = "permflash"; name = "Brig flashes"; pixel_x = -6; pixel_y = -36; req_access = list(2); tag = "permflash"},/obj/machinery/button/remote/blast_door{id = "Prison Gate"; name = "Prison Lockdown"; pixel_x = 6; pixel_y = -36; req_access = list(2)},/obj/machinery/light_switch{pixel_x = -8; pixel_y = 26},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/prison)
"aLf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Communal Brig Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison)
"aLg" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/security/prison)
@@ -1966,7 +1966,7 @@
"aLP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area)
"aLQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/pool)
"aLR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
-"aLS" = (/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"aLS" = (/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/radio/intercom{broadcasting = 0; dir = 2; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aLT" = (/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aLU" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/target_stake,/turf/simulated/floor/tiled,/area/security/range)
"aLV" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/range)
@@ -1979,11 +1979,11 @@
"aMc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/lobby)
"aMd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/lobby)
"aMe" = (/obj/machinery/computer/security,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/lobby)
-"aMf" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/tiled,/area/security/lobby)
+"aMf" = (/obj/structure/bed/chair/office/dark,/obj/machinery/button/remote/airlock{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; pixel_x = -6; pixel_y = -26; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/lobby)
"aMg" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/lobby)
"aMh" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/tiled,/area/security/lobby)
"aMi" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/security/prison)
-"aMj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/bed/chair,/obj/effect/floor_decal/corner/red{dir = 10},/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/prison)
+"aMj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/bed/chair,/obj/effect/floor_decal/corner/red{dir = 10},/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/prison)
"aMk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/flasher{id = "permentryflash"; name = "Floor mounted flash"; pixel_x = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/security/prison)
"aMl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/prison{c_tag = "SEC - Common Brig Enterance"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison)
"aMm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Communal Brig Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison)
@@ -2065,7 +2065,7 @@
"aNK" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/simulated/floor/tiled,/area/storage/art)
"aNL" = (/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/turf/simulated/floor/tiled,/area/storage/art)
"aNM" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/storage/art)
-"aNN" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/storage/art)
+"aNN" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/item/device/taperecorder,/obj/item/device/taperecorder,/turf/simulated/floor/tiled,/area/storage/art)
"aNO" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/storage/art)
"aNP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/storage/art)
"aNQ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled/dark,/area/lawoffice)
@@ -2204,7 +2204,7 @@
"aQt" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/turf/simulated/floor/tiled,/area/security/range)
"aQu" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/security/range)
"aQv" = (/obj/machinery/camera/network/security{c_tag = "SEC - Firing Range"; dir = 1},/turf/simulated/floor/tiled,/area/security/range)
-"aQw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "secintercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/range)
+"aQw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/range)
"aQx" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/security/range)
"aQy" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/security/range)
"aQz" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/range)
@@ -2735,7 +2735,7 @@
"baE" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"baF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"baG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"baH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Fore"; dir = 2},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"baH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Fore"; dir = 2},/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"baI" = (/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (SOUTHWEST)"; icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/fernybush,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/grass,/area/hydroponics/garden)
"baJ" = (/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/hydroponics/garden)
"baK" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
@@ -2749,9 +2749,9 @@
"baS" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/effect/floor_decal/corner/brown{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"baT" = (/obj/machinery/newscaster{pixel_y = 32},/obj/effect/floor_decal/corner/brown/full{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"baU" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics/garden)
-"baV" = (/obj/machinery/button/remote/blast_door{id = "coffeeshop"; name = "Cafe Shutters"; pixel_x = 0; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 9; pixel_y = 27},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"baV" = (/obj/machinery/button/remote/blast_door{id = "coffeeshop"; name = "Cafe Shutters"; pixel_x = 0; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 9; pixel_y = 27},/obj/effect/floor_decal/corner/yellow{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"baW" = (/obj/machinery/door/window/westright{name = "Coffee Shop"; req_access = newlist(); req_one_access = list(25,28)},/obj/machinery/door/blast/shutters{dir = 8; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
-"baX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"baX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/sink/kitchen{pixel_y = 28},/obj/effect/floor_decal/corner/yellow{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"baY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"baZ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"bba" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/yellow/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
@@ -2847,7 +2847,7 @@
"bcM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/yellow{dir = 9},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"bcN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/yellow/full,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"bcO" = (/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
-"bcP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"bcP" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"bcQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"bcR" = (/turf/simulated/wall,/area/medical/surgery_storage)
"bcS" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore)
@@ -2886,7 +2886,7 @@
"bdz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/yellow/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"bdA" = (/obj/machinery/door/airlock/glass_medical{name = "Staff Room"; req_access = list(5)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bdB" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
-"bdC" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/brown{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"bdC" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bdD" = (/obj/structure/table/marble,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 8; id = "coffeeshop"; layer = 3.1; name = "Cafe Shutters"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"bdE" = (/obj/structure/table/marble,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 8; pixel_y = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 0; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -8; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 8; pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 0; pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"bdF" = (/obj/structure/cable/green,/obj/structure/flora/pottedplant,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
@@ -3000,7 +3000,7 @@
"bfJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/turret_protected/ai_upload)
"bfK" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/reset,/obj/machinery/light{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bfL" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/brflowers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/grass,/area/hydroponics/garden)
-"bfM" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"bfM" = (/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bfN" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/beach/water,/area/hydroponics/garden)
"bfO" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bfP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/beach/water,/area/hydroponics/garden)
@@ -3047,7 +3047,7 @@
"bgE" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bgF" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bgG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"bgH" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"bgH" = (/obj/effect/floor_decal/corner/green{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"bgI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -26},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bgJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bgK" = (/obj/structure/disposalpipe/segment,/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
@@ -3302,7 +3302,7 @@
"blz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/beach/water,/area/hydroponics/garden)
"blA" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 2},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"blB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"blC" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"blC" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"blD" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"blE" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Surgery Observation"; dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
"blF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
@@ -3922,7 +3922,7 @@
"bxv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"bxw" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"bxx" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills{pixel_y = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
-"bxy" = (/turf/simulated/floor/tiled/white,/area/space)
+"bxy" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/closet/l3closet/virology,/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -24},/obj/item/clothing/mask/gas,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bxz" = (/obj/structure/closet/secure_closet/CMO,/obj/item/clothing/mask/gas,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"bxA" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6,5)},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/medical/genetics_cloning)
"bxB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology)
@@ -4389,7 +4389,7 @@
"bGu" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue)
"bGv" = (/obj/structure/morgue,/turf/simulated/floor/tiled,/area/medical/morgue)
"bGw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/morgue)
-"bGx" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/closet/l3closet/virology,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/item/clothing/mask/gas,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled/white,/area/medical/virology)
+"bGx" = (/obj/machinery/chemical_dispenser/full,/obj/effect/floor_decal/corner/beige{dir = 9},/obj/structure/table/reinforced,/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bGy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bGz" = (/obj/structure/table/steel,/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/camera/network/medbay{c_tag = "MED - Virology Airlock"; dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bGA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/solar/auxport)
@@ -5061,10 +5061,10 @@
"bTq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bTr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bTs" = (/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two)
-"bTt" = (/obj/machinery/chemical_dispenser/full,/obj/effect/floor_decal/corner/beige{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
+"bTt" = (/obj/machinery/chemical_dispenser/full,/obj/structure/table/reinforced,/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bTu" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bTv" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/tiled/white,/area/medical/chemistry)
-"bTw" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor/tiled/white,/area/medical/chemistry)
+"bTw" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/item/device/eftpos{eftpos_name = "Captain EFTPOS scanner"},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 4; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Captain's Office Door Control"; pixel_x = 4; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bTx" = (/obj/structure/closet/secure_closet/medical1,/obj/item/weapon/storage/box/pillbottles,/obj/effect/floor_decal/corner/beige{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/chemistry)
"bTy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/chemistry)
"bTz" = (/obj/structure/table/steel,/obj/item/weapon/deck,/obj/item/device/multitool,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
@@ -5313,7 +5313,7 @@
"bYi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "cap_office"; name = "Captain's Shutters"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/bridge_hallway)
"bYj" = (/obj/structure/bed/chair/comfy/brown,/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bYk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bYl" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/item/device/eftpos{eftpos_name = "Captain EFTPOS scanner"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bYl" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/maintenance/cargo)
"bYm" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bYn" = (/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bYo" = (/obj/structure/table/woodentable,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -5554,7 +5554,7 @@
"ccP" = (/turf/simulated/wall,/area/crew_quarters/captain)
"ccQ" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/central)
"ccR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/yellow/full,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
-"ccS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/civilian{c_tag = "CIV - Cafe Back Room"; dir = 1},/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"ccS" = (/obj/structure/bed/chair/wood{dir = 4},/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
"ccT" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
"ccU" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
"ccV" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
@@ -5925,8 +5925,8 @@
"cjW" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor,/area/maintenance/substation/cargo)
"cjX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/maintenance/substation/cargo)
"cjY" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/cargo)
-"cjZ" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/cargo)
-"cka" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/maintenance/cargo)
+"cjZ" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/cargo)
+"cka" = (/obj/effect/floor_decal/corner/red{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"ckb" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/device/multitool,/obj/item/clothing/glasses/meson,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/storage/tech)
"ckc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech)
"ckd" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/structure/table/steel,/obj/machinery/camera/network/engineering{c_tag = "ENG - Technical Storage"; dir = 2},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/storage/tech)
@@ -5998,7 +5998,7 @@
"clr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/storage/tech)
"cls" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/obj/item/weapon/circuitboard/scan_consolenew,/obj/item/weapon/circuitboard/med_data{pixel_x = 3; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
"clt" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/storage/tech)
-"clu" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/pandemic{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
+"clu" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
"clv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/storage/tech)
"clw" = (/obj/machinery/requests_console{department = "Tech storage"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/storage/tech)
"clx" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_four)
@@ -6997,7 +6997,7 @@
"cEC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/evahallway)
"cED" = (/turf/simulated/floor,/area/maintenance/evahallway)
"cEE" = (/obj/machinery/light/small,/turf/simulated/floor,/area/maintenance/evahallway)
-"cEF" = (/obj/effect/floor_decal/corner/red{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -36},/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"cEF" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/button/remote/airlock{id = "security_checkpoint"; name = "Door Bolt Control"; pixel_x = 0; pixel_y = -28; req_access = list(1); specialfunctions = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cEG" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cEH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cEI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway)
@@ -7126,10 +7126,10 @@
"cHb" = (/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva)
"cHc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway)
"cHd" = (/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/computer/card,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cHe" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/button/remote/airlock{id = "security_checkpoint"; name = "Door Bolt Control"; pixel_x = 28; pixel_y = 12; req_access = list(1); specialfunctions = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cHf" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cHg" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/brigdoor/westleft{name = "Security Checkpoint"; req_access = list(1)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cHh" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
+"cHe" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"cHf" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
+"cHg" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/brigdoor/westleft{name = "Security Checkpoint"; req_access = list(1)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"cHh" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cHi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/northern_star{c_tag = "HALL - Dock Hallway Aft"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cHj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cHk" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
@@ -7197,7 +7197,7 @@
"cIu" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva)
"cIv" = (/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/computer/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cIw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cIx" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"cIx" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 1},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cIy" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cIz" = (/obj/structure/curtain/open/shower,/obj/machinery/door/window/southright{name = "Shower"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_2)
"cIA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
@@ -7251,7 +7251,7 @@
"cJw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/storage)
"cJx" = (/obj/effect/floor_decal/corner/red/full,/obj/structure/filingcabinet/chestdrawer,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/checkpoint2)
"cJy" = (/obj/effect/floor_decal/corner/red{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled,/area/security/checkpoint2)
-"cJz" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 1},/turf/simulated/floor/tiled,/area/security/checkpoint2)
+"cJz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled,/area/engineering/workshop)
"cJA" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cJB" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cJC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
@@ -7422,8 +7422,8 @@
"cML" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"cMM" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos)
"cMN" = (/turf/simulated/wall/r_wall,/area/engineering/atmos)
-"cMO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/atmos)
-"cMP" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos)
+"cMO" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos)
+"cMP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/atmos)
"cMQ" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring)
"cMR" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring)
"cMS" = (/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring)
@@ -8479,7 +8479,6 @@
"dhc" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dhd" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dhe" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/engineering/workshop)
-"dhf" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled,/area/engineering/workshop)
"dhg" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dhh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/engineering/workshop)
"dhi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop)
@@ -9581,6 +9580,34 @@
"dCm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"dCn" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8)
"dCo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_8)
+"dCp" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCq" = (/obj/effect/floor_decal/corner/green{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCr" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCs" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/brown{dir = 6},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"dCt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"dCu" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Cafe Back Room"; dir = 1},/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
+"dCv" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCw" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCx" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCy" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCz" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCA" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCB" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCC" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCD" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCE" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCF" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCG" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCH" = (/obj/effect/floor_decal/corner/green,/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCI" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Starboard"; dir = 8},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCJ" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCK" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCL" = (/obj/effect/floor_decal/corner/green{dir = 8},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCM" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCN" = (/obj/structure/bed/chair/wood{dir = 4},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCO" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCP" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics/garden)
+"dCQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_three)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9708,31 +9735,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaYNaUAaClaClaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRaYSaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmaZWaZXaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbaDbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbaZbaXaZRaZRaahaahaahaahaZmbbbbbcaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfbbgaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbbGbbGbbGbbGbbGbbHbbGbbGbbIbbJbbKbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmaZWbcbaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibchbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbbGbbGbbGbbGbczbcAbcBbcCbcDbbGbbGbbGbbGbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzbdCbdDbcObaZbcPbdEaZRbcRbcRbcRbcRaZmbcSbcTaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbdHbdGbLZbdIbWObNGcccbYuaZRccRcsWccScwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPbdUbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbegbehbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbbGbbGbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbbGbeqbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbeubevbewbcRbdMbdNbdOaZmaahaZmaZmbexbeybdObdObdObezbeAaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbeSbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHbeqbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGbbJbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfabfbbeZbfcbfdbfebffbfgbfhbfibfjbcRbfkbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfobfobfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfubfvbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahaahaahbdlbfGbeTbfHbfIbfJbeTbfKbdlaahaahaahaahaZdaZHaZdahyaZIbfLbfMbbJbbGbeVbfNbfObbGbbGbbGbbGbbGbfObfPbfQbbGbbGbfRbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbgibfobfobfobfobgjbgkbgkbgkbgkbgkbgkbgkbglbfobfobfobfobfobfpaZmaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahaahaahbdlbgybeTbeibgzbeibeTbgAbdlaahaahaahaZdaZdaZHaZdahyaZIbgBbfRbfRbbGbgCbbGbbGbbGbgDbgEbgFbbGbbGbbGbgCbbGbgGbbGbgHaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbhcbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZybhpbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbeTbhwbhxbhwbeTbhybdlaahaahaahaZdaZGaZHaZdahybdqbaUbbGbbGbbGbbGbbGbbGbgDbhAbhAbhAbgFbbGbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahaahaahbdlbiybeTbizbiAbiBbeTbiCbdlaahaahaahaZdbiDaZHaZdahybejbdrbbGbbGbbGbbGbbGbbGbiFbhAbdtbhAbiHbbGbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUbiVbiWbiXbfhbgVbhObiYbgYbiZbjabjbbjcbgYbjdbjebjfbjgbgZbjhbjibjjbjkbjlbjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahbilbjybjzbjAbjBbjCbjDbjEbilbjFbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUbbGbbGbbGbbGbbGbbGbjZbhAbhAbhAbkabbGbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZbkfbkgbkhbeZbfhbfhbfhbfhbkibfhbkjbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahaahbjWblrblsbltblublvblwblxbjWaahaahaahaZdaZdaZHaZdahyaZIblybeqbeqbbGblzbbGbbGbbGbjZblAbkabbGbbGbbGblzbbGblBbbGblCaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJblKblLblMblNbhOblObgYbgYblPblQblRbgYblSblTblUblVbgZblWbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbmzbdTbmzbhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahaahbjWbmNbmObmPbmQbmPbmRbmSbjWaahaahaahaahaZdaZHaZdahyaZIbmTbbJbbJbbGbfPbfQbmUbbGbbGbbGbbGbbGbmUbeVbfNbbGbbGbeqbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMbnNbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkboabobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahaahbjWbjWbombonboobopboqbonborbjWbjWaahaahaahaZdaZHaZdahybdqbiHbfRbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGbbJbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIboJboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfboTboUboVboWbmmbmgbkHbmibmmboXboYboSboZbpabgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbpybpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahaahbjWbpHbpIbpJbpKbpLbpKbpMbpNbpObjWaahaahaahaZdaZHaZdahybejbiHbbGbbGbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGbbGbfRbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqobqpbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbqCbqCbqEbqFbqGboZbqHbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbrebrfbrgbpzbrhbmzbribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahaahbjWbjWbrwbrxbpKbpKbpKbrybrzbjWbjWaahaahaahaZdaZHaZdahybcyaTsbrBbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbrKbrLbrMblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscbsdbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbsnbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmqbstbpcbpcbmqbsubsvbswbsxbsybszbsAbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbsBbfubsCbdTbekbsEbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMbsNbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahaahaahbjWbsQbrxbsRbsSbsTbsUbsQbjWaahaahaahaahaZdaZHaZdahyaZIbdqbbEbsVbbGbbGbbIbbJbbKbbGbbGbbGbbIbbJbbKbbGbbGbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkbtlbtmboObtnbtobtpbtqbtpbtrboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbnIbijbtzbtAbtBbtCbtDbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObnPbnQbtPbtQbnPbtRbnTbkPbkPbkPbtSbnTbkPaahaahaahaahaahaahaahaahaahaahaahbdTbtTbtUbtVbpybtWbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahaahaahbjWbujbukbulbumbukbukbujbjWaahaahaahaahaZdaZHaZdahyahybbMbaMbbEbsVbbGbbIbbJbbKbbGbbGbbGbbIbbJbbKbbGbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuoberbuqburbusbutbuubuvbsXbuwbuxbuybuzbuAbuBbuCbuDbuEbuFbuGbuHbuIbtfbuJbuKbuLbuMbuNbuObuLbuNboObuPbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbuYbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbaDbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmbbbbbcaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfbbgaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCbbGbbGbbHbbGbgHccSblCdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmaZWbcbaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibchbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmbcSbcTaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbdHbdGbLZbdIbWObNGcccbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPbdUbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbegbehbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbeubevbewbcRbdMbdNbdOaZmaahaZmaZmbexbeybdObdObdObezbeAaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbeSbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfabfbbeZbfcbfdbfebffbfgbfhbfibfjbcRbfkbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfobfobfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfubfvbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahaahaahbdlbfGbeTbfHbfIbfJbeTbfKbdlaahaahaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbfObfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbgibfobfobfobfobgjbgkbgkbgkbgkbgkbgkbgkbglbfobfobfobfobfobfpaZmaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahaahaahbdlbgybeTbeibgzbeibeTbgAbdlaahaahaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbhcbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZybhpbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbeTbhwbhxbhwbeTbhybdlaahaahaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahaahaahbdlbiybeTbizbiAbiBbeTbiCbdlaahaahaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGbiFbhAbdtbhAbiHdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUbiVbiWbiXbfhbgVbhObiYbgYbiZbjabjbbjcbgYbjdbjebjfbjgbgZbjhbjibjjbjkbjlbjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahbilbjybjzbjAbjBbjCbjDbjEbilbjFbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbjZbhAbhAbhAbkadCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZbkfbkgbkhbeZbfhbfhbfhbfhbkibfhbkjbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahaahbjWblrblsbltblublvblwblxbjWaahaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbjZblAbkabfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJblKblLblMblNbhOblObgYbgYblPblQblRbgYblSblTblUblVbgZblWbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbmzbdTbmzbhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahaahbjWbmNbmObmPbmQbmPbmRbmSbjWaahaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMbnNbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkboabobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahaahbjWbjWbombonboobopboqbonborbjWbjWaahaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGdCxbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIboJboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfboTboUboVboWbmmbmgbkHbmibmmboXboYboSboZbpabgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbpybpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahaahbjWbpHbpIbpJbpKbpLbpKbpMbpNbpObjWaahaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqobqpbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbqCbqCbqEbqFbqGboZbqHbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbrebrfbrgbpzbrhbmzbribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahaahbjWbjWbrwbrxbpKbpKbpKbrybrzbjWbjWaahaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbrKbrLbrMblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscbsdbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbsnbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmqbstbpcbpcbmqbsubsvbswbsxbsybszbsAbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbsBbfubsCbdTbekbsEbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMbsNbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahaahaahbjWbsQbrxbsRbsSbsTbsUbsQbjWaahaahaahaahaZdaZHaZdahyaZIbdqbbEbsVdCDdCLbbIbbJbbKbbGbbGbbGbbIbbJbbKdCHdCCbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkbtlbtmboObtnbtobtpbtqbtpbtrboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbnIbijbtzbtAbtBbtCbtDbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObnPbnQbtPbtQbnPbtRbnTbkPbkPbkPbtSbnTbkPaahaahaahaahaahaahaahaahaahaahaahbdTbtTbtUbtVbpybtWbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahaahaahbjWbujbukbulbumbukbukbujbjWaahaahaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNdCPdCOdCzdCzdCzdCNdCPdCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuoberbuqburbusbutbuubuvbsXbuwbuxbuybuzbuAbuBbuCbuDbuEbuFbuGbuHbuIbtfbuJbuKbuLbuMbuNbuObuLbuNboObuPbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbuYbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhbvibvjbvkbkPbmobmpbmqbmpbmobkRahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahbdTbvlbvmbvnbrebvobvpbvqbvrbpybvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCbllahyahybaiaZzbcnbhrbaiahyahyahyaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbetaUwbvNahyahybvObosbuqbvQboNbvSbvTbvUbsXbvVbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbwhbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbwxbwybwzbkJbkJbkJbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLbkObkPbkRbkQbkSbkPbkPaahaahahyahyahyahyahyahyaahaahbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbrAbwRbwSbwTbrebwUbuabsCbucbwVbwWbwXbllbwYbwZbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbxdbxebvSbxfbxgbxhbxibsXbxjbxkbxlbxmbvYbxnbsXbxobxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbxybxzboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLbkObkPbkRbkQbkSbkPbkPaahaahahyahyahyahyahyahyaahaahbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbrAbwRbwSbwTbrebwUbuabsCbucbwVbwWbwXbllbwYbwZbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbxdbxebvSbxfbxgbxhbxibsXbxjbxkbxlbxmbvYbxnbsXbxobxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbxzboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHbtLbxMbxNbxObxPbxQbtLaahaahaahahyahyaahaahahyahyahyahyaahaahaahaahbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbyibyjbykbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaTobbObynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbyDbsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObyPbyQbyRbySbyTbyUbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJbzjbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsbztbtLaahaahaahaahahyahyahyahyahyahyaahaahaahaahaahbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbzTbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahaahbxaaahaahaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbAhaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbAobuCbApbAqbArbAsbAtbAubuCbAvbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmbALbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbAYaadaaaaadbAYaadaaaaadbAYaadaaaaadbAYaadaaaaadaaaaaaaaabAZbBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmbztbtLaahaahaahaahaahahyahyahyahyaahaahaahaahaahaahbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbCebCdbCdbCdbCfbCgbCgbCgbCgbCgbCgbCgbCgbChbCgbCibCjbCkbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCybCzbCAbwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIbCJbCKbCLbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbCQbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCWbCXbCXbCXbCXbCXbCXbCXbCXbCXbCXbCXbCXbCXbCXbCXbCYbCVbCVbCVbCZbDabDbbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahaahaahbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbDKbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfbEgbEgbEgbEgbEgbEgbEgbEhbEgbEgbEgbEibEjbEjbEjbEjbEjaZGaZGbEkbiDbjYaZdbElaYGbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFbyGbyHbEAbtfbEBbuKbECbEDbuKbySbySbySbEEbEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbEMaadaaaaadbEMaadaaaaadbEMaadaaaaadbEMaadaaaaadaaaaaaaaabAZbBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbrDbFqbFrbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvbFwaZdbFxbFybFxaZdbFzbFAbFBbFCaZdaahaahaZdaZdaZGaZHaZGbFDbFEbFFbFGbEgbFHbFIbFJbFJbFKbFLbFMbFNbFObFPbFObEjbEjbEjbFQbEjaZdaZdaTobFRbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySbGqbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbGxbGybGzbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbEMaadaaaaadbEMaadaaaaadbEMaadaaaaadbEMaadaaaaadaaaaaaaaabAZbBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbrDbFqbFrbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvbFwaZdbFxbFybFxaZdbFzbFAbFBbFCaZdaahaahaZdaZdaZGaZHaZGbFDbFEbFFbFGbEgbFHbFIbFJbFJbFKbFLbFMbFNbFObFPbFObEjbEjbEjbFQbEjaZdaZdaTobFRbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySbGqbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxybGybGzbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaadbtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaaaaaabGBbznbznbznbznbtHbtHbGCbGDbDibGEbGFbGGbGHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbwMbwMbGIbGJbGJbGJbwMbwMbwMbGKbGLbyfbGMbGNbGObGPbGQbFibGRbGSbGTbGUbGVbGWbGXbGYbFnbGZbFnbGYahybeebeebHabcnbecbHbbHcbFubHdbHebHfbHgbFubFubFubFubHhbHibHhbHjbHjbHkbHlbHjbHmaahaahaahaZdaZdaZHbEgbEgbHnbHobHpbEgbHqbHrbHsbHsbHsbHtbHubHvbHwbHwbHxbHybHzbHAbHBbEjahyahyaToaZjblDbHCaToaToahybxcbHDbHEbCqbHFbHGbHHbCqbHIbHJbHKbHLbHMbHNbHMbHObHPbHPbHQbHPbHPbHRbHSbHTbHUbHVbHWbHXbySbHYbHZbIabGtbGubGvbIbbyWbAJbySbbbbIcaZmaahaahaahaahaahaahbgmbIdbIebIfbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHbIgbIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibIsbItbIubIvbIubIwbIubIxbIybIzbIAbGYahyahybIBbecbcnbecbICbHcbIDbIEbIFbIFbIGbIHbIIbIJbFubIKbILbIMbHjbINbIObIPbHjaahaahaahaahaZdaZGaZHbEgbIQbIRbISbITbEgbIUbIVbIWbFJbFJbIXbIYbIZbJabJabJabJabJabJbbJcbJdahyahybJeaYGbetaUvbpPahyahybuobosbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbJJbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHbJLbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbJTbJUbJVbFibGYbJWbJXbJYbJXbJXbJXbJZbJYbKabKbbKcahyahybKdbecbcnbecbKebHcbKfbKgbKhbKibKjbKhbKhbKkbFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqaZHbEgbIQbKrbKsbKtbEgbKubKvbKwbFJbKxbKycuybKAbJabJabJabJabJabKBbKCbKDahyahybrGbKEbynbKFbrGahyahybvObsDbKHbKHbKIbKKbKLbKMbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9740,10 +9767,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHbNhbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHbtHbtHbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbNobNpbNpbNqbNqbNrbNqbNqbLDbNsbGYahyahybKdbecbDMbDNbKebNtbFubNubKhbNvbNwbNxbKhbNybFubNzbNAbNBbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdaZHbEgbNDbNEbNFdBNbNHbFJbFJbNIbFJbNJbEgbNKbNLbNMbNNbNObKBbNPbNQbNRbNSahyahyaTobNTbetbNUaToahyahybMkbNVbNWbNXbNYbNXbOabMnbMobOdbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbOLbOMbONbOObOPbOQbOLbORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbOUbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbPkbPlbPmbNpbNpbNpbNpbNpbLDbPnbGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbPsbKhbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdaZHbEgbPCbPDbPEbPEbPFbPEbPEbPGbFJbPHbEgbPIbPJbPKbPLbPMbPNbPIbPJbPKbEjbPObPPaToaZjblDbHCaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvbQwbMPbMQbQxbQybQzbMUbMVbQAbQBbOJbQCbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbRfbRgbRhbNpbNpbRibRjbRkbLDbRlbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtbRubRvbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdaZHbEgbRFbRGbFJbRHbRIbFJbFJbFJbFJbRJbEgbupbTlbTkbRNbRObRPbRObRPbvEbRTbRUbRUbRVbRWbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbSkbQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSybSzbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbSLbSQbSRbSQbSSbSSbSQbSTbSQbSUbSQbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbTtbTubTvbTubTwbScbTxbTybTzbTAbTBbTCbTDbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbTXbTYbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbSLbSQbSRbSQbSSbSSbSQbSTbSQbSUbSQbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybTzbTAbTBbTCbTDbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbTXbTYbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbSLbUybUzbUAbUBbUBbUybUzbUybUCbUDbUEahyahybKdbecbcnaZzbUFahybUGbUHbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbUQbNCbNCbNCbNCbNCbNCaahaZdaZHbURbvMbUTbUUbUVbUWbUWbUWbUWbUWbUXbUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvbVfbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsbMpbKNbKNbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbSLbWlbWmbWlbWnbUBbWlbWmbWlbUCbUDbUEahyahybKdbWobcnaZzbamahybWpbWqbULbWrbWsbWsbWtbWubUGbWvbWwbUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbWFbWGbWHbWIbWJbWKbWLbWKbWKbWKbWLbWKbWJbTlbTkbWNdBObVabWPbTlbTkbWQbURbPObPPaTobHCblDbHCaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbWTbWUbWVbWWbKNaahaahaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpbXfbXgbXhbXibXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbSLbXObUBbUBbXPbXQbXRbXRbXRbXSbXTbUEahyahybXUbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkbYlbYmbYnbYnbvRbNCaahaZdbYpbURbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTldBPbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzbYAbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbSLbXObUBbUBbXPbXQbXRbXRbXRbXSbXTbUEahyahybXUbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkbTwbYmbYnbYnbvRbNCaahaZdbYpbURbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTldBPbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzbYAbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbSLbWlbWmbWlbYWbUBbWlbWmbWlbYXbYYbUEbYZbZabeebecbDMbZbbamahybZcbZdbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbZtbNCaahaZdbYpbURcaAbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzaahaahaahaahaahaahaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybZUbZVbZWbZUbZUahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbZZcaacabcacbSEcadcaecaecaecafcagcahcaicaecaecaecajcakbSLbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbamahycaocapbZecaqcarcarcasbULbUGbWvcatcaucavcavcawcaxcaybYnbYncazbNCaahaZdcaBaZdccebTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkcaCcaDcaEcaFcaGcaHcaIahyahybrGaUvbetcaJbrGahyahyahyahyahyahyahyahyahyahyahycaKcaLcaMcaNaahaahaahaahaahaahaahbZCcaOcaPcaQcaRcaScaTcaUcaVcaWcaXbZLaahaahaahaahaahaahbZMcaYcaZcbacbbbZMaahaahaahaahcbccbdcbecbfcbcaahahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahycbgcbhcbicbjcbgahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEcbkcblcbmcbnbSEbNZcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAbSLcbBcbCbUBbUBbUBbUBcbDbUBcbEcbFcamcancbGcbHbecbcnaZzcbIahybUGcbJcbKcbLcbMbULcbNbUGcbOcbPcbQcbObNCcbRcbScbTcbUcbVcbWcbXbNCaahaZdbYpaZdcDsbTlbTkbYsbTmbTnbTkbTlbTkcbZbTmbTlbTkbTlccabTnccbbTlbTkdBQcaIahyahybrGccdbgJaUvbrGahyahyahyahyahyahyahyahyahyahyahyccBccfccgcaNaahaahaahaahaahaahaahbZCcchcciccjbZGcckcclbZHccmccnccobZLaahaahaahaahaahaahbZMbZNbZMbZMbZMbZMaahaahaahaahcbcccpccqccrccscctccuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9754,12 +9781,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUcgycgzcgAccwcgBccwccwcgCccwcgDbZUcgEcgFcgEcgGcgHcgIcgJbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXcgKcgLceicgMcgNcgOceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZycgPcgQcgRcgSchucgUcbOcgVcgWcgXcgYcgZchacgWcgWchbcgWchcchdchechfcgWchgcbOcgUchuchhchichjcevcevchkcdMcdNcdMcdNchlchmcdMchncdMcdNchochpcdMchqchrchschtchLchvahyahybJechwchxbbQbbRchychzchzchzchAchzchzchBchzchzchzchzchCchDchEchFchGchHchGchGchGchGchGchGchGchGchGchIchJchJchJchJchJchJchJchJchJchJchJchJchJchKbZMaahaahcbccgocgpciscgucgucgucgucgucgucguchMchNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUchOchPchQchRchSchTchUccwchVchWbZUchXchYchZchYciacibciccidcidcidcidcidcidcidcidcidcidcidcidcidcidcidcidcidcidcidcidciecifcidcidcigcihciicijcikcilceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybamcimbcnbeccbOcbOcbOcbOcinciocipciqcirciwcitciucivciAcixciycizciGciBciCcbOcbOcbOcbOciDcfQciEciFbURbURciXciHciHciHciHciHciHciHciHciHciHciHciHciIbURciXchvahyahyahybrGciJciKciLciKciMciNciNciOciNciNciNciPciNciNciNciOciQciRciSbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMciTciUciVciWbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahcbccgocgpcjAciYciZcjacjbcjccjdcjeceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgbZUbZUcjhcjicjjcgBcjkcjlcjlcjmbZUbZUcjnchYcjochYcjpcjqcjrcjsbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXcjtcjucjvcjvcjwcjxcjyceiceiceiceiahyahycjzcjzcjzcjzcjzcjzcjzahyahyahyahyahyahyahybaicimbcnbeccjBahyahycbOcbOcbOcjHcjCcjDcjEcjDcjDcjFcjDcjEcjDcjCcjGcbOcbOcbOahyahyckhcjIcjJcjKciFaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybvNaUvaUvcjLcjMcaNcgqceMceMceMceMceMceMceMceMceNcaNcaNcaNcaNbZMaahaahaahaahaahaahaahaahbZMbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccjNceTceTceTceTceTceTceVceTceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgcjOcjPcjgbVScjQbVQcjRbVScjQbVQbZUchYcjScjTchYcjUchYcjVcjWcjXcjqaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXbZXcjucjYbZXcjZckabZXaahahyahyahyahycjzcjzckbckcckdckeckfcjzcjzahyahyahyahyahybbobbockgblnccHbbobboahyahyahyckEahyahyahyahyahyahyahyahyahyahyahyahyckEahyahyahyciFciFckicfQcfRciFciFaahaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyciFciFckjckjckkciFciFahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccbccbccbccbccbccbccbccbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgcjOcjPcjgbVScjQbVQcjRbVScjQbVQbZUchYcjScjTchYcjUchYcjVcjWcjXcjqaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXbZXcjucjYbZXcjZbYlbZXaahahyahyahyahycjzcjzckbckcckdckeckfcjzcjzahyahyahyahyahybbobbockgblnccHbbobboahyahyahyckEahyahyahyahyahyahyahyahyahyahyahyahyckEahyahyahyciFciFckicfQcfRciFciFaahaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyciFciFckjckjckkciFciFahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccbccbccbccbccbccbccbccbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgcjgcklckmcknckockpckqckrckscktckuckvckwckxckyckzchYckAchYckBckCckDcjqaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcjubZXbZXbZXbZXbZXahyahyckKckFckFckGckHckIckIckIckIckIckIcjzahyahyahyahybbobbockJcimbcnbecbDObboclmckLckMciFclmckLckLckLckLckLckLckLckLckLckLckMciFclmckLckMciFckNckOckPcfRckQciFciFciFciFciFclmckLckLckLckLckLckLckLckLckLckLckRciFclmckLckRciFckScfRcfRckTckUciFciFahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgckVckmcknckWckXckYckZclaclbchVclccldclecleclfclgclhcjUchYclicljclkcjqaahaahaahaahaahaahaahaahaahcllcllcllcllcllcllcllaahaahaahbZXcjubZXaahaahaahaahahyahyclYclncloclpclqclrclscltcluclvclwcjzahyahyahyahyaZyclxbecclyclzclAclAclBclCclCclCclDclCclEclCclCclFcfRcfRcfRcfRclGclHclIclJclIclIclIclKclLclMclNclIclIclKclIclOclIclPclIclQclIclIclIclIclIclQclRclIclSclIclTclIclQclIclKclIclUclUclVclWbKGcmpahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgclZcknckncmacmbcmcbZUbZUcmdbZUbZUchYcmeclecmfcmgcmhcmichYcjqcjqcjqcjqaahaahaahaahaahcmjcmjcmjcmjcllcmkcmlcmmcmncmocllaahaahbZXbZXcjubZXaahaahaahahyahyahycmRcmqcmrcmscmtcmtcmucmvcmwcmtcmxcjzahyahyahyahybamcmybeccimbcnbecbeccmzcfRcfRcfRcfRcmAcmBcmBcmBcmCcmDcmDcmDcmEcmDcmFcmDcmGcmDcmDcmDcmHcmIcmJcmKcmDcmDcmHcmDcmDcmDcmLcmDcmDcmDcmMcmDcmDcmDcmDcmGcmDcmDcmDcmEcmDcmDcmDcmHcmNcmBcmBcmOcmPcmQcncahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhcmichYaahaahaahaahaahaahaahaahaahcmjcnicnjcnkcllcnlcnlcnmcnlcnncllaahaahbZXcnocjubZXaahaahaahaahahyahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcnxcfRcfRcnDcnxcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcnJcevcevcevcevcnJcevcnNcevcevcevcnIcnOcnPcnQcnRcfRbKGcodahyaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahaahaahaahcmjcogcohcoicllcojcokcolcnlcomcllaahaahbZXconcjubZXaahaahaahaahaahahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFckLckMciFclmckLckMciFcoFckickicfRcoXciFciFaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoJcoJcoJcoJcoKcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahaahaahaahcmjcogcohcoicllcojcokcolcnlcomcllaahaahbZXconcjubZXaahaahaahaahaahahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcoFckickicfRcoXciFciFaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoJcoJcoJcoJcoKcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahaahaahaahcmjcpdcohcpecllcpfcpgcphcpicokcllaahaahcpjbZXcpkbZXcpjaahaahaahaahahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovcpucpvcpwcpxcpycpzcpAcpBcpCcovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcDncDncDncEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgcpKcpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXcpXcpXcpXcmjcmjcpYcmjcllcllcpZcqacllcpZcllcpXcpjcpjcqbcqccqdcpjcpjcpjcpjcpjcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocqpcqqcqrcqscrJcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcFecEVcEVcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgcqEckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqYcqOcqZcracqYcrbcrccqYcqYcqOcrdcrecrfcrgcrhcricrjcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrLcrMcrLcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcJacJacEVcEVcEVcEVcEVcEVcJKcrQcrQcrQcsLcrScrTcrUcrQcrQbRLcsNbRLcrQcrQcrQcrQaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9773,14 +9800,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcAEcAFcxgcxgcvScvTcAGczzcAHcBTcAJcAKcALbWMcuXcxqcANcxqcxqcxrcxrcxrcxrcxrcxrcxrcxrcAOcxrcxraahaahaahcxrcAPcAPcAPcxrcxrcxrcxrcwdcwdcAQcARcAScwdcwdcwhcwhcwhcwhcwhczQcwhcwhaahaahcwhczRcwhaahahyahyahyahycxzcATczecAUcAVczeczeczgcAWcAXczecAYcxzaahahyahyaahaahaahaahczicAZcziaahaahaahcBacCScBccBacqvcqvcBdcBecBfcqvcBgcBgcBgcBgcBgahyahyahycBgcQzcBgaahaahcrQcvucvucsYcsYcBicxPcsYcxPcBjcsYcxRczncxOcBkcxObYocrQaahaahcAicAicAicAicAicBmcDycDxcAiczpcBpcAocDDcDCcBscAocAocAocAocAocAscAscAscAscBtcDMcDNcAscBwcBvcAycFkcBycBzcAycAycAycAycAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcEBcyCcBBcBCcxgcxgcxgcBDcvTcAGczzcBEcuXcvrcvbcuXcuXcuXcxrcANcBFcxrcxraahaahaahaahaahaahcxrcBGcBHcxraahaahaahcBIcBIcBJcBIcBIaahaahaahaahcwdcBKcxucxvcwdaahaahaahaahaahcwhczQcwhaahaahaahcwhczRcwhaahaahaahahyahycxzcxzcxzcxzcBLcBMcBNcBOcbocxzcxzcxzcxzaahaahaahaahaahaahaahczicAbczicziczicBacBacBQcBRcBacBScEIcrOcrPcqycBUcBgcBVcBWcBXcBgcBgahyahycBgcQzcBgaTWaahcrQdBVcxPcsYcsYcxQcxQcsYcxQcxQcsYcxRczncxQcxQcxQcxQcrQaahaahcAicBZcCacCbcAicAicFlcAicAicCdcvAcAocFmcCecAocAocCfcCgcChcAocCicCjcCkcAscAscFncAscAscvHcFycAycAycCncAycAycCocCpcCqcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcCrcyFcxgcxgcvScvTcAGczzcCscCtcCucCvcCwcCxcCycCzcCAcxrcxraahaahaahaahaahaahaahcxrcCBcCCcxraahaahaahcBIcCDcCEcCFcBIcCGcCGcCGaahcwdcCHcCIcCJcCKcCKcCKcCKcCKcCKcCKcCLcCKcCKaahahycwhczRcwhaahaahaahaahahycxzcCMcCNcABcCOczVcCPcCQcCRcEKcCTcCUcxzaahaahaahaahaahaahaahczicCVcCWcCXcCXcCYcCZcDacDbcDccDdcDecDfcDgcDhcDicBgcDjcDkcDlcDmcBgcBgcBgcBgcQzcQzcBgcBgcrQcxQcxQcDocwycwycwycwycwycwycwycDpcDqcwscDrcsYcducrQaahaahcAicDtcDucDvcDwcDvcFAcFzcDzcDAcwIcDBcHFcHAcDEcDFcDEcDGcDHcAocDIcDJcDKcDLcDKcHGcHKcDOcwWcHNcDPcDQcDRcDScDTcDScDUcDVcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxraahaahaahcBIcCDcCEcCFcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtcEuddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBacEFcEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUddqddrcEXcEXcEYcEZcxTcxTcxTcxTcxTcFacFacFacxTcxTcFbcFccFdcFdcFdcFdcrQaahaahcAicFfcFgcFhcFicFjcIKcIJcAicyccydcAocIPcILcFocFpcFqcFrcFscAocFtcFucFvcFwcFxcIQcIRcAscyscAxcKacJRcFBcFCcFDcFEcFFcFGcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxraahaahaahcBIcCDcCEcCFcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtcEuddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBackacEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUddqddrcEXcEXcEYcEZcxTcxTcxTcxTcxTcFacFacFacxTcxTcFbcFccFdcFdcFdcFdcrQaahaahcAicFfcFgcFhcFicFjcIKcIJcAicyccydcAocIPcILcFocFpcFqcFrcFscAocFtcFucFvcFwcFxcIQcIRcAscyscAxcKacJRcFBcFCcFDcFEcFFcFGcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJcFKcDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcElcFUcxraahaahaahcBIcFVcCEcCFcBIcFWcGpcFYcFZcwdcGacGbcGccCKcGdcGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcGicGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcGycBgcBgcBgcrQcvucvucsYcGzcGAcGAcGAcGAcGAcGzcxRctbcFdcFdcFdcFdcrQaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcGMcGNcxraahaahaahcBIcGOcGPcGQcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHecHfcHgcHhcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcBgaahaahcrQcHrcxPcsYcGzcHscHtcHucHvcHwcGzcxRctbcFdcFdcFdcHxcrQaahaahaahaahaahaahcHycHzcKTcHBcHycHCcHDcHEcKXcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgcHLcHIcHMcLhcHOcHPcHQcJtcHOaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahaahaahcxrcIdcIecxraahaahaahcBIcCDcIfcIgcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcIxcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgaahaahcrQclXcxQcsYcGzcHscHtcIGcHtcHwcGzcxRctbcFdcFdcFdcmYcrQaahaahcHycHycHycHycHycIIcMpcMocHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrcMscHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahyaahcJecJecJfcJgcJeaahaahaahcBIcCDcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycJzcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcHqcBgaahaahcrQcsYcsYcsYcGzcHscJLcJMcJNcHwcGzcxRctbcFdcFdcFdcFdcrQaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcGMcGNcxraahaahaahcBIcGOcGPcGQcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHecEFcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcBgaahaahcrQcHrcxPcsYcGzcHscHtcHucHvcHwcGzcxRctbcFdcFdcFdcHxcrQaahaahaahaahaahaahcHycHzcKTcHBcHycHCcHDcHEcKXcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgcHLcHIcHMcLhcHOcHPcHQcJtcHOaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahaahaahcxrcIdcIecxraahaahaahcBIcCDcIfcIgcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgaahaahcrQclXcxQcsYcGzcHscHtcIGcHtcHwcGzcxRctbcFdcFdcFdcmYcrQaahaahcHycHycHycHycHycIIcMpcMocHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrcMscHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahyaahcJecJecJfcJgcJeaahaahaahcBIcCDcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcHqcBgaahaahcrQcsYcsYcsYcGzcHscJLcJMcJNcHwcGzcxRctbcFdcFdcFdcFdcrQaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahyaahcJecKgcKhcKicJecKjcKjcKjcBIcBIcKkcKlcBIcKmcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcrQcrQcrQcKJcKKcKLcKMcHwcGzcxRcKNcFdcFdcFdcFdcrQaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahaahcJecLtcLucLvcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOcLPcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgcBgcBgcrQcMdcMecMfcrQcrQcMgcMhcKMcHwcGzcxRctbcFdcFdcFdcFdcrQaahaahcHycMicMjcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdCbdCedCddCgdCfdCidChdCkdCjdClcHIcysdCmdCodCncMEcMFcMGcMHcMIcMJcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMOcMPcKjcMQcMRcMScMTcMUcMVcMWcMXcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcNkcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicNscAbcNtcKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcNHcNIcERcNJcERcNKcNLcNMcNNctzcNOcNPcNQcNRcNScNTcNUctbcNVcNVcNWcNXcrQaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLczqcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMPcMOcKjcMQcMRcMScMTcMUcMVcMWcMXcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcNkcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicNscAbcNtcKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcNHcNIcERcNJcERcNKcNLcNMcNNctzcNOcNPcNQcNRcNScNTcNUctbcNVcNVcNWcNXcrQaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLczqcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcOucOtcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCcOHcOIcOJcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCcOScHqcGxcOTcGxcOUcOVcsYcOWcOXcrQcOYcHtcOZcPacPbcPbctacPccPccPccPccrQaahaahcPdcPecPfcPgcPhcPicPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwcPlcPxcPycPzcPAcPBcPCcPDcPEcPxaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQccxUcQecQfcQgcQhcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDcQncKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCcQzcHqcBgcBgcBgcrQcrQcQAcQBcQCcrQcQDcQEcQFcQGcsYcsYcsYcQHcQHcQIcrQcrQaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZcRacRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTacOtcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRcRScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCcSbcSccBgahyahyahycrQcrQcrQcrQcrQcrQcrQcrQcrQcrQcrQcrQcrQcrQcrQcrQaahaahaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStcSkcSucSucSvcSwcSxcSycSycSzcPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9797,8 +9824,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcWLcWLcVIcVJdeAdeBdeCdeDdcudeEdeFdeGdeHdeIdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqdfvcWLcPMcPMdfwdfxdfydfzdcudcudfAdfQdfCdfDdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTSdgpdgpdgqcPMdgrdgsdaSdgtdcudgudgvdhzdgxdfDdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhacWLcWLdhbdhadhcdhddaSdhedcudcudhfdhEdfCdhhdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibdicdiddaSdiedcudcudhfdiYdfCdfDdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhacWLcWLdhbdhadhcdhddaSdhedcudcucJzdhEdfCdhhdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibdicdiddaSdiedcudcucJzdiYdfCdfDdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahahyahyahyahyahydjtdizdiAdiBdiCdiBdiDdiEdiCdiBdiFdiEdiCdiCdiDdiGcMNcMNdaSdiHdiIdiJdiKdjudiMdiNdiOdgzdfFdihdgBdiidijdiPdiQdiRdijdhrdiSdiTdiUdiVdiWcwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjwddYdjcdjddjedcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdjfdjgdjhdeidjiddcaaaaaaaaadjjdjkdjkdjkdjkdjkdjjaaaaaaaaaddidjldemdjmdjndjoddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodjpdjqdjrdjsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaahydkCdjxdbDdbDdkJdjxdkLdbDdkJdjxdkLdbDdkJdkUcOsbkQbkQahydaSdgzdgzdgzdgzdgzdjydgzdgzdgzdjzdjAdjBdjCdjCdjCdjCdjCdjCdjCdjCdjCcxxdhtcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdehdeidfgdeWaaaaaaaaadjjdjDdjEdjkdjEdjDdjjaaaaaaaaadfbdfidemdendhGdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdixdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAaaadjFaaabkQcIcdjGcNZcMKcIcdjGcNZcMKcIcdjGcNZcMKcIcbkQaahdjHdjHdjIdjJdjKdjLdjMdjNdjOdjPdjQdjRdjSdjCdjTdjUdjVdjWdjXdjYdjZdjCdjCdhtcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadfUddZdgRdebdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdejdgSdehdeidgSdhMaaaaaadisdkbdkcdkcdkddkcdkcdkbdiwaaaaaadifdhGdemdendhGdepdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiyderdesdixdgXddsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm
index d42fbfa069a..1d3a9c28d66 100644
--- a/maps/polaris-2.dmm
+++ b/maps/polaris-2.dmm
@@ -112,11 +112,11 @@
"ch" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Jury Box"},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
"ci" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt)
"cj" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area/space)
-"ck" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 6},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
+"ck" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"cl" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
"cm" = (/obj/effect/decal/cleanable/dirt,/obj/structure/holostool,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
"cn" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
-"co" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
+"co" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (SOUTHWEST)"; icon_state = "spline_fancy"; dir = 10},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"cp" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre)
"cq" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
"cr" = (/obj/structure/window/reinforced/holowindow,/obj/machinery/door/window/holowindoor{dir = 1; name = "Court Reporter's Box"},/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom)
@@ -137,7 +137,7 @@
"cG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area/space)
"cH" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area/space)
"cI" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea)
-"cJ" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
+"cJ" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"cK" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre)
"cL" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
"cM" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre)
@@ -178,7 +178,7 @@
"dv" = (/turf/space/transit/east/shuttlespace_ew9,/area/shuttle/large_escape_pod1/transit)
"dw" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"dx" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
-"dy" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
+"dy" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (NORTHWEST)"; icon_state = "spline_fancy"; dir = 9},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
"dz" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
"dA" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
"dB" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom)
@@ -731,7 +731,7 @@
"oc" = (/obj/structure/urinal{pixel_y = 32},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"od" = (/obj/structure/urinal{pixel_y = 32},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"oe" = (/obj/item/weapon/bikehorn/rubberducky,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
-"of" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership)
+"of" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/obj/item/clothing/glasses/regular,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership)
"og" = (/obj/structure/table/standard,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership)
"oh" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership)
"oi" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops)
@@ -2249,7 +2249,7 @@
"Rm" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Rn" = (/obj/item/weapon/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Ro" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"Rp" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"Rp" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/white/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/restaurant)
"Rq" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Rr" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start)
"Rs" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start)
@@ -2261,7 +2261,7 @@
"Ry" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start)
"Rz" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"RA" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"RB" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"RB" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/white/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/restaurant)
"RC" = (/turf/unsimulated/wall,/area/wizard_station)
"RD" = (/obj/structure/sink,/turf/unsimulated/wall,/area/wizard_station)
"RE" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/skipjack_station/start)
@@ -2275,7 +2275,7 @@
"RM" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"RN" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/nuclear,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"RO" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
-"RP" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "\[center]\[b]LIST OF SPELLS AVAILABLE\[/b]\[/center]\[br]\[br]Magic Missile:\[br]This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.\[br]\[br]Fireball:\[br]This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.\[br]\[br]Disintegrate:\[br]This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.\[br]\[br]Disable Technology:\[br]This spell disables all weapons, cameras and most other technology in range.\[br]\[br]Smoke:\[br]This spell spawns a cloud of choking smoke at your location and does not require wizard garb.\[br]\[br]Blind:\[br]This spell temporarly blinds a single person and does not require wizard garb.\[br]Forcewall:\[br]This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.\[br]\[br]Blink:\[br]This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.\[br]\[br]Teleport:\[br]This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.\[br]\[br]Mutate:\[br]This spell causes you to turn into a hulk, and gain telekinesis for a short while.\[br]\[br]Ethereal Jaunt:\[br]This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.\[br]\[br]Knock:\[br]This spell opens nearby doors and does not require wizard garb.\[br]"; name = "List of Available Spells (READ)"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
+"RP" = (/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"RQ" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
"RR" = (/obj/structure/toilet{pixel_y = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"RS" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
@@ -2368,16 +2368,20 @@
"TB" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"TC" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"TD" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"TE" = (/obj/structure/table/steel,/obj/item/clothing/glasses/regular,/obj/item/clothing/glasses/regular,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start)
+"TF" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"TG" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
+"TH" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "\[center]\[b]LIST OF SPELLS AVAILABLE\[/b]\[/center]\[br]\[br]Magic Missile:\[br]This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.\[br]\[br]Fireball:\[br]This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.\[br]\[br]Disintegrate:\[br]This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.\[br]\[br]Disable Technology:\[br]This spell disables all weapons, cameras and most other technology in range.\[br]\[br]Smoke:\[br]This spell spawns a cloud of choking smoke at your location and does not require wizard garb.\[br]\[br]Blind:\[br]This spell temporarly blinds a single person and does not require wizard garb.\[br]Forcewall:\[br]This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.\[br]\[br]Blink:\[br]This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.\[br]\[br]Teleport:\[br]This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.\[br]\[br]Mutate:\[br]This spell causes you to turn into a hulk, and gain telekinesis for a short while.\[br]\[br]Ethereal Jaunt:\[br]This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.\[br]\[br]Knock:\[br]This spell opens nearby doors and does not require wizard garb.\[br]"; name = "List of Available Spells (READ)"},/obj/item/clothing/glasses/regular,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station)
(1,1,1) = {"
aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoalahajapaqarasatauavawaxayaaabacadaeafagahaaaiajakalamanaoagafajacadahakazaAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaAaBaCaDaEaFaGaHaIaJazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQaQaQaQaQaQaQaQaQaQaQaQaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaR
ajaTaUaVaWaXaYaZbabbbcbdbebfbgbhaYaXbcaUaVaZbdaWbfbbbhbeaZbcabauavawbibjbkblbmbeaXbfaZbcbbbhbeaXbfaZbcbbbhbhbeaXbfaZbcbbbhbhbmazaEbnbobpaqarasatauavawbibjbkblbqbnbobpaqarasatauaNazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQbrbsaQbrbsaQbrbsaQbrbsaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbubububvbububububububwbxbybxbybxbxbybxbybxbwbzbAbAbAbAbAbAbAbAbAbwbBbCbDbDbDbDbDbDbDbDbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIbJbKbKbKbKbKbLbM
amaWbbbeaZbgaUaYbcaXbfbabhaVbdaTaUbgbfbbbeaYbaaZaVaXaTbhaYbfaearasatauavawbibNbhbgaVaYbfaXaTbhbgaVaYbfaXaTaTbhbgaVaYbfaXaTaTbNazaBbkblbqbnbobpaqarasasatauavbibjbkblbqbnbobpaqaraKazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQaQaQaQaQaQaQaQaQaQaQaQaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububububububububObubwbPbQbPbQbPbQbPbQbPbQbwbRbRbRbRbRbRbRbRbRbRbwbBbSbTbTbTbTbTbTbTbTbwbEbUbEbEbEbEbEbEbUbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIbVbWbWbWbWbWbXbM
adaZaXbhaYbdbbaUbfaUaVbcaTbebaaWbbbdaVaXbhaUbcaYbebgaWaTaUaVahbibjbkblbqbnbobYaTbdbeaUaVbgaWaTbdbeaUaVbgaWaWaTbdbeaUaVbgaWaWbYazaHaqarasatauavawbibjawbibjbkbobpaqarasatauavawbiaBazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQbrbsaQbrbsaQbrbsaQbrbsaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbubObububububububububwbQbPbZcacbcacbccbQbPbwbRbRbRbRbRbRbRbRbRbRbwbBcdbTbDcebDbTcfcgchbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbGcibVbWbWbWbWbWbXbM
-alaYbgaTaUbaaXbbaVbbbebfaWbhbcaZaXbabebgaTbbbfaUbhbdaZaWbbbeagbobpaqarasataucjbfaUbaaTbdaYaVbfaUbaaTbdaYaVaVaWaUbaaTbdaYaVaVcjazaNawbibjbkblbqbnbobpatauavawauavawbibjbkblbqbnboaHazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQaQaQaQaQaQaQaQaQaQaQaQaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbubububububvbububububwcacbckclcmcmcncobPbQbwcpcpcpcpcpcpcpcpcpcqbwbBcdcrcsctcucvcwcxcybwbEbEbEbUbEbEbUbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIbVbWbWbWbWbWbXbM
-aoaUbdaWbbbcbgaXbeaXbhczcAcBcCbYcDcEcFcGaWaXaVbbaTbaaYaZaXbhacbibjbkblbqbnbocHbeaXbfaZbcbbbhaVbbbcaWbaaUbebeaVbbbcaWbaaUbebecHazaHaqarasatauavawbibjbkblbqbnbobpaqarasatauavawbiaBazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububvbubububvbubububwcncncncncIcIcncJbQbPbwcKcKcLcMcMcMcMcNcKcObwbBcdcPcQcQcQcRcwcScTbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIbVbWbWbWbWbWbXbM
-abbbbaaZaXbfbdbgbhbgcCcUcVcVcVcVcVcVcVcFcEaWbeaXaWbcaUaYbgaTaiasatauavawbibjbmbhbgaVaYbfaXaTbeaXbfaZbcbbbhbhbeaXbfaZbcbbbhbhbmazaCblbqbnbocWcXcXcYcZcWcXcYcWcXcYcYcYbnbobpaqarasaLazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububububububububububwcncncncncIcIcncJbQbPbwcKcKdadbdbdbdbdccKcObwbBcddddedfdedgcwcScTbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIdhbWbWbWbWbWdibM
-aeaXbcaYbgaVbabdaTdjdkcVcVcVcVcVcVcVcVcVcDdlbhbgaZbfbbaUbdaWafbqbnbobpaqarasbNaTbdbeaUaVbgaWaWbeaXbfaZbcbbbhbhaXbfaZbcbbbhbhbNazaLauavawbidmdndndodpdqdrdsdtdudvdvcYdmbibjbkblbqaFazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbubububububObubububvbwdwdxdyclcmcmcncobPbQbwcKcKdadbdbdbdbdccKcObwbBcddzdAdfdAdBcwcScTbwbEbEbEbUbEbEbUbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIdhbWbWbWbWbWdibM
+alaYbgaTaUbaaXbbaVbbbebfaWbhbcaZaXbabebgaTbbbfaUbhbdaZaWbbbeagbobpaqarasataucjbfaUbaaTbdaYaVbfaUbaaTbdaYaVaVaWaUbaaTbdaYaVaVcjazaNawbibjbkblbqbnbobpatauavawauavawbibjbkblbqbnboaHazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQaQaQaQaQaQaQaQaQaQaQaQaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbubububububvbububububwbQbPckclcmcmcncocbcabwcpcpcpcpcpcpcpcpcpcqbwbBcdcrcsctcucvcwcxcybwbEbEbEbUbEbEbUbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIbVbWbWbWbWbWbXbM
+aoaUbdaWbbbcbgaXbeaXbhczcAcBcCbYcDcEcFcGaWaXaVbbaTbaaYaZaXbhacbibjbkblbqbnbocHbeaXbfaZbcbbbhaVbbbcaWbaaUbebeaVbbbcaWbaaUbebecHazaHaqarasatauavawbibjbkblbqbnbobpaqarasatauavawbiaBazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububvbubububvbubububwbPbQcJcncIcIcncncncnbwcKcKcLcMcMcMcMcNcKcObwbBcdcPcQcQcQcRcwcScTbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIbVbWbWbWbWbWbXbM
+abbbbaaZaXbfbdbgbhbgcCcUcVcVcVcVcVcVcVcFcEaWbeaXaWbcaUaYbgaTaiasatauavawbibjbmbhbgaVaYbfaXaTbeaXbfaZbcbbbhbhbeaXbfaZbcbbbhbhbmazaCblbqbnbocWcXcXcYcZcWcXcYcWcXcYcYcYbnbobpaqarasaLazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububububububububububwbPbQcJcncIcIcncncncnbwcKcKdadbdbdbdbdccKcObwbBcddddedfdedgcwcScTbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIdhbWbWbWbWbWdibM
+aeaXbcaYbgaVbabdaTdjdkcVcVcVcVcVcVcVcVcVcDdlbhbgaZbfbbaUbdaWafbqbnbobpaqarasbNaTbdbeaUaVbgaWaWbeaXbfaZbcbbbhbhaXbfaZbcbbbhbhbNazaLauavawbidmdndndodpdqdrdsdtdudvdvcYdmbibjbkblbqaFazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbubububububObubububvbwbQbPckclcmcmcndydxdwbwcKcKdadbdbdbdbdccKcObwbBcddzdAdfdAdBcwcScTbwbEbEbEbUbEbEbUbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIdhbWbWbWbWbWdibM
ahbgbfaUbdbebcbaaWczcVcVcVcVcVcVcVcVcVcVcVbmaTbdaYaVaXbbbaaZanbpaqarasatauavbYbfaUbaaTbdaYaVdCdDdEdFdGdHdIdJdKbgaVaYbfaXaTaTbYazaObibjbkbldLdMdMdNdOdOdndodpdrdsdsdsdmblbqbnbobpaIazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububObubububububububwbQbPdPdwdxdwdxdQbQbPbwcKcKdadbdbdbdbdccKcObwbBdRdSdfdfdfdTcwcScTbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbGdUdhbWbWbWbWbWdibM
agbdaVbbbabhbfbcaZcUcVcVcVcVcVcVcVcVcVcVcVcGaWbaaUbebgaXbcaYakbkblbqbnbobpaqcjaVbbbcaWbaaUbedVdWdXdYdZeaebebdKbdbeaUaVbgaWaWcjazaJasatauavdmdqdqdrdsdqdrdsdtecedededeeavawbibjbkaDazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbububububububububububwbPbQbPbQbPbQbPbQbQbPbwcKcKefegegegegehcKeibwbBcddzdAdAdAdBcwejekbwbEbUbEbEbEbEbEbEbUbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIdhbWbWbWbWbWdibM
acbabeaXbcaTaVbfaYcCcVcVcVcVcVcVcVcVcVcVcVaxaZbcbbbhbdbgbfaUaaatauavawbibjbkcHaUaVaZbdaWbfeldJemeneodXdWepepdHelaVaZbdaWbfbbcHazaDbqbnbobpeqerereceddndodpdqdodpdpdpesbpaqarasataMazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbtbvbubububObububububObwbxbybxbybxbxbybxbybxbwetcKcKcKcKcKcKcKcKeubwbBbCevewewewexcwbDbDbwbEbEbEbEbEbEbEbEbEbEbwbFbFbFbFbFbFbFbFbFbFbwbGbHbIeyezezezezezeAbM
@@ -2486,11 +2490,11 @@ aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmMtntnmMaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPsdsGsGtdtevkvlvmvkvntetDtDtDvouWsGsGsGsGsGsGsGuXvevpvqvqvqvqvqvrvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPmjmjmjmjaPaPaPaPpYqBqBqBqBqBqBrbrbrbqBqBqBqBqBqBqcaPaPaPaPaPmSaPmTmjmjjwvcioiovcjwmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmMtntnmMaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPsdsdsdsdsdsGsGuoupvsvsvsvsvsuatDtDtetetetetetetetgsGsGuXvevtvuvuvuvuvuvtvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPmjmjmjmjaPaPaPaPqBvvvwvxvyvzqBvArbvBqBvCvDvDvEvFqBaPaPaPaPaPmSmTmjmjmjjwvcioiovcjwmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGvGvGvHvHvHvHvGvGvGvGvHvIvIvHsdvJvJsdsdvJvJsdsdvJvJvJvJsdsdsdsdvJvJvJvJsdsdsdsdvJvJsdsdsdsdsdsdvKvKvLsdsGsGuJupvMvsvsvsvstetDtDtDtDtDtetDvNvOtesGsGuXvevtvPvuvuvuvQvtvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPmjmjmjaPaPaPaPaPvRvSvSvSvSvSqBrbrbrbqBvTrbrbrbvUvVaPaPaPaPaPnOaPmjmjmjjwjwvWvXjwjwmjmjmjmjmjmjmjmjmj
-aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvYvZvYvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvYvYvYvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGwawbwbwbwbwbwbwbwbwbwbwbwbwbwbwcvJvKvKvKvKvKvKvJvKvKvKvKvKvKwdvKvKvKvKvKvKvKvKwdvKvKvKwevKvKvKvKvKvKvKvKwfsGsGuTtetewgwhwiwjtetZwkwkwktDuatDtDtDtesGsGuXvevtvuvuvuvuwlwmvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPmjmjaPaPaPaPaPaPwnwowpvSvSvSwqrbrbrbwrrbrbrbwswtwuaPaPaPaPaPmSmTmTmjmjmjjwjwjwjwmjmjmjmjmjmjmjmjmjmj
+aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvYvZvYvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvYvYvYvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGwawbwbwbwbwbwbwbwbwbwbwbwbwbwbwcvJvKvKvKvKvKvKvJvKvKvKvKvKvKwdvKvKvKvKvKvKvKvKwdvKvKvKwevKvKvKvKvKvKvKvKwfsGsGuTtetewgwhwiwjtetZwkwkwktDuatDtDtDtesGsGuXvevtvuvuwlwlwlwmvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPmjmjaPaPaPaPaPaPwnwowpvSvSvSwqrbrbrbwrrbrbrbwswtwuaPaPaPaPaPmSmTmTmjmjmjjwjwjwjwmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPwvvGvGvGwvaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPwvvGvGvGwvvHvHvHvHwvaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwbwbwbwbwbwbwbwbwbwbwbwbwbwbwwvKvKvKvKvKvKwwvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKwevKvKvKvKvKvKvKvKwfsGsGsGuTtevsvsvsvstetDwkwkwktDtewxteteuKsGsGuXvevtvuvuvuvuvuwyvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPwzvSvSvSvSvSwArbrbrbwBrbrbrbrbwCwDaPaPaPaPaPmSaPaPmTmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHmTmTmTmTaPaPaPaPaPaPaPaPaPmTmTmTmTvHwbwbwbvHmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTmTaPvGwbwbwbwbwbwbwbwbwbwbwbwbwbwbwbwbwbwwvKvKvKvKvKvKwwvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKsdsdsdsdsdsdsdsdsdsdsGsGsGsGuTtewEwFwGtetDtDtDtDtDteteteuKsGsGsGuXvevtvuvuvuvuwHvtvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPqBwIvSvSvSwJqBuBwKuBqBwLwMwNrbwOqBaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPmTmTmTmTmTmTmTmTmTmTmTaPaPaPvHwbwbwbvHmTaPaPaPaPaPaPaPaPaPaPaPaPaPaPmTmTvHwbwbwbwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPwPvJvJwQvJvJsdvJvJvJvJvJwRwRvJvJsdsdvJvJvJvJsdsdvKvKsdwSwTsdwSwTsdwSwTsdsGsGsGsGsGuTteteteteteteteteteteuKsGsGsGsGsGuXvevtvuvuvuvuvuwyvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPqBwUwVwWwXwYqBwZrbxaqBxbqBqBxcqBqBaPaPaPaPaPaPaPmSaPmTmjmjmjmjmjmjmjmjmjmjmjmjmjmjmj
-aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbwPxdxexfxexfxexfxexfxexgxhxixhwPxjxjxjxkxlsdwRwRwRwRwRwRwRxmxnsdxjxjxjxjxjxjsdvKvKsdxoxosdxoxosdxoxosdsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGuXvevtvuvuvuvuxpxqvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPqBxrvSxsqBqBqBrbrbxtqBqBqBxurbxvqBaPaPaPaPaPaPaPmSmTmTmjmjmjmjmjmjmjmjmjmjmjmjmjmjmj
+aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbwPxdxexfxexfxexfxexfxexgxhxixhwPxjxjxjxkxlsdwRwRwRwRwRwRwRxmxnsdxjxjxjxjxjxjsdvKvKsdxoxosdxoxosdxoxosdsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGuXvevtvuvuxpxpxpxqvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPqBxrvSxsqBqBqBrbrbxtqBqBqBxurbxvqBaPaPaPaPaPaPaPmSmTmTmjmjmjmjmjmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbxwxxxyaPaPaPaPaPaPaPaPaPaPaPaPaPxyxxxwwbwbwbvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPxyxxxwwbwbwbwPxzxfxexfxAxBxexfxexfxCxfxexfwPxDxjxjxjxjsdwRxExFxGxEwRwRwRwRsdxjxoxHxHxoxjvJvKvKsdxoxIsdxoxIsdxoxIsdsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGsGuXvevtvPvuvuvuvQvtvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPqBxJxKxLqBaPqBxMxMxMqBaPqBqFxNxOqBaPaPaPaPaPaPaPmSaPmTaPmjmjmjmjmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbxwxxxyaPaPaPaPaPaPaPaPaPaPaPaPaPxyxxxwwbwbwbvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPxyxxxywbwbwbwPxPxexfxQxRxSxTxexfxexgxhxixhwPxUxjxjxjxjsdwRxExVxVxEwRwRwRwRsdxjxWxXxYxZxjvJvKvKsdyasdsdyasdsdyasdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsdsduXveybycvuvuvuydyevevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPqBxMxMxMqBaPsfyfygyhshaPqBxMxMxMqBaPaPaPaPaPaPaPmSmTmTmTmTmTmjmjmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbvGaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbwPxzxfxeyiyjykylxfxexfwPwPwPwPwPymymymxjxjsdwRwRwRwRwRwRwRynxEsdxjxWxXxXxZxjsdvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKyosGsGyovfveypyqyryryryqysvevfaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPmjmjaPaPaPsfyfygyhshaPaPaPaPaPaPaPsfyfygyhshaPaPaPaPaPaPaPmSaPmTaPmTaPaPmjmjmjmjmjmjmjmjmjmjmj
@@ -2501,15 +2505,15 @@ aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGvGvGaP
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbxwxxxyaPaPaPaPaPaPaPaPaPaPaPaPaPxyxxxwwbwbwbvHmTaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwPzhzixgxexfxexfzjwPzkzlzmzmzmyIyUyVznyIyYyYyYyYzozpyYyYyYyYyYsdxjxjxjxjxjxjsdvKvKvJvKvKvKvKvKvKvKvKzqsdsdsdsdsdsdsdsdsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbxwxxxyaPaPaPaPaPaPaPaPaPaPaPaPaPxyxxxwwbwbwbvHvHvHvHvHwvmTmTmTmTmTmTmTmTmTmTmTaPvGwbwbwbwPxexfzrxfxexfySzswPztxexexexeyIyVyVyVzuyYyYzvyYzozpyYzwzxzyyYsdsdvJvJvJvJsdsdvKvKzzvKvKvKvKzAzBzCvKvKsdvKvKvKvKvKvKzDsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbvHmTaPaPzEzFzGzEzFzFzHzIzJzFzKzLmTmTvHzMwbwbwPxfxezNxexfxezOzPwPzQxexAxexeyIyVyVzRyIzSyYzTyYzozpyYzwzxzyyYyIvKvKvKvKvKvKvKvKvKvJvKvKvKvKzCzCzDvKvKzUvKzVvKvKzVvKzCsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmj
-aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvGaPaPzEzWzXzYzZAaAbAaAaAaAbAcAdvGvGvGwbwbwbwPzrzNxgxgxgxgxgxgwPAeAfxexeAgyIAhyVzRyIzSyYyYyYzozpyYzwzxzyyYyIvKvKvKvKvKvKvKvKvKvJAiyNvKvKvKvKvKAjvKsdzcAkAlzCAmvKzqsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmj
-aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvGaPaPAnAoApAoAqAoAoAoAoAoAoAoArAsxxAswbwbwbwPxfxexfxexfxexfxexfAeAeAtAeAeyIyIyIyIyIzozozozozozpyYzwzxzyyYyIvJvJAuvJvJsdwdvKvKsdAvyNvKvKvKvKvKsdsdsdsdvJvJvJvJvJsdsdAwAwsdvKvKsdaPaPaPaPAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmj
+aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvGaPaPzEzWzXzYzZAaAbAaAaAaAbAcAdvGvGvGwbwbwbwPzrzNxgxgxgxgxgxgwPAeAfxexeAgyIAhyVzRyIzSyYyYyYzozpyYzwRpzyyYyIvKvKvKvKvKvKvKvKvKvJAiyNvKvKvKvKvKAjvKsdzcAkAlzCAmvKzqsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmj
+aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvGaPaPAnAoApAoAqAoAoAoAoAoAoAoArAsxxAswbwbwbwPxfxexfxexfxexfxexfAeAeAtAeAeyIyIyIyIyIzozozozozozpyYzwRBzyyYyIvJvJAuvJvJsdwdvKvKsdAvyNvKvKvKvKvKsdsdsdsdvJvJvJvJvJsdsdAwAwsdvKvKsdaPaPaPaPAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHmTmTmTaPaPaPaPaPaPaPaPaPaPaPmTmTmTvHwbwbwbvGaPaPAyAzAAABzZACADACACACADAEAFvGvGvGwbwbwbwPxexfxexfxexfxexfxexfxexfxeAGAHyIyYyYyYzpzpzpzpzpyYyYyYyYyYyYyIAIAJvKAKALsdAMANAOAwAwBkAwsdvJAPvJsdAQAQAQARASATAUAVAQAQAQAwwdvKvKsdaPaPaPAxAxAWAWAWAWAWAWAXAXAXAWAWAWAWAXAXAXAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPAyzFAZAyzFzFzHzIzJzFBaBbmTmTvHwbwbwbwPxfxexfySAGySAGySxfxexfxexfySBcyIBdyYyYyYyYyYyYyYyYyYyYyYyYBdyIvKvKvKvKvKsdvKvKvKEaAQAQBlsdvKvKvKsdAQAQAQARBeBfBgAVAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPBhaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHvHvHvHvHwvmTmTmTmTmTmTmTmTmTmTmTaPvGwbwbwbwPxexfxeBiBjBiBjBixexfxexfxexfxeyIzxyYzwzxzxzyyYyYzwzxzxzyyYzxyIvKvKvKvKvKsdvKvKvKEaBmBzBysdvKvKvKsdAQAQAQBnBoBpBqBrAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmj
-aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwPxfxexfyjxfxexfxSxfxexfxexfxexfyIBsyYzwzxzxzyyYyYzwzxzxzyyYBsyIvKBtBuBvBwsdvJBxvJAwTzTAAwsdBABBBCsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWBDAxAxAxAYAYAYAxBEBEAxAYAYAYAxAxAxAxAYAYAYAxAxAYAYAYAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmj
+aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwPxfxexfyjxfxexfxSxfxexfxexfxexfyIBsyYzwRBRpzyyYyYzwRBRpzyyYBsyIvKBtBuBvBwsdvJBxvJAwTzTAAwsdBABBBCsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWBDAxAxAxAYAYAYAxBEBEAxAYAYAYAxAxAxAxAYAYAYAxAxAYAYAYAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHBFBFBFvHvHaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPvHvHBFBFBFvHvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHvHBFBFBFwPxexfxexfxexfxexfxexfwPwPBGBHwPyIBdyYyYyYyYyYyYyYyYyYyYyYyYBdyIBIsdsdsdsdsdAQAQAQAwEaEaAwsdsdsdsdsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxBJAWAWAxAxBKBLBMBLBMBNBOBOBPBMBLBMBLBQBRBRBRBRBRBRBRBRBRBRAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmj
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbBSwbwbvHvHmTaPaPaPaPaPaPaPaPaPaPaPmTvHvHwbBTBUBVwbvHvHaPaPaPaPaPaPaPaPaPaPaPaPaPvHvHwbwbBUBVwPxfxexfwPBWAtwPwPxfxewPBXxfxeBYyIzxyYzwzxzxzyyYyYzwzxzxzyyYzxyIsdsdAQAQAQAQAQAQAQAQAQAQAQAwAwsdsdAwAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxBJAWAWAxBKBZCaCaCaCaCbCcCcCdCaCaCaCbCeBQCfCfCfCfCfCfCfCfCfAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
-aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbCgwbwbwavHvHaPaPaPaPaPaPaPaPaPaPaPvHvHwawbwbChwbwbwavHvHaPaPaPaPaPaPaPaPaPaPaPvHvHwawbwbCiBVzNxexfxewPxexfxewPxexfwPCjxexfCkyIBsyYzwzxzxzyyYyYzwzxzxzyyYBsyIsdClAQAQAQAQAQAQAQAQAQAQAQClAwAwsdAwCmAQAQAQAQAQAQAQAQAQCmAwwdvKvKAxAxAxAxAxBJAWAWAYCnCoCcCcCcCcCcCcCcCcCcCcCcCcCpCnCqCqCqCqCqCqCqCqCqAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
+aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbCgwbwbwavHvHaPaPaPaPaPaPaPaPaPaPaPvHvHwawbwbChwbwbwavHvHaPaPaPaPaPaPaPaPaPaPaPvHvHwawbwbCiBVzNxexfxewPxexfxewPxexfwPCjxexfCkyIBsyYzwRBRpzyyYyYzwRBRpzyyYBsyIsdClAQAQAQAQAQAQAQAQAQAQAQClAwAwsdAwCmAQAQAQAQAQAQAQAQAQCmAwwdvKvKAxAxAxAxAxBJAWAWAYCnCoCcCcCcCcCcCcCcCcCcCcCcCcCpCnCqCqCqCqCqCqCqCqCqAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGwbCiwbwbwbwbvHvHvHvHvGvGvGvGvGvHvHvHvHwbwbwbCiBUCrwbwbwbvHvHvHvHvGvGvGvGvGvHvHvHvHwbwbwbwbBUwbzrxfxexfwPxfxeCswPxfxewPCtxfxeBYyIyICuCvCvCwyICxCxyICuCvCvCwyIyIAQAQAQAQCyCzCACACACBCCAQAQAQAQAwAwAwAwAwAwAwAQAQAQAwAwAwAwAwsdvKvKCDAWAWAWAxBJAWAWAYCECoCcCcCcCcCcCcCcCcCcCcCcCcCpCECfCfCfCfCfCfCfCfCfAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwbwbwbwbCFxxCGCFxxCHCICJxxCGCFxxCGwbwbwbwbwbwbwbwbwbCFxxCGCFxxCHCICJxxCGCFxxCGwbwbwbwbwbwbwPCKxfxexgxeCLCMxgxexfwPCjxexfCkwPCNCOCPCOCPCQAQAQCRCOCSCOCOCTAwAQAQAQCUCVCWCWCWCWCWCXCYAQAQAQAwCOCPCOCNCPCQAQAQAQCRCPCOCOCZsdvKvKAxDaAWDbAYBJAWAWAxCeBQDcDcDcDcDdCcCcDeDcDcDcDdBKBZCqCqCqCqCqCqCqCqCqAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwbwbwbwbCFxxCGCFxxCHDfCJxxCGCFxxCGwbwbwbwbwbwbwbwbwbCFxxCGCFxxCHDfCJxxCGCFxxCGwbwbwbwbwbwbwPwPzrzNxgDgDhxgxgzNzrwPwPwPwPwPwPDiDjDjDjDjDkAQAQDlDjDjDjDjDmAwAQAQDnDoCWCWCWCWCWCWCWDpCCAQAQAwDiDjDjDjDjDkAQAQAQDlDjDjDjDmAwDqDqAxAWDrDsAYBJAWAWAxAxCeBLBMBLBMBNBOBOBPBMBLBMBLBZBRBRBRBRBRBRBRBRBRBRAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
@@ -2604,10 +2608,10 @@ aRmjmjmjmjmjaPaPaPaPaPaPaPaPQaQyQaQaQaQaQaQzQAQAQAQAQAQBQaQaQaQaQaQCQaaPaPaPaPmd
aRmjmjmjmjmjaPaPaPaPaPaPaPaPQaQDQEQFQGQHQaQIQAQAQAQAQAQIQaQJQKQLQMQNQaaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aRmjmjaPaPaPaPaPaPaPaPaPaPaPQaQOQPQPQPQQQaQRQSQTQUQRQSQTQaQVQPQPQWQOQaaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aRmjmjaPaPaPaPaPaPaPaPaPaPaPQXQOQPQPQPQPQUQAQAQAQAQAQAQAQUQPQPQYQPQOQXaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
-aRmjmjmjaPaPaPaPaPaPaPaPaPaPQZRaQPRbQPQPQaRcRdQAQAQAQAReQaQPRfQPRgQOQZaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
-aRmjmjmjaPaPaPaPaPaPaPaPaPaPRhRaQPQPQaRiQaQaQaRjRkRlQaQaQaRiQaRmRnRoRhaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
-aRmjmjmjaPaPaPaPaPaPaPaPaPPYQaRpRqRqQaRrRsRrQXRtRuRvQXRwRxRyQaRzRARBQaPZaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCRCRCRCRCRCRCRCRCRCRCRCRCRDRCRCRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
-aRmjmjmjaPaPaPaPmjmjaPaPaPREQaRFRFQaQaRrRrRrQZRtRkRvQZRyRyRGQaQaRFRFQaRHaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCRIRJRKRLRMRNRCRORPRQRCRRRSRTRCRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
+aRmjmjmjaPaPaPaPaPaPaPaPaPaPQZRaQPRbRPQPQaRcRdQAQAQAQAReQaQPRfQPRgQOQZaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
+aRmjmjmjaPaPaPaPaPaPaPaPaPaPRhRaQPQPQaRiQaQaQaRjTERlQaQaQaRiQaRmRnRoRhaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
+aRmjmjmjaPaPaPaPaPaPaPaPaPPYQaTFRqRqQaRrRsRrQXRtRuRvQXRwRxRyQaRzRATGQaPZaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCRCRCRCRCRCRCRCRCRCRCRCRCRDRCRCRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
+aRmjmjmjaPaPaPaPmjmjaPaPaPREQaRFRFQaQaRrRrRrQZRtRkRvQZRyRyRGQaQaRFRFQaRHaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCRIRJRKRLRMRNRCROTHRQRCRRRSRTRCRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aRmjmjmjaPaPaPaPmjmjaPaPaPaPRERURURHQaRVRWRrRhRXQARXRhRyRyRYQaRERURURHaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCRKRKRKRKRKRKRZSaSbSaScRSRSSdRCRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aRmjmjmjaPaPaPaPmjmjaPaPaPaPaPaPaPaPQaRrRrRrQaQaQUQaQaSeRySfQaaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCSgSgRKRKRKShRCSaSaSiRCRCRCRCRCRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
aRmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPQaRrRrSjQaSkQASlQaRyRySmQaaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPRCRKRKRKRKRKSnRCSoSoSpRCSqSrSsStRCaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP
diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm
index c3769ba2f86..3a643c2ee31 100644
--- a/maps/polaris-5.dmm
+++ b/maps/polaris-5.dmm
@@ -20,7 +20,7 @@
"at" = (/turf/simulated/floor/tiled/airless,/area/outpost/research/test_area)
"au" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/outpost/research/test_area)
"av" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
-"aw" = (/obj/structure/table/standard,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
+"aw" = (/obj/structure/table/standard,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/item/weapon/crowbar,/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
"ax" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
"ay" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing)
"az" = (/turf/simulated/wall,/area/outpost/research/hallway/toxins_hallway)
@@ -211,7 +211,7 @@
"ec" = (/turf/simulated/floor/tiled/dark,/area/outpost/research/mixing)
"ed" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"ee" = (/turf/simulated/floor/tiled,/area/outpost/research/mixing)
-"ef" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
+"ef" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eg" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eh" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"ei" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Toxins Lab Aft"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
@@ -364,9 +364,9 @@
"gZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"ha" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/space)
"hb" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"hc" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Exterior"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
+"hc" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Exterior"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"hd" = (/obj/structure/sink{pixel_y = 16},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
-"he" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
+"he" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/light{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"hf" = (/obj/machinery/shower{pixel_y = 3},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/freezer,/area/outpost/research/xenobiology)
"hg" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"hh" = (/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
@@ -458,7 +458,7 @@
"iP" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"iQ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio5"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"iR" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Aft Starboard"; dir = 1},/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
-"iS" = (/obj/structure/table/steel,/obj/item/clothing/glasses/science,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
+"iS" = (/obj/structure/table/steel,/obj/item/clothing/glasses/science,/obj/item/weapon/extinguisher,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
"iT" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"iU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"iV" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
@@ -479,7 +479,7 @@
"jk" = (/turf/simulated/floor/airless,/area/space)
"jl" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"jm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
-"jn" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small,/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Main Exterior"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
+"jn" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small,/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Main Exterior"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"jo" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"jp" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"jq" = (/turf/simulated/wall/r_wall,/area/outpost/research/medical)
@@ -592,7 +592,7 @@
"lt" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage)
"lu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage)
"lv" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage)
-"lw" = (/obj/machinery/conveyor{dir = 6; id = "anolongstorage"},/turf/simulated/floor/plating{dir = 10},/area/outpost/research/tempstorage)
+"lw" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"lx" = (/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage)
"ly" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage)
"lz" = (/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/research/tempstorage)
@@ -636,7 +636,7 @@
"ml" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/dock)
"mm" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"mn" = (/obj/structure/bookcase/manuals/xenoarchaeology,/turf/simulated/floor/wood,/area/outpost/research/dorms)
-"mo" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/outpost/research/dorms)
+"mo" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/clipboard,/obj/item/weapon/pen,/obj/item/device/taperecorder,/turf/simulated/floor/wood,/area/outpost/research/dorms)
"mp" = (/obj/structure/table/glass,/obj/item/weapon/folder,/obj/item/weapon/stamp,/turf/simulated/floor/wood,/area/outpost/research/dorms)
"mq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/carpet/blue,/area/outpost/research/dorms)
"mr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/eastleft{name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
@@ -718,7 +718,7 @@
"nP" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid)
"nQ" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid)
"nR" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/wood,/area/outpost/research/dorms)
-"nS" = (/obj/machinery/space_heater,/obj/effect/floor_decal/corner/purple{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid)
+"nS" = (/obj/machinery/conveyor{dir = 3; id = "anolongstorage"},/turf/simulated/floor/plating{dir = 10},/area/outpost/research/tempstorage)
"nT" = (/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
"nU" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
"nV" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
@@ -827,7 +827,7 @@
"pU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/anomaly)
"pV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/anomaly)
"pW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/anomaly)
-"pX" = (/obj/machinery/door/airlock/glass_research{name = "Anomalous Materials"; req_access = list(65)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"pX" = (/obj/effect/floor_decal/corner/purple{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/portable_atmospherics/powered/pump/filled{pixel_x = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid)
"pY" = (/obj/effect/floor_decal/corner/purple/full,/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Hallway Starboard 1"; dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
"pZ" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/purple{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
"qa" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
@@ -845,7 +845,7 @@
"qm" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/effect/floor_decal/corner/beige{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qo" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage)
-"qp" = (/obj/effect/floor_decal/corner/purple/full,/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
+"qp" = (/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/space_heater,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid)
"qq" = (/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"qr" = (/obj/effect/floor_decal/corner/purple/full{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"qs" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
@@ -857,7 +857,7 @@
"qy" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/obj/structure/plasticflaps/mining,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/research/anomaly)
"qz" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/obj/machinery/door/window,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/research/anomaly)
"qA" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"qB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"qB" = (/obj/machinery/door/airlock/glass_research{name = "Anomalous Materials"; req_access = list(65)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"qC" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"qD" = (/obj/machinery/artifact_harvester,/turf/simulated/floor/bluegrid,/area/outpost/research/anomaly)
"qE" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
@@ -878,13 +878,13 @@
"qT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qU" = (/obj/effect/floor_decal/corner/beige{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qV" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/solution_trays,/obj/effect/floor_decal/corner/beige/full{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
-"qW" = (/obj/machinery/portable_atmospherics/powered/pump/filled{pixel_x = 32},/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid)
+"qW" = (/obj/effect/floor_decal/corner/purple/full,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"qX" = (/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"qY" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"qZ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"ra" = (/obj/machinery/conveyor_switch{id = "anom"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"rb" = (/obj/machinery/power/emitter{anchored = 1; dir = 1; state = 2},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"rc" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"rb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"rc" = (/obj/machinery/power/emitter{anchored = 1; dir = 1; state = 2},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rd" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/anomaly)
"re" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"rf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/outpost/research/eva)
@@ -908,7 +908,7 @@
"rx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"ry" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"rA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"rA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rB" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rC" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Anomalous Materials Starboard"; dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"rD" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/purple/full{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/table/standard,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/tiled,/area/outpost/research/eva)
@@ -938,7 +938,7 @@
"sb" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/tape_roll,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sc" = (/obj/structure/table/standard,/obj/machinery/computer/atmoscontrol/laptop{monitored_alarm_ids = list("isolation_one","isolation_two","isolation_three"); req_one_access = list(47,24,11)},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sd" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"se" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/structure/table/standard,/obj/item/weapon/folder,/obj/item/device/camera,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"se" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sf" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
@@ -966,7 +966,7 @@
"sD" = (/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sE" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"sG" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"sG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sH" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sI" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sJ" = (/obj/machinery/conveyor{dir = 2; id = "anolongstorage2"},/turf/simulated/floor,/area/outpost/research/anomaly)
@@ -988,12 +988,12 @@
"sZ" = (/obj/machinery/atmospherics/unary/heater{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"ta" = (/obj/machinery/atmospherics/unary/freezer{dir = 1; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tb" = (/obj/machinery/atmospherics/valve/digital/open,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"tc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"td" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"te" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"tf" = (/obj/machinery/atmospherics/valve/digital/open,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"tg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"th" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"tc" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/structure/table/standard,/obj/item/weapon/folder,/obj/item/device/camera,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"td" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"te" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"tf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"tg" = (/obj/machinery/atmospherics/valve/digital/open,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"th" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"ti" = (/obj/machinery/conveyor_switch/oneway{id = "anolongstorage"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tj" = (/turf/simulated/wall,/area/outpost/research/power)
"tk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Research Outpost Maintenance"; req_one_access = list(11,24,47)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/power)
@@ -1010,7 +1010,7 @@
"tv" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/airlock/research{name = "Isolation Room 1"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tw" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Isolation Room 2"; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tx" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Isolation Room 3"; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"ty" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
+"ty" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tz" = (/obj/machinery/disposal/deliveryChute{dir = 1},/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/outpost/research/anomaly)
"tA" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/outpost/research/power)
"tB" = (/obj/machinery/power/sensor{long_range = 1; name_tag = "Research Outpost"},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/power)
@@ -1020,8 +1020,8 @@
"tF" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tG" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tH" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"tI" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"tJ" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"tI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"tJ" = (/obj/machinery/atmospherics/valve/digital/open,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tK" = (/obj/structure/cable/blue,/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Research"},/turf/simulated/floor/plating,/area/outpost/research/power)
"tL" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/outpost/research/power)
"tM" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/research/power)
@@ -1029,19 +1029,19 @@
"tO" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"tP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"tQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 2"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
-"tR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/wall/r_wall,/area/outpost/research/anomaly)
+"tR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"tS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 3"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"tT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"tU" = (/turf/simulated/wall/r_wall,/area/outpost/research/power)
"tV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/power)
"tW" = (/obj/machinery/light/small{dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"tX" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
-"tY" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
-"tZ" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
-"ua" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
+"tY" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"tZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/anomaly)
+"ua" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"ub" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
-"uc" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
-"ud" = (/obj/structure/bed,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
+"uc" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"ud" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"ue" = (/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored)
"uf" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored)
"ug" = (/turf/simulated/wall,/area/outpost/mining_main/north_hall)
@@ -1228,7 +1228,7 @@
"xF" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored)
"xG" = (/obj/machinery/floodlight,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/unexplored)
"xH" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
-"xI" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/shieldwallgen,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"xI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"xJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
"xK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
"xL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "meoutpost_main_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 25; req_access = newlist(); req_one_access = list(10,48,65)},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
@@ -1250,9 +1250,9 @@
"yb" = (/turf/simulated/wall/r_wall,/area/outpost/mining_main/refinery)
"yc" = (/turf/simulated/wall,/area/outpost/mining_main/refinery)
"yd" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
-"ye" = (/obj/machinery/shieldwallgen,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"ye" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"yf" = (/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
-"yg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"yg" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"yh" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
"yi" = (/obj/machinery/door/airlock/atmos{req_one_access = list(10,48,65)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"yj" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHWEST)"; icon_state = "intact-supply"; dir = 9},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
@@ -1286,13 +1286,13 @@
"yL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
"yM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
"yN" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/newscaster{layer = 3.3; pixel_x = -30; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
-"yO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"yO" = (/obj/machinery/artifact_analyser,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
"yP" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"yQ" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige/full{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Sample Preparation"; dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"yR" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"yS" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Mining Atmospherics"; dir = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"yT" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"yU" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"yU" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"yV" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/dorms)
"yW" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/effect/floor_decal/industrial/warning,/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Anomalous Materials Port"; dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"yX" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms)
@@ -1567,6 +1567,14 @@
"Eg" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
"Eh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
"Ei" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva)
+"Ej" = (/obj/structure/bed,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly)
+"Ek" = (/obj/machinery/shieldwallgen,/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"El" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"Em" = (/obj/machinery/shieldwallgen,/obj/structure/extinguisher_cabinet{pixel_x = 7; pixel_y = -32},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"En" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"Eo" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"Ep" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway)
+"Eq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 7; pixel_y = -32},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1681,29 +1689,29 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtgZjmiUiqdldlacdldldldldldlaaaaaaaaaaaadldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlgejnjojpgidldldldldldldldldlaaaaaaaaaadldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldljqjqjrjsjrjtjtdldldldldldldldldldldldldldldljtjujujujujujvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldljwjxjqjyjzjAjBjCjtjtjtdldldldldldldldldldldljtjtjtjujDmsjEjEjvjvjvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldljwjxjqjylwjAjBjCjtjtjtdldldldldldldldldldldljtjtjtjujDmsjEjEjvjvjvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadljqjqjFjGjHjIjJjKjLjMjNjOjtjtjtdldldldldldldljtjtjtjPjQjujRjSjTjRjUjVjvjvjvacacacacjWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajqjqjXjYjZkakbkcjAkdkejPjPkfkgjtjtkhkikikikjjtjtmIkljPkmjuknkokpkpjUkqmTksjvjvktktktkukvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadljwjxkwkxkykzkAkBkCkDkEkFkGkHkGkGkIkJkKkGkLkGkGkMkGkNkOkPkQjukRkSkTkUjUkVkWkXkYjvjvkZkZkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldljFlbkxlcldlelfkblglhliljlklllklklklklmlnlojPjPlojPlplojPlqjulrlskpnOjUltlulvlwlxlylzlzlzkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldljFlbkxlcldlelfkblglhliljlklllklklklklmlnlojPjPlojPlplojPlqjulrlskpnOjUltlulvnSlxlylzlzlzkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldljrjqjIlAlBlClAlBlDlEjAlFjtlGlHlIlJlKlLlMjClNjCjClOjCjClPjCjCjulQlRlSlTlUlVlWlXlYlZjvjvmakZkZkZmbacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmcgNgNmdmcjrmemfmgmhmimjmkjqmlmmmljtmnjPlImomplLnRjCmqnZjCmqnZjCpjmtmujumvmwmxjujUkVmymzmAmBmBmCmDmDmDkZmbacacacdldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamcmEmEmEmEmEjrmemFmgmgmgmGjrjrjzjAmHjrjtqclImJmKlLjPjCmLmMjCmLmMjCmNmOjtmPmQmRmSmPjvqomUmVmWmYmXjvmZnakZkZmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanbmEmEmEmEmEncndnenfmgmgjrjrngnhninjnkjtjtjtjCkhkikjjCjtjtjCjCjCjCjtjtjtnlnmnnnonpjvjvjvnqnrnsntnumPnvnwkZmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEnxnynznxnAmgqFqEnBlFnCnDnEmgnFnGnHnInJnKnLnMnNqKnPnQqWnSnFnTnUnVnWnXnTnTnYrqoamRobocodoeofogohmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldloidldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEnxnynznxnAmgqFqEnBlFnCnDnEmgnFnGnHnInJnKnLnMnNqKnPnQqppXnFnTnUnVnWnXnTnTnYrqoamRobocodoeofogohmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldloidldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEojokolomonooopopoqrujrosotouovowoxoyoyozoyoAoBoCoDoDoEoDoFoGoHoImPoJoKoGoLCMoMoNoOoPoQoRoSoToUmboVoVoVoVoVdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEoWoXoYoWoZpapbpcpbpdpepfpgmgnFphpisKpkpkplnMpmpnpopppqprpstnpupvpwpxpyptpzpApBpCpDEdodpFpGpHpImboVoVoVoVoVdloVoVoVoVdldloVdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlpJmEmEmEmEmEpKndndpLpMpNpMpMpOpPmglFpQpRpRpRpSpSpTpUpVpRpWpXpWpSpSpRpRpRpYpZqaqbvNqdqdqdqeqeqfqgnumPnvqhqiqjoVoVdldldloVoVoVdloVoVoVdloVoVdldldloVdldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlmcmEmEmEmEmEpMqkqlqlqmqnvRpMjrqpqqqrjrpRqsqtquqvqwqxqyqzqAqBqCqDxYxWqDpRmPqGqHqImPqdqJyuqLqLqMqNqdqOoVoVoVoVoVdldldldldldldldldldldldloVoVoVdloVoVdldldldldloVdldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgNmcgNgNmdmcpMqPqQqRqSqTqUqVpMpTpUpVpRyNqXqXqXqXqYqZrarbrcqBqCrdqXqXrdrepRrfrgqgqdrhrirjqLqLqMrkqdoVoVoVoVoVdldldldldldldldldldldldldldldldldldldloVdloVdldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlpMpMrlrmrnrorpyQpMrrrsrtpRyWrvrvrvrvrwrxryrxrzrArBrvrvrvrvrCpRrDrErFqdrGqLrHrIqLrJqdqdoVoVoVdldldldldldldldldldldldldldldldldldlrKdldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlrLrMrNrOrPrQrRrSrTrUrVpWrWrXrXrXrYrZsasbscsdserZsfrZrtsgshsisjskslsmsnsospqLsqsrssoVoVoVdldldlrKacacacacacacacacacacacacacacacjWdldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlstsusvswsxsyszsAsBrXsCsDrXrXrYsfsEsFsFsFDGsFsGsFsEsHrtsIsJpWzfsLsMsNsOqLsPsqsQsRsSoVoVacacdldljWacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldloidldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMsTsUsVszsAsWsXsXsYrXrXsZtatbtctdtetftetgthtbrXtisIzLtjtjtktltjtmsqAitoqdqdoVoVtpacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMtqszsAtrtsttpWtutupRpWtvpWpRpWtwpWpRpWtxpWpRtytztjtAtBtCtjtDtEqdqdqdoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMsAtFtGtHpSpRpRpRtItJsXpRtItJsXpRtItJsXpRpRpRtjtKtLtMtjqdqdqdoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldlpMpMpRpWpRpRpRdlpRtNtOtPpRtQtOtRpRtStOtTpRdlpRtUtUtVtUtUqdoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWtWdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlaaaaaaaaaaaaaaaaaaaaaaaaaadlaadldldldldldldldldldldldldlpRtXtYtZpRtXuatZpRubucudpRdldldldlueufoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlpJmEmEmEmEmEpKndndpLpMpNpMpMpOpPmglFpQpRpRpRpSpSpTpUpVpRpWqBpWpSpSpRpRpRpYpZqaqbvNqdqdqdqeqeqfqgnumPnvqhqiqjoVoVdldldloVoVoVdloVoVoVdloVoVdldldloVdldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlmcmEmEmEmEmEpMqkqlqlqmqnvRpMjrqWqqqrjrpRqsqtquqvqwqxqyqzqArbqCqDxYxWqDpRmPqGqHqImPqdqJyuqLqLqMqNqdqOoVoVoVoVoVdldldldldldldldldldldldloVoVoVdloVoVdldldldldloVdldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgNmcgNgNmdmcpMqPqQqRqSqTqUqVpMpTpUpVpRyNqXqXqXqXqYqZrarcserAqCrdqXqXrdrepRrfrgqgqdrhrirjqLqLqMrkqdoVoVoVoVoVdldldldldldldldldldldldldldldldldldldloVdloVdldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlpMpMrlrmrnrorpyQpMrrrsrtpRyWrvrvrvrvrwrxryrxrzsGrBrvrvrvrvrCpRrDrErFqdrGqLrHrIqLrJqdqdoVoVoVdldldldldldldldldldldldldldldldldldlrKdldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlrLrMrNrOrPrQrRrSrTrUrVpWrWrXrXrXrYrZsasbscsdtcrZsfrZrtsgshsisjskslsmsnsospqLsqsrssoVoVoVdldldlrKacacacacacacacacacacacacacacacjWdldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlstsusvswsxsyszsAsBrXsCsDrXrXrYsfsEsFsFsFDGsFtdsFsEsHrtsIsJpWzfsLsMsNsOqLsPsqsQsRsSoVoVacacdldljWacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldloidldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMsTsUsVszsAsWsXsXsYrXrXsZtatbtftethtgtItytRtJtYtisIzLtjtjtktltjtmsqAitoqdqdoVoVtpacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMtqszsAtrtsttpWtutupRpWtvtZpRpWtwtZpRpWtxtZpRuatztjtAtBtCtjtDtEqdqdqdoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMsAtFtGtHpSpRpRpRuducxIpRuducxIpRuducxIpRpRpRtjtKtLtMtjqdqdqdoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldlpMpMpRpWpRpRpRdlpRtNtOtPpRtQtOyepRtStOtTpRdlpRtUtUtVtUtUqdoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWtWdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlaaaaaaaaaaaaaaaaaaaaaaaaaadlaadldldldldldldldldldldldldlpRtXygyOpRtXygyOpRubtXEjpRdldldldlueufoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNuguhgNdlgNuhuggNdlaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldluidlpRpRpRpRpRpRpRpRpRpRpRpRpRdldldldlueoVoVoVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlugujujujujujujujugdldlaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlueoVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldlwaujujujujujujujwadldldldlaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldldldldldldldldldldldldldldldldlukuloVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1718,9 +1726,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumumvIvJvKvLvMAt
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumwbwbwbwcwdwewfwgwhvbvbvbwiununvSvTwjwkwkwkwldldluedloVoVdldldldldlvVvXwmwnwmvXwowpwowqwrmbdlwsdldlxGacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlvtwtwuugwvwwwxwxwyvbwzwAwBwCwCwDwEwFwGwkwHwIwldldluedloVoVdldldldlvWvWvWwJwKwLwMwMwMwMwMwMwMwMwMwMwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlugwNwOwPwQwRwSwSwTwSwUvtwVwSwWwXwYwZxaxbxcxdxeuououldloVoVdldldlvWvWxfvWvXxgvXwMxhxixjxkxlxmxnxoxowMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlvtxpxqugxrxsxtxtxuvbxvxwxxvbxyxzxAxAxBxCxDxEwlxFktktDLoVoVdlDAvWvWxHxIxJxKxLxMwMxNxOxPxQxRxRxRxSxTwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUxVxVxVxVxVxUxUxUBvxXDIxZyaybybybycycybycycybycqiqiqjoVoVdldlvWydyeyfyfyfygyhyiyjykylymynyoypyqxTwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUyrysxVytCgxVyvxUxUywyxyyybybyzyAyByCyDyEyFyGyHyIyIyIoVoVdlyJyJyJyJyKyfyLyMCUwMyOyPDeyRySyTyRyUyUwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlvtxpxqugxrxsxtxtxuvbxvxwxxvbxyxzxAxAxBxCxDxEwlxFktktDLoVoVdlDAvWvWxHEkxJxKxLxMwMxNxOxPxQxRxRxRxSxTwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUxVxVxVxVxVxUxUxUBvxXDIxZyaybybybycycybycycybycqiqiqjoVoVdldlvWydEmElEoEnEpyhyiyjykylymynyoypyqxTwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUyrysxVytCgxVyvxUxUywyxyyybybyzyAyByCyDyEyFyGyHyIyIyIoVoVdlyJyJyJyJyKyfyLyMCUwMEqyPDeyRySyTyRyUyUwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxVyVDixVyXyYxVyZzazbzczdDMybDNzgycycyczhziybybycktktkvoVoVdlyJzjzkyJzlyfyfwnzmwMwMwMwMwMwMwMwMwMwMwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlxVxVznxVxVzoxVzpzqzrzsztzuzvzwzwzxzyzzzAziybzCzBzCzDmboVoVDAyJzEzFzGzHzIzJzKDOzMzNzOzPzQzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlacxVzRzSzTzUzVzWzXzYzZAaAbAcAdAdAeAdAfAgAhybzCkZkZkZmboVoVdlyJDPAjyJzMzMAkAlAkzMAmAnAozQzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/polaris.dme b/polaris.dme
index 99a2c0400df..fe46804c7e5 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -150,7 +150,6 @@
#include "code\datums\computerfiles.dm"
#include "code\datums\crew.dm"
#include "code\datums\datacore.dm"
-#include "code\datums\disease.dm"
#include "code\datums\EPv2.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
@@ -159,42 +158,6 @@
#include "code\datums\recipe.dm"
#include "code\datums\sun.dm"
#include "code\datums\supplypacks.dm"
-#include "code\datums\diseases\appendicitis.dm"
-#include "code\datums\diseases\beesease.dm"
-#include "code\datums\diseases\brainrot.dm"
-#include "code\datums\diseases\cold.dm"
-#include "code\datums\diseases\cold9.dm"
-#include "code\datums\diseases\dna_spread.dm"
-#include "code\datums\diseases\fake_gbs.dm"
-#include "code\datums\diseases\flu.dm"
-#include "code\datums\diseases\fluspanish.dm"
-#include "code\datums\diseases\gbs.dm"
-#include "code\datums\diseases\jungle_fever.dm"
-#include "code\datums\diseases\magnitis.dm"
-#include "code\datums\diseases\pierrot_throat.dm"
-#include "code\datums\diseases\plasmatoid.dm"
-#include "code\datums\diseases\retrovirus.dm"
-#include "code\datums\diseases\rhumba_beat.dm"
-#include "code\datums\diseases\robotic_transformation.dm"
-#include "code\datums\diseases\wizarditis.dm"
-#include "code\datums\diseases\xeno_transformation.dm"
-#include "code\datums\diseases\advance\advance.dm"
-#include "code\datums\diseases\advance\presets.dm"
-#include "code\datums\diseases\advance\symptoms\confusion.dm"
-#include "code\datums\diseases\advance\symptoms\cough.dm"
-#include "code\datums\diseases\advance\symptoms\damage_converter.dm"
-#include "code\datums\diseases\advance\symptoms\dizzy.dm"
-#include "code\datums\diseases\advance\symptoms\fever.dm"
-#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
-#include "code\datums\diseases\advance\symptoms\headache.dm"
-#include "code\datums\diseases\advance\symptoms\heal.dm"
-#include "code\datums\diseases\advance\symptoms\itching.dm"
-#include "code\datums\diseases\advance\symptoms\shivering.dm"
-#include "code\datums\diseases\advance\symptoms\sneeze.dm"
-#include "code\datums\diseases\advance\symptoms\symptoms.dm"
-#include "code\datums\diseases\advance\symptoms\voice_change.dm"
-#include "code\datums\diseases\advance\symptoms\vomit.dm"
-#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
@@ -234,7 +197,6 @@
#include "code\defines\procs\radio.dm"
#include "code\defines\procs\sd_Alert.dm"
#include "code\defines\procs\statistics.dm"
-#include "code\game\asteroid.dm"
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
#include "code\game\base_turf.dm"
@@ -412,7 +374,6 @@
#include "code\game\jobs\access.dm"
#include "code\game\jobs\access_datum.dm"
#include "code\game\jobs\job_controller.dm"
-#include "code\game\jobs\jobprocs.dm"
#include "code\game\jobs\jobs.dm"
#include "code\game\jobs\whitelist.dm"
#include "code\game\jobs\job\assistant.dm"
@@ -731,7 +692,6 @@
#include "code\game\objects\items\weapons\gift_wrappaper.dm"
#include "code\game\objects\items\weapons\handcuffs.dm"
#include "code\game\objects\items\weapons\improvised_components.dm"
-#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\mop.dm"
#include "code\game\objects\items\weapons\mop_deploy.dm"
@@ -994,7 +954,6 @@
#include "code\modules\admin\verbs\diagnostics.dm"
#include "code\modules\admin\verbs\dice.dm"
#include "code\modules\admin\verbs\getlogs.dm"
-#include "code\modules\admin\verbs\icarus.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
#include "code\modules\admin\verbs\modifyvariables.dm"
@@ -1141,6 +1100,7 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
+#include "code\modules\clothing\under\xenos\seromi.dm"
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\detectivework\footprints.dm"
#include "code\modules\detectivework\forensics.dm"
@@ -1214,7 +1174,10 @@
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
#include "code\modules\food\recipes_microwave.dm"
+#include "code\modules\games\cardemon.dm"
#include "code\modules\games\cards.dm"
+#include "code\modules\games\spaceball_cards.dm"
+#include "code\modules\games\tarot.dm"
#include "code\modules\genetics\side_effects.dm"
#include "code\modules\ghosttrap\trap.dm"
#include "code\modules\holodeck\HolodeckControl.dm"
@@ -1288,7 +1251,6 @@
#include "code\modules\mob\login.dm"
#include "code\modules\mob\logout.dm"
#include "code\modules\mob\mob.dm"
-#include "code\modules\mob\mob_cleanup.dm"
#include "code\modules\mob\mob_defines.dm"
#include "code\modules\mob\mob_grab.dm"
#include "code\modules\mob\mob_grab_specials.dm"
@@ -1387,6 +1349,7 @@
#include "code\modules\mob\living\carbon\human\human_damage.dm"
#include "code\modules\mob\living\carbon\human\human_defense.dm"
#include "code\modules\mob\living\carbon\human\human_defines.dm"
+#include "code\modules\mob\living\carbon\human\human_helpers.dm"
#include "code\modules\mob\living\carbon\human\human_movement.dm"
#include "code\modules\mob\living\carbon\human\human_organs.dm"
#include "code\modules\mob\living\carbon\human\human_powers.dm"
@@ -1409,6 +1372,7 @@
#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm"
#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
#include "code\modules\mob\living\carbon\human\species\station\monkey.dm"
+#include "code\modules\mob\living\carbon\human\species\station\seromi.dm"
#include "code\modules\mob\living\carbon\human\species\station\slime.dm"
#include "code\modules\mob\living\carbon\human\species\station\station.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm"
@@ -1574,6 +1538,7 @@
#include "code\modules\organs\wound.dm"
#include "code\modules\organs\subtypes\diona.dm"
#include "code\modules\organs\subtypes\machine.dm"
+#include "code\modules\organs\subtypes\seromi.dm"
#include "code\modules\organs\subtypes\standard.dm"
#include "code\modules\organs\subtypes\unbreakable.dm"
#include "code\modules\organs\subtypes\xenos.dm"
diff --git a/sound/machines/synth_no.ogg b/sound/machines/synth_no.ogg
new file mode 100644
index 00000000000..f0d2c3bfb0c
Binary files /dev/null and b/sound/machines/synth_no.ogg differ
diff --git a/sound/machines/synth_yes.ogg b/sound/machines/synth_yes.ogg
new file mode 100644
index 00000000000..300cad132ed
Binary files /dev/null and b/sound/machines/synth_yes.ogg differ
diff --git a/tools/mapmerge/2clean_map.bat b/tools/mapmerge/2clean_map.bat
index 2cfd9217260..a719963df43 100644
--- a/tools/mapmerge/2clean_map.bat
+++ b/tools/mapmerge/2clean_map.bat
@@ -5,4 +5,4 @@ FOR %%f IN (../../maps/*.dmm) DO (
java -jar MapPatcher.jar -clean ../../maps/%%f.backup ../../maps/%%f ../../maps/%%f
)
-pause
\ No newline at end of file
+pause
diff --git a/tools/mapmerge/clean_map_git.sh b/tools/mapmerge/clean_map_git.sh
index 3ede4e8d1b2..25cef6da93a 100755
--- a/tools/mapmerge/clean_map_git.sh
+++ b/tools/mapmerge/clean_map_git.sh
@@ -1,10 +1,9 @@
-#!/bin/bash
+#!/bin/sh
-for i in {1..5}
+for MAPFILE in ../../maps/*.dmm
do
- MAPFILE="polaris-$i.dmm"
-
- git show HEAD:maps/$MAPFILE > tmp.dmm
- java -jar MapPatcher.jar -clean tmp.dmm '../../maps/'$MAPFILE '../../maps/'$MAPFILE
+ MAPNAME=$(basename $MAPFILE)
+ git show HEAD:maps/$MAPNAME > tmp.dmm
+ java -jar MapPatcher.jar -clean tmp.dmm $MAPFILE $MAPFILE
rm tmp.dmm
done