diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index c0ef908406..ac400269b5 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -42,6 +42,15 @@
index = findtext(t, char)
return t
+/proc/readd_quotes(var/t)
+ var/list/repl_chars = list(""" = "\"")
+ for(var/char in repl_chars)
+ var/index = findtext(t, char)
+ while(index)
+ t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+5)
+ index = findtext(t, char)
+ return t
+
//Runs byond's sanitization proc along-side sanitize_simple
/proc/sanitize(var/t,var/list/repl_chars = null)
return html_encode(sanitize_simple(t,repl_chars))
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index f875b9975c..c793ecb857 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -57,6 +57,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/sound/forced_ambience = null
+ var/rad_shielded = 0
+
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list()
@@ -458,6 +460,7 @@ var/list/ghostteleportlocs = list()
icon_state = "yellow"
requires_power = 0
unlimited_power = 1
+ rad_shielded = 1
/area/syndicate_station/start
name = "\improper Mercenary Forward Operating Base"
@@ -512,35 +515,33 @@ var/list/ghostteleportlocs = list()
icon_state = "yellow"
requires_power = 0
+/area/vox_station
+ requires_power = 0
+ rad_shielded = 1
+
/area/vox_station/transit
name = "\improper hyperspace"
icon_state = "shuttle"
- requires_power = 0
/area/vox_station/southwest_solars
name = "\improper aft port solars"
icon_state = "southwest"
- requires_power = 0
/area/vox_station/northwest_solars
name = "\improper fore port solars"
icon_state = "northwest"
- requires_power = 0
/area/vox_station/northeast_solars
name = "\improper fore starboard solars"
icon_state = "northeast"
- requires_power = 0
/area/vox_station/southeast_solars
name = "\improper aft starboard solars"
icon_state = "southeast"
- requires_power = 0
/area/vox_station/mining
name = "\improper nearby mining asteroid"
icon_state = "north"
- requires_power = 0
//PRISON
/area/prison
@@ -633,6 +634,9 @@ var/list/ghostteleportlocs = list()
//Maintenance
+/area/maintenance
+ rad_shielded = 1
+
/area/maintenance/aft
name = "Aft Maintenance"
icon_state = "amaint"
@@ -906,6 +910,7 @@ var/list/ghostteleportlocs = list()
/area/crew_quarters
name = "\improper Dormitories"
icon_state = "Sleep"
+ rad_shielded = 1
/area/crew_quarters/toilet
name = "\improper Dormitory Toilets"
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 4fc82ebf4a..381a9790fb 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -96,7 +96,7 @@
if(!allow_items) return
if(frozen_items.len == 0)
- user << "\blue There is nothing to recover from storage."
+ user << "There is nothing to recover from storage."
return
var/obj/item/I = input(usr, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
@@ -104,10 +104,10 @@
return
if(!(I in frozen_items))
- user << "\blue \The [I] is no longer in storage."
+ user << "\The [I] is no longer in storage."
return
- visible_message("\blue The console beeps happily as it disgorges \the [I].", 3)
+ visible_message("The console beeps happily as it disgorges \the [I].", 3)
I.loc = get_turf(src)
frozen_items -= I
@@ -116,10 +116,10 @@
if(!allow_items) return
if(frozen_items.len == 0)
- user << "\blue There is nothing to recover from storage."
+ user << "There is nothing to recover from storage."
return
- visible_message("\blue The console beeps happily as it disgorges the desired objects.", 3)
+ visible_message("The console beeps happily as it disgorges the desired objects.", 3)
for(var/obj/item/I in frozen_items)
I.loc = get_turf(src)
@@ -141,7 +141,7 @@
//Decorative structures to go alongside cryopods.
/obj/structure/cryofeed
- name = "\improper cryogenic feed"
+ name = "cryogenic feed"
desc = "A bewildering tangle of machinery and pipes."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "cryo_rear"
@@ -163,7 +163,7 @@
//Cryopods themselves.
/obj/machinery/cryopod
- name = "\improper cryogenic freezer"
+ name = "cryogenic freezer"
desc = "A man-sized pod for entering suspended animation."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "body_scanner_0"
@@ -277,113 +277,125 @@
if(!find_control_computer(urgent=1))
return
- //Drop all items into the pod.
- for(var/obj/item/W in occupant)
- if(istype(W, /obj/item/device/mmi))
- if(istype(occupant, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = occupant
- if(R.mmi == W)
- del(W)
- continue
- occupant.drop_from_inventory(W)
- W.loc = src
+ despawn_occupant()
- if(W.contents.len) //Make sure we catch anything not handled by del() on the items.
- for(var/obj/item/O in W.contents)
- if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets, you fuck!
- continue
- O.loc = src
+// This function can not be undone; do not call this unless you are sure
+// Also make sure there is a valid control computer
+/obj/machinery/cryopod/robot/despawn_occupant()
+ var/mob/living/silicon/robot/R = occupant
+ if(!istype(R)) return ..()
- //Delete all items not on the preservation list.
- var/list/items = src.contents
- items -= occupant // Don't delete the occupant
- items -= announce // or the autosay radio.
+ del(R.mmi)
+ for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc
+ for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags
+ O.loc = R
+ del(I)
+ del(R.module)
- for(var/obj/item/W in items)
+ return ..()
- var/preserve = null
- for(var/T in preserve_items)
- if(istype(W,T))
- preserve = 1
- break
+// This function can not be undone; do not call this unless you are sure
+// Also make sure there is a valid control computer
+/obj/machinery/cryopod/proc/despawn_occupant()
+ //Drop all items into the pod.
+ for(var/obj/item/W in occupant)
+ occupant.drop_from_inventory(W)
+ W.loc = src
- if(!preserve)
- del(W)
- else
- if(control_computer && control_computer.allow_items)
- control_computer.frozen_items += W
- W.loc = null
- else
- W.loc = src.loc
+ if(W.contents.len) //Make sure we catch anything not handled by del() on the items.
+ for(var/obj/item/O in W.contents)
+ if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets, you fuck!
+ continue
+ O.loc = src
- //Update any existing objectives involving this mob.
- for(var/datum/objective/O in all_objectives)
- // We don't want revs to get objectives that aren't for heads of staff. Letting
- // them win or lose based on cryo is silly so we remove the objective.
- if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind)
- del(O)
- else if(O.target && istype(O.target,/datum/mind))
- if(O.target == occupant.mind)
- if(O.owner && O.owner.current)
- O.owner.current << "\red You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]..."
- O.target = null
- spawn(1) //This should ideally fire after the occupant is deleted.
- if(!O) return
- O.find_target()
- if(!(O.target))
- all_objectives -= O
- O.owner.objectives -= O
- del(O)
+ //Delete all items not on the preservation list.
+ var/list/items = src.contents
+ items -= occupant // Don't delete the occupant
+ items -= announce // or the autosay radio.
- //Handle job slot/tater cleanup.
- var/job = occupant.mind.assigned_role
+ for(var/obj/item/W in items)
- job_master.FreeRole(job)
+ var/preserve = null
+ for(var/T in preserve_items)
+ if(istype(W,T))
+ preserve = 1
+ break
- if(occupant.mind.objectives.len)
- del(occupant.mind.objectives)
- occupant.mind.special_role = null
+ if(!preserve)
+ del(W)
+ else
+ if(control_computer && control_computer.allow_items)
+ control_computer.frozen_items += W
+ W.loc = null
else
- if(ticker.mode.name == "AutoTraitor")
- var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode
- current_mode.possible_traitors.Remove(occupant)
+ W.loc = src.loc
- // Delete them from datacore.
+ //Update any existing objectives involving this mob.
+ for(var/datum/objective/O in all_objectives)
+ // We don't want revs to get objectives that aren't for heads of staff. Letting
+ // them win or lose based on cryo is silly so we remove the objective.
+ if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind)
+ del(O)
+ else if(O.target && istype(O.target,/datum/mind))
+ if(O.target == occupant.mind)
+ if(O.owner && O.owner.current)
+ O.owner.current << "You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]..."
+ O.target = null
+ spawn(1) //This should ideally fire after the occupant is deleted.
+ if(!O) return
+ O.find_target()
+ if(!(O.target))
+ all_objectives -= O
+ O.owner.objectives -= O
+ del(O)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == occupant.real_name))
- del(R)
- for(var/datum/data/record/T in data_core.security)
- if ((T.fields["name"] == occupant.real_name))
- del(T)
- for(var/datum/data/record/G in data_core.general)
- if ((G.fields["name"] == occupant.real_name))
- del(G)
+ //Handle job slot/tater cleanup.
+ var/job = occupant.mind.assigned_role
- if(orient_right)
- icon_state = "[base_icon_state]-r"
- else
- icon_state = base_icon_state
+ job_master.FreeRole(job)
- //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags?
+ if(occupant.mind.objectives.len)
+ del(occupant.mind.objectives)
+ occupant.mind.special_role = null
+ else
+ if(ticker.mode.name == "AutoTraitor")
+ var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode
+ current_mode.possible_traitors.Remove(occupant)
- //This should guarantee that ghosts don't spawn.
- occupant.ckey = null
+ // Delete them from datacore.
- //Make an announcement and log the person entering storage.
- control_computer.frozen_crew += "[occupant.real_name]"
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ for(var/datum/data/record/R in data_core.medical)
+ if ((R.fields["name"] == occupant.real_name))
+ del(R)
+ for(var/datum/data/record/T in data_core.security)
+ if ((T.fields["name"] == occupant.real_name))
+ del(T)
+ for(var/datum/data/record/G in data_core.general)
+ if ((G.fields["name"] == occupant.real_name))
+ del(G)
- announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]")
- visible_message("\blue \The [src] hums and hisses as it moves [occupant.real_name] into storage.", 3)
+ if(orient_right)
+ icon_state = "[base_icon_state]-r"
+ else
+ icon_state = base_icon_state
- // Delete the mob.
- del(occupant)
- occupant = null
- name = initial(name)
+ //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags?
- return
+ //This should guarantee that ghosts don't spawn.
+ occupant.ckey = null
+
+ //Make an announcement and log the person entering storage.
+ control_computer.frozen_crew += "[occupant.real_name]"
+
+ announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]")
+ visible_message("\The [src] hums and hisses as it moves [occupant.real_name] into storage.", 3)
+
+ // Delete the mob.
+ del(occupant)
+ occupant = null
+ name = initial(name)
/obj/machinery/cryopod/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob)
@@ -391,7 +403,7 @@
if(istype(G, /obj/item/weapon/grab))
if(occupant)
- user << "\blue \The [src] is in use."
+ user << "\The [src] is in use."
return
if(!ismob(G:affecting))
@@ -428,15 +440,15 @@
else
icon_state = occupied_icon_state
- M << "\blue [on_enter_occupant_message]"
- M << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ M << "[on_enter_occupant_message]"
+ M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
occupant = M
time_entered = world.time
// Book keeping!
var/turf/location = get_turf(src)
log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)")
- message_admins("\blue [key_name_admin(M)] has entered a stasis pod.")
+ message_admins("[key_name_admin(M)] has entered a stasis pod.")
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
@@ -476,7 +488,7 @@
return
if(src.occupant)
- usr << "\blue \The [src] is in use."
+ usr << "\The [src] is in use."
return
for(var/mob/living/carbon/slime/M in range(1,usr))
@@ -492,7 +504,7 @@
return
if(src.occupant)
- usr << "\blue \The [src] is in use."
+ usr << "\The [src] is in use."
return
usr.stop_pulling()
@@ -506,8 +518,8 @@
else
icon_state = occupied_icon_state
- usr << "\blue [on_enter_occupant_message]"
- usr << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ usr << "[on_enter_occupant_message]"
+ usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
occupant = usr
time_entered = world.time
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index c409ef3080..f1f4306f56 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -54,6 +54,7 @@
src.update_icon()
src.SetOpacity(0)
sleep(15)
+ src.layer = open_layer
src.operating = 0
// Proc: force_close()
@@ -61,6 +62,7 @@
// Description: Closes the door. No checks are done inside this proc.
/obj/machinery/door/blast/proc/force_close()
src.operating = 1
+ src.layer = closed_layer
flick(icon_state_closing, src)
src.density = 1
update_nearby_tiles()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 7cfb901350..603fc9fe98 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -546,7 +546,7 @@
raising = 0
cover.icon_state = "turretCover"
raised = 0
- invisibility = 2
+ invisibility = INVISIBILITY_LEVEL_TWO
update_icon()
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 2314509098..20dc45099c 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -57,15 +57,21 @@ var/global/list/image/splatter_cache=list()
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
hasfeet = 0
if(perp.shoes && !perp.buckled)//Adding blood to shoes
- perp.shoes.blood_color = basecolor
- perp.shoes:track_blood = max(amount,perp.shoes:track_blood)
- if(!perp.shoes.blood_overlay)
- perp.shoes.generate_blood_overlay()
- if(!perp.shoes.blood_DNA)
- perp.shoes.blood_DNA = list()
- perp.shoes.blood_overlay.color = basecolor
- perp.shoes.overlays += perp.shoes.blood_overlay
- perp.shoes.blood_DNA |= blood_DNA.Copy()
+ var/obj/item/clothing/shoes/S = perp.shoes
+ if(istype(S))
+ S.blood_color = basecolor
+ S.track_blood = max(amount,S.track_blood)
+ if(!S.blood_overlay)
+ S.generate_blood_overlay()
+ if(!S.blood_DNA)
+ S.blood_DNA = list()
+ S.blood_overlay.color = basecolor
+ S.overlays += S.blood_overlay
+ if(S.blood_overlay && S.blood_overlay.color != basecolor)
+ S.blood_overlay.color = basecolor
+ S.overlays.Cut()
+ S.overlays += S.blood_overlay
+ S.blood_DNA |= blood_DNA.Copy()
else if (hasfeet)//Or feet
perp.feet_blood_color = basecolor
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 089b47aadd..ddc983a7ba 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -117,8 +117,10 @@
size = "huge"
else
//if ((CLUMSY in usr.mutations) && prob(50)) t = "funny-looking"
- var/custom_suffix = "It is a [size] item."
- return ..(user, distance, suffix = custom_suffix)
+ usr << "This is a [blood_DNA ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""]\icon[src][src.name]. It is a [size] item."
+ if(src.desc)
+ usr << src.desc
+ return
/obj/item/attack_hand(mob/user as mob)
if (!user) return
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 9280ccba90..b24bf75ec1 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -966,6 +966,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
U.last_target_click = world.time
var/t = input(U, "Please enter message", P.name, null) as text
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
+ t = readd_quotes(t)
if (!t || !istype(P))
return
if (!in_range(src, U) && loc != U)
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 5a290d3fbd..84ec0adecb 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -27,7 +27,9 @@
if (istype(A,/mob/living/carbon))
var/mob/living/carbon/M = A
- if(M.lying) return
+ if(M.lying)
+ ..()
+ return
dirt++
var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src)
if (dirt >= 50)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 6c9ee85751..1f86703322 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -128,34 +128,27 @@
if(!istype(atom, /atom/movable))
return
- var/atom/movable/M = atom
+ var/atom/movable/A = atom
var/loopsanity = 100
- if(ismob(M))
- if(!M:lastarea)
- M:lastarea = get_area(M.loc)
- if(M:lastarea.has_gravity == 0)
+ if(ismob(A))
+ var/mob/M = A
+ if(!M.lastarea)
+ M.lastarea = get_area(M.loc)
+ if(M.lastarea.has_gravity == 0)
inertial_drift(M)
- /*
- if(M.flags & NOGRAV)
- inertial_drift(M)
- */
-
-
-
else if(!istype(src, /turf/space))
- M:inertia_dir = 0
- var/mob/M1 = M
- M1.make_floating(0)
+ M.inertia_dir = 0
+ M.make_floating(0)
..()
var/objects = 0
- for(var/atom/A as mob|obj|turf|area in range(1))
+ for(var/atom/O as mob|obj|turf|area in range(1))
if(objects > loopsanity) break
objects++
spawn( 0 )
- if ((A && M))
- A.HasProximity(M, 1)
+ if ((O && A))
+ O.HasProximity(A, 1)
return
return
@@ -257,9 +250,9 @@
//W.Assimilate_Air()
W.lighting_lumcount += old_lumcount
- if(old_lumcount != W.lighting_lumcount)
- W.lighting_changed = 1
- lighting_controller.changed_turfs += W
+
+ if(W.lighting_lumcount)
+ W.UpdateAffectingLights()
if(old_fire)
fire = old_fire
diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm
index 002f53d114..3872b326bc 100644
--- a/code/modules/economy/cash.dm
+++ b/code/modules/economy/cash.dm
@@ -31,30 +31,11 @@
bundle = W
bundle.worth += src.worth
bundle.update_icon()
- if (!istype(src.loc, /turf) && istype(user, /mob/living/carbon/human))
+ if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/h_user = user
- if(h_user.r_hand == src)
- h_user.drop_from_inventory(src)
- h_user.put_in_r_hand(bundle)
- else if(h_user.l_hand == src)
- h_user.drop_from_inventory(src)
- h_user.put_in_l_hand(bundle)
- else if (h_user.l_store == src)
- h_user.drop_from_inventory(src)
- bundle.loc = h_user
- bundle.layer = 20
- h_user.l_store = bundle
- h_user.update_inv_pockets()
- else if (h_user.r_store == src)
- h_user.drop_from_inventory(src)
- bundle.loc = h_user
- bundle.layer = 20
- h_user.r_store = bundle
- h_user.update_inv_pockets()
- else
- src.loc = get_turf(h_user)
- if(h_user.client) h_user.client.screen -= src
- h_user.put_in_hands(bundle)
+ h_user.drop_from_inventory(src)
+ h_user.drop_from_inventory(bundle)
+ h_user.put_in_hands(bundle)
user << "You add [src.worth] Thalers worth of money to the bundles.
It holds [bundle.worth] Thalers now."
del(src)
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index a5b6c6be55..a288752ff7 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -30,12 +30,12 @@
/datum/event/radiation_storm/proc/radiate()
for(var/mob/living/carbon/C in living_mob_list)
- var/turf/T = get_turf(C)
- if(!T)
+ var/area/A = get_area(C)
+ if(!A)
continue
- if(!(T.z in config.station_levels))
+ if(!(A.z in config.station_levels))
continue
- if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters))
+ if(A.rad_shielded)
continue
if(istype(C,/mob/living/carbon/human))
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index cac59fc767..777c17fdbc 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -120,7 +120,7 @@
else
msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n"
else if(blood_DNA)
- msg += "[t_He] [t_has] blood-stained hands!\n"
+ msg += "[t_He] [t_has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!\n"
//handcuffed?
@@ -145,7 +145,7 @@
else
msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n"
else if(feet_blood_DNA)
- msg += "[t_He] [t_has] blood-stained feet!\n"
+ msg += "[t_He] [t_has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!\n"
//mask
if(wear_mask && !skipmask)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 568998a3c6..03bf90b0f5 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -113,7 +113,11 @@
/mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7)
var/list/L = hearers(src, dist)
- L += mechas_list
+
+ for (var/obj/mecha/M in mechas_list)
+ if (get_dist(src, M) <= dist)
+ L += M
+
return L
/mob/living/simple_animal/hostile/death()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index b3e04533d4..be66fe5611 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -360,6 +360,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return
M.shakecamera = 1
spawn(1)
+ if(!M.client)
+ return
var/atom/oldeye=M.client.eye
var/aiEyeFlag = 0
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 0799900909..5b188f0bca 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -79,6 +79,9 @@ display round(lastgen) and phorontank amount
icon_state = initial(icon_state)
handleInactive()
+/obj/machinery/power/powered()
+ return 1 //doesn't require an external power source
+
/obj/machinery/power/port_gen/attack_hand(mob/user as mob)
if(..())
return
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 0e02c10ad4..a2ea7c6f0c 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -187,20 +187,20 @@
max_energy = 100
dispensable_reagents = list("water","ice","coffee","cream","tea","icetea","cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice","watermelonjuice")
- /obj/machinery/chem_dispenser/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
- ..()
- if(istype(B, /obj/item/device/multitool))
- if(hackedcheck == 0)
- user << "You change the mode from 'McNano' to 'Pizza King'."
- dispensable_reagents += list("thirteenloko","grapesoda")
- hackedcheck = 1
- return
+/obj/machinery/chem_dispenser/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
+ ..()
+ if(istype(B, /obj/item/device/multitool))
+ if(hackedcheck == 0)
+ user << "You change the mode from 'McNano' to 'Pizza King'."
+ dispensable_reagents += list("thirteenloko","grapesoda")
+ hackedcheck = 1
+ return
- else
- user << "You change the mode from 'Pizza King' to 'McNano'."
- dispensable_reagents -= list("thirteenloko")
- hackedcheck = 0
- return
+ else
+ user << "You change the mode from 'Pizza King' to 'McNano'."
+ dispensable_reagents -= list("thirteenloko","grapesoda")
+ hackedcheck = 0
+ return
/obj/machinery/chem_dispenser/beer
icon_state = "booze_dispenser"
@@ -212,21 +212,21 @@
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
dispensable_reagents = list("lemon_lime","sugar","orangejuice","limejuice","sodawater","tonic","beer","kahlua","whiskey","wine","vodka","gin","rum","tequilla","vermouth","cognac","ale","mead")
- /obj/machinery/chem_dispenser/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
- ..()
+/obj/machinery/chem_dispenser/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
+ ..()
- if(istype(B, /obj/item/device/multitool))
- if(hackedcheck == 0)
- user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
- dispensable_reagents += list("goldschlager","patron","watermelonjuice","berryjuice")
- hackedcheck = 1
- return
+ if(istype(B, /obj/item/device/multitool))
+ if(hackedcheck == 0)
+ user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
+ dispensable_reagents += list("goldschlager","patron","watermelonjuice","berryjuice")
+ hackedcheck = 1
+ return
- else
- user << "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
- dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice")
- hackedcheck = 0
- return
+ else
+ user << "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
+ dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice")
+ hackedcheck = 0
+ return
/obj/machinery/chem_dispenser/meds
name = "chem dispenser magic"
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 3dcd21e9bb..c7ed90f786 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -185,7 +185,7 @@ datum/tech/materials
datum/tech/engineering
name = "Engineering Research"
- desc = "Development of new and improved engineering parts and."
+ desc = "Development of new and improved engineering parts."
id = "engineering"
datum/tech/phorontech
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index a82446462f..3525678125 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 485152df1a..a8e83d5c20 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -854,7 +854,7 @@
"aqv" = (/obj/structure/table,/obj/item/weapon/dice,/turf/simulated/floor/wood,/area/maintenance/dormitory)
"aqw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dorm_pump"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/dormitory)
"aqx" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory)
-"aqy" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/dormitory)
+"aqy" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dorm_sensor"; pixel_x = 25; pixel_y = -8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/dormitory)
"aqz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aqA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aqB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway)
@@ -5467,12 +5467,12 @@
"cbg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cbh" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cbi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance)
-"cbj" = (/obj/machinery/airlock_sensor{command = "cycle_exterior"; frequency = 1379; id_tag = "eng_eva_ext_sensor"; master_tag = "eng_eva_airlock"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance)
+"cbj" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance)
"cbk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_outer"; locked = 1; name = "Engineering EVA External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/engine/engine_eva_maintenance)
"cbl" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_eva_pump"},/turf/simulated/floor{dir = 9; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance)
"cbm" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "eng_eva_pump"; tag_exterior_door = "eng_eva_outer"; frequency = 1379; id_tag = "eng_eva_airlock"; tag_interior_door = "eng_eva_inner"; name = "Engineering Airlock Console"; pixel_y = 25; req_access_txt = "13"; tag_chamber_sensor = "eng_eva_sensor"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor{dir = 5; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance)
"cbn" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_inner"; locked = 1; name = "Engineering EVA Internal Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engine_eva_maintenance)
-"cbo" = (/obj/machinery/airlock_sensor{command = "cycle_interior"; frequency = 1379; id_tag = "eng_eva_int_sensor"; master_tag = "eng_eva_airlock"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance)
+"cbo" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/engine/engine_eva_maintenance)
"cbp" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/engine/engine_eva_maintenance)
"cbq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/engine/engine_eva_maintenance)
"cbr" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/crew_quarters/heads/chief)
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index a9301e064d..2903dec322 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -1198,7 +1198,7 @@
"xb" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"xc" = (/obj/machinery/door/airlock/centcom{name = "Armory Special Operations"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"xd" = (/obj/machinery/door/airlock/centcom{name = "Engineering Special Operations"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
-"xe" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; use_power = 0; req_one_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"xe" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; on = 0; req_one_access = list(103); req_one_access_txt = "103"; use_power = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"xf" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
"xg" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops)
"xh" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
@@ -1927,7 +1927,6 @@
"Lc" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/vox/station)
"Ld" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox/station)
"Le" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station)
-"Lf" = (/obj/machinery/porta_turret{anchored = 1; check_records = 0; use_power = 0; req_one_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"Lg" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/rcd,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/injector,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"Lh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station)
"Li" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox/station)
@@ -1947,7 +1946,7 @@
"Lw" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 0; req_access = null; req_access_txt = "150"},/obj/item/weapon/surgicaldrill,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start)
"Lx" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"Ly" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-
+
(1,1,1) = {"
aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaPaOaOaOaOaOaQ
ajaRaSaTaUaVaWaXaYaZbabbbcbdbebfaWaVbaaSaTaXbbaUbdaZabatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbrbsbtbsbtbsbrbubqbqbqbqbrbwbwbwbwbwbrbxbxbxbxbxbraMaMaMaMaMbrbybzbzbzbAbB
@@ -2090,7 +2089,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMxkoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNxlxmvMxnoNvPuhwkoNtZxqtZxrtZxsxtxttZxutvxvxwxwxxxyxzxAtvxBxBxBtvufufvBxCxDwNxEufxFwRxGxCvDufufxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwVoVoVoVoVoVoVoVoVoVoVoVoVoVxHoUoVoVoVqVxHxIxJvMwnxKuhtZtZxLtZxMtZwmwmxNxNwmwmxutvxOxOxOxPxQxPxRtvtvtvtvtvufufvVwLxSufxiufxiufxSwLueufuftxxTxUxUxUxVtxtxxWtxtxtxuOtxtxtxxXxXxXtxtxurururxYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMxkoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNLgyaoNoNoNoNoNyboNycwmydyeyfygwmxutvtvyhyiyjykylymyhaMaMaMtxufufvVtxtxynyoufypyqtxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywyxtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNyzyAxowDtZoNLfwmydyfyfygwmxpyEyFyhyGyHyIyByKyhaMaMaMtxufufvVtxtxvlvmvmvmvotxtxueufuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywyMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNyzyAxowDtZoNxewmydyfyfygwmxpyEyFyhyGyHyIyByKyhaMaMaMtxufufvVtxtxvlvmvmvmvotxtxueufuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywyMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNzitZtZtZtZtZtZoNxetZtZwqwqwmwmwmwmyRyhySyIyIyIyIyhaMaMaMtxufufwKyTyTyTyTyTyTyTyTyTwTufuftxaMaMaMaMaMtxyUystxyLyVyLuNyuyuyuyuyuyutxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNyQtZtZtZtZtZyWoNyXtZtZyYtZtZwCvdyJzcyhyIyIyIyIzdyhtxtxtxtxtxtxzetxtxufufufufuftxtxtxtxtxtxaMaMaMaMaMtxzfystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNzgzgzhyDyZzkzloNyXzmzmoNznznoNoNoNoNyhyIzozpzqzryhzsztztzszuzvufzwtxtxtxzxtxtxdCaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMzyuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt