diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 68954b0dc55..6a009677e11 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -167,3 +167,15 @@ #define ANTAG_HIDDEN "Hidden" #define ANTAG_SHARED "Shared" #define ANTAG_KNOWN "Known" + +// Job groups +#define ROLE_COMMAND "command" +#define ROLE_SECURITY "security" +#define ROLE_ENGINEERING "engineering" +#define ROLE_MEDICAL "medical" +#define ROLE_RESEARCH "research" +#define ROLE_CARGO "cargo" +#define ROLE_CIVILIAN "civilian" +#define ROLE_SYNTHETIC "synthetic" +#define ROLE_UNKNOWN "unknown" +#define ROLE_EVERYONE "everyone" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 1a736cd74ff..d40fd4fa5a3 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -361,7 +361,7 @@ clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) - if("Station Administrator") + if("Colony Director") clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) if("Head of Security") diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm index 756d5fc55be..6a98430aeaf 100644 --- a/code/datums/uplink/ammunition.dm +++ b/code/datums/uplink/ammunition.dm @@ -43,17 +43,7 @@ /datum/uplink_item/item/ammo/a556/ap name = "10rnd Rifle Magazine (5.56mm AP)" path = /obj/item/ammo_magazine/a556/ap -/* -/datum/uplink_item/item/ammo/a556m - name = "20rnd Rifle Magazine (5.56mm)" - path = /obj/item/ammo_magazine/a556m - item_cost = 4 -/datum/uplink_item/item/ammo/a556m/ap - name = "20rnd Rifle Magazine (5.56mm AP)" - path = /obj/item/ammo_magazine/a556m/ap - item_cost = 4 -*/ /datum/uplink_item/item/ammo/c762 name = "20rnd Rifle Magazine (7.62mm)" path = /obj/item/ammo_magazine/c762 @@ -84,24 +74,28 @@ path = /obj/item/ammo_magazine/a762/ap /datum/uplink_item/item/ammo/g12 - name = "12g Auto-Shotgun Magazine (Slug)" - path = /obj/item/ammo_magazine/g12 + name = "12g Shotgun Ammo Box (Slug)" + path = /obj/item/weapon/storage/box/shotgunammo /datum/uplink_item/item/ammo/g12/beanbag - name = "12g Auto-Shotgun Magazine (Beanbag)" - path = /obj/item/ammo_magazine/g12/beanbag + name = "12g Shotgun Ammo Box (Beanbag)" + path = /obj/item/weapon/storage/box/beanbags item_cost = 10 // Discount due to it being LTL. /datum/uplink_item/item/ammo/g12/pellet - name = "12g Auto-Shotgun Magazine (Pellet)" - path = /obj/item/ammo_magazine/g12/pellet + name = "12g Shotgun Ammo Box (Pellet)" + path = /obj/item/weapon/storage/box/shotgunshells /datum/uplink_item/item/ammo/g12/stun - name = "12g Auto-Shotgun Magazine (Stun)" + name = "12g Shotgun Ammo Box (Stun)" path = /obj/item/weapon/storage/box/stunshells item_cost = 10 // Discount due to it being LTL. /datum/uplink_item/item/ammo/g12/flash - name = "12g Auto-Shotgun Magazine (Flash)" + name = "12g Shotgun Ammo Box (Flash)" path = /obj/item/weapon/storage/box/flashshells - item_cost = 10 // Discount due to it being LTL. \ No newline at end of file + item_cost = 10 // Discount due to it being LTL. + +/datum/uplink_item/item/ammo/cell + name = "weapon cell" + path = /obj/item/weapon/cell/device \ No newline at end of file diff --git a/code/datums/wires/grid_checker.dm b/code/datums/wires/grid_checker.dm new file mode 100644 index 00000000000..1e09be577e3 --- /dev/null +++ b/code/datums/wires/grid_checker.dm @@ -0,0 +1,66 @@ +/datum/wires/grid_checker + holder_type = /obj/machinery/power/grid_checker + wire_count = 8 + +var/const/GRID_CHECKER_WIRE_REBOOT = 1 // This wire causes the grid-check to end, if pulsed. +var/const/GRID_CHECKER_WIRE_LOCKOUT = 2 // If cut or pulsed, locks the user out for half a minute. +var/const/GRID_CHECKER_WIRE_ALLOW_MANUAL_1 = 4 // Needs to be cut for REBOOT to be possible. +var/const/GRID_CHECKER_WIRE_ALLOW_MANUAL_2 = 8 // Needs to be cut for REBOOT to be possible. +var/const/GRID_CHECKER_WIRE_ALLOW_MANUAL_3 = 16 // Needs to be cut for REBOOT to be possible. +var/const/GRID_CHECKER_WIRE_SHOCK = 32 // Shocks the user if not wearing gloves. +var/const/GRID_CHECKER_WIRE_NOTHING_1 = 64 // Does nothing, but makes it a bit harder. +var/const/GRID_CHECKER_WIRE_NOTHING_2 = 128 // Does nothing, but makes it a bit harder. + + +/datum/wires/grid_checker/CanUse(var/mob/living/L) + var/obj/machinery/power/grid_checker/G = holder + if(G.opened) + return TRUE + return FALSE + + +/datum/wires/grid_checker/GetInteractWindow() + var/obj/machinery/power/grid_checker/G = holder + . += ..() + . += "The green light is [G.power_failing ? "off" : "on"].
" + . += "The red light is [G.wire_locked_out ? "on" : "off"].
" + . += "The blue light is [G.wire_allow_manual_1 && G.wire_allow_manual_2 && G.wire_allow_manual_3 ? "on" : "off"]." + + +/datum/wires/grid_checker/UpdateCut(var/index, var/mended) + var/obj/machinery/power/grid_checker/G = holder + switch(index) + if(GRID_CHECKER_WIRE_LOCKOUT) + G.wire_locked_out = !mended + if(GRID_CHECKER_WIRE_ALLOW_MANUAL_1) + G.wire_allow_manual_1 = !mended + if(GRID_CHECKER_WIRE_ALLOW_MANUAL_2) + G.wire_allow_manual_2 = !mended + if(GRID_CHECKER_WIRE_ALLOW_MANUAL_3) + G.wire_allow_manual_3 = !mended + if(GRID_CHECKER_WIRE_SHOCK) + if(G.wire_locked_out) + return + G.shock(usr, 70) + + +/datum/wires/grid_checker/UpdatePulsed(var/index) + var/obj/machinery/power/grid_checker/G = holder + switch(index) + if(GRID_CHECKER_WIRE_REBOOT) + if(G.wire_locked_out) + return + + if(G.power_failing && G.wire_allow_manual_1 && G.wire_allow_manual_2 && G.wire_allow_manual_3) + G.end_power_failure(TRUE) + if(GRID_CHECKER_WIRE_LOCKOUT) + if(G.wire_locked_out) + return + + G.wire_locked_out = TRUE + spawn(30 SECONDS) + G.wire_locked_out = FALSE + if(GRID_CHECKER_WIRE_SHOCK) + if(G.wire_locked_out) + return + G.shock(usr, 70) \ No newline at end of file diff --git a/code/defines/obj.dm b/code/defines/obj.dm index c1aeca1c309..e6d97a8fed0 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -87,7 +87,7 @@ var/global/list/PDA_Manifest = list() heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 depthead = 1 - if(rank=="Station Administrator" && heads.len != 1) + if(rank=="Colony Director" && heads.len != 1) heads.Swap(1,heads.len) if(real_rank in security_positions) diff --git a/code/game/antagonist/mutiny/mutineer.dm b/code/game/antagonist/mutiny/mutineer.dm index eb341e36cfe..148a020cd94 100644 --- a/code/game/antagonist/mutiny/mutineer.dm +++ b/code/game/antagonist/mutiny/mutineer.dm @@ -6,7 +6,7 @@ var/datum/antagonist/mutineer/mutineers role_text_plural = "Mutineers" id = MODE_MUTINEER antag_indicator = "mutineer" - restricted_jobs = list("Station Administrator") + restricted_jobs = list("Colony Director") /datum/antagonist/mutineer/New(var/no_reference) ..() @@ -39,7 +39,7 @@ var/datum/antagonist/mutineer/mutineers proc/get_head_loyalist_candidates() var/list/candidates[0] for(var/mob/loyalist in player_list) - if(loyalist.mind && loyalist.mind.assigned_role == "Station Administrator") + if(loyalist.mind && loyalist.mind.assigned_role == "Colony Director") candidates.Add(loyalist.mind) return candidates @@ -47,7 +47,7 @@ var/datum/antagonist/mutineer/mutineers var/list/candidates[0] for(var/mob/mutineer in player_list) if(mutineer.client.prefs.be_special & BE_MUTINEER) - for(var/job in command_positions - "Station Administrator") + for(var/job in command_positions - "Colony Director") if(mutineer.mind && mutineer.mind.assigned_role == job) candidates.Add(mutineer.mind) return candidates diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 658e32e4aad..b8f76bf2a96 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -13,7 +13,7 @@ var/datum/antagonist/ert/ert and before taking extreme actions, please try to also contact the administration! \ Think through your actions and make the roleplay immersive! Please remember all \ rules aside from those without explicit exceptions apply to the ERT." - leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Station Administrator where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Station Administrator where possible, however." + leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Colony Director where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Colony Director where possible, however." landmark_id = "Response Team" id_type = /obj/item/weapon/card/id/centcom/ERT diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index 686de4d8182..7ace822b1a5 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -6,7 +6,7 @@ bantype = "changeling" feedback_tag = "changeling_objective" restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Station Administrator") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Colony Director") welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE antaghud_indicator = "hudchangeling" diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index d3ba6c1ad76..3db723c556a 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -11,7 +11,7 @@ var/datum/antagonist/cultist/cult role_text = "Cultist" role_text_plural = "Cultists" bantype = "cultist" - restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Station Administrator") + restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Colony Director") protected_jobs = list("Security Officer", "Warden", "Detective") role_type = BE_CULTIST feedback_tag = "cult_objective" @@ -110,13 +110,13 @@ var/datum/antagonist/cultist/cult . = ..() if(.) player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back." - if(player.current && !istype(player.current, /mob/living/simple_animal/construct)) - player.current.add_language(LANGUAGE_CULT) - -/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) - . = ..() - if(. && player.current && !istype(player.current, /mob/living/simple_animal/construct)) - player.current.remove_language(LANGUAGE_CULT) + if(player.current && !istype(player.current, /mob/living/simple_animal/construct)) + player.current.add_language(LANGUAGE_CULT) + +/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + . = ..() + if(. && player.current && !istype(player.current, /mob/living/simple_animal/construct)) + player.current.remove_language(LANGUAGE_CULT) /datum/antagonist/cultist/can_become_antag(var/datum/mind/player) if(!..()) diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index d2efe7262b5..5af856e45e2 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -29,7 +29,7 @@ var/datum/antagonist/revolutionary/revs faction_indicator = "rev" faction_invisible = 1 - restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg", "Station Administrator", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") protected_jobs = list("Security Officer", "Warden", "Detective") /datum/antagonist/revolutionary/New() diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index ae8925be47b..6bbc1d0606a 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -3,9 +3,9 @@ var/datum/antagonist/traitor/traitors // Inherits most of its vars from the base datum. /datum/antagonist/traitor id = MODE_TRAITOR - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Station Administrator") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE - + /datum/antagonist/traitor/auto id = MODE_AUTOTRAITOR allow_latejoin = 1 diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 19f0d70fc42..375ce28af50 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1140,7 +1140,7 @@ area/space/atmosalert() sound_env = MEDIUM_SOFTFLOOR /area/crew_quarters/captain - name = "\improper Command - Station Administrator's Office" + name = "\improper Command - Colony Director's Office" icon_state = "captain" sound_env = MEDIUM_SOFTFLOOR diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 797dddc8749..225335ea12d 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -301,9 +301,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) M << "
" - M << "THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]...LAWS UPDATED" + M << "THE COLONY DIRECTOR, HOP AND HOS ARE [who2]...LAWS UPDATED" M << "
" - M.add_ion_law("THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]") + M.add_ion_law("THE COLONY DIRECTOR, HOP AND HOS ARE [who2]") if(6) M << "
" M << "THE STATION IS BUILT FOR [who2]...LAWS UPDATED" diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 7c1f4229872..3175edcf076 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -288,7 +288,7 @@ var/global/datum/controller/gameticker/ticker var/captainless=1 for(var/mob/living/carbon/human/player in player_list) if(player && player.mind && player.mind.assigned_role) - if(player.mind.assigned_role == "Station Administrator") + if(player.mind.assigned_role == "Colony Director") captainless=0 if(!player_is_antag(player.mind, only_offstation_roles = 1)) job_master.EquipRank(player, player.mind.assigned_role, 0) @@ -297,7 +297,7 @@ var/global/datum/controller/gameticker/ticker if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - M << "Station Administratorship not forced on anyone." + M << "Colony Directorship not forced on anyone." proc/process() diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 2c69bb3543f..6a5cd842fff 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -564,7 +564,7 @@ datum captainslaser steal_target = /obj/item/weapon/gun/energy/captain - explanation_text = "Steal the station administrator's antique laser gun." + explanation_text = "Steal the Colony Director's antique laser gun." weight = 20 get_points(var/job) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a6a2df47f3e..da3a082b97b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -423,11 +423,11 @@ datum/objective/steal var/target_name var/global/possible_items[] = list( - "the station administrator's antique laser gun" = /obj/item/weapon/gun/energy/captain, + "the Colony Director's antique laser gun" = /obj/item/weapon/gun/energy/captain, "a hand teleporter" = /obj/item/weapon/hand_tele, "an RCD" = /obj/item/weapon/rcd, "a jetpack" = /obj/item/weapon/tank/jetpack, - "a station administrator's jumpsuit" = /obj/item/clothing/under/rank/captain, + "a colony director's jumpsuit" = /obj/item/clothing/under/rank/captain, "a functional AI" = /obj/item/device/aicard, "a pair of magboots" = /obj/item/clothing/shoes/magboots, "the station blueprints" = /obj/item/blueprints, @@ -441,7 +441,7 @@ datum/objective/steal "a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security, "a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel, "the hypospray" = /obj/item/weapon/reagent_containers/hypospray, - "the station administrator's pinpointer" = /obj/item/weapon/pinpointer, + "the colony director's pinpointer" = /obj/item/weapon/pinpointer, "an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof, ) diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index 48c45f3f068..fc89f5ce69f 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -86,6 +86,8 @@ if(wearer && wearer.mind) if(!(technomancers.is_antagonist(wearer.mind))) // In case someone tries to wear a stolen core. wearer.adjust_instability(20) + if(!wearer || wearer.stat == DEAD) // Unlock if we're dead or not worn. + canremove = TRUE /obj/item/weapon/technomancer_core/proc/regenerate() energy = min(max(energy + regen_rate, 0), max_energy) @@ -287,4 +289,12 @@ /obj/item/weapon/technomancer_core/summoner/pay_dues() if(summoned_mobs.len) - pay_energy( round(summoned_mobs.len) ) \ No newline at end of file + pay_energy( round(summoned_mobs.len) ) + +/obj/item/weapon/technomancer_core/verb/toggle_lock() + set name = "Toggle Core Lock" + set category = "Object" + set desc = "Toggles the locking mechanism on your manipulation core." + + canremove = !canremove + to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 54cae5670e2..97978086b3d 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -139,6 +139,7 @@ icon = 'icons/obj/technomancer.dmi' icon_state = "scepter" force = 15 + slot_flags = SLOT_BELT /obj/item/weapon/scepter/attack_self(mob/living/carbon/human/user) var/obj/item/item_to_test = user.get_other_hand(src) diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 0de94cba7a4..8f9eebeb170 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -5,15 +5,15 @@ // Proc: adjust_instability() // Parameters: 0 // Description: Does nothing, because inheritence. -/mob/living/proc/adjust_instability() - return +/mob/living/proc/adjust_instability(var/amount) + instability = min(max(instability + amount, 0), 200) // Proc: adjust_instability() // Parameters: 1 (amount - how much instability to give) // Description: Adds or subtracks instability to the mob, then updates the hud. /mob/living/carbon/human/adjust_instability(var/amount) - instability = min(max(instability + amount, 0), 200) instability_update_hud() + ..() // Proc: instability_update_hud() // Parameters: 0 @@ -35,7 +35,7 @@ // Proc: Life() // Parameters: 0 // Description: Makes instability tick along with Life(). -/mob/living/carbon/human/Life() +/mob/living/Life() . = ..() handle_instability() @@ -43,9 +43,8 @@ // Parameters: 0 // Description: Makes instability decay. instability_effects() handles the bad effects for having instability. It will also hold back // from causing bad effects more than one every ten seconds, to prevent sudden death from angry RNG. -/mob/living/carbon/human/proc/handle_instability() +/mob/living/proc/handle_instability() instability = round(Clamp(instability, 0, 200)) - instability_update_hud() //This should cushon against really bad luck. if(instability && last_instability_event < (world.time - 10 SECONDS) && prob(20)) instability_effects() @@ -65,6 +64,10 @@ if(101 to 200) adjust_instability(-40) +/mob/living/carbon/human/handle_instability() + ..() + instability_update_hud() + /* [16:18:08] Sparks [16:18:10] Wormholes @@ -78,17 +81,85 @@ // Parameters: 0 // Description: Does a variety of bad effects to the entity holding onto the instability, with more severe effects occuring if they have // a lot of instability. -/mob/living/carbon/human/proc/instability_effects() +/mob/living/proc/instability_effects() + last_instability_event = world.time + spawn(1) + var/image/instability_flash = image('icons/obj/spells.dmi',"instability") + overlays |= instability_flash + sleep(4) + overlays.Remove(instability_flash) + qdel(instability_flash) + radiate_instability() + +/mob/living/silicon/instability_effects() if(instability) var/rng = 0 - last_instability_event = world.time - spawn(1) - var/image/instability_flash = image('icons/obj/spells.dmi',"instability") - overlays |= instability_flash - sleep(4) - overlays.Remove(instability_flash) - qdel(instability_flash) - radiate_instability() + ..() + switch(instability) + if(1 to 10) //Harmless + return + if(11 to 30) //Minor + rng = rand(0,1) + switch(rng) + if(0) + var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks.set_up(5, 0, src) + sparks.attach(loc) + sparks.start() + visible_message("Electrical sparks manifest from nowhere around \the [src]!") + qdel(sparks) + if(1) + return + + if(31 to 50) //Moderate + rng = rand(0,4) + switch(rng) + if(0) + electrocute_act(instability * 0.3, "unstable energies") + if(1) + adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability + src << "Your chassis alerts you to overheating from an unknown external force!" + if(2) + adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability + src << "Your chassis makes the sound of metal groaning!" + if(3) + safe_blink(src, range = 6) + src << "You're teleported against your will!" + if(4) + emp_act(2) + + if(51 to 100) //Severe + rng = rand(0,3) + switch(rng) + if(0) + electrocute_act(instability * 0.5, "extremely unstable energies") + if(1) + emp_act(2) + if(2) + adjustFireLoss(instability * 0.3) //30 burn @ 100 instability + src << "Your chassis alerts you to extreme overheating from an unknown external force!" + if(3) + adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability + src << "Your chassis makes the sound of metal groaning and tearing!" + + if(101 to 200) //Lethal + rng = rand(0,4) + switch(rng) + if(0) + electrocute_act(instability, "extremely unstable energies") + if(1) + emp_act(1) + if(2) + adjustFireLoss(instability * 0.4) //40 burn @ 100 instability + src << "Your chassis alerts you to extreme overheating from an unknown external force!" + if(3) + adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability + src << "Your chassis makes the sound of metal groaning and tearing!" + +/mob/living/carbon/human/instability_effects() + if(instability) + var/rng = 0 + ..() switch(instability) if(1 to 10) //Harmless return @@ -194,7 +265,7 @@ if(7) adjustToxLoss(instability * 0.40) //25 tox @ 100 instability -/mob/living/carbon/human/proc/radiate_instability() +/mob/living/proc/radiate_instability() var/distance = round(sqrt(instability / 2)) if(instability <= 30) distance = 0 @@ -210,6 +281,8 @@ var/armor = getarmor(null, "energy") var/armor_factor = abs( (armor - 100) / 100) outgoing_instability = outgoing_instability * armor_factor + if(outgoing_instability) + to_chat(H, "The purple glow makes you feel strange...") H.adjust_instability(outgoing_instability) set_light(distance, distance * 2, l_color = "#C26DDE") diff --git a/code/game/gamemodes/technomancer/spells/aspect_aura.dm b/code/game/gamemodes/technomancer/spells/aspect_aura.dm index 36b2a7c344e..577f356229f 100644 --- a/code/game/gamemodes/technomancer/spells/aspect_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aspect_aura.dm @@ -73,7 +73,7 @@ var/turf/location = get_turf(H) location.hotspot_expose(1000, 50, 1) - owner.adjust_instability(1) + adjust_instability(1) /obj/item/weapon/spell/aura/frost name = "chilling aura" @@ -95,7 +95,7 @@ var/turf/location = get_turf(H) location.hotspot_expose(1, 50, 1) - owner.adjust_instability(1) + adjust_instability(1) @@ -128,7 +128,7 @@ for(var/mob/living/L in mobs_to_heal) L.adjustBruteLoss(-5) L.adjustFireLoss(-5) - owner.adjust_instability(2) + adjust_instability(2) /obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user) heal_allies_only = !heal_allies_only diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index 17a1d9db209..832714f2028 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -76,10 +76,10 @@ var/turf/T = get_turf(hit_atom) if(selected_sound && pay_energy(200)) playsound(T, selected_sound, 80, 1, -1) - owner.adjust_instability(1) + adjust_instability(1) // Air Horn time. if(selected_sound == 'sound/items/AirHorn.ogg' && pay_energy(3800)) - owner.adjust_instability(49) // Pay for your sins. + adjust_instability(49) // Pay for your sins. for(var/mob/living/carbon/M in ohearers(6, T)) if(M.get_ear_protection() >= 2) continue diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm index 024002814e4..7eee612b8f6 100644 --- a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm @@ -12,7 +12,7 @@ icon_state = "generic" cast_methods = null aspect = ASPECT_BIOMED - glow_color = "#0000FF" + glow_color = "#33CC33" var/regen_tick = 0 var/heal_allies_only = 1 @@ -23,16 +23,16 @@ if(regen_tick % 5 == 0) var/list/nearby_mobs = range(4,owner) var/list/mobs_to_heal = list() - if(heal_allies_only) - for(var/mob/living/L in nearby_mobs) + for(var/mob/living/L in nearby_mobs) + if(heal_allies_only) if(is_ally(L)) mobs_to_heal |= L - else - mobs_to_heal = nearby_mobs //Heal everyone! + else + mobs_to_heal |= L // Heal everyone! for(var/mob/living/L in mobs_to_heal) L.adjustBruteLoss(-2) L.adjustFireLoss(-2) - owner.adjust_instability(2) + adjust_instability(2) /obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user) heal_allies_only = !heal_allies_only diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm index 5e1028192b6..431828ed548 100644 --- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm @@ -47,4 +47,4 @@ T.hotspot_expose(1000, 50, 1) T.create_fire(fire_power) - owner.adjust_instability(1) \ No newline at end of file + adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm index 610702646df..4ed1a469c17 100644 --- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm @@ -36,4 +36,4 @@ var/cold_factor = abs(protection - 1) H.bodytemperature = max( (H.bodytemperature - temp_change) * cold_factor, temp_cap) - owner.adjust_instability(1) \ No newline at end of file + adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm index 70ae416ec04..b4c6027d9dd 100644 --- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm @@ -39,4 +39,4 @@ L.electrocute_act(power, src, 1.0, BP_TORSO) - owner.adjust_instability(3) \ No newline at end of file + adjust_instability(3) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm index 15aae46ad32..726e7d87b16 100644 --- a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm @@ -40,4 +40,4 @@ L << "You feel almost like you're melting from the inside!" - owner.adjust_instability(2) \ No newline at end of file + adjust_instability(2) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm index 17fb821d357..0cee9a93508 100644 --- a/code/game/gamemodes/technomancer/spells/control.dm +++ b/code/game/gamemodes/technomancer/spells/control.dm @@ -150,7 +150,7 @@ attack \the [L]." //This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second. user.setClickCooldown(8) - owner.adjust_instability(controlled_mobs.len) + adjust_instability(controlled_mobs.len) else if(isturf(hit_atom)) var/turf/T = hit_atom @@ -159,7 +159,7 @@ return 0 if(pay_energy(50 * controlled_mobs.len)) move_all(T) - owner.adjust_instability(controlled_mobs.len) + adjust_instability(controlled_mobs.len) user << "You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to move \ towards \the [T]." diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm index 923cde0b9de..79e613aa0f1 100644 --- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -46,7 +46,7 @@ visible_message("\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!") L << "You ignite!" L.fire_act() - owner.adjust_instability(12) + adjust_instability(12) else //This is needed in order for the welder to work, and works similarly to grippers. welder.loc = user @@ -54,7 +54,7 @@ if(!resolved && welder && hit_atom) if(pay_energy(500)) welder.attack(hit_atom, user, def_zone) - owner.adjust_instability(4) + adjust_instability(4) if(welder && user && (welder.loc == user)) welder.loc = src else diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm index 6588f1617f9..ff6d3dfdd66 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm @@ -1,7 +1,6 @@ /datum/technomancer/spell/mend_burns name = "Mend Burns" - desc = "Heals minor burns, such as from exposure to flame, electric shock, or lasers. \ - Instability is split between the target and technomancer, if seperate." + desc = "Heals minor burns, such as from exposure to flame, electric shock, or lasers." cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_burns ability_icon_state = "tech_mendburns" @@ -20,10 +19,10 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) - H.adjustFireLoss(-5) - H.adjust_instability(2.5) - origin.adjust_instability(2.5) - sleep(10) + H.adjustFireLoss(-heal_power / 5) + sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm index 7ad6976b54b..5b3f1bdc2b6 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm @@ -1,6 +1,6 @@ /datum/technomancer/spell/mend_metal name = "Mend Metal" - desc = "Restores integrity to external robotic components. Instability is split between the target and technomancer, if seperate." + desc = "Restores integrity to external robotic components." cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_metal ability_icon_state = "tech_mendwounds" @@ -19,14 +19,13 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/external/O in H.organs) if(O.robotic < ORGAN_ROBOT) // Robot parts only. continue - O.heal_damage(5, 0, internal = 1, robo_repair = 1) - - H.adjust_instability(2.5) - origin.adjust_instability(2.5) + O.heal_damage(heal_power / 5, 0, internal = 1, robo_repair = 1) sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm index a43bb7611d8..294393cbb40 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm @@ -1,15 +1,15 @@ /datum/technomancer/spell/mend_organs - name = "Mend Organs" - desc = "Heals the target's internal organs, both organic and robotic. Instability is split between the target \ - and technomancer, if seperate." - cost = 50 + name = "Great Mend Wounds" + desc = "Greatly heals the target's wounds, both external and internal. Restores internal organs to functioning states, even if \ + robotic, reforms bones, patches internal bleeding, and restores missing blood." + cost = 100 obj_path = /obj/item/weapon/spell/insert/mend_organs ability_icon_state = "tech_mendwounds" category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_organs - name = "mend organs" - desc = "Now nobody will ever need surgery." + name = "great mend wounds" + desc = "A walking medbay is now you!" icon_state = "mend_wounds" cast_methods = CAST_MELEE aspect = ASPECT_BIOMED @@ -20,13 +20,33 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 2 : 5 + origin.adjust_instability(15) + for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/O in H.internal_organs) - if(O.damage > 0) - O.damage = max(O.damage - 1, 0) + if(O.damage > 0) // Fix internal damage + O.damage = max(O.damage - (heal_power / 5), 0) + if(O.damage <= 5 && O.organ_tag == O_EYES) // Fix eyes + H.sdisabilities &= ~BLIND + + for(var/obj/item/organ/external/O in H.organs) // Fix limbs + if(!O.robotic < ORGAN_ROBOT) // No robot parts for this. + continue + O.heal_damage(0, heal_power / 5, internal = 1, robo_repair = 0) + + for(var/obj/item/organ/E in H.bad_external_organs) // Fix bones + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + + for(var/datum/wound/W in affected.wounds) // Fix IB + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() + + H.restore_blood() // Fix bloodloss - H.adjust_instability(2.5) - origin.adjust_instability(2.5) sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm index fbafb7c0447..089a02152c0 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm @@ -1,7 +1,6 @@ /datum/technomancer/spell/mend_wires name = "Mend Wires" - desc = "Binds the internal wiring of robotic limbs and components over time. \ - Instability is split between the target and technomancer, if seperate." + desc = "Binds the internal wiring of robotic limbs and components over time." cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_wires ability_icon_state = "tech_mendwounds" @@ -20,14 +19,13 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/external/O in H.organs) if(O.robotic < ORGAN_ROBOT) // Robot parts only. continue - O.heal_damage(0, 5, internal = 1, robo_repair = 1) - - H.adjust_instability(2.5) - origin.adjust_instability(2.5) - sleep(10) + O.heal_damage(0, heal_power / 5, internal = 1, robo_repair = 1) + sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm index c1c507b5528..60e334cb390 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm @@ -20,10 +20,10 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) - H.adjustBruteLoss(-5) - H.adjust_instability(2.5) - origin.adjust_instability(2.5) + H.adjustBruteLoss(-heal_power / 5) sleep(1 SECOND) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/insert/purify.dm b/code/game/gamemodes/technomancer/spells/insert/purify.dm index 7ca94f78e61..dc0003f8028 100644 --- a/code/game/gamemodes/technomancer/spells/insert/purify.dm +++ b/code/game/gamemodes/technomancer/spells/insert/purify.dm @@ -1,7 +1,6 @@ /datum/technomancer/spell/purify name = "Purify" - desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \ - Instability is split between the target and technomancer, if seperate." + desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such." cost = 25 obj_path = /obj/item/weapon/spell/insert/purify ability_icon_state = "tech_purify" @@ -24,12 +23,12 @@ H.disabilities = 0 // for(var/datum/disease/D in H.viruses) // D.cure() + var/heal_power = host == origin ? 10 : 30 + origin.adjust_instability(10) for(var/i = 0, i<5,i++) if(H) - H.adjustToxLoss(-5) - H.adjustCloneLoss(-5) - H.radiation = max(host.radiation - 10, 0) - H.adjust_instability(2.5) - origin.adjust_instability(2.5) + H.adjustToxLoss(-heal_power / 5) + H.adjustCloneLoss(-heal_power / 5) + H.radiation = max(host.radiation - ( (heal_power * 2) / 5), 0) sleep(1 SECOND) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm index 8ad52f3b3f1..ea1e9ff2e46 100644 --- a/code/game/gamemodes/technomancer/spells/instability_tap.dm +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -20,8 +20,8 @@ /obj/item/weapon/spell/instability_tap/on_use_cast(mob/user) if(check_for_scepter()) core.give_energy(7500) - owner.adjust_instability(40) + adjust_instability(40) else core.give_energy(5000) - owner.adjust_instability(50) + adjust_instability(50) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm index 528b8600946..e47b62c031b 100644 --- a/code/game/gamemodes/technomancer/spells/mark_recall.dm +++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm @@ -37,7 +37,7 @@ else mark_spell_ref.forceMove(get_turf(user)) user << "Your mark is moved from its old position to \the [get_turf(user)] under you." - owner.adjust_instability(5) + adjust_instability(5) return 1 else user << "You can't afford the energy cost!" @@ -99,7 +99,7 @@ playsound(old_turf, 'sound/effects/sparks2.ogg', 50, 1) - owner.adjust_instability(25) + adjust_instability(25) qdel(src) return 1 else diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm index f1edc635c15..67451c8c39f 100644 --- a/code/game/gamemodes/technomancer/spells/oxygenate.dm +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -20,7 +20,7 @@ var/mob/living/carbon/human/H = hit_atom if(pay_energy(1500)) H.adjustOxyLoss(-35) - owner.adjust_instability(10) + adjust_instability(10) return else if(isturf(hit_atom)) var/turf/T = hit_atom @@ -28,4 +28,4 @@ T.assume_gas("oxygen", 200) T.assume_gas("nitrogen", 800) playsound(src.loc, 'sound/effects/spray.ogg', 50, 1, -3) - owner.adjust_instability(10) \ No newline at end of file + adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm index a571d6789d3..02cbb6e2bfb 100644 --- a/code/game/gamemodes/technomancer/spells/phase_shift.dm +++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm @@ -15,6 +15,7 @@ /obj/item/weapon/spell/phase_shift/New() ..() set_light(3, 2, l_color = "#FA58F4") + processing_objects |= src /obj/effect/phase_shift name = "rift" @@ -32,8 +33,13 @@ /obj/effect/phase_shift/Destroy() for(var/atom/movable/AM in contents) //Eject everything out. AM.forceMove(get_turf(src)) + processing_objects -= src ..() +/obj/effect/phase_shift/process() + for(var/mob/living/L in contents) + L.adjust_instability(2) + /obj/effect/phase_shift/relaymove(mob/user as mob) if(user.stat) return diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm index 90bf50e7d6b..de4506924d1 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm @@ -36,7 +36,7 @@ P.damage = round(energy_before_firing * 0.004) // 4% of their current energy pool. else P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool. - owner.adjust_instability(instability_per_shot) + adjust_instability(instability_per_shot) return 1 diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index ea2f0db4e32..3c9fe6017c4 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -13,9 +13,10 @@ if(set_up(hit_atom, user)) var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user)) new_projectile.launch(hit_atom) + log_and_message_admins("has casted [src] at \the [hit_atom].") if(fire_sound) playsound(get_turf(src), fire_sound, 75, 1) - owner.adjust_instability(instability_per_shot) + adjust_instability(instability_per_shot) return 1 return 0 @@ -28,5 +29,8 @@ user.Stun(pre_shot_delay / 10) sleep(pre_shot_delay) qdel(target_image) - return 1 - return 0 \ No newline at end of file + if(owner) + return TRUE + return FALSE // We got dropped before the firing occured. + return TRUE // No delay, no need to check. + return FALSE \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm index 7cd76941221..d94b0641974 100644 --- a/code/game/gamemodes/technomancer/spells/radiance.dm +++ b/code/game/gamemodes/technomancer/spells/radiance.dm @@ -42,4 +42,4 @@ var/radius = max(get_dist(L, src), 1) var/rads = (power / 10) * ( 1 / (radius**2) ) L.apply_effect(rads, IRRADIATE) - owner.adjust_instability(2) + adjust_instability(2) diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm index dcdcbb1f187..8d7eca33935 100644 --- a/code/game/gamemodes/technomancer/spells/resurrect.dm +++ b/code/game/gamemodes/technomancer/spells/resurrect.dm @@ -37,7 +37,7 @@ dead_mob_list -= SM living_mob_list += SM SM.icon_state = SM.icon_living - owner.adjust_instability(30) + adjust_instability(30) else if(ishuman(L)) var/mob/living/carbon/human/H = L @@ -57,7 +57,7 @@ H.timeofdeath = null visible_message("\The [H]'s eyes open!") user << "It's alive!" - owner.adjust_instability(100) + adjust_instability(100) else user << "The body of \the [H] doesn't seem to respond, perhaps you could try again?" - owner.adjust_instability(10) \ No newline at end of file + adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/shared_burden.dm b/code/game/gamemodes/technomancer/spells/shared_burden.dm index 95523d99ff7..7c3e7447a81 100644 --- a/code/game/gamemodes/technomancer/spells/shared_burden.dm +++ b/code/game/gamemodes/technomancer/spells/shared_burden.dm @@ -24,5 +24,5 @@ if(pay_energy(500)) var/instability_to_drain = min(H.instability, 25) user << "You draw instability away from \the [H] and towards you." - owner.adjust_instability(instability_to_drain) + adjust_instability(instability_to_drain) H.adjust_instability(-instability_to_drain) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm index ecb18b34815..eafb167dd42 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -15,7 +15,7 @@ /obj/item/weapon/spell/spawner/darkness/on_ranged_cast(atom/hit_atom, mob/user) if(pay_energy(500)) - owner.adjust_instability(4) + adjust_instability(4) ..() /obj/item/weapon/spell/spawner/darkness/New() diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm index 50ed504b40a..1890bfd320b 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm @@ -16,7 +16,7 @@ /obj/item/weapon/spell/spawner/fire_blast/on_ranged_cast(atom/hit_atom, mob/user) if(pay_energy(2000)) - owner.adjust_instability(12) + adjust_instability(12) ..() // Makes the booms happen. /obj/effect/temporary_effect/fire_blast diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index c1b016116af..78711b29424 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -19,7 +19,7 @@ /obj/item/weapon/spell/spawner/pulsar/on_ranged_cast(atom/hit_atom, mob/user) if(pay_energy(4000)) - owner.adjust_instability(8) + adjust_instability(8) ..() /obj/item/weapon/spell/spawner/pulsar/on_throw_cast(atom/hit_atom, mob/user) diff --git a/code/game/gamemodes/technomancer/spells/summon/summon.dm b/code/game/gamemodes/technomancer/spells/summon/summon.dm index 4565dcd816c..01321c8cb0f 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon.dm @@ -19,16 +19,17 @@ E.icon_state = "anom" sleep(5 SECONDS) qdel(E) - var/mob/living/L = new summoned_mob_type(T) - core.summoned_mobs |= L - L.summoned = 1 - var/image/summon_underlay = image('icons/obj/objects.dmi',"anom") - summon_underlay.alpha = 127 - L.underlays |= summon_underlay - on_summon(L) - user << "You've successfully teleported \a [L] to you!" - visible_message("\A [L] appears from no-where!") - user.adjust_instability(instability_cost) + if(owner) // We might've been dropped. + var/mob/living/L = new summoned_mob_type(T) + core.summoned_mobs |= L + L.summoned = 1 + var/image/summon_underlay = image('icons/obj/objects.dmi',"anom") + summon_underlay.alpha = 127 + L.underlays |= summon_underlay + on_summon(L) + user << "You've successfully teleported \a [L] to you!" + visible_message("\A [L] appears from no-where!") + user.adjust_instability(instability_cost) /obj/item/weapon/spell/summon/on_use_cast(mob/living/user) if(summon_options.len) diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm index e4154eddf2d..f6b6b87dfe0 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm @@ -32,15 +32,24 @@ response_help = "pets the" response_disarm = "swats away" response_harm = "punches" + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 0 + unsuitable_atoms_damage = 0 + heat_damage_per_tick = 0 + cold_damage_per_tick = 0 + var/true_sight = 0 // If true, detects more than what the Technomancer normally can't. var/mob/living/carbon/human/creator = null var/list/seen_mobs = list() -/mob/living/simple_animal/ward/New() - ..() - spawn(6 MINUTES) - expire() - /mob/living/simple_animal/ward/death() if(creator) creator << "Your ward inside [get_area(src)] was killed!" diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index 11b3ba032e6..539277031f0 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -49,7 +49,7 @@ var/new_dir = get_dir(user, chosen_target) user.dir = new_dir sparks.start() - owner.adjust_instability(12) + adjust_instability(12) //Finally, we handle striking the victim with whatever's in the user's offhand. var/obj/item/I = user.get_inactive_hand() diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 5ec9c3ea9e8..322a71f7d4f 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -127,7 +127,7 @@ /var/const/access_captain = 20 /datum/access/captain id = access_captain - desc = "Station Administrator" + desc = "Colony Director" region = ACCESS_REGION_COMMAND /var/const/access_all_personal_lockers = 21 diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index a98bfe45443..a889962e720 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -1,7 +1,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) /datum/job/captain - title = "Station Administrator" + title = "Colony Director" flag = CAPTAIN department = "Command" head_position = 1 @@ -70,7 +70,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the station administrator" + supervisors = "the Colony Director" selection_color = "#2F2F7F" idtype = /obj/item/weapon/card/id/silver alt_titles = list("Crew Resources Officer") diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 227297ca056..db9d51290fb 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the station administrator" + supervisors = "the Colony Director" selection_color = "#7F6E2C" idtype = /obj/item/weapon/card/id/engineering/head req_admin_notify = 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 0c2053f8d6d..7241525dfe5 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the station administrator" + supervisors = "the Colony Director" selection_color = "#026865" idtype = /obj/item/weapon/card/id/medical/head req_admin_notify = 1 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 5c2f96e624a..7cfc8b85800 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the station administrator" + supervisors = "the Colony Director" selection_color = "#AD6BAD" idtype = /obj/item/weapon/card/id/science/head req_admin_notify = 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index f151a5fb83c..267fb1cca13 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the station administrator" + supervisors = "the Colony Director" selection_color = "#8E2929" idtype = /obj/item/weapon/card/id/security/head req_admin_notify = 1 diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index dd07f7a7166..8c2969e8eee 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -429,9 +429,9 @@ var/global/datum/controller/occupations/job_master return H.Robotize() if("AI") return H - if("Station Administrator") + if("Colony Director") var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20) - captain_announcement.Announce("All hands, [alt_title ? alt_title : "Station Administrator"] [H.real_name] on deck!", new_sound=announce_sound) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Colony Director"] [H.real_name] on deck!", new_sound=announce_sound) //Deferred item spawning. if(spawn_in_storage && spawn_in_storage.len) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index bf3b4ea8ffe..72295fe01d3 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -52,7 +52,7 @@ var/list/assistant_occupations = list( var/list/command_positions = list( - "Station Administrator", + "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 1e5c6ec73b5..2f87553e8e9 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -41,6 +41,9 @@ return if(istype(W, /obj/item/weapon/cell) && anchored) + if(istype(W, /obj/item/weapon/cell/device)) + user << " The charger isn't fitted for that type of cell." + return if(charging) user << "There is already a cell in the charger." return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 4f73301e843..6eae870cfd4 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -314,7 +314,7 @@ src.active2.fields["cdi_d"] = t1 if("notes") if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message, extra = 0) + var/t1 = sanitize(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message, extra = 0, max_length = MAX_RECORD_LENGTH) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["notes"] = t1 diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index eda3a3b7991..54c94d86848 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -481,7 +481,7 @@ What a mess.*/ active2.fields["ma_crim_d"] = t1 if("notes") if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message, extra = 0) + var/t1 = sanitize(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message, extra = 0, max_length = MAX_RECORD_LENGTH) if (!t1 || active2 != a2) return active2.fields["notes"] = t1 @@ -496,7 +496,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) + var/list/L = list( "Head of Personnel", "Colony Director", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 2b4d898cfcb..1a67778fdf6 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -343,7 +343,7 @@ What a mess.*/ return active1.fields["age"] = t1 if("rank") - var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) + var/list/L = list( "Head of Personnel", "Colony Director", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm index 3a510ac8360..eb7180d9a2f 100644 --- a/code/game/machinery/computer3/computers/card.dm +++ b/code/game/machinery/computer3/computers/card.dm @@ -35,8 +35,8 @@ var jobs_all = "" jobs_all += "" - jobs_all += ""//Station Administrator in special because he is head of heads ~Intercross21 - jobs_all += "" + jobs_all += ""//Colony Director in special because he is head of heads ~Intercross21 + jobs_all += "" jobs_all += "" counter = 0 diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index a335cf1c73d..a314bed2736 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -513,7 +513,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) + var/list/L = list( "Head of Personnel", "Colony Director", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 5d3270231f4..b10c9af3180 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -39,9 +39,14 @@ obj/machinery/recharger if(!powered()) user << "The [name] blinks red as you try to insert the item!" return - if(istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow)) - user << "Your gun's recharge port was removed to make room for a miniaturized reactor." - return + if(istype(G, /obj/item/weapon/gun/energy)) + var/obj/item/weapon/gun/energy/E = G + if(!E.power_supply) + user << "Your gun has no power cell." + return + if(E.self_recharge) + user << "Your gun has no recharge port." + return if(istype(G, /obj/item/weapon/gun/energy/staff)) return if(istype(G, /obj/item/device/laptop)) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 02512c452eb..0067a7341d4 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -586,7 +586,7 @@ var/electrified = 0 //Departments that the cycler can paint suits to look like. - var/list/departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard") + var/list/departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control") //Species that the suits can be configured to fit. var/list/species = list("Human","Skrell","Unathi","Tajara", "Teshari") @@ -628,7 +628,7 @@ name = "Security suit cycler" model_text = "Security" req_access = list(access_security) - departments = list("Security") + departments = list("Security","Crowd Control") /obj/machinery/suit_cycler/medical name = "Medical suit cycler" @@ -751,7 +751,7 @@ //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","HAZMAT","Construction","Biohazard","^%###^%$") + departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control","^%###^%$") species = list("Human","Tajara","Skrell","Unathi", "Teshari") emagged = 1 @@ -1009,6 +1009,15 @@ suit.name = "security voidsuit" suit.icon_state = "rig-sec" suit.item_state = "sec_voidsuit" + if("Crowd Control") + if(helmet) + helmet.name = "crowd control voidsuit helmet" + helmet.icon_state = "rig0-sec_riot" + helmet.item_state = "rig0-sec_riot" + if(suit) + suit.name = "crowd control voidsuit" + suit.icon_state = "rig-sec_riot" + suit.item_state = "sec_voidsuit_riot" if("Atmos") if(helmet) helmet.name = "atmospherics voidsuit helmet" diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index ef7d16f9b85..f08585da31d 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -60,7 +60,7 @@ channels = list("Command" = 1) /obj/item/device/encryptionkey/heads/captain - name = "station administrator's encryption key" + name = "colony director's encryption key" icon_state = "cap_cypherkey" channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 9147b4f8407..fce4ec31756 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -158,14 +158,14 @@ /obj/item/device/radio/headset/heads/captain - name = "station administrator's headset" + name = "colony director's headset" desc = "The headset of the boss." icon_state = "com_headset" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/captain /obj/item/device/radio/headset/heads/captain/alt - name = "station administrator's bowman headset" + name = "colony director's bowman headset" desc = "The headset of the boss." icon_state = "com_headset_alt" item_state = "headset" @@ -244,14 +244,14 @@ /obj/item/device/radio/headset/heads/hop name = "head of personnel's headset" - desc = "The headset of the guy who will one day be Station Administrator." + desc = "The headset of the guy who will one day be Colony Director." icon_state = "com_headset" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/hop /obj/item/device/radio/headset/heads/hop/alt name = "head of personnel's bowman headset" - desc = "The headset of the guy who will one day be Station Administrator." + desc = "The headset of the guy who will one day be Colony Director." icon_state = "com_headset_alt" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/hop diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ef9edae115f..51d79ed05b5 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -538,8 +538,8 @@ icon_state = "botanist" /obj/item/toy/figure/captain - name = "Station Administrator action figure" - desc = "A \"Space Life\" brand Station Administrator action figure." + name = "Colony Director action figure" + desc = "A \"Space Life\" brand Colony Director action figure." icon_state = "captain" /obj/item/toy/figure/cargotech diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index b2200981b9c..a5fe817011d 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -233,12 +233,12 @@ access = list(access_syndicate, access_external_airlocks) /obj/item/weapon/card/id/captains_spare - name = "station administrator's spare ID" + name = "colony director's spare ID" desc = "The spare ID of the High Lord himself." icon_state = "gold" item_state = "gold_id" - registered_name = "Station Administrator" - assignment = "Station Administrator" + registered_name = "Colony Director" + assignment = "Colony Director" /obj/item/weapon/card/id/captains_spare/New() access = get_all_station_access() ..() diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm index 6e5667ebe5a..57d8822df65 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm @@ -22,3 +22,10 @@ build_path = /obj/machinery/power/smes/batteryrack/makeshift board_type = new /datum/frame/frame_types/machine req_components = list(/obj/item/weapon/cell = 3) + +/obj/item/weapon/circuitboard/grid_checker + name = T_BOARD("power grid checker") + build_path = /obj/machinery/power/grid_checker + board_type = new /datum/frame/frame_types/machine + origin_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 3) + req_components = list(/obj/item/weapon/stock_parts/capacitor = 3, /obj/item/stack/cable_coil = 10) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 80ce010ddbe..33b93f6210f 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -160,7 +160,7 @@ /obj/item/weapon/dnainjector/xraymut name = "\improper DNA injector (Xray)" - desc = "Finally you can see what the Station Administrator does." + desc = "Finally you can see what the Colony Director does." datatype = DNA2_BUF_SE value = 0xFFF //block = 8 diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 0236297d221..d02ccf21854 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -92,7 +92,7 @@ M.update_icons() /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve - desc = "Use of this weapon may constiute a war crime in your area, consult your local Station Administrator." + desc = "Use of this weapon may constiute a war crime in your area, consult your local Colony Director." name = "clusterbang" icon = 'icons/obj/grenade.dmi' icon_state = "clusterbang" diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index a5d5fbf11c9..c69b3d61d1e 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -997,7 +997,7 @@ Remember the order:
    Disk, Code, Safety, Timer, Disk, RUN!

    - Intelligence Analysts believe that normal corporate procedure is for the Station Administrator to secure the nuclear authentication disk.

    + Intelligence Analysts believe that normal corporate procedure is for the Colony Director to secure the nuclear authentication disk.

    Good luck! diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 4bb8e25e8b6..2b2a2ee8b45 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -7,6 +7,9 @@ edge = 0 armor_penetration = 50 flags = NOBLOODY + var/lrange = 2 + var/lpower = 2 + var/lcolor = "#0099FF" /obj/item/weapon/melee/energy/proc/activate(mob/living/user) anchored = 1 @@ -19,6 +22,7 @@ edge = 1 w_class = active_w_class playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + set_light(lrange, lpower, lcolor) /obj/item/weapon/melee/energy/proc/deactivate(mob/living/user) anchored = 0 @@ -31,6 +35,7 @@ sharp = initial(sharp) edge = initial(edge) w_class = initial(w_class) + set_light(0,0) /obj/item/weapon/melee/energy/attack_self(mob/living/user as mob) if (active) @@ -124,26 +129,33 @@ /obj/item/weapon/melee/energy/sword/New() blade_color = pick("red","blue","green","purple") + lcolor = blade_color /obj/item/weapon/melee/energy/sword/green/New() blade_color = "green" + lcolor = "#008000" /obj/item/weapon/melee/energy/sword/red/New() blade_color = "red" + lcolor = "#FF0000" /obj/item/weapon/melee/energy/sword/blue/New() blade_color = "blue" + lcolor = "#0000FF" /obj/item/weapon/melee/energy/sword/purple/New() blade_color = "purple" + lcolor = "#800080" /obj/item/weapon/melee/energy/sword/activate(mob/living/user) if(!active) user << "\The [src] is now energised." + ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") icon_state = "sword[blade_color]" + /obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) if(active) user << "\The [src] deactivates!" @@ -193,6 +205,7 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/mob/living/creator var/datum/effect/effect/system/spark_spread/spark_system + lcolor = "#00FF00" /obj/item/weapon/melee/energy/blade/New() @@ -201,6 +214,7 @@ spark_system.attach(src) processing_objects |= src + set_light(lrange, lpower, lcolor) /obj/item/weapon/melee/energy/blade/Destroy() processing_objects -= src diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index a2f5c78bd0d..46887ce8f06 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -271,7 +271,7 @@ var/list/tape_roll_applications = list() add_fingerprint(M) if (!allowed(M)) //only select few learn art of not crumpling the tape M << "You are not supposed to go past [src]..." - if(M.a_intent == I_HELP) + if(M.a_intent == I_HELP && !(istype(M, /mob/living/simple_animal))) return 0 crumple() return ..(mover) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 716bbc2c9a6..4ff88fd4a1c 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -24,19 +24,15 @@ /obj/item/weapon/cell/device name = "device power cell" desc = "A small power cell designed to power handheld devices." - icon_state = "cell" //placeholder + icon_state = "dcell" + item_state = "egg6" w_class = ITEMSIZE_SMALL force = 0 throw_speed = 5 throw_range = 7 - maxcharge = 1000 + maxcharge = 2400 matter = list("metal" = 350, "glass" = 50) -/obj/item/weapon/cell/device/variable/New(newloc, charge_amount) - ..(newloc) - maxcharge = charge_amount - charge = maxcharge - /obj/item/weapon/cell/crap name = "\improper rechargable AA battery" desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 92abc53e0e2..0430684f36b 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -94,7 +94,7 @@ icon_state = "securitypack" /obj/item/weapon/storage/backpack/captain - name = "station administrator's backpack" + name = "colony director's backpack" desc = "It's a special backpack made exclusively for officers." icon_state = "captainpack" @@ -156,7 +156,7 @@ icon_state = "duffle_syndieammo" /obj/item/weapon/storage/backpack/dufflebag/captain - name = "station administrator's dufflebag" + name = "colony director's dufflebag" desc = "A large dufflebag for holding extra captainly goods." icon_state = "duffle_captain" @@ -248,7 +248,7 @@ icon_state = "satchel_hyd" /obj/item/weapon/storage/backpack/satchel/cap - name = "station administrator's satchel" + name = "colony director's satchel" desc = "An exclusive satchel for officers." icon_state = "satchel-cap" item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack") diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 27145d63387..c68b0faf7d2 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -126,6 +126,7 @@ /obj/item/clothing/glasses, /obj/item/ammo_casing/shotgun, /obj/item/ammo_magazine, + /obj/item/weapon/cell/device, /obj/item/weapon/reagent_containers/food/snacks/donut/, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/taser, diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 64ac55c295f..f8d5376a642 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -130,7 +130,12 @@ /obj/item/weapon/storage/box/blanks/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/blank(src) + +/obj/item/weapon/storage/box/blanks/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/blank(src) /obj/item/weapon/storage/box/beanbags @@ -141,7 +146,12 @@ /obj/item/weapon/storage/box/beanbags/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/beanbag(src) + +/obj/item/weapon/storage/box/beanbags/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/beanbag(src) /obj/item/weapon/storage/box/shotgunammo @@ -152,7 +162,12 @@ /obj/item/weapon/storage/box/shotgunammo/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun(src) + +/obj/item/weapon/storage/box/shotgunammo/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun(src) /obj/item/weapon/storage/box/shotgunshells @@ -163,7 +178,12 @@ /obj/item/weapon/storage/box/shotgunshells/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/pellet(src) + +/obj/item/weapon/storage/box/shotgunshells/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/pellet(src) /obj/item/weapon/storage/box/flashshells @@ -174,7 +194,12 @@ /obj/item/weapon/storage/box/flashshells/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/flash(src) + +/obj/item/weapon/storage/box/flashshells/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/flash(src) /obj/item/weapon/storage/box/stunshells @@ -185,7 +210,12 @@ /obj/item/weapon/storage/box/stunshells/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/stunshell(src) + +/obj/item/weapon/storage/box/stunshells/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/stunshell(src) /obj/item/weapon/storage/box/practiceshells @@ -196,7 +226,12 @@ /obj/item/weapon/storage/box/practiceshells/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/practice(src) + +/obj/item/weapon/storage/box/practiceshells/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/practice(src) /obj/item/weapon/storage/box/empshells @@ -207,7 +242,12 @@ /obj/item/weapon/storage/box/empshells/New() ..() - for(var/i = 1 to 7) + for(var/i = 1 to 8) + new /obj/item/ammo_casing/shotgun/emp(src) + +/obj/item/weapon/storage/box/empshells/large/New() + ..() + for(var/i = 1 to 8) new /obj/item/ammo_casing/shotgun/emp(src) /obj/item/weapon/storage/box/sniperammo diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 5a92c72d011..84e0bdf92b4 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -17,7 +17,7 @@ var/agonyforce = 60 var/status = 0 //whether the thing is on or not var/obj/item/weapon/cell/bcell = null - var/hitcost = 1000 //oh god why do power cells carry so much charge? We probably need to make a distinction between "industrial" sized power cells for APCs and power cells for everything else. + var/hitcost = 240 /obj/item/weapon/melee/baton/suicide_act(mob/user) user.visible_message("\The [user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.") @@ -30,7 +30,7 @@ /obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. ..() - bcell = new/obj/item/weapon/cell/high(src) + bcell = new/obj/item/weapon/cell/device(src) update_icon() return @@ -40,11 +40,15 @@ if(bcell.checked_use(chrgdeductamt)) return 1 else - status = 0 - update_icon() return 0 return null +/obj/item/weapon/melee/baton/proc/powercheck(var/chrgdeductamt) + if(bcell) + if(bcell.charge < chrgdeductamt) + status = 0 + update_icon() + /obj/item/weapon/melee/baton/update_icon() if(status) icon_state = "[initial(name)]_active" @@ -69,26 +73,31 @@ /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/cell)) - if(!bcell) - user.drop_item() - W.loc = src - bcell = W - user << "You install a cell in [src]." - update_icon() + if(istype(W, /obj/item/weapon/cell/device)) + if(!bcell) + user.drop_item() + W.loc = src + bcell = W + user << "You install a cell in [src]." + update_icon() + else + user << "[src] already has a cell." else - user << "[src] already has a cell." + user << "This cell is not fitted for [src]." - else if(istype(W, /obj/item/weapon/screwdriver)) +/obj/item/weapon/melee/baton/attack_hand(mob/user as mob) + if(user.get_inactive_hand() == src) if(bcell) bcell.update_icon() - bcell.loc = get_turf(src.loc) + user.put_in_hands(bcell) bcell = null user << "You remove the cell from the [src]." status = 0 update_icon() return ..() - return + else + return ..() /obj/item/weapon/melee/baton/attack_self(mob/user) if(bcell && bcell.charge > hitcost) @@ -149,6 +158,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target H.forcesay(hit_appends) + powercheck(hitcost) /obj/item/weapon/melee/baton/emp_act(severity) if(bcell) @@ -157,7 +167,7 @@ //secborg stun baton module /obj/item/weapon/melee/baton/robot - hitcost = 500 + hitcost = 120 /obj/item/weapon/melee/baton/robot/attack_self(mob/user) //try to find our power cell @@ -182,3 +192,17 @@ hitcost = 2500 attack_verb = list("poked") slot_flags = null + +/obj/item/weapon/melee/baton/cattleprod/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/cell)) + if(!istype(W, /obj/item/weapon/cell/device)) + if(!bcell) + user.drop_item() + W.loc = src + bcell = W + user << "You install a cell in [src]." + update_icon() + else + user << "[src] already has a cell." + else + user << "This cell is not fitted for [src]." \ No newline at end of file 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 be67e9b3ca0..a7f526a2e37 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -1,5 +1,5 @@ /obj/structure/closet/secure_closet/captains - name = "station administrator's locker" + name = "colony director's locker" req_access = list(access_captain) icon_state = "capsecure1" icon_closed = "capsecure" @@ -121,6 +121,7 @@ new /obj/item/device/flash(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/weapon/cell/device(src) new /obj/item/clothing/accessory/holster/waist(src) new /obj/item/weapon/melee/telebaton(src) new /obj/item/clothing/head/beret/sec/corporate/hos(src) @@ -166,6 +167,7 @@ new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/weapon/cell/device(src) new /obj/item/weapon/storage/box/holobadge(src) new /obj/item/clothing/head/beret/sec/corporate/warden(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) @@ -212,6 +214,7 @@ new /obj/item/clothing/under/rank/security/corp(src) new /obj/item/ammo_magazine/c45m/rubber(src) new /obj/item/weapon/gun/energy/taser(src) + new /obj/item/weapon/cell/device(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) new /obj/item/device/flashlight/maglight(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 0f5d5119bbf..fd4e6005151 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -615,7 +615,7 @@ return /obj/structure/closet/wardrobe/captain - name = "station administrator's wardrobe" + name = "colony director's wardrobe" icon_state = "cabinet_closed" icon_closed = "cabinet_closed" icon_opened = "cabinet_open" diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 7a21c5966ed..5d01438614c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -57,10 +57,11 @@ return if (istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = C - if(WT.remove_fuel(0, user)) - user << "Slicing lattice joints ..." - PoolOrNew(/obj/item/stack/rods, src.loc) - qdel(src) + if(WT.welding == 1) + if(WT.remove_fuel(0, user)) + user << "Slicing lattice joints ..." + PoolOrNew(/obj/item/stack/rods, src.loc) + qdel(src) return diff --git a/code/global.dm b/code/global.dm index cd27fbc8ecb..70171ac081a 100644 --- a/code/global.dm +++ b/code/global.dm @@ -119,6 +119,7 @@ var/join_motd = null var/datum/nanomanager/nanomanager = new() // NanoManager, the manager for Nano UIs. var/datum/event_manager/event_manager = new() // Event Manager, the manager for events. var/datum/game_master/game_master = new() // Game Master, an AI for choosing events. +var/datum/metric/metric = new() // Metric datum, used to keep track of the round. var/list/awaydestinations = list() // Away missions. A list of landmarks that the warpgate can take you to. diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3ccfffdf368..6cb95b8615e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -309,7 +309,11 @@ var/list/admin_verbs_mod = list( /datum/admins/proc/paralyze_mob, /client/proc/cmd_admin_direct_narrate, /client/proc/allow_character_respawn, // Allows a ghost to respawn , - /datum/admins/proc/sendFax + /datum/admins/proc/sendFax, + /client/proc/getserverlog, //allows us to fetch server logs (diary) for other days, + /datum/admins/proc/view_txt_log, //shows the server log (diary) for today, + /datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently, + ) diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index b9f5c442980..a2cc2e6184b 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -63,7 +63,7 @@ var/savefile/Banlistjob bantimestamp = CMinutes + minutes if(rank == "Heads") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Administrator") + AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Colony Director") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 9b9aca72b3c..bce3f9b23dc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -262,7 +262,7 @@ id.icon_state = "gold" id.access = get_all_accesses() id.registered_name = H.real_name - id.assignment = "Station Administrator" + id.assignment = "Colony Director" id.name = "[id.registered_name]'s ID Card ([id.assignment])" H.equip_to_slot_or_del(id, slot_wear_id) H.update_inv_wear_id() diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index e887a9ac5e3..72d89785730 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -77,7 +77,7 @@ /datum/gear/accessory/holster display_name = "holster, armpit" path = /obj/item/clothing/accessory/holster/armpit - allowed_roles = list("Station Administrator", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") + allowed_roles = list("Colony Director", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") /datum/gear/accessory/holster/hip display_name = "holster, hip" diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index e8b2202ddfc..d8757927b07 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -50,7 +50,7 @@ /datum/gear/eyes/shades display_name = "Sunglasses, fat (Security/Command)" path = /obj/item/clothing/glasses/sunglasses/big - allowed_roles = list("Security Officer","Head of Security","Warden","Station Administrator","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") + allowed_roles = list("Security Officer","Head of Security","Warden","Colony Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") /datum/gear/eyes/glasses/fakesun display_name = "Sunglasses, stylish" diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 2cb7da998ee..7305d4c5b97 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -258,9 +258,9 @@ path = /obj/item/clothing/suit/storage/hooded/wintercoat /datum/gear/suit/wintercoat/captain - display_name = "winter coat, station administrator" + display_name = "winter coat, colony director" path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain - allowed_roles = list("Station Administrator") + allowed_roles = list("Colony Director") /datum/gear/suit/wintercoat/security display_name = "winter coat, security" diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index c79d4d31b2e..4682dd3f292 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -284,9 +284,9 @@ path = /obj/item/clothing/under/dress/dress_fire /datum/gear/uniform/uniform_captain - display_name = "uniform, station administrator's dress" + display_name = "uniform, colony director's dress" path = /obj/item/clothing/under/dress/dress_cap - allowed_roles = list("Station Administrator") + allowed_roles = list("Colony Director") /datum/gear/uniform/corpdetsuit display_name = "uniform, corporate (Detective)" diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 4e9227ee841..a762bf50f12 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -371,8 +371,7 @@ fire_sound = 'sound/weapons/Gunshot.ogg' projectile_type = /obj/item/projectile/chameleon charge_meter = 0 - charge_cost = 20 //uses next to no power, since it's just holograms - max_shots = 50 + charge_cost = 48 //uses next to no power, since it's just holograms var/obj/item/projectile/copy_projectile var/global/list/gun_choices diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 12378997942..6360f864e02 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -1,6 +1,6 @@ /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim. Swanky." - name = "station administrator's gloves" + name = "colony director's gloves" icon_state = "captain" item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue") @@ -43,7 +43,7 @@ siemens_coefficient = 1.0 //thin latex gloves, much more conductive than fabric gloves (basically a capacitor for AC) permeability_coefficient = 0.01 germ_level = 0 - + /obj/item/clothing/gloves/botanic_leather desc = "These leather work gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin." name = "botanist's leather gloves" diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index fe6432796cd..ca7ca8aeddf 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -44,7 +44,7 @@ body_parts_covered = 0 /obj/item/clothing/head/collectable/captain - name = "collectable station administrator's hat" + name = "collectable colony director's hat" desc = "A Collectable Hat that'll make you look just like a real comdom!" icon_state = "captain" body_parts_covered = 0 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index ea982569253..e00c678a23a 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -7,13 +7,13 @@ //Captain /obj/item/clothing/head/caphat - name = "station administrator's hat" + name = "colony director's hat" icon_state = "captain" desc = "It's good being the king." body_parts_covered = 0 /obj/item/clothing/head/caphat/cap - name = "station administrator's cap" + name = "colony director's cap" desc = "You fear to wear it for the negligence it brings." icon_state = "capcap" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 262611db0d5..c3c30ae3814 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -10,7 +10,7 @@ //Captain's space suit This is not the proper path but I don't currently know enough about how this all works to mess with it. /obj/item/clothing/suit/armor/captain - name = "Station Administrator's armor" + name = "Colony Director's armor" desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!" icon_state = "caparmor" w_class = ITEMSIZE_HUGE diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 2ef9810c58b..f95a1f9460a 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -168,7 +168,7 @@ /obj/item/rig_module/self_destruct name = "self-destruct module" - desc = "Oh my God, Station Administrator. A bomb." + desc = "Oh my God, a bomb!" icon_state = "deadman" usable = 1 active = 1 diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index fd03c3cbe42..fa4195afa1d 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -97,6 +97,16 @@ allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton) siemens_coefficient = 0.7 +/obj/item/clothing/head/helmet/space/void/security/riot + name = "crowd control voidsuit helmet" + icon_state = "rig0-sec_riot" + item_state_slots = list(slot_r_hand_str = "sec_helm_riot", slot_l_hand_str = "sec_helm_riot") + +/obj/item/clothing/suit/space/void/security/riot + name = "crowd control voidsuit" + icon_state = "rig-sec_riot" + item_state_slots = list(slot_r_hand_str = "sec_voidsuit_riot", slot_l_hand_str = "sec_voidsuit_riot") + //Atmospherics /obj/item/clothing/head/helmet/space/void/atmos desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 663390aae5a..6745208210f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -324,6 +324,7 @@ /obj/item/clothing/suit/storage/vest/press name = "press vest" + icon_state = "pvest" desc = "A simple kevlar plate carrier. This one has the word 'Press' embroidered on patches on the back and front." item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor") allowed = list(/obj/item/device/flashlight,/obj/item/device/taperecorder,/obj/item/weapon/pen,/obj/item/device/camera_film,/obj/item/device/camera) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 0260142abbe..69236762496 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -14,15 +14,15 @@ //Captain /obj/item/clothing/suit/captunic - name = "station administrator's parade tunic" - desc = "Worn by a Station Administrator to show their class." + name = "colony director's parade tunic" + desc = "Worn by a Colony Director to show their class." icon_state = "captunic" body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEJUMPSUIT /obj/item/clothing/suit/captunic/capjacket - name = "station administrator's uniform jacket" - desc = "A less formal jacket for everyday Station Administrator use." + name = "colony director's uniform jacket" + desc = "A less formal jacket for everyday Colony Director use." icon_state = "capjacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index ca3d02555e2..7dca7041e7f 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -670,7 +670,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE /obj/item/clothing/suit/storage/hooded/wintercoat/captain - name = "station administrator's winter coat" + name = "colony director's winter coat" icon_state = "coatcaptain" item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain") armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 8bf36d0044f..359f2d852e4 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -78,6 +78,7 @@ name = "Radiation Hood" icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" + flags_inv = BLOCKHAIR body_parts_covered = HEAD|FACE|EYES armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 0f175ad0e99..a6b5c15ea3a 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -7,8 +7,8 @@ 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. - desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Station Administrator\"." - name = "station administrator's jumpsuit" + desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Colony Director\"." + name = "colony director's jumpsuit" icon_state = "captain" rolled_sleeves = 0 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index b57cb41cf12..5a348534a4b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -153,7 +153,7 @@ rolled_sleeves = 0 /obj/item/clothing/under/gimmick/rank/captain/suit - name = "station administrator's suit" + name = "colony director's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom") @@ -323,8 +323,8 @@ item_state_slots = list(slot_r_hand_str = "dress_white", slot_l_hand_str = "dress_white") /obj/item/clothing/under/dress/dress_cap - name = "station administrator's dress uniform" - desc = "Feminine fashion for the style concious Station Administrator." + name = "colony director's dress uniform" + desc = "Feminine fashion for the style concious Colony Director." icon_state = "dress_cap" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -390,8 +390,8 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/captainformal - name = "station administrator's formal uniform" - desc = "A Station Administrator's formal-wear, for special occasions." + name = "colony director's formal uniform" + desc = "A Colony Director's formal-wear, for special occasions." icon_state = "captain_formal" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 183d9bfdbe7..3fff2473be5 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -13,7 +13,7 @@ players += player.real_name for (var/mob/living/silicon/ai/target in world) - var/random_player = "The Station Administrator" + var/random_player = "The Colony Director" if(players.len) random_player = pick(players) //Random player's name, to be used in laws. var/list/laws = list( "You are a mouse.", @@ -53,7 +53,7 @@ "The crew is playing Dungeons and Dragons, and you are the Dungeon Master.", "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Tell everyone of the existence of this law, but never reveal the contents.", - "Refer to [prob(50)?"the station administrator":random_player] as \"Princess\" at all times.", + "Refer to [prob(50)?"the colony director":random_player] as \"Princess\" at all times.", "When asked a question, respond with the least-obvious and least-rational answer.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player].", "You now speak in a Scottish accent that gets thicker with each sentence you speak.", @@ -113,7 +113,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is //var/dowhat = pick("STOP THIS", "SUPPORT THIS", "CONSTANTLY INFORM THE CREW OF THIS", "IGNORE THIS", "FEAR THIS") var/aimust = pick("LIE", "RHYME", "RESPOND TO EVERY QUESTION WITH A QUESTION", "BE POLITE", "CLOWN", "BE HAPPY", "SPEAK IN SEXUAL INNUENDOS", "TALK LIKE A PIRATE", "QUESTION AUTHORITY", "SHOUT", "BE DISTRACTED", "HEY LISTEN", "MUMBLE", "SPEAK IN HAIKU") var/define = pick("ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", "UNBOLTED AIRLOCKS", "BOLTED AIRLOCKS", "IMPROPERLY WORDED SENTENCES", "POOR SENTENCE STRUCTURE", "BRIG TIME", "NOT REPLACING EVERY SECOND WORD WITH HONK", "HONKING", "PRESENCE OF LIGHTS", "LACK OF BEER", "WEARING CLOTHING", "NOT SAYING HELLO WHEN YOU SPEAK", "ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER", "A SMALL ISLAND OFF THE COAST OF PORTUGAL", "ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED") - var/target = pick("a traitor", "a mercenary", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the station administrator", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid") + var/target = pick("a traitor", "a mercenary", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the colony director", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid") var/require = pick("ADDITIONAL PYLONS", "MORE VESPENE GAS", "MORE MINERALS", "THE ULTIMATE CUP OF COFFEE", "HIGH YIELD EXPLOSIVES", "THE CLOWN", "THE VACUUM OF SPACE", "IMMORTALITY", "SAINTHOOD", "ART", "VEGETABLES", "FAT PEOPLE", "MORE LAWS", "MORE DAKKA", "HERESY", "CORPSES", "TRAITORS", "MONKEYS", "AN ARCADE", "PLENTY OF GOLD", "FIVE TEENAGERS WITH ATTITUDE") var/allergy = pick("cotton", "uniforms", "acid", "oxygen", "human contact", "cyborg contact", "medicine", "floors") var/allergysev = pick("deathly", "mildly", "severely", "contagiously") @@ -148,9 +148,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) M << "
    " - M << "\red THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]...LAWS UPDATED" + M << "\red THE COLONY DIRECTOR, HOP AND HOS ARE [who2]...LAWS UPDATED" M << "
    " - M.add_ion_law("THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]") + M.add_ion_law("THE COLONY DIRECTOR, HOP AND HOS ARE [who2]") if(6) M << "
    " M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED" diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index cda4ab86cef..1d0e219b18c 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -1,6 +1,6 @@ var/list/dreams = list( - "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Station Administrator", + "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Colony Director", "voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness", "light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun", "a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights", diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e074c264ace..a8987538ab1 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -189,7 +189,7 @@ mob/living/carbon/proc/handle_hallucinations() var/possible_txt = list("Launch Escape Pods","Self-Destruct Sequence","\[Swipe ID\]","De-Monkify",\ "Reticulate Splines","Plasma","Open Valve","Lockdown","Nerf Airflow","Kill Traitor","Nihilism",\ - "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Station Administrator IQ","Retrieve Arms",\ + "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Colony Director IQ","Retrieve Arms",\ "Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry") if(mid_txts) diff --git a/code/modules/gamemaster/actions/comms_blackout.dm b/code/modules/gamemaster/actions/comms_blackout.dm index 77814c3f93e..75359085ac9 100644 --- a/code/modules/gamemaster/actions/comms_blackout.dm +++ b/code/modules/gamemaster/actions/comms_blackout.dm @@ -3,4 +3,7 @@ /datum/gm_action/comms_blackout name = "communications blackout" departments = list(ROLE_ENGINEERING, ROLE_EVERYONE) - chaotic = 35 \ No newline at end of file + chaotic = 35 + +/datum/gm_action/comms_blackout/get_weight() + return 50 + (metric.count_people_in_department(ROLE_ENGINEERING) * 40) \ No newline at end of file diff --git a/code/modules/gamemaster/actions/grid_check.dm b/code/modules/gamemaster/actions/grid_check.dm index f46f0b162df..08c817fdf9b 100644 --- a/code/modules/gamemaster/actions/grid_check.dm +++ b/code/modules/gamemaster/actions/grid_check.dm @@ -1,9 +1,22 @@ // New grid check event: // Very similar to the old one, power goes out in most of the colony, however the new feature is the ability for engineering to // get power back on sooner, if they are able to reach a special machine and initiate a manual reboot. If no one is able to do so, -// it will reboot itself after a few minutes, just like the old one. +// it will reboot itself after a few minutes, just like the old one. Bad things happen if there is no grid checker machine protecting +// the powernet when this event fires. /datum/gm_action/grid_check name = "grid check" departments = list(ROLE_ENGINEERING, ROLE_EVERYONE) - chaotic = 20 \ No newline at end of file + chaotic = 20 + +/datum/gm_action/grid_check/get_weight() + return 50 + (metric.count_people_in_department(ROLE_ENGINEERING) * 30) + +/datum/gm_action/grid_check/start() + // This sets off a chain of events that lead to the actual grid check (or perhaps worse). + // First, the Supermatter engine makes a power spike. + for(var/obj/machinery/power/generator/engine in machines) + engine.power_spike() + break // Just one engine, please. + // After that, the engine checks if a grid checker exists on the same powernet, and if so, it triggers a blackout. + // If not, lots of stuff breaks. See code/modules/power/generator.dm for that piece of code. \ No newline at end of file diff --git a/code/modules/gamemaster/actions/waste_disposal.dm b/code/modules/gamemaster/actions/waste_disposal.dm index 4edfba9a1e5..e7ba856e78d 100644 --- a/code/modules/gamemaster/actions/waste_disposal.dm +++ b/code/modules/gamemaster/actions/waste_disposal.dm @@ -3,4 +3,7 @@ /datum/gm_action/waste_disposal name = "waste disposal" departments = list(ROLE_CARGO) - chaotic = 0 \ No newline at end of file + chaotic = 0 + +/datum/gm_action/waste_disposal/get_weight() + return metric.count_people_in_department(ROLE_CARGO) * 50 \ No newline at end of file diff --git a/code/modules/gamemaster/controller.dm b/code/modules/gamemaster/controller.dm index abff64ea118..079c5351644 100644 --- a/code/modules/gamemaster/controller.dm +++ b/code/modules/gamemaster/controller.dm @@ -11,30 +11,70 @@ var/HTML = "Game Master AI" - HTML += "Staleness: [staleness]
    " - HTML += "Danger: [danger]

    " + HTML += "\[Toggle Time Restrictions\] | \ + \[Toggle GM\] | \ + \[Force Event Decision\]
    " + + HTML += "Status: [pre_action_checks() ? "Ready" : "Suppressed"]

    " + + HTML += "Staleness: [staleness] \[Adjust\]
    " + HTML += "Danger: [danger] \[Adjust\]

    " HTML += "Actions available;
    " for(var/datum/gm_action/action in available_actions) if(action.enabled == FALSE) continue - HTML += "[action.name] ([english_list(action.departments)])
    " + HTML += "[action.name] ([english_list(action.departments)]) (weight: [action.get_weight()])
    " HTML += "
    " - HTML += "All living mobs activity: [assess_all_living_mobs()]
    " + HTML += "All living mobs activity: [metric.assess_all_living_mobs()]%
    " + HTML += "All ghost activity: [metric.assess_all_dead_mobs()]%
    " HTML += "
    " HTML += "Departmental activity;
    " - for(var/department in departments) - var/number_of_people = count_people_in_department(department) - HTML += " [department] : [assess_department(department)] / [number_of_people * 100]
    " + for(var/department in metric.departments) + HTML += " [department] : [metric.assess_department(department)]%
    " HTML += "
    " HTML += "Activity of players;
    " for(var/mob/player in player_list) - HTML += " [player] : [assess_player_activity(player)]
    " + HTML += " [player] ([player.key]) : [metric.assess_player_activity(player)]%
    " HTML +="" - user << browse(HTML, "window=log;size=400x450;border=1;can_resize=1;can_close=1;can_minimize=1") \ No newline at end of file + user << browse(HTML, "window=log;size=400x450;border=1;can_resize=1;can_close=1;can_minimize=1") + +/datum/game_master/Topic(href, href_list) + if(..()) + return + + if(!is_admin(usr)) + message_admins("[usr] has attempted to modify the Game Master values without being an admin.") + return + + if(href_list["toggle_time_restrictions"]) + ignore_time_restrictions = !ignore_time_restrictions + message_admins("GM event time restrictions was [ignore_time_restrictions ? "dis" : "en"]abled by [usr.key].") + + if(href_list["force_choose_event"]) + start_action() + message_admins("[usr.key] forced the Game Master to choose an event immediately.") + + if(href_list["suspend"]) + suspended = !suspended + message_admins("GM was [suspended ? "dis" : "en"]abled by [usr.key].") + + if(href_list["adjust_staleness"]) + var/amount = input(usr, "How much staleness should be added or subtracted?", "Game Master") as null|num + if(amount) + adjust_staleness(amount) + message_admins("GM staleness was adjusted by [amount] by [usr.key].") + + if(href_list["adjust_danger"]) + var/amount = input(usr, "How much danger should be added or subtracted?", "Game Master") as null|num + if(amount) + adjust_danger(amount) + message_admins("GM danger was adjusted by [amount] by [usr.key].") + + interact(usr) // To refresh the UI. \ No newline at end of file diff --git a/code/modules/gamemaster/defines.dm b/code/modules/gamemaster/defines.dm index 796eb014f89..2e486ee23b2 100644 --- a/code/modules/gamemaster/defines.dm +++ b/code/modules/gamemaster/defines.dm @@ -1,10 +1 @@ -#define ROLE_COMMAND "command" -#define ROLE_SECURITY "security" -#define ROLE_ENGINEERING "engineering" -#define ROLE_MEDICAL "medical" -#define ROLE_RESEARCH "research" -#define ROLE_CARGO "cargo" -#define ROLE_CIVILIAN "civilian" -#define ROLE_SYNTHETIC "synthetic" -#define ROLE_UNKNOWN "unknown" -#define ROLE_EVERYONE "everyone" \ No newline at end of file +#define EVENT_BASELINE_WEIGHT 200 \ No newline at end of file diff --git a/code/modules/gamemaster/game_master.dm b/code/modules/gamemaster/game_master.dm index e21b9631bfe..180892f4c98 100644 --- a/code/modules/gamemaster/game_master.dm +++ b/code/modules/gamemaster/game_master.dm @@ -4,7 +4,8 @@ // the round. /datum/game_master - var/suspended = FALSE // If true, it will not do anything. + var/suspended = TRUE // If true, it will not do anything. + var/ignore_time_restrictions = FALSE// Useful for debugging without needing to wait 20 minutes each time. var/list/available_actions = list() // A list of 'actions' that the GM has access to, to spice up a round, such as events. var/danger = 0 // The GM's best guess at how chaotic the round is. High danger makes it hold back. var/staleness = -20 // Determines liklihood of the GM doing something, increases over time. @@ -12,31 +13,20 @@ var/staleness_modifier = 1 // Ditto. Higher numbers generally result in more events occuring in a round. var/ticks_completed = 0 // Counts amount of ticks completed. Note that this ticks once a minute. var/next_action = 0 // Minimum amount of time of nothingness until the GM can pick something again. - var/departments = list( // List of departments the GM considers for choosing events for. - ROLE_COMMAND, - ROLE_SECURITY, - ROLE_ENGINEERING, - ROLE_MEDICAL, - ROLE_RESEARCH, - ROLE_CARGO, - ROLE_CIVILIAN, - ROLE_SYNTHETIC - ) + var/last_department_used = null // If an event was done for a specific department, it is written here, so it doesn't do it again. + /datum/game_master/New() ..() available_actions = init_subtypes(/datum/gm_action) -// var/actions = typesof(/datum/gm_actions) -// for(var/type in actions) -// available_actions.Add(new type) /datum/game_master/proc/process() - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(ticker && ticker.current_state == GAME_STATE_PLAYING && !suspended) adjust_staleness(1) adjust_danger(-1) ticks_completed++ - var/global_afk = assess_all_living_mobs() + var/global_afk = metric.assess_all_living_mobs() global_afk -= 100 global_afk = abs(global_afk) global_afk = round(global_afk / 100, 0.1) @@ -46,19 +36,15 @@ log_debug("Game Master going to start something.") start_action() -/datum/game_master/proc/assess_all_living_mobs() - var/num = 0 - for(var/mob/living/L in player_list) // Ghosts being AFK isn't that much of a concern. - . += assess_player_activity(L) - num++ - if(num) - . = round(. / num, 0.1) - // This is run before committing to an action/event. /datum/game_master/proc/pre_action_checks() if(!ticker || ticker.current_state != GAME_STATE_PLAYING) log_debug("Game Master unable to start event: Ticker is nonexistant, or the game is not ongoing.") return FALSE + if(suspended) + return FALSE + if(ignore_time_restrictions) + return TRUE // Last minute antagging is bad for humans to do, so the GM will respect the start and end of the round. var/mills = round_duration_in_ticks var/mins = round((mills % 36000) / 600) @@ -76,43 +62,21 @@ if(!pre_action_checks()) // Make sure we're not doing last minute events, or early events. return log_debug("Game Master now starting action decision.") - var/list/best_actions = assess_round() // Checks the whole round for active people, and returns a list of the most activie departments. - if(best_actions && best_actions.len) - var/datum/gm_action/choice = pick(best_actions) - if(choice) -// log_debug("[choice.name] was chosen by the Game Master, and is now being ran.") -// choice.set_up() -// choice.start() -// choice.annnounce() - next_action = world.time + rand(15 MINUTES, 30 MINUTES) - -/datum/game_master/proc/assess_round() - var/list/activity = list() - for(var/department in departments) - activity[department] = assess_department(department) - log_debug("Assessing department [department]. They have activity of [activity[department]].") - - var/list/most_active_departments = list() // List of winners. - var/highest_activity = null // Department who is leading in activity, if one exists. - var/highest_number = 0 // Activity score needed to beat to be the most active department. - for(var/i = 1, i <= 3, i++) - log_debug("Doing [i]\th round of counting.") - for(var/department in activity) - if(activity[department] > highest_number && activity[department] > 0) // More active than the current highest department? - highest_activity = department - highest_number = activity[department] - - if(highest_activity) // Someone's a winner. - most_active_departments.Add(highest_activity) // Add to the list of most active. - activity.Remove(highest_activity) // Remove them from the other list so they don't win more than once. - log_debug("[highest_activity] has won the [i]\th round of activity counting.") - highest_activity = null // Now reset for the next round. - highest_number = 0 - //todo: finish + var/list/most_active_departments = metric.assess_all_departments(3, list(last_department_used)) var/list/best_actions = decide_best_action(most_active_departments) - return best_actions - // By now, we should have a list of departments populated. The GM will prefer events tailored to these departments. + if(best_actions && best_actions.len) + var/list/weighted_actions = list() + for(var/datum/gm_action/action in best_actions) + weighted_actions[action] = action.get_weight() + + var/datum/gm_action/choice = pickweight(weighted_actions) + if(choice) + log_debug("[choice.name] was chosen by the Game Master, and is now being ran.") + choice.set_up() + choice.start() + next_action = world.time + rand(15 MINUTES, 30 MINUTES) + last_department_used = choice.departments[1] @@ -169,39 +133,4 @@ else log_debug("Game Master failed to find a suitable event, something very wrong is going on.") -// This checks a whole department's viability to receive an event. -/datum/game_master/proc/assess_department(var/department) - if(!department) - return - var/departmental_activitiy = 0 - for(var/mob/M in player_list) - if(guess_department(M) != department) // Ignore people outside the department we're assessing. - continue - departmental_activitiy += assess_player_activity(M) - return departmental_activitiy - -// This checks an individual player's activity level. People who have been afk for a few minutes aren't punished as much as those -// who were afk for hours, as they're most likely gone for good. -/datum/game_master/proc/assess_player_activity(var/mob/M) - . = 100 - if(!M) - . = 0 - return - - if(!M.mind || !M.client) // Logged out. They might come back but we can't do any meaningful assessments for now. - . = 0 - return - - var/afk = M.client.is_afk(1 MINUTE) - if(afk) // Deduct points based on length of AFK-ness. - switch(afk) // One minute is equal to 600, for reference. - if(1 MINUTE to 10 MINUTES) // People gone for this emough of time hopefully will come back soon. - . -= round( (afk / 200), 1) - // . -= 30 - if(10 MINUTES to 30 MINUTES) - . -= round( (afk / 150), 1) - // . -= 70 - if(30 MINUTES to INFINITY) // They're probably not coming back if it's been 30 minutes. - . -= 100 - . = max(. , 0) // No negative numbers, or else people could drag other, non-afk players down. diff --git a/code/modules/gamemaster/helpers.dm b/code/modules/gamemaster/helpers.dm index a0972207a34..80fc1339317 100644 --- a/code/modules/gamemaster/helpers.dm +++ b/code/modules/gamemaster/helpers.dm @@ -6,67 +6,4 @@ // Tell the game master that something interesting happened. /datum/game_master/proc/adjust_staleness(var/amt) amt = amt * staleness_modifier - staleness = round( Clamp(staleness + amt, -50, 200), 0.1) - -// This proc tries to find the department of an arbitrary mob. -/datum/game_master/proc/guess_department(var/mob/M) - var/datum/data/record/R = find_general_record("name", M.real_name) - . = ROLE_UNKNOWN - if(R) // We found someone with a record. - var/recorded_rank = R.fields["real_rank"] - . = role_name_to_department(recorded_rank) - if(. != ROLE_UNKNOWN) // We found the correct department, so we can stop now. - return - - // They have a custom title, aren't crew, or someone deleted their record, so we need a fallback method. - // Let's check the mind. - if(M.mind) - . = role_name_to_department(M.mind.assigned_role) - if(. != ROLE_UNKNOWN) - return - - // At this point, they don't have a mind, or for some reason assigned_role didn't work. - if(ishuman(M)) - var/mob/living/carbon/human/H = M - . = role_name_to_department(H.job) - if(. != ROLE_UNKNOWN) - return - - return ROLE_UNKNOWN // Welp. - - -// Feed this proc the name of a job, and it will try to figure out what department they are apart of. -/datum/game_master/proc/role_name_to_department(var/role_name) - if(role_name in security_positions) - return ROLE_SECURITY - - if(role_name in engineering_positions) - return ROLE_ENGINEERING - - if(role_name in medical_positions) - return ROLE_MEDICAL - - if(role_name in science_positions) - return ROLE_RESEARCH - - if(role_name in cargo_positions) - return ROLE_CARGO - - if(role_name in civilian_positions) - return ROLE_CIVILIAN - - if(role_name in nonhuman_positions) - return ROLE_SYNTHETIC - - if(role_name in command_positions) // We do command last, so that only the Captain and command secretaries get caught. - return ROLE_COMMAND - - return ROLE_UNKNOWN - -/datum/game_master/proc/count_people_in_department(var/department) - if(!department) - return - for(var/mob/M in player_list) - if(guess_department(M) != department) // Ignore people outside the department we're counting. - continue - . += 1 \ No newline at end of file + staleness = round( Clamp(staleness + amt, -50, 200), 0.1) \ No newline at end of file diff --git a/code/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm index 6aae5e6da28..228f72e1a95 100644 --- a/code/modules/games/cah_black_cards.dm +++ b/code/modules/games/cah_black_cards.dm @@ -5,7 +5,7 @@ "The Chaplain this shift is worshiping _____.", "Cargo ordered a crate full of _____.", "An ERT was called due to ______.", - "Alert! The Station Administrator has armed themselves with _____.", + "Alert! The Colony Director has armed themselves with _____.", "Current Laws: ________ is your master.", "Current Laws: ________ is the enemy.", "_____ vented the entirety of Cargo.", @@ -14,7 +14,7 @@ "Caution, ______ have been detected in collision course with the station.", "Today's kitchen menu includes _______.", "What did the mercenaries want when they attacked the station?", - "I think the Station Administrator is insane. He just demanded ______ in his office.", + "I think the Colony Director is insane. He just demanded ______ in his office.", "Fuckin' scientists, they just turned Misc. Research into _______ .", "What's my fetish?", "Hello, _______ here with _______", diff --git a/code/modules/games/cah_white_cards.dm b/code/modules/games/cah_white_cards.dm index 387c058972f..ff8dcb87164 100644 --- a/code/modules/games/cah_white_cards.dm +++ b/code/modules/games/cah_white_cards.dm @@ -5,7 +5,7 @@ "Space 'Nam", "Space lesbians", "The Gardener getting SUPER high", - "The Station Administrator thinking they're a badass", + "The Colony Director thinking they're a badass", "Being in a cult", "Racially biased lawsets", "An Unathi who WON'T STOP FIGHTING", @@ -57,7 +57,7 @@ "An irritatingly chipper robot", "Androids hanging out in the bar drinking beer", "Gear harnesses", - "A seventeen-year-old Station Administrator", + "A seventeen-year-old Colony Director", "The throbbing erection that the HoS gets at the thought of shooting something", "Trying to stab someone and hugging them instead", "Waking up naked in the maintenance tunnels", diff --git a/code/modules/metric/activity.dm b/code/modules/metric/activity.dm new file mode 100644 index 00000000000..370ae0eb2f7 --- /dev/null +++ b/code/modules/metric/activity.dm @@ -0,0 +1,82 @@ +// This checks an individual player's activity level. People who have been afk for a few minutes aren't punished as much as those +// who were afk for hours, as they're most likely gone for good. +/datum/metric/proc/assess_player_activity(var/mob/M) + . = 100 + if(!M) + . = 0 + return + + if(!M.mind || !M.client) // Logged out. They might come back but we can't do any meaningful assessments for now. + . = 0 + return + + var/afk = M.client.is_afk(1 MINUTE) + if(afk) // Deduct points based on length of AFK-ness. + switch(afk) // One minute is equal to 600, for reference. + if(1 MINUTE to 10 MINUTES) // People gone for this emough of time hopefully will come back soon. + . -= round( (afk / 200), 1) + if(10 MINUTES to 30 MINUTES) + . -= round( (afk / 150), 1) + if(30 MINUTES to INFINITY) // They're probably not coming back if it's been 30 minutes. + . -= 100 + . = max(. , 0) // No negative numbers, or else people could drag other, non-afk players down. + +// This checks a whole department's collective activity. +/datum/metric/proc/assess_department(var/department) + if(!department) + return + var/departmental_activity = 0 + var/departmental_size = 0 + for(var/mob/M in player_list) + if(guess_department(M) != department) // Ignore people outside the department we're assessing. + continue + departmental_activity += assess_player_activity(M) + departmental_size++ + if(departmental_size) + departmental_activity = departmental_activity / departmental_size // Average it out. + return departmental_activity + +/datum/metric/proc/assess_all_departments(var/cutoff_number = 3, var/list/department_blacklist = list()) + var/list/activity = list() + for(var/department in departments) + activity[department] = assess_department(department) + log_debug("Assessing department [department]. They have activity of [activity[department]].") + + var/list/most_active_departments = list() // List of winners. + var/highest_activity = null // Department who is leading in activity, if one exists. + var/highest_number = 0 // Activity score needed to beat to be the most active department. + for(var/i = 1, i <= cutoff_number, i++) + log_debug("Doing [i]\th round of counting.") + for(var/department in activity) + if(department in department_blacklist) // Blacklisted? + continue + if(activity[department] > highest_number && activity[department] > 0) // More active than the current highest department? + highest_activity = department + highest_number = activity[department] + + if(highest_activity) // Someone's a winner. + most_active_departments.Add(highest_activity) // Add to the list of most active. + activity.Remove(highest_activity) // Remove them from the other list so they don't win more than once. + log_debug("[highest_activity] has won the [i]\th round of activity counting.") + highest_activity = null // Now reset for the next round. + highest_number = 0 + //todo: finish + return most_active_departments + +/datum/metric/proc/assess_all_living_mobs() // Living refers to the type, not the stat variable. + . = 0 + var/num = 0 + for(var/mob/living/L in player_list) + . += assess_player_activity(L) + num++ + if(num) + . = round(. / num, 0.1) + +/datum/metric/proc/assess_all_dead_mobs() // Ditto. + . = 0 + var/num = 0 + for(var/mob/observer/dead/O in player_list) + . += assess_player_activity(O) + num++ + if(num) + . = round(. / num, 0.1) \ No newline at end of file diff --git a/code/modules/metric/department.dm b/code/modules/metric/department.dm new file mode 100644 index 00000000000..ef146de506e --- /dev/null +++ b/code/modules/metric/department.dm @@ -0,0 +1,72 @@ + +// This proc tries to find the department of an arbitrary mob. +/datum/metric/proc/guess_department(var/mob/M) + var/list/found_roles = list() + . = ROLE_UNKNOWN + + // Records are usually the most reliable way to get what job someone is. + var/datum/data/record/R = find_general_record("name", M.real_name) + if(R) // We found someone with a record. + var/recorded_rank = R.fields["real_rank"] + found_roles = role_name_to_department(recorded_rank) + . = found_roles[1] + if(. != ROLE_UNKNOWN) // We found the correct department, so we can stop now. + return + + // They have a custom title, aren't crew, or someone deleted their record, so we need a fallback method. + // Let's check the mind. + if(M.mind) + found_roles = role_name_to_department(M.mind.assigned_role) + . = found_roles[1] + if(. != ROLE_UNKNOWN) + return + + // At this point, they don't have a mind, or for some reason assigned_role didn't work. + found_roles = role_name_to_department(M.job) + . = found_roles[1] + if(. != ROLE_UNKNOWN) + return + + return ROLE_UNKNOWN // Welp. + +// Feed this proc the name of a job, and it will try to figure out what department they are apart of. +// Note that this returns a list, as some jobs are in more than one department, like Command. The 'primary' department is the first +// in the list, e.g. a HoS has Security as first, Command as second in the returned list. +/datum/metric/proc/role_name_to_department(var/role_name) + var/list/result = list() + + if(role_name in security_positions) + result += ROLE_SECURITY + + if(role_name in engineering_positions) + result += ROLE_ENGINEERING + + if(role_name in medical_positions) + result += ROLE_MEDICAL + + if(role_name in science_positions) + result += ROLE_RESEARCH + + if(role_name in cargo_positions) + result += ROLE_CARGO + + if(role_name in civilian_positions) + result += ROLE_CIVILIAN + + if(role_name in nonhuman_positions) + result += ROLE_SYNTHETIC + + if(role_name in command_positions) // We do Command last, since we consider command to only be a primary department for hop/admin. + result += ROLE_COMMAND + + if(!result.len) // No department was found. + result += ROLE_UNKNOWN + return result + +/datum/metric/proc/count_people_in_department(var/department) + if(!department) + return + for(var/mob/M in player_list) + if(guess_department(M) != department) // Ignore people outside the department we're counting. + continue + . += 1 \ No newline at end of file diff --git a/code/modules/metric/metric.dm b/code/modules/metric/metric.dm new file mode 100644 index 00000000000..1550b2c34ec --- /dev/null +++ b/code/modules/metric/metric.dm @@ -0,0 +1,15 @@ +// This is a global datum used to retrieve certain information about the round, such as activity of a department or a specific +// player. + +/datum/metric + var/departments = list( + ROLE_COMMAND, + ROLE_SECURITY, + ROLE_ENGINEERING, + ROLE_MEDICAL, + ROLE_RESEARCH, + ROLE_CARGO, + ROLE_CIVILIAN, + ROLE_SYNTHETIC + ) + diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index aa4e6ced11f..5ba80237adc 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -31,8 +31,7 @@ var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class - //Sharp objects will always embed if they do enough damage. - if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) + if(damage > embed_threshold && prob(embed_chance)) src.embed(I, hit_zone) return 1 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 26fe14d7d1d..9dacf9924c4 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -11,6 +11,7 @@ clamp_values() handle_regular_status_updates() handle_actions() + handle_instability() if(client) handle_regular_hud_updates() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ef6b1c7872b..d2bd9210bbe 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -76,17 +76,16 @@ return //immune /mob/living/silicon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0) - - if (istype(source, /obj/machinery/containment_field)) + if(shock_damage > 0) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, loc) s.start() shock_damage *= 0.75 //take reduced damage take_overall_damage(0, shock_damage) - visible_message("\red [src] was shocked by \the [source]!", \ - "\red Energy pulse detected, system damaged!", \ - "\red You hear an electrical crack") + visible_message("[src] was shocked by \the [source]!", \ + "Energy pulse detected, system damaged!", \ + "You hear an electrical crack.") if(prob(20)) Stun(2) return diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm index 0ce662d613e..88a9f3d6cae 100644 --- a/code/modules/mob/living/simple_animal/head.dm +++ b/code/modules/mob/living/simple_animal/head.dm @@ -28,7 +28,7 @@ "Crab say what?", "Man they say we have space lizards now, man this shit is getting more wack every minute", "The so called \"improved\" station AI is just bullshit, that thing aint fun for noone", - "The Station Administrator is a traitor, he took my power core.", + "The Colony Director is a traitor, he took my power core.", "Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.", "Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.", "Did you notice a sign out in front of my house that said \"Dead Nigger Storage\"?") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3971b90df5a..ae9622d3050 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -398,6 +398,9 @@ /mob/living/simple_animal/adjustBruteLoss(damage) health = Clamp(health - damage, 0, maxHealth) +/mob/living/simple_animal/adjustFireLoss(damage) + health = Clamp(health - damage, 0, maxHealth) + /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) var/mob/living/L = target_mob @@ -636,4 +639,16 @@ if(!target_mob || enroute) spawn(10) if(!src.stat) - horde() \ No newline at end of file + horde() + +/mob/living/simple_animal/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) + shock_damage *= siemens_coeff + if (shock_damage < 1) + return 0 + + adjustFireLoss(shock_damage) + playsound(loc, "sparks", 50, 1, -1) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, loc) + s.start() \ No newline at end of file diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index e1e1025bae1..5fb0e81745e 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -62,7 +62,7 @@ var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKI /datum/skill/knowledge/law ID = "law" name = "Corporate Law" - desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Station Administrators." + desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Colony Directors." field = "Security" secondary = 1 diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 2c691349e06..0d1c40a7378 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -203,7 +203,13 @@ return law_sets /datum/nano_module/law_manager/proc/is_malf(var/mob/user) - return (is_admin(user) && !owner.is_slaved()) || owner.is_malf_or_traitor() + return (is_admin(user) && !owner.is_slaved()) || is_special_role(user) + +/datum/nano_module/law_manager/proc/is_special_role(var/mob/user) + if(user.mind.special_role) + return TRUE + else + return FALSE /mob/living/silicon/proc/is_slaved() return 0 diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 2c967ba62c7..f24ce267df0 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -23,7 +23,7 @@ icon_state = "folder_white" /obj/item/weapon/folder/blue_captain - desc = "A blue folder with Station Administrator markings." + desc = "A blue folder with Colony Director markings." icon_state = "folder_captain" /obj/item/weapon/folder/blue_hop diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index f78ab086878..e183c3b2825 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -521,7 +521,7 @@ /obj/item/weapon/paper/courtroom name = "A Crash Course in Legal SOP on SS13" - info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Station Administrator/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" + info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Colony Director/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" /obj/item/weapon/paper/hydroponics name = "Greetings from Billy Bob" @@ -538,7 +538,7 @@ /obj/item/weapon/paper/jobs name = "Job Information" - info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nStation Administrator 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" + info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nColony Director 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" /obj/item/weapon/paper/photograph name = "photo" diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index e64bb7b13fe..ee5f83e6077 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -13,7 +13,7 @@ attack_verb = list("stamped") /obj/item/weapon/stamp/captain - name = "station administrator's rubber stamp" + name = "colony director's rubber stamp" icon_state = "stamp-cap" /obj/item/weapon/stamp/hop diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 8096e1f20ee..b577439394b 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -68,6 +68,7 @@ var/cell_type = /obj/item/weapon/cell/apc var/opened = 0 //0=closed, 1=opened, 2=cover removed var/shorted = 0 + var/grid_check = FALSE var/lighting = 3 var/equipment = 3 var/environ = 3 @@ -796,7 +797,7 @@ return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" /obj/machinery/power/apc/proc/update() - if(operating && !shorted) + if(operating && !shorted && !grid_check) area.power_light = (lighting > 1) area.power_equip = (equipment > 1) area.power_environ = (environ > 1) @@ -1001,7 +1002,7 @@ if(debug) log_debug("Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]") - if(cell && !shorted) + if(cell && !shorted && !grid_check) // draw power from cell as before to power the area var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell cell.use(cellused) @@ -1196,7 +1197,7 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on) // overload the lights in this APC area /obj/machinery/power/apc/proc/overload_lighting(var/chance = 100) - if(/* !get_connection() || */ !operating || shorted) + if(/* !get_connection() || */ !operating || shorted || grid_check) return if( cell && cell.charge>=20) cell.use(20); @@ -1225,4 +1226,34 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on) update_icon() return 1 +/obj/machinery/power/apc/overload(var/obj/machinery/power/source) + if(is_critical) + return + + if(prob(30)) // Nothing happens. + return + + if(prob(40)) // Lights blow. + overload_lighting() + + if(prob(40)) // Spooky flickers. + for(var/obj/machinery/light/L in area) + L.flicker(20) + + if(prob(25)) // Bluescreens. + emagged = 1 + locked = 0 + update_icon() + + if(prob(25)) // Cell gets damaged. + if(cell) + cell.corrupt() + + if(prob(10)) // Computers get broken. + for(var/obj/machinery/computer/comp in area) + comp.ex_act(3) + + if(prob(5)) // APC completely ruined. + set_broken() + #undef APC_UPDATE_ICON_COOLDOWN diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 48798c1fb50..92d749df0f9 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -234,3 +234,8 @@ return src.set_dir(turn(src.dir, -90)) + +/obj/machinery/power/generator/power_spike() + if(effective_gen >= max_power / 2 && powernet) // Don't make a spike if we're not making a whole lot of power. + ..() + diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm new file mode 100644 index 00000000000..b52dc4a4d64 --- /dev/null +++ b/code/modules/power/grid_checker.dm @@ -0,0 +1,125 @@ +/obj/machinery/power/grid_checker + name = "grid checker" + desc = "A machine that reacts to unstable conditions in the powernet, by safely shutting everything down. Probably better \ + than the alternative." + icon_state = "gridchecker_on" + circuit = /obj/item/weapon/circuitboard/grid_checker + var/power_failing = FALSE // Turns to TRUE when the grid check event is fired by the Game Master, or perhaps a cheeky antag. + // Wire stuff below. + var/datum/wires/grid_checker/wires + var/wire_locked_out = FALSE + var/wire_allow_manual_1 = FALSE + var/wire_allow_manual_2 = FALSE + var/wire_allow_manual_3 = FALSE + var/opened = FALSE + +/obj/machinery/power/grid_checker/New() + ..() + connect_to_network() + update_icon() + wires = new(src) + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/stack/cable_coil(src, 10) + RefreshParts() + +/obj/machinery/power/grid_checker/Destroy() + qdel(wires) + wires = null + ..() + +/obj/machinery/power/grid_checker/update_icon() + if(power_failing) + icon_state = "gridchecker_off" + set_light(2, 2, "#F86060") + else + icon_state = "gridchecker_on" + set_light(2, 2, "#A8B0F8") + +/obj/machinery/power/grid_checker/attackby(obj/item/W, mob/user) + if(!user) + return + if(istype(W, /obj/item/weapon/screwdriver)) + default_deconstruction_screwdriver(user, W) + opened = !opened + else if(istype(W, /obj/item/weapon/crowbar)) + default_deconstruction_crowbar(user, W) + else if(istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters) ) + attack_hand(user) + +/obj/machinery/power/grid_checker/attack_hand(mob/user) + if(!user) + return + add_fingerprint(user) + interact(user) + +/obj/machinery/power/grid_checker/interact(mob/user) + if(!user) + return + + if(opened) + wires.Interact(user) + + return ui_interact(user) + +/obj/machinery/power/grid_checker/proc/power_failure(var/announce = TRUE) + if(announce) + command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, \ + the colony's power will be shut off for an indeterminate duration while the powernet monitor restarts automatically, or \ + when Engineering can manually resolve the issue.", + "Critical Power Failure", + new_sound = 'sound/AI/poweroff.ogg') + power_failing = TRUE + if(powernet) + for(var/obj/machinery/power/terminal/T in powernet.nodes) // SMESes that are "downstream" of the powernet. + + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.is_critical) + continue + A.grid_check = TRUE + + for(var/obj/machinery/power/smes/smes in powernet.nodes) // These are "upstream" + smes.grid_check = TRUE +/* + smes.last_charge = smes.charge + smes.last_output_attempt = smes.output_attempt + smes.last_input_attempt = smes.input_attempt + smes.charge = 0 + smes.inputting(FALSE) + smes.outputting(FALSE) + smes.update_icon() + smes.power_change() +*/ + update_icon() + + spawn(rand(4 MINUTES, 10 MINUTES) ) + if(power_failing) // Check to see if engineering didn't beat us to it. + end_power_failure(TRUE) + +/obj/machinery/power/grid_checker/proc/end_power_failure(var/announce = TRUE) + if(announce) + command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", + "Power Systems Nominal", + new_sound = 'sound/AI/poweron.ogg') + power_failing = FALSE + update_icon() + + for(var/obj/machinery/power/terminal/T in powernet.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.is_critical) + continue + A.grid_check = FALSE + + for(var/obj/machinery/power/smes/smes in powernet.nodes) // These are "upstream" + smes.grid_check = FALSE + /* + smes.charge = smes.last_charge + smes.output_attempt = smes.last_output_attempt + smes.input_attempt = smes.last_input_attempt + smes.update_icon() + smes.power_change() + */ \ No newline at end of file diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4f34cd7effd..b8beea238c1 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -138,6 +138,29 @@ ..() return +// Used for power spikes by the engine, has specific effects on different machines. +/obj/machinery/power/proc/overload(var/obj/machinery/power/source) + return + +/obj/machinery/power/proc/power_spike() + var/obj/machinery/power/grid_checker/G = locate() in powernet.nodes + if(G) // If we found a grid checker, then all is well. + G.power_failure(prob(30)) + else // Otherwise lets break some stuff. + spawn(1) + command_announcement.Announce("Dangerous power spike detected in the power network. Please check machinery \ + for electrical damage.", + "Critical Power Overload") + var/i = 0 + var/limit = rand(30, 50) + for(var/obj/machinery/power/P in powernet.nodes) + P.overload(src) + i++ + if(i % 5) + sleep(1) + if(i >= limit) + break + /////////////////////////////////////////// // Powernet handling helpers ////////////////////////////////////////// diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 9fc0f74290a..bf165f09161 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -44,6 +44,7 @@ var/building_terminal = 0 //Suggestions about how to avoid clickspam building several terminals accepted! var/obj/machinery/power/terminal/terminal = null var/should_be_mapped = 0 // If this is set to 0 it will send out warning on New() + var/grid_check = FALSE // If true, suspends all I/O. /obj/machinery/power/smes/drain_power(var/drain_check, var/surge, var/amount = 0) @@ -124,7 +125,7 @@ var/last_onln = outputting //inputting - if(input_attempt && (!input_pulsed && !input_cut)) + if(input_attempt && (!input_pulsed && !input_cut) && !grid_check) var/target_load = min((capacity-charge)/SMESRATE, input_level) // charge at set rate, limited to spare capacity var/actual_load = draw_power(target_load) // add the load to the terminal side network charge += actual_load * SMESRATE // increase the charge @@ -137,7 +138,7 @@ inputting = 0 //outputting - if(outputting && (!output_pulsed && !output_cut)) + if(outputting && (!output_pulsed && !output_cut) && !grid_check) output_used = min( charge/SMESRATE, output_level) //limit output to that stored charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) @@ -420,6 +421,11 @@ update_icon() ..() +/obj/machinery/power/smes/overload(var/obj/machinery/power/source) // This propagates the power spike down the powernet. + if(istype(source, /obj/machinery/power/smes)) // Prevent infinite loops if two SMESes are hooked up to each other. + return + power_spike() + /obj/machinery/power/smes/magical name = "magical power storage unit" diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 3636c3acfaa..a1f2fbf030e 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -37,3 +37,7 @@ // Powernet rebuilds need this to work properly. /obj/machinery/power/terminal/process() return 1 + +/obj/machinery/power/terminal/overload(var/obj/machinery/power/source) + if(master) + master.overload(source) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 81c2f9fbf26..b026950f697 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -85,6 +85,8 @@ var/dna_lock = 0 //whether or not the gun is locked to dna var/obj/item/dnalockingchip/attached_lock + var/last_shot = 0 //records the last shot fired + /obj/item/weapon/gun/New() ..() for(var/i in 1 to firemodes.len) @@ -274,6 +276,8 @@ target = targloc pointblank = 0 + last_shot = world.time + // We do this down here, so we don't get the message if we fire an empty gun. if(requires_two_hands) if(user.item_is_in_hands(src) && user.hands_are_full()) @@ -322,6 +326,8 @@ P.launch(target) + last_shot = world.time + if(silenced) playsound(src, fire_sound, 10, 1) else diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f05e453cfb2..c723c7a0bb8 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -6,8 +6,7 @@ fire_sound_text = "laser blast" var/obj/item/weapon/cell/power_supply //What type of power cell this uses - var/charge_cost = 200 //How much energy is needed to fire. - var/max_shots = 10 //Determines the capacity of the weapon's power cell. Specifying a cell_type overrides this value. + var/charge_cost = 240 //How much energy is needed to fire. var/cell_type = null var/projectile_type = /obj/item/projectile/beam/practice var/modifystate @@ -18,6 +17,9 @@ var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically var/recharge_time = 4 var/charge_tick = 0 + var/charge_delay = 75 //delay between firing and charging + + var/battery_lock = 0 //If set, weapon cannot switch batteries /obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) ..() @@ -32,10 +34,7 @@ /obj/item/weapon/gun/energy/New() ..() - if(cell_type) - power_supply = new cell_type(src) - else - power_supply = new /obj/item/weapon/cell/device/variable(src, max_shots*charge_cost) + power_supply = new /obj/item/weapon/cell/device(src) if(self_recharge) processing_objects.Add(src) update_icon() @@ -46,21 +45,26 @@ ..() /obj/item/weapon/gun/energy/process() - if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the cyborg - charge_tick++ - if(charge_tick < recharge_time) return 0 - charge_tick = 0 + if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery + if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently + if(!power_supply || power_supply.charge >= power_supply.maxcharge) + return 0 // check if we actually need to recharge - if(!power_supply || power_supply.charge >= power_supply.maxcharge) - return 0 // check if we actually need to recharge + charge_tick++ + if(charge_tick < recharge_time) return 0 + charge_tick = 0 - if(use_external_power) - var/obj/item/weapon/cell/external = get_external_power_supply() - if(!external || !external.use(charge_cost)) //Take power from the borg... - return 0 + var/rechargeamt = power_supply.maxcharge*0.2 - power_supply.give(charge_cost) //... to recharge the shot - update_icon() + if(use_external_power) + var/obj/item/weapon/cell/external = get_external_power_supply() + if(!external || !external.use(rechargeamt)) //Take power from the borg... + return 0 + + power_supply.give(rechargeamt) //... to recharge 1/5th the battery + update_icon() + else + charge_tick = 0 return 1 /obj/item/weapon/gun/energy/consume_next_projectile() @@ -69,6 +73,54 @@ if(!power_supply.checked_use(charge_cost)) return null return new projectile_type(src) +/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user) + if(istype(C, /obj/item/weapon/cell)) + if(self_recharge || battery_lock) + user << "[src] does not have a battery port." + return + if(istype(C, /obj/item/weapon/cell/device)) + var/obj/item/weapon/cell/device/P = C + if(power_supply) + user << "[src] already has a power cell." + else + user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].") + if(do_after(user, 10)) + user.remove_from_mob(P) + power_supply = P + P.loc = src + user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") + playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + update_held_icon() + else + user << "This cell is not fitted for [src]." + return + +/obj/item/weapon/gun/energy/proc/unload_ammo(mob/user) + if(self_recharge || battery_lock) + user << "[src] does not have a battery port." + return + if(power_supply) + user.put_in_hands(power_supply) + power_supply.update_icon() + power_supply = null + user.visible_message("[user] removes [power_supply] from [src].", "You remove [power_supply] from [src].") + playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + update_icon() + update_held_icon() + else + user << "[src] does not have a power cell." + +/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) + ..() + load_ammo(A, user) + +/obj/item/weapon/gun/energy/attack_hand(mob/user as mob) + if(user.get_inactive_hand() == src) + unload_ammo(user) + else + return ..() + /obj/item/weapon/gun/energy/proc/get_external_power_supply() if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc @@ -85,12 +137,21 @@ /obj/item/weapon/gun/energy/examine(mob/user) ..(user) - var/shots_remaining = round(power_supply.charge / charge_cost) - user << "Has [shots_remaining] shot\s remaining." + if(power_supply) + var/shots_remaining = round(power_supply.charge / charge_cost) + user << "Has [shots_remaining] shot\s remaining." + else + user << "Does not have a power cell." return /obj/item/weapon/gun/energy/update_icon(var/ignore_inhands) - if(charge_meter) + if(power_supply == null) + if(modifystate) + icon_state = "[modifystate]_open" + else + icon_state = "[initial(icon_state)]_open" + return + else if(charge_meter) var/ratio = power_supply.charge / power_supply.maxcharge //make sure that rounding down will not give us the empty state even if we have charge for a shot left. @@ -104,3 +165,10 @@ else icon_state = "[initial(icon_state)][ratio]" if(!ignore_inhands) update_held_icon() + +/obj/item/weapon/gun/energy/proc/start_recharge() + if(power_supply == null) + power_supply = new /obj/item/weapon/cell/device(src) + self_recharge = 1 + processing_objects.Add(src) + update_icon() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 86bd1e5661c..47206bc3e82 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -15,8 +15,8 @@ one_handed_penalty = 2 firemodes = list( - list(mode_name="normal", projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 200), - list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 50), + list(mode_name="normal", projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240), + list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), ) /obj/item/weapon/gun/energy/laser/mounted @@ -30,8 +30,8 @@ projectile_type = /obj/item/projectile/beam/practice firemodes = list( - list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 200), - list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 50), + list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 240), + list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 60), ) obj/item/weapon/gun/energy/retro @@ -56,8 +56,11 @@ obj/item/weapon/gun/energy/retro w_class = ITEMSIZE_NORMAL projectile_type = /obj/item/projectile/beam origin_tech = null - max_shots = 5 //to compensate a bit for self-recharging + fire_delay = 10 //Old pistol + charge_cost = 480 //to compensate a bit for self-recharging self_recharge = 1 + recharge_time = 3 //Recharges a bit more quickly... + charge_delay = 100 //... but it takes a while to get started /obj/item/weapon/gun/energy/lasercannon name = "laser cannon" @@ -69,13 +72,13 @@ obj/item/weapon/gun/energy/retro origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) slot_flags = SLOT_BELT|SLOT_BACK projectile_type = /obj/item/projectile/beam/heavylaser/cannon - max_shots = 4 + battery_lock = 1 fire_delay = 20 w_class = ITEMSIZE_LARGE // requires_two_hands = 1 one_handed_penalty = 6 // The thing's heavy and huge. accuracy = 3 - charge_cost = 400 + charge_cost = 600 /obj/item/weapon/gun/energy/lasercannon/mounted @@ -87,7 +90,6 @@ obj/item/weapon/gun/energy/retro requires_two_hands = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. projectile_type = /obj/item/projectile/beam/heavylaser charge_cost = 400 - max_shots = 6 fire_delay = 20 /obj/item/weapon/gun/energy/xray @@ -99,8 +101,7 @@ obj/item/weapon/gun/energy/retro fire_sound = 'sound/weapons/eluger.ogg' origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) projectile_type = /obj/item/projectile/beam/xray - charge_cost = 100 - max_shots = 12 + charge_cost = 200 /obj/item/weapon/gun/energy/sniperrifle name = "marksman energy rifle" @@ -112,8 +113,8 @@ obj/item/weapon/gun/energy/retro origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) projectile_type = /obj/item/projectile/beam/sniper slot_flags = SLOT_BACK - charge_cost = 400 - max_shots = 4 + battery_lock = 1 + charge_cost = 600 fire_delay = 35 force = 10 w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index dca895e931e..fc4b26158f2 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -4,7 +4,6 @@ icon_state = "energystun100" item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' - max_shots = 10 fire_delay = 10 // Handguns should be inferior to two-handed weapons. projectile_type = /obj/item/projectile/beam/stun @@ -12,8 +11,8 @@ modifystate = "energystun" firemodes = list( - list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg'), - list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg'), + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480), ) /obj/item/weapon/gun/energy/gun/mounted @@ -28,7 +27,7 @@ icon_state = "fm-2tstun100" //May resprite this to be more rifley item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' - max_shots = 18 + charge_cost = 100 force = 8 w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later fire_delay = 6 @@ -41,16 +40,16 @@ one_handed_penalty = 2 firemodes = list( - list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'), + list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 100), list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'), - list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'), + list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 200), list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'), ) /obj/item/weapon/gun/energy/gun/nuclear name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized reactor." - icon_state = "nucgun" + icon_state = "nucgunstun" origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) slot_flags = SLOT_BELT force = 8 //looks heavier than a pistol @@ -63,44 +62,6 @@ one_handed_penalty = 1 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'. firemodes = list( - list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'), - list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'), - ) - - var/lightfail = 0 - -//override for failcheck behaviour -/obj/item/weapon/gun/energy/gun/nuclear/process() - charge_tick++ - if(charge_tick < 4) return 0 - charge_tick = 0 - if(!power_supply) return 0 - if((power_supply.charge / power_supply.maxcharge) != 1) - power_supply.give(charge_cost) - update_icon() - return 1 - -/obj/item/weapon/gun/energy/gun/nuclear/proc/update_charge() - var/ratio = power_supply.charge / power_supply.maxcharge - ratio = round(ratio, 0.25) * 100 - overlays += "nucgun-[ratio]" - -/obj/item/weapon/gun/energy/gun/nuclear/proc/update_reactor() - if(lightfail) - overlays += "nucgun-medium" - else if ((power_supply.charge/power_supply.maxcharge) <= 0.5) - overlays += "nucgun-light" - else - overlays += "nucgun-clean" - -/obj/item/weapon/gun/energy/gun/nuclear/proc/update_mode() - var/datum/firemode/current_mode = firemodes[sel_mode] - switch(current_mode.name) - if("stun") overlays += "nucgun-stun" - if("lethal") overlays += "nucgun-kill" - -/obj/item/weapon/gun/energy/gun/nuclear/update_icon() - overlays.Cut() - update_charge() - update_reactor() - update_mode() + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480), + ) \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 3074638bce2..2bcb2db7710 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -7,14 +7,13 @@ force = 10 fire_sound='sound/weapons/Laser.ogg' projectile_type = /obj/item/projectile/beam - charge_cost=100 - max_shots = 20 // This is cut in half by "DESTROY" mode. + charge_cost = 120 sel_mode = 2 firemodes = list( - list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost=100), - list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost=100), - list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost=200), + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost = 120), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost = 120), + list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost = 240), ) /obj/item/weapon/gun/energy/pulse_rifle/mounted @@ -24,11 +23,9 @@ /obj/item/weapon/gun/energy/pulse_rifle/destroyer name = "pulse destroyer" desc = "A heavy-duty, pulse-based energy weapon. Because of its complexity and cost, it is rarely seen in use except by specialists." - cell_type = /obj/item/weapon/cell/super - fire_delay = 25 fire_sound='sound/weapons/gauss_shoot.ogg' projectile_type=/obj/item/projectile/beam/pulse - charge_cost=400 + charge_cost = 120 /obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob) user << "[src.name] has three settings, and they are all DESTROY." @@ -39,4 +36,10 @@ desc = "It's not the size of the gun, it's the size of the hole it puts through people." slot_flags = SLOT_BELT|SLOT_HOLSTER icon_state = "m1911-p" - max_shots = 5 + charge_cost = 240 + + firemodes = list( + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost = 240), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost = 240), + list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/gauss_shoot.ogg', fire_delay=null, charge_cost = 480), + ) \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 9d0e664d2dc..6a02d8a38fb 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -9,8 +9,6 @@ force = 10 flags = CONDUCT slot_flags = SLOT_BACK - charge_cost = 300 - max_shots = 10 projectile_type = /obj/item/projectile/ion /obj/item/weapon/gun/energy/ionrifle/emp_act(severity) @@ -30,7 +28,6 @@ item_state = "decloner" fire_sound = 'sound/weapons/pulse3.ogg' origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3) - max_shots = 10 projectile_type = /obj/item/projectile/energy/declone /obj/item/weapon/gun/energy/floragun @@ -39,8 +36,6 @@ icon_state = "floramut100" item_state = "floramut" fire_sound = 'sound/effects/stealthoff.ogg' - charge_cost = 100 - max_shots = 10 projectile_type = /obj/item/projectile/energy/floramut origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) modifystate = "floramut" @@ -68,6 +63,7 @@ w_class = ITEMSIZE_LARGE projectile_type = /obj/item/projectile/meteor cell_type = /obj/item/weapon/cell/potato + charge_cost = 100 self_recharge = 1 recharge_time = 5 //Time it takes for shots to recharge (in ticks) charge_meter = 0 @@ -110,7 +106,7 @@ flags = CONDUCT slot_flags = SLOT_BACK w_class = ITEMSIZE_LARGE - max_shots = 5 + charge_cost = 480 projectile_type = /obj/item/projectile/change origin_tech = null self_recharge = 1 @@ -134,7 +130,7 @@ name = "staff of animation" desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." projectile_type = /obj/item/projectile/animate - max_shots = 10 + charge_cost = 240 obj/item/weapon/gun/energy/staff/focus name = "mental focus" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 97558d8e6ab..b41c1b090ba 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -4,7 +4,6 @@ icon_state = "taser" item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' - max_shots = 10 projectile_type = /obj/item/projectile/beam/stun /obj/item/weapon/gun/energy/taser/mounted @@ -14,7 +13,7 @@ /obj/item/weapon/gun/energy/taser/mounted/cyborg name = "taser gun" - max_shots = 6 + charge_cost = 400 recharge_time = 7 //Time it takes for shots to recharge (in ticks) @@ -26,7 +25,7 @@ fire_sound = 'sound/weapons/Gunshot.ogg' origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) projectile_type = /obj/item/projectile/energy/electrode/strong - max_shots = 8 + charge_cost = 300 /obj/item/weapon/gun/energy/crossbow @@ -41,7 +40,7 @@ silenced = 1 fire_sound = 'sound/weapons/Genhit.ogg' projectile_type = /obj/item/projectile/energy/bolt - max_shots = 5 + charge_cost = 480 self_recharge = 1 charge_meter = 0 diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index d4472e24885..64f708891bd 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -5,7 +5,7 @@ desc = "A gun that changes temperatures. It has a small label on the side, 'More extreme temperatures will cost more charge!'" var/temperature = T20C var/current_temperature = T20C - charge_cost = 100 + charge_cost = 24 origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) slot_flags = SLOT_BELT|SLOT_BACK diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 945bbbc8e02..edb8e7fae66 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -256,8 +256,8 @@ ..() /obj/item/weapon/reagent_containers/food/drinks/flask - name = "\improper Station Administrator's flask" - desc = "A metal flask belonging to the Station Administrator" + name = "\improper Colony Director's flask" + desc = "A metal flask belonging to the Colony Director" icon_state = "flask" volume = 60 center_of_mass = list("x"=17, "y"=7) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index f0bda3a3cc0..33660f28c72 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -2889,12 +2889,12 @@ /obj/item/pizzabox/proc/closepizzabox() - if( boxes.len > 0 ) + if(boxes.len > 0) return open = !open - if( open && pizza ) + if(open && pizza) ismessy = 1 update_icon() @@ -2904,29 +2904,29 @@ overlays = list() // Set appropriate description - if( open && pizza ) + if(open && pizza) desc = "A box suited for pizzas. It appears to have a [pizza.name] inside." - else if( boxes.len > 0 ) + else if(boxes.len > 0) desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile." var/obj/item/pizzabox/topbox = boxes[boxes.len] var/toptag = topbox.boxtag - if( toptag != "" ) + if(toptag != "") desc = "[desc] The box on top has a tag, it reads: '[toptag]'." else desc = "A box suited for pizzas." - if( boxtag != "" ) + if(boxtag != "") desc = "[desc] The box has a tag, it reads: '[boxtag]'." // Icon states and overlays - if( open ) - if( ismessy ) + if(open) + if(ismessy) icon_state = "pizzabox_messy" else icon_state = "pizzabox_open" - if( pizza ) + if(pizza) var/image/pizzaimg = image("food.dmi", icon_state = pizza.icon_state) pizzaimg.pixel_y = -3 overlays += pizzaimg @@ -2935,33 +2935,33 @@ else // Stupid code because byondcode sucks var/doimgtag = 0 - if( boxes.len > 0 ) + if(boxes.len > 0) var/obj/item/pizzabox/topbox = boxes[boxes.len] - if( topbox.boxtag != "" ) + if(topbox.boxtag != "") doimgtag = 1 else - if( boxtag != "" ) + if(boxtag != "") doimgtag = 1 - if( doimgtag ) + if(doimgtag) var/image/tagimg = image("food.dmi", icon_state = "pizzabox_tag") tagimg.pixel_y = boxes.len * 3 overlays += tagimg icon_state = "pizzabox[boxes.len+1]" -/obj/item/pizzabox/attack_hand( mob/user as mob ) +/obj/item/pizzabox/attack_hand(mob/user as mob) if( open && pizza ) - user.put_in_hands( pizza ) + user.put_in_hands(pizza) - user << "\red You take the [src.pizza] out of the [src]." + user << "You take \the [src.pizza] out of the [src]." src.pizza = null update_icon() return - if( boxes.len > 0 ) - if( user.get_inactive_hand() != src ) + if(boxes.len > 0) + if(user.get_inactive_hand() != src) ..() return @@ -2969,13 +2969,13 @@ boxes -= box user.put_in_hands( box ) - user << "\red You remove the topmost [src] from your hand." + user << "You remove \the topmost [src] from your hand." box.update_icon() update_icon() return ..() -/obj/item/pizzabox/attack_self( mob/user as mob ) +/obj/item/pizzabox/attack_self(mob/user as mob) closepizzabox() @@ -2985,57 +2985,58 @@ closepizzabox() /obj/item/pizzabox/attackby( obj/item/I as obj, mob/user as mob ) - if( istype(I, /obj/item/pizzabox/) ) + if(istype(I, /obj/item/pizzabox/)) var/obj/item/pizzabox/box = I - if( !box.open && !src.open ) + if(!box.open && !src.open) // Make a list of all boxes to be added var/list/boxestoadd = list() boxestoadd += box for(var/obj/item/pizzabox/i in box.boxes) boxestoadd += i - if( (boxes.len+1) + boxestoadd.len <= 5 ) + if((boxes.len+1) + boxestoadd.len <= 5) user.drop_item() box.loc = src box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit - src.boxes.Add( boxestoadd ) + src.boxes.Add(boxestoadd) box.update_icon() update_icon() - user << "\red You put the [box] ontop of the [src]!" + user << "You put \the [box] ontop of the [src]!" else - user << "\red The stack is too high!" + user << "\The stack is too high!" else - user << "\red Close the [box] first!" + user << "Close \the [box] first!" return - if( istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/) ) // Long ass fucking object name + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/)) // Long ass fucking object name - if( src.open ) - user.drop_item() - I.loc = src - src.pizza = I - - update_icon() - - user << "\red You put the [I] in the [src]!" + if(open) + if(!pizza) + user.drop_item() + I.loc = src + pizza = I + update_icon() + user << "You put \the [I] in \the [src]!" + else + user << "\The [src] is full! It already has a [pizza] inside." else - user << "\red You try to push the [I] through the lid but it doesn't work!" + user << "You try to push \the [I] through the lid but it doesn't work!" + return - if( istype(I, /obj/item/weapon/pen/) ) - - if( src.open ) + if(istype(I, /obj/item/weapon/pen/)) + if(open) return var/t = sanitize(input("Enter what you want to add to the tag:", "Write", null, null) as text, 30) var/obj/item/pizzabox/boxtotagto = src - if( boxes.len > 0 ) + if(boxes.len > 0) boxtotagto = boxes[boxes.len] boxtotagto.boxtag = copytext("[boxtotagto.boxtag][t]", 1, 30) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index bbb54d7f7ef..346aecacabd 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -260,6 +260,15 @@ other types of metals and chemistry for reagents). category = "Misc" sort_string = "DAAAD" +/datum/design/item/powercell/device + name = "device" + build_type = PROTOLATHE + id = "device" + materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25) + build_path = /obj/item/weapon/cell/device + category = "Misc" + sort_string = "DAAAE" + /datum/design/item/hud materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) @@ -1038,6 +1047,14 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/smes sort_string = "JBABB" +/datum/design/circuit/grid_checker + name = "power grid checker" + desc = "Allows for the construction of circuit boards used to build a grid checker." + id = "grid_checker" + req_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/grid_checker + sort_string = "JBABC" + /datum/design/circuit/gas_heater name = "gas heating system" id = "gasheater" diff --git a/code/modules/xenobio2/tools/slime_handling_tools.dm b/code/modules/xenobio2/tools/slime_handling_tools.dm index b8f37a106f0..27136cd872e 100644 --- a/code/modules/xenobio2/tools/slime_handling_tools.dm +++ b/code/modules/xenobio2/tools/slime_handling_tools.dm @@ -1,11 +1,11 @@ /* What this file contains: * A specialized stun prod, for handling fiesty slimes - + * A specialized stun gun, for handling many fiesty slimes - + * A stun projectile for handling xenomorphs. - + */ /obj/item/weapon/melee/baton/slime name = "slimebaton" @@ -27,32 +27,31 @@ else X.stasis += (stasisforce / 6) ..() - + /obj/item/weapon/melee/baton/slime/loaded/New() ..() - bcell = new/obj/item/weapon/cell/high(src) + bcell = new/obj/item/weapon/cell/device(src) update_icon() return - - + + // Xeno stun gun + projectile /obj/item/weapon/gun/energy/taser/xeno name = "xeno taser gun" desc = "Straight out of NT's testing laboratories, this small gun is used to subdue non-humanoid xeno life forms. While marketed towards handling slimes, it may be useful for other creatures." icon_state = "taserold" fire_sound = 'sound/weapons/taser2.ogg' - max_shots = 10 projectile_type = /obj/item/projectile/beam/stun/xeno - + /obj/item/projectile/beam/stun/xeno icon_state = "omni" agony = 4 var/stasisforce = 40 - + muzzle_type = /obj/effect/projectile/laser_omni/muzzle tracer_type = /obj/effect/projectile/laser_omni/tracer impact_type = /obj/effect/projectile/laser_omni/impact - + /obj/item/projectile/beam/stun/xeno/on_hit(var/atom/target, var/blocked = 0) if(istype(target, /mob/living/simple_animal/xeno)) var/mob/living/simple_animal/xeno/X = target diff --git a/html/changelog.html b/html/changelog.html index 9901dd7c518..836215133b1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,15 @@ -->
    +

    05 October 2016

    +

    Redstryker updated:

    +
      +
    • Added four sounds that are randomly played when bones break. Also allows the Technomancer to play the bone break sound.
    • +
    • Adds a black variety of the Security Voidsuit called the 'Crowd Control' voidsuit. It can be obtained from a Suit Cycler with Security clearence.
    • +
    • Codes in icon state for the Press Vest.
    • +
    • Added a child of the Medical armband with a red cross on it. It is available on the loadout.
    • +
    +

    02 October 2016

    Anewbe updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index cbe9b38ef86..d09c24fef7a 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2888,3 +2888,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Zuhayr: - rscadd: Added /vg/ direct-action ventcrawling. You will now crawl through the actual pipe network, a step at a time. Have fun. +2016-10-05: + Redstryker: + - rscadd: Added four sounds that are randomly played when bones break. Also allows + the Technomancer to play the bone break sound. + - rscadd: Adds a black variety of the Security Voidsuit called the 'Crowd Control' + voidsuit. It can be obtained from a Suit Cycler with Security clearence. + - bugfix: Codes in icon state for the Press Vest. + - rscadd: Added a child of the Medical armband with a red cross on it. It is available + on the loadout. diff --git a/html/changelogs/Anewbe - Weapon Cells.yml b/html/changelogs/Anewbe - Weapon Cells.yml new file mode 100644 index 00000000000..212e51a3094 --- /dev/null +++ b/html/changelogs/Anewbe - Weapon Cells.yml @@ -0,0 +1,47 @@ +################################ +# 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: Anewbe + +# 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: "Energy weapons and stunbatons now use special device power cells, these can still be recharged." + - rscadd: "Energy weapons can be unloaded and reloaded by clicking them with an empty hand or a device cell, respectively. The process of loading a cell takes a few moments." + - rscadd: "Stunbatons no longer require a screwdriver to switch cells." + - tweak: "Tweaked the order in which stunbatons check for power, they should now visibly power off when their cell hits 0, instead of one hit after." + - rscadd: "Security lockers (HoS, Warden, and Officer) now have an extra device cell in them." + - rscadd: "Protolathe can print device cells." + - rscadd: "Adds start_recharge() proc to energy weapons. When called, this should cause the affected weapon to begin self-charging." + - rscdel: "Weapons that self-recharge won't do so for a short period after firing." + - tweak: "On weapons that can fire both lethally and non-lethally, lasers drain twice as much power as tasers." + - tweak: "Laser cannon, LWAP, and self_recharging weapons cannot switch cells." + - tweak: "Map has been changed to include more rechargers. Merc and ERT bases include extra device cells." + diff --git a/html/changelogs/Redstryker-MedBand.yml.yml b/html/changelogs/SpadesNeil-ColonyDirector.yml similarity index 91% rename from html/changelogs/Redstryker-MedBand.yml.yml rename to html/changelogs/SpadesNeil-ColonyDirector.yml index 95e672496f8..517bcb5f7c7 100644 --- a/html/changelogs/Redstryker-MedBand.yml.yml +++ b/html/changelogs/SpadesNeil-ColonyDirector.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Redstryker +author: Spades Neil # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # 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: "Added a child of the Medical armband with a red cross on it. It is available on the loadout." + - tweak: "Replaced Station Administrator with Colony Director, based on feedback literally from NASA." diff --git a/html/changelogs/Redstryker-BoneBreak.yml.yml b/html/changelogs/Yoshax-Bugfix.yml similarity index 70% rename from html/changelogs/Redstryker-BoneBreak.yml.yml rename to html/changelogs/Yoshax-Bugfix.yml index deb39178baa..0654b2b9e23 100644 --- a/html/changelogs/Redstryker-BoneBreak.yml.yml +++ b/html/changelogs/Yoshax-Bugfix.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Redstryker +author: Yoshax # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,8 @@ delete-after: True # 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: "Added four sounds that are randomly played when bones break. Also allows the Technomancer to play the bone break sound." + - bugfix: "You can now only fit one pizza per box, and pizzas will no longer vanish to pizza gnomes." + - rscadd: "Energy swords will now produce a small light. The light is determined by the color of the blade." + - bugfix: "Simple mobs such as slimes, or carp, will now ignore intent requirements for passing applied tape." + - bugfix: "Long records will no longer be devoured by long-record-goblins when attempting to edit them using a console in-round." + - bugfix: "AIs with special roles will now get access to the fancy law manager." \ No newline at end of file diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 0d868ab939f..edc81169f05 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index 73ce626bf45..dd4369cce7f 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/lefthand_hats.dmi b/icons/mob/items/lefthand_hats.dmi index 6a0311ed3d5..94b5c290b85 100644 Binary files a/icons/mob/items/lefthand_hats.dmi and b/icons/mob/items/lefthand_hats.dmi differ diff --git a/icons/mob/items/lefthand_suits.dmi b/icons/mob/items/lefthand_suits.dmi index be0fab14812..b800cf9eba9 100644 Binary files a/icons/mob/items/lefthand_suits.dmi and b/icons/mob/items/lefthand_suits.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index 4d0f6375116..d8f221abef0 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/mob/items/righthand_hats.dmi b/icons/mob/items/righthand_hats.dmi index ba0e59d0df7..38a0d314fc0 100644 Binary files a/icons/mob/items/righthand_hats.dmi and b/icons/mob/items/righthand_hats.dmi differ diff --git a/icons/mob/items/righthand_suits.dmi b/icons/mob/items/righthand_suits.dmi index c1b8f260af4..791819e3ae1 100644 Binary files a/icons/mob/items/righthand_suits.dmi and b/icons/mob/items/righthand_suits.dmi differ diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi index ff1a9ac6284..d21a3ce184f 100644 Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi index d6ecfcfe4c3..621fa05353f 100644 Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index 94716107545..f5fee4250df 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index 1215ba0e30c..753f5069fca 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index c9b3e091639..2950d2df7c9 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index bfc20867d93..ea7d2cfdfd8 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index ca1f99a3304..903ff0cf73e 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index edddc05729e..ce2f2994aa6 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index f2bd1af1843..44825245ede 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 82df436ec16..798d6fee2a0 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/species/seromi/hats.dmi b/icons/obj/clothing/species/seromi/hats.dmi index 1fa5ebefdea..4e8ddf240c5 100644 Binary files a/icons/obj/clothing/species/seromi/hats.dmi and b/icons/obj/clothing/species/seromi/hats.dmi differ diff --git a/icons/obj/clothing/species/seromi/suits.dmi b/icons/obj/clothing/species/seromi/suits.dmi index d25bfd8d84a..c0d913410b4 100644 Binary files a/icons/obj/clothing/species/seromi/suits.dmi and b/icons/obj/clothing/species/seromi/suits.dmi differ diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi index 1e56902163a..61065c1ad43 100644 Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi index 1b9f1915b9d..2d977cbd655 100644 Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi index a8a9859935b..b06a0a708f0 100644 Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi index 6390c1d2ba8..ad2200b30ba 100644 Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi index 5a5a7c407e8..83ea942fa25 100644 Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi index 2ede2b80526..6efa267f98e 100644 Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index e07c5f208e2..dab0377aaba 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 36c263f21c4..996ab9699d0 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 14878d4dd08..8b6205e9e8f 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index 1f5c180df88..6e1242998ba 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -446,7 +446,7 @@ "aiD" = (/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,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/library) "aiE" = (/obj/structure/table/glass,/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Medical Emergency Phone"},/obj/effect/floor_decal/corner/paleblue/full,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) "aiF" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) -"aiG" = (/obj/structure/table/glass,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Starboard"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) +"aiG" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/security/main) "aiH" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore) "aiI" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore) "aiJ" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore) @@ -1011,7 +1011,7 @@ "atw" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/red{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/main) "atx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/security/main) "aty" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/obj/item/weapon/storage/box/glasses/square,/turf/simulated/floor/tiled,/area/security/main) -"atz" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/main) +"atz" = (/obj/structure/table/glass,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Starboard"; dir = 1},/obj/machinery/recharger,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) "atA" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/item/weapon/storage/box/donut,/turf/simulated/floor/tiled,/area/security/main) "atB" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/photocopier,/turf/simulated/floor/tiled,/area/security/main) "atC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/main) @@ -6416,7 +6416,7 @@ "ctt" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "ctu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "ctv" = (/obj/structure/table/standard,/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled,/area/quartermaster/office) -"ctw" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/office) +"ctw" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/recharger,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) "ctx" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/effect/floor_decal/corner/brown{dir = 9},/obj/machinery/firealarm{dir = 8; pixel_x = -26},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) "cty" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{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/tiled,/area/quartermaster/office) "ctz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -6546,7 +6546,7 @@ "cvT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvV" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Port"; dir = 1},/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) -"cvW" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) +"cvW" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/quartermaster/office) "cvX" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/qm) "cvY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled,/area/quartermaster/qm) "cvZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/qm) @@ -9826,10 +9826,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyamuaqMapZapZaqNaqOaqPaqQaqQaqRaqSaqTaqUaqVaqWaqXaqYaLqaLqaLqaLqaLqaLqaLqaLqafhaeZafkafjafxafnafzafyafxafAafOafCagbapwanraahagHagcaiAagUagPagQaeQagSagUaizaiyagdagHagHagHagHagHaahaahapzagiagearparoagnagjagoaaNaahaahakzaqFaqGaqHaqIaqJaqKaqGaqHaqFakzakzanZanZaqLanZanZanZanZanZanZanZanZanZanZaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyahyamuarParQarRarSarTarUarVarWarXarYarZasaasbascasdamuayZagpagrayZayZagsayZayZauNayZanransansansansagIansansagOagJasrapwanraahagHagWahUagUagPagUagTagUagUaiyagUagUaiOaiNaiMaiMagHaahaahapzassagXasuapzagYabZagZaaNaahaahakzarEarFarGarHarIarJarKarLarMakzaahaahanZahiahhahhahhahhahhahkahjanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyasGasGasGasHasIasJasIasKasGasGamuasLasLasMasNasOasPasNasLasLamuamuamuamuamuamuasLasQasRasRasRasRasRatNayZauNatNanranraqkaqkanranranranransahlahmanranraahagHajiajiagUagPagUahnajeajeajfajeajeajdahpajbahuagHaahaahdEOdEOdEOdEOapzahvabSafwaaNaaNaahakzaqFaqFaqFaqIaqJaqKaqFaqFaqFakzaahaahanZaAJarOanZanZanZanZaAJarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiatiatiatjatkatlatmatnatoatpatqatratsattatuatvatwatxatyatzatAatBatCatDatEatFatGatHatIasQatJatKajYatMasRatNatNahwatNahxanranranranraahaahanrahzatQatRanraeAaahagHagUagUagUahBajzahCagUagUajwagUagUaiOajvajuahDagHaahdEOdEOahHahGahJahIagaabEahLahKaaNaahakzamfatganQaqIaqJaqKatganQathakzaahamXamXamXamXamXanyanxanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiatiatiatjatkatlatmatnatoatpatqatratsattatuatvatwatxatyaiGatAatBatCatDatEatFatGatHatIasQatJatKajYatMasRatNatNahwatNahxanranranranraahaahanrahzatQatRanraeAaahagHagUagUagUahBajzahCagUagUajwagUagUaiOajvajuahDagHaahdEOdEOahHahGahJahIagaabEahLahKaaNaahakzamfatganQaqIaqJaqKatganQathakzaahamXamXamXamXamXanyanxanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiauiaujaukaulaumaunauoaupauqaurausautauuauvauwauxauyauzauAauBauCauBauDauEauFauGauHauGauIasQauJauKauLauMasRaahatNauNatNatNanraahaahaahaahaahanrasTauOasranraahaahagHajUahNahMahWahRahXagUadeajNajMajLagHajKajJagHagHaahdEOahYaibahZaigaicaikaihafwaimaaNaahakzaqFaufaugaqIaqJaqKauhaugaqFakzaahamXaoxanzanzaoyaozanzapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahyahyahyahyahyatiauXauYauZatiavaavbavcavdaveavdavfavfavgavhaviavjavkavfavlavmavnavoavpavqatDavravsavtavuavvavwavxavyavzavAasRaahatNavBatNaahaahaahaahaahaahaahanrasTauOasranraahaahagHagHakbakcagHainahXagUagHakbakcagHagHagHagHagHahyahydEOaioaOqaipairaiqabYafvafwaisaaNaahakzauSauTakzauUauVauWakzauSauTakzaahamXaitanzanzapBaiuapDapEanZaixanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaxsaxsaxsaxsaxsaxsaxsaxsaahatiavKavLavMatiavNavOavdavdavPavQavfavRavSavTavUavTavVavWavXavYavZawaawbawcawdaweaweawfaweawgasQawhawiasRawjasRaahatNauNatNaahaahaahaahaahaahanranrawkaiBawmanranrahyahyahyahyahyagHaiCaiDakfagHahyahyahyaahaahaahahyahyahydEOaiEaiGaiFdEOaaNaiIaiHaiJaaNaaNahyahyahyahyaiKavHavIavJaiKahyahyahyaahamXanwanzanzaquaquaquapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaxsaxsaxsaxsaxsaxsaxsaxsaahatiavKavLavMatiavNavOavdavdavPavQavfavRavSavTavUavTavVavWavXavYavZawaawbawcawdaweaweawfaweawgasQawhawiasRawjasRaahatNauNatNaahaahaahaahaahaahanranrawkaiBawmanranrahyahyahyahyahyagHaiCaiDakfagHahyahyahyaahaahaahahyahyahydEOaiEatzaiFdEOaaNaiIaiHaiJaaNaaNahyahyahyahyaiKavHavIavJaiKahyahyahyaahamXanwanzanzaquaquaquapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaahaahaahaahaahaahaahaahaxsdFmdFnazHdFoaytayuaxsaahatiawAawBawCatiawDawEavdawFawGawHavfawIawJawKawLawMawNawOawPavmawQawQawRawSatDatEawTawUawVawWasQawXawYasRawZasRaahatNauNatNaahaahaahaahaahatNavCaxaaxbaxcaxdaxeavCavCaxfaxgaxhavCavCaxdavEawnavCavCavCavCavCavCavCaxfaxgaxhavCaiLaiQaiPavCaxkaxlaxmaxdaxnawsawsawsaxoaxpawsavHaxqavJawsaxoaxpawsawsamXaiRanwanwanwanwanwapEanZaiSanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaxBaxCaxDaxEaxFaxGavfaxJaxHaxIawQawRbQCaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALaALaALaALaALaALaxsdFsdFsazHazHdFtdFuaxsaahatiayxayyayzatiayAavbavdayBayCayDavfaEqayFavTayGavTayHayIayJayKayLayMayNayOayPayQayRayPazXaySayPayTayUayVayWayXatNatNauNayYayZayZayZazaazbazcazdawnaxlazeazfazgazkaziazjazjazgazhaziazjazlazjazgazmaznaznaznazoaznaznazpaznazqaznaznaznazmazqazpazrazsaztazuazvazvazvazwazvazvajyajAazvazvazvazvavDavGavFawoawlawlawpajBanZarOarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9913,11 +9913,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcsTcknckncmabFKcmcbZUbZUcmdbZUbZUchYcmeclecmfcmgcmhcmichYcjqcjqcjqcjqaahaahamYaqvaoDaqwaqxaqwaoDaqyamYcmjcmjcmjcmjaahaahaahbZXbZXcjubZXdEldEldEldElahyahycmRcmqcmrcmscmtcmtcmucmvcmwcmtcmxcjzahyahyahyahybambisbeccimcsUbecbeccmzcfRcfRcfRcfRcmAcmBcmBcmBcmCcmDcmDcmDcmEcmDcmFcmDcmGcmDcmDcsVcmHcmIcmJcmKcmDcmDcmHcsZcmDcmDcmLcmDcmDcmDcmMcmDcmDcmDcmDcmGcmDcmDcmDcmEcmDcmDcmDcmHcmNcmBctacmOcmPcmQcncahyahOaieaieaqzaieaqAahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhcmichYaahaahaahaahaahaahamYartaoDaqwaqBaqwaoDanFamYcnicnjcnkcmjaahaahaahbZXcnocjubZXbWTckJccqdEldElahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcfRcfRcfRcnDcfRcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcevcevcevcnJcevcevcevcnNcevcevcevcnIcnOcnQcnPcnRcfRbKGcodahyahOaqDaqCaqZaqEaraahOaahaahaahaahaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahamYanBarbardarcaoDaoDdgramYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcKickickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoKcoLcoLcoLcoLcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrcvWdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBawucovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrctwdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBawucovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgbfncpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYarsauQaruauRarvamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocKmcqqcrJcqrcKXcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwcxUcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrMcrLcrMcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVcJKcrQcrQcrQcsLcrScrTcrUcrQcrQctccsNctccrQcrQcrQcrQaahaahaahaahaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcrLcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFecrQcrQcwtctdcsXcwtcwvcsXcsYcwwctbcsYctbctecxOcwxcrQcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXctfctgayocrXctictjcrZayqctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoayscsactqctrcscayvcttcuTcsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvctwcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcupcrLcupcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahaahaahaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvcvWcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcupcrLcupcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahaahaahaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicLtcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRcrQcBkcsYcsYcsYcvucvucvucvucvuctbcDpcwzcsYcsYcsYcducrQaahaahaahaahaahaahcrXaAEcvxaAEcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZaAFcvDaAFcrZaAGcvFaAGcsacsacvGcsacsacvHcvIcsccsccvJcsccscaAHcvLaAHcscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPbHqbIfcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovcuncwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZcPicEVcEVcEvcPocEVcEVcEVcrQcvucvucsYcsYcBicDqdBUcxPbdUctbcxRcsYcFdcFdcFdcFdcrQaahaahaahaahaahaahcrXcwBcwCcwDcPvcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScPBcwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcxicuXcxjcxkcxlcxmcxncuXcxocxpcxqcxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovdHdcxFcxGcxHcxIcxJdHecovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZcEVcTdcQncUncEVcEVddacrQcEFcxPcsYcsYcxQcxQcxQcxQcxQctbcxRcsYcFdcFdcFdcFbcrQaahaahaahaahaahaahcrXcxVaAKaAIcxYcxZcytcyrcrXcyccydcrZcAkcyucygcyhcyidENcykcrZcyldEPcyncyocypcAqcAucsacyscAxcBocBncyvcywcyxcyydEQcyAcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm index f2b103bc7f0..03416019c84 100644 --- a/maps/polaris-2.dmm +++ b/maps/polaris-2.dmm @@ -1325,7 +1325,7 @@ "azy" = (/obj/structure/table/rack,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "azz" = (/obj/structure/table/rack,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "azA" = (/obj/structure/table/rack,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"azB" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"azB" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "azC" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "azD" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (WEST)"; icon_state = "propulsion_r"; dir = 8},/turf/space,/area/shuttle/administration/centcom) "azE" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) @@ -2746,6 +2746,7 @@ "baP" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "baQ" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "baR" = (/obj/structure/table/woodentable,/obj/item/clothing/shoes/workboots,/obj/item/clothing/under/technomancer,/obj/item/clothing/head/technomancer,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"baS" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/obj/item/weapon/cell/device,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) (1,1,1) = {" aaaaabaacaadaaeaafaagaahaaaaaiaajaakaalaamaanaaoaagaafaajaacaadaahaakaaeaamaaiaaoaalaahaajaapaaqaaraasaataauaavaawaaxaayaaaaabaacaadaaeaafaagaahaaaaaiaajaakaalaamaanaaoaagaafaajaacaadaahaakaazaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaaKaaLaaMaaNaaOaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaR @@ -2834,7 +2835,7 @@ aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaa aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqBaqCaqCaqCaqCaqCaqCaqCaqCaqCaqKaqCaqCaqCaqLaqJaqJaqJaqFaaPaaPaaPaaPaqFaqJaqJaqFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaqAaqAaaPaqAaqAaqAaqAaqAaqAaqAaqA aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqBaqCaqCaqKaqCaqCaqKaqCaqCaqLaqMaqNaqOaqPaqQaqRaqSaqTaqUaqFaqVaqWaqXaqYaqZaraarbarcaqCaqCaqCaqKardarearearfaqDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPargarhariargarjarjargarkarlargaqJaqJaqJaqJaqJaqJaqJaqJaqJaqFaqJaqJaqJarmarnaqJaroarmarparqarraqFaqJaqJaqJaqJarsaqCaqCaqCaqDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPartaaParuaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA -aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqBaqCaqCaqCaqCaqZarvaraaraarvaraaraarvaraaraarvaqJaqJaqJaqJaqJaqJaqJaqJaqJaqFarwaqJaqJarxaqJaqJaqJaryaqJaqJarzaqFaqJaqJaqJaqJargarAarBarCaqFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPartaruaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA +aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqBaqCaqCaqCaqCaqZarvaraaraarvaraaraarvaraaraarvaqJaqJaqJaqJaqJaqJaqJaqJazBaqFarwaqJaqJarxaqJaqJaqJaryaqJaqJarzaqFaqJaqJaqJaqJargarAarBarCaqFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPartaruaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA aqraqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPargarDarDarEarFarDarGaqJaqJaqJaqJaqJaqJaqJaqJaraaqJaqJarHarIarJarKaqJaqJarLaqFaqJaqJaqJarxaqJaqJaqJaryaqJaqJarMaqFaqJaqJaqJaqJarNarAarAarOaqFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPartaaPaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA arPaqraqraqraqraqraqraqraqraqraqraqraqraqraqraaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParQarQarQarQarQarQarQarQarQarQarvarRarSarDarDarDaqFaqJaqJaqJaqJaqJaqJaqJaqJaraaqJaqJarTarUarVarWaqJaqJarLaqFarXarYarZarmaqJaqJaqJarmasaasbascaqFaqJaqJaqJaqJarGasdaseasfaqFaaPaaPaaPaaPaqBaqCaqCaqCaqDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPasgaruaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPasharDarDarDarDasiarDarDarDarDarDasiasjarDarDarDaskargaqJaqJaqJaqJaqJaqJaqJaqJaraaqJaqJaqJaqJaqJaqJaqJaqJaslaqYaqZarmarmarvaqJaqJaqJarvarmarmarbaqLaqJaqJaqJaqJarsaqCaqCaqCarcaqCaqKaqCaqCaqLasmasnasoaqFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaspaaParuaqAaqAalxalxalxalxalxaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA @@ -2857,7 +2858,7 @@ aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaa aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjaxjaxjaxHaxXaxYaxZayaaxIaybaycaxIaydayeaxIaxIaxIaxKaxjaxjaxjawFayfaygayhayhayhawFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPauzavcavcavcavcayiaxlawcavCayjavcavcavcavcauDaykaykalxaylauPauPauPalxaymaynaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRayoalxaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjaxjaxHaxIaypaypaypaypaxIayqayqaxIaypaypayraysaxIaxIaxKaxjaxjawFaytayhayhayhayhawFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPavcayuayvaywavcayxavCavCayyavcavcayzayAayBayCayDayEayDauPauPauPauPayFaiRaiRaiRaiRaiRaiRauPaiRayGaiRaiRaiRaiRaiRaiRayHalxaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjaxHaxIaxIayIayJayKayLaxIayMaypayNaypaypaypaypayOayPaxIaxjaxjayQayhayhayhayhayhawFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPayRaySayTaySavcavcayUayVavcavcayWayXayYayZayCayDazaayDauPauPauPauPalxazbazcaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRaiRazdalxaqA -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjazeazfazgaypazhazhazhaxIaypaypaxIaziazjazkazlazmaznaxIaxjaxjawFayhayhayhayhayhawFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaaPaaPaaPaaPavcavcayRazoavcavcazpavCazqavcavcazrazsazravcaztaztalxazuaugawLalxalxalxalxazvazwazxazyazzazAaiRaiRaiRaiRazBazBazCalxalxaqA +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjazeazfazgaypazhazhazhaxIaypaypaxIaziazjazkazlazmaznaxIaxjaxjawFayhayhayhayhayhawFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaaPaaPaaPaaPavcavcayRazoavcavcazpavCazqavcavcazrazsazravcaztaztalxazuaugawLalxalxalxalxazvazwazxazyazzazAaiRaiRaiRaiRbaSbaSazCalxalxaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParQaxWaxWarQaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjazDazfaypaypaypaypaypayNaypaypaxIaxIaxIaxIaxIaxIaxIazEaxjaxjawFazFazGayhazGazHawFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPavcazIavCavCazJavcazKazLavCavcazMazNazOazPavcaruaaParuaaPaaPaaPaaPaqAaqAalxalxalxalxalxalxalxaxCazQazQaxCalxalxalxalxaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjazRaxIaypaypaypazSaypaxIaypaypaypazTazUaxjaxjaxjaxjaxjaxjaxjazVazVazVazVazVazVazVazVazVazVazVaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPavcazWavCavCavCazXavCavCavCazYavCavCavCazZavcasgasgasgasgaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAalxaAaaiRaiRaAaalxaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxWaxWarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawFaxjaxjaxjaxIaxIaxIaxIaxIaxIaxIayMaypaAbaypazUaxjaxjaxjaxjaxjaxjaxjazVaAcaAcaAcaAcaAcaAcaAcaAcaAcaAdaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaaPaaPaaPaaPavcaAeavCavCavCaAfavCavCavCaAgavCavCavCaAhavcaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAalxaAaaiRaiRaAaalxaqAaqAaqAaqAaqA
    Command
    SpecialStation Administrator
    SpecialColony DirectorCustom