From 85d7f3d9aaff2db2339b3bbb0b1cd750a6d0e7e2 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 23 Oct 2014 13:40:53 +0200 Subject: [PATCH 1/8] Moves /obj/machinery/turretid to its own class/file. --- code/game/machinery/turret_control.dm | 133 +++++++++++++++++++++++++ code/game/machinery/turrets.dm | 136 -------------------------- 2 files changed, 133 insertions(+), 136 deletions(-) create mode 100644 code/game/machinery/turret_control.dm diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm new file mode 100644 index 0000000000..0e34d316ff --- /dev/null +++ b/code/game/machinery/turret_control.dm @@ -0,0 +1,133 @@ +/obj/machinery/turretid + name = "Turret deactivation control" + icon = 'icons/obj/device.dmi' + icon_state = "motion3" + anchored = 1 + density = 0 + var/enabled = 1 + var/lethal = 0 + var/locked = 1 + var/control_area //can be area name, path or nothing. + var/ailock = 0 // AI cannot use this + req_access = list(access_ai_upload) + +/obj/machinery/turretid/New() + ..() + if(!control_area) + var/area/CA = get_area(src) + if(CA.master && CA.master != CA) + control_area = CA.master + else + control_area = CA + else if(istext(control_area)) + for(var/area/A in world) + if(A.name && A.name==control_area) + control_area = A + break + //don't have to check if control_area is path, since get_area_all_atoms can take path. + return + +/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user) + if(stat & BROKEN) return + if (istype(user, /mob/living/silicon)) + return src.attack_hand(user) + + if (istype(W, /obj/item/weapon/card/emag) && !emagged) + user << "\red You short out the turret controls' access analysis module." + emagged = 1 + locked = 0 + if(user.machine==src) + src.attack_hand(user) + + return + + else if( get_dist(src, user) == 0 ) // trying to unlock the interface + if (src.allowed(usr)) + if(emagged) + user << "The turret control is unresponsive." + return + + locked = !locked + user << "You [ locked ? "lock" : "unlock"] the panel." + if (locked) + if (user.machine==src) + user.unset_machine() + user << browse(null, "window=turretid") + else + if (user.machine==src) + src.attack_hand(user) + else + user << "Access denied." + +/obj/machinery/turretid/attack_ai(mob/user as mob) + if(!ailock) + return attack_hand(user) + else + user << "There seems to be a firewall preventing you from accessing this device." + +/obj/machinery/turretid/attack_hand(mob/user as mob) + if ( get_dist(src, user) > 0 ) + if ( !issilicon(user) ) + user << "You are too far away." + user.unset_machine() + user << browse(null, "window=turretid") + return + + user.set_machine(src) + var/loc = src.loc + if (istype(loc, /turf)) + loc = loc:loc + if (!istype(loc, /area)) + user << text("Turret badly positioned - loc.loc is [].", loc) + return + var/area/area = loc + var/t = "Turret Control Panel ([area.name])
" + + if(src.locked && (!istype(user, /mob/living/silicon))) + t += "(Swipe ID card to unlock control panel.)
" + else + t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable") + t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal") + + user << browse(t, "window=turretid") + onclose(user, "turretid") + +/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0) + if(..(href, href_list)) + return + if (src.locked) + if (!istype(usr, /mob/living/silicon)) + usr << "Control panel is locked!" + return + if ( get_dist(src, usr) == 0 || issilicon(usr)) + if (href_list["toggleOn"]) + src.enabled = !src.enabled + src.updateTurrets() + else if (href_list["toggleLethal"]) + src.lethal = !src.lethal + src.updateTurrets() + if(!nowindow) + src.attack_hand(usr) + +/obj/machinery/turretid/proc/updateTurrets() + if(control_area) + for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area)) + aTurret.setState(enabled, lethal) + src.update_icons() + +/obj/machinery/turretid/proc/update_icons() + if (src.enabled) + if (src.lethal) + icon_state = "motion1" + else + icon_state = "motion3" + else + icon_state = "motion0" + //CODE FIXED BUT REMOVED +// if(control_area) //USE: updates other controls in the area +// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was +// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person +// Turret_Control.icon_state = icon_state //who coded it originally was just tired +// Turret_Control.enabled = enabled //or something. I don't see any situation +// Turret_Control.lethal = lethal //in which this would be used on the current map. + //If he wants it back he can uncomment it \ No newline at end of file diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index af5b67c16d..f9e8a94747 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -338,101 +338,6 @@ spawn(13) del(src) -/obj/machinery/turretid - name = "Turret deactivation control" - icon = 'icons/obj/device.dmi' - icon_state = "motion3" - anchored = 1 - density = 0 - var/enabled = 1 - var/lethal = 0 - var/locked = 1 - var/control_area //can be area name, path or nothing. - var/ailock = 0 // AI cannot use this - req_access = list(access_ai_upload) - -/obj/machinery/turretid/New() - ..() - if(!control_area) - var/area/CA = get_area(src) - if(CA.master && CA.master != CA) - control_area = CA.master - else - control_area = CA - else if(istext(control_area)) - for(var/area/A in world) - if(A.name && A.name==control_area) - control_area = A - break - //don't have to check if control_area is path, since get_area_all_atoms can take path. - return - -/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user) - if(stat & BROKEN) return - if (istype(user, /mob/living/silicon)) - return src.attack_hand(user) - - if (istype(W, /obj/item/weapon/card/emag) && !emagged) - user << "\red You short out the turret controls' access analysis module." - emagged = 1 - locked = 0 - if(user.machine==src) - src.attack_hand(user) - - return - - else if( get_dist(src, user) == 0 ) // trying to unlock the interface - if (src.allowed(usr)) - if(emagged) - user << "The turret control is unresponsive." - return - - locked = !locked - user << "You [ locked ? "lock" : "unlock"] the panel." - if (locked) - if (user.machine==src) - user.unset_machine() - user << browse(null, "window=turretid") - else - if (user.machine==src) - src.attack_hand(user) - else - user << "Access denied." - -/obj/machinery/turretid/attack_ai(mob/user as mob) - if(!ailock) - return attack_hand(user) - else - user << "There seems to be a firewall preventing you from accessing this device." - -/obj/machinery/turretid/attack_hand(mob/user as mob) - if ( get_dist(src, user) > 0 ) - if ( !issilicon(user) ) - user << "You are too far away." - user.unset_machine() - user << browse(null, "window=turretid") - return - - user.set_machine(src) - var/loc = src.loc - if (istype(loc, /turf)) - loc = loc:loc - if (!istype(loc, /area)) - user << text("Turret badly positioned - loc.loc is [].", loc) - return - var/area/area = loc - var/t = "Turret Control Panel ([area.name])
" - - if(src.locked && (!istype(user, /mob/living/silicon))) - t += "(Swipe ID card to unlock control panel.)
" - else - t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable") - t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal") - - user << browse(t, "window=turretid") - onclose(user, "turretid") - - /obj/machinery/turret/attack_animal(mob/living/M as mob) if(M.melee_damage_upper == 0) return if(!(stat & BROKEN)) @@ -446,47 +351,6 @@ M << "\red That object is useless to you." return -/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0) - if(..(href, href_list)) - return - if (src.locked) - if (!istype(usr, /mob/living/silicon)) - usr << "Control panel is locked!" - return - if ( get_dist(src, usr) == 0 || issilicon(usr)) - if (href_list["toggleOn"]) - src.enabled = !src.enabled - src.updateTurrets() - else if (href_list["toggleLethal"]) - src.lethal = !src.lethal - src.updateTurrets() - if(!nowindow) - src.attack_hand(usr) - -/obj/machinery/turretid/proc/updateTurrets() - if(control_area) - for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area)) - aTurret.setState(enabled, lethal) - src.update_icons() - -/obj/machinery/turretid/proc/update_icons() - if (src.enabled) - if (src.lethal) - icon_state = "motion1" - else - icon_state = "motion3" - else - icon_state = "motion0" - //CODE FIXED BUT REMOVED -// if(control_area) //USE: updates other controls in the area -// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was -// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person -// Turret_Control.icon_state = icon_state //who coded it originally was just tired -// Turret_Control.enabled = enabled //or something. I don't see any situation -// Turret_Control.lethal = lethal //in which this would be used on the current map. - //If he wants it back he can uncomment it - - /obj/structure/turret/gun_turret name = "Gun Turret" density = 1 From 687c2b40f7ec52f15d94cb220567e87ffc134045 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 23 Oct 2014 14:35:34 +0200 Subject: [PATCH 2/8] Nabs /tg/ support procs and defines. --- baystation12.dme | 1 + code/_onclick/click.dm | 3 +++ code/defines/procs/records.dm | 7 ++++++- code/game/atoms.dm | 6 ++++++ code/global.dm | 3 +++ code/modules/mob/inventory.dm | 25 +++++++++++++++++++++++++ code/setup.dm | 4 ++++ 7 files changed, 48 insertions(+), 1 deletion(-) diff --git a/baystation12.dme b/baystation12.dme index 35c47edeb6..926aeabfc6 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -328,6 +328,7 @@ #include "code\game\machinery\supply_display.dm" #include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\turret_control.dm" #include "code\game\machinery\turrets.dm" #include "code\game\machinery\vending.dm" #include "code\game\machinery\washing_machine.dm" diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 716c30171e..569423ec01 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -147,6 +147,9 @@ return +/mob/proc/changeNext_move(num) + next_move = world.time + num + // Default behavior: ignore double clicks, consider them normal clicks instead /mob/proc/DblClickOn(var/atom/A, var/params) ClickOn(A,params) diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm index 9f7d78df47..3bf23c5941 100644 --- a/code/defines/procs/records.dm +++ b/code/defines/procs/records.dm @@ -37,4 +37,9 @@ R.fields["ma_crim_d"] = "No major crime convictions." R.fields["notes"] = "No notes." data_core.security += R - return R \ No newline at end of file + return R + +/proc/find_record(field, value, list/L) + for(var/datum/data/record/R in L) + if(R.fields[field] == value) + return R diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e1e76dd3fa..b1cfd18551 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -423,3 +423,9 @@ its easier to just keep the beam vertical. /atom/proc/checkpass(passflag) return pass_flags&passflag + +/atom/proc/isinspace() + if(istype(get_turf(src), /turf/space)) + return 1 + else + return 0 diff --git a/code/global.dm b/code/global.dm index 514fdcf5ac..9f7e22b3dd 100644 --- a/code/global.dm +++ b/code/global.dm @@ -205,6 +205,9 @@ var/list/AAlarmWireColorToIndex #define AIR_DAMAGE_MODIFIER 2.025 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025) #define INFINITY 1.#INF +#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary. + // 1 will enable set background. 0 will disable set background. + //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam #define MAX_MESSAGE_LEN 1024 #define MAX_PAPER_MESSAGE_LEN 3072 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 91253e2ca6..f3fbb8c4a3 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -181,6 +181,31 @@ update_inv_wear_mask(0) return +/mob/proc/unEquip(obj/item/I, force) //Force overrides NODROP for things like wizarditis and admin undress. + if(!I) //If there's nothing to drop, the drop is automatically successful. If(unEquip) should generally be used to check for NODROP. + return 1 + + /*if((I.flags & NODROP) && !force) + return 0*/ + + if(!I.canremove && !force) + return 0 + + if(I == r_hand) + r_hand = null + update_inv_r_hand() + else if(I == l_hand) + l_hand = null + update_inv_l_hand() + + if(I) + if(client) + client.screen -= I + I.loc = loc + I.dropped(src) + if(I) + I.layer = initial(I.layer) + return 1 //Attemps to remove an object on a mob. Will not move it to another area or such, just removes from the mob. /mob/proc/remove_from_mob(var/obj/O) diff --git a/code/setup.dm b/code/setup.dm index 4b64a0821e..1fa9448002 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -487,6 +487,10 @@ var/static/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons #define SEC_LEVEL_RED 2 #define SEC_LEVEL_DELTA 3 +#define CLICK_CD_MELEE 8 +#define CLICK_CD_RANGE 4 +//click cooldowns, in tenths of a second + #define TRANSITIONEDGE 7 //Distance from edge to move to another z-level var/list/liftable_structures = list(\ From 1bb1e871103e1f45d0e69ac2b49391677b3c374a Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 23 Oct 2014 14:37:06 +0200 Subject: [PATCH 3/8] Moves down target assessment into machinery. --- code/game/machinery/bots/secbot.dm | 76 ++---------------------------- code/game/machinery/machinery.dm | 75 +++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 73 deletions(-) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index cddb9286b0..f6140d9102 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -643,7 +643,7 @@ Auto Patrol: []"}, continue if(istype(C, /mob/living/carbon/human)) - src.threatlevel = src.assess_perp(C) + src.threatlevel = src.assess_perp(C, idcheck, check_records, lasercolor) else if(istype(M, /mob/living/simple_animal/hostile)) if(M.stat == DEAD) @@ -669,78 +669,8 @@ Auto Patrol: []"}, else continue -//If the security records say to arrest them, arrest them -//Or if they have weapons and aren't security, arrest them. -/obj/machinery/bot/secbot/proc/assess_perp(mob/living/carbon/human/perp as mob) - var/threatcount = 0 - - if(perp.stat == DEAD) - return 0 - - if(src.emagged == 2) return 10 //Everyone is a criminal! - - if(src.idcheck && !src.allowed(perp)) - if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) - if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \ - && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/redtag) \ - && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/practice)) - threatcount += 4 - - if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee)) - if(!istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/bluetag) \ - && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/redtag) \ - && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/practice)) - threatcount += 4 - - if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee)) - if(!istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag) \ - && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag) \ - && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/practice)) - threatcount += 2 - - if(istype(perp.wear_suit, /obj/item/clothing/suit/wizrobe)) - threatcount += 2 - - if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none") - threatcount += 2 - - //Agent cards lower threatlevel. - if(perp.wear_id && istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) - threatcount -= 2 - - if(src.lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve - threatcount = 0//They will not, however shoot at people who have guns, because it gets really fucking annoying - if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag)) - threatcount += 4 - if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag))) - threatcount += 4 - if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag)) - threatcount += 2 - - if(src.lasercolor == "r") - threatcount = 0 - if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag)) - threatcount += 4 - if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) - threatcount += 4 - if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag)) - threatcount += 2 - - if(src.check_records) - var/perpname = perp.name - if(perp.wear_id) - var/obj/item/weapon/card/id/id = perp.wear_id.GetID() - if(id) - perpname = id.registered_name - - for (var/datum/data/record/E in data_core.general) - if(E.fields["name"] == perpname) - for(var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - threatcount = 4 - break - - return threatcount +/obj/machinery/bot/secbot/is_assess_emagged() + return emagged == 2 /obj/machinery/bot/secbot/Bump(M as mob|obj) //Leave no door unopened! if((istype(M, /obj/machinery/door)) && !isnull(src.botcard)) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 7f48ca8bcf..d88d5b1798 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -305,3 +305,78 @@ Class Procs: I.loc = loc del(src) return 1 + +/obj/machinery/proc/on_assess_perp(mob/living/carbon/human/perp) + return 0 + +/obj/machinery/proc/is_assess_emagged() + return emagged + +/obj/machinery/proc/assess_perp(mob/living/carbon/human/perp, var/auth_weapons, var/check_records, var/lasercolor) + var/threatcount = 0 //the integer returned + + if(is_assess_emagged()) + return 10 //if emagged, always return 10. + + var/on_asses = on_assess_perp(perp) + if(on_asses) + return on_asses + if(auth_weapons && !src.allowed(perp)) + if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) + if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \ + && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/redtag) \ + && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/practice)) + threatcount += 4 + + if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee)) + if(!istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/bluetag) \ + && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/redtag) \ + && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/practice)) + threatcount += 4 + + if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee)) + if(!istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag) \ + && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag) \ + && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/practice)) + threatcount += 2 + + if(istype(perp.wear_suit, /obj/item/clothing/suit/wizrobe)) + threatcount += 2 + + if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none") + threatcount += 2 + + //Agent cards lower threatlevel. + if(perp.wear_id && istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) + threatcount -= 2 + + if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + threatcount = 0//They will not, however shoot at people who have guns, because it gets really fucking annoying + if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag)) + threatcount += 4 + if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag))) + threatcount += 4 + if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag)) + threatcount += 2 + + if(lasercolor == "r") + threatcount = 0 + if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag)) + threatcount += 4 + if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) + threatcount += 4 + if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag)) + threatcount += 2 + + if(check_records) + var/perpname = perp.name + if(perp.wear_id) + var/obj/item/weapon/card/id/id = perp.wear_id.GetID() + if(id) + perpname = id.registered_name + + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(!R || (R.fields["criminal"] == "*Arrest*")) + threatcount += 4 + + return threatcount From 9f8b6660fbbda9e4688a24335e3f45598eb1da5e Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 23 Oct 2014 15:22:56 +0200 Subject: [PATCH 4/8] Ports /tg/'s portable turrets. However, skipping porting /tg/'s projectile system for now. Not going to swallow more than I can chew here. --- code/game/machinery/machinery.dm | 7 +- code/game/machinery/portable_turret.dm | 1208 +++++++++++------------- code/game/machinery/turret_control.dm | 105 +- icons/obj/machines/turret_control.dmi | Bin 0 -> 700 bytes 4 files changed, 618 insertions(+), 702 deletions(-) create mode 100644 icons/obj/machines/turret_control.dmi diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index d88d5b1798..e7b93e46cf 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -318,9 +318,10 @@ Class Procs: if(is_assess_emagged()) return 10 //if emagged, always return 10. - var/on_asses = on_assess_perp(perp) - if(on_asses) - return on_asses + var/assess_result = on_assess_perp(perp) + if(assess_result) + return assess_result + if(auth_weapons && !src.allowed(perp)) if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \ diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index dabdebb380..8bbadc1659 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -1,230 +1,195 @@ -/* - Portable Turrets: - +/* Portable Turrets: Constructed from metal, a gun of choice, and a prox sensor. - Gun can be a taser or laser or energy gun. - This code is slightly more documented than normal, as requested by XSI on IRC. - */ - /obj/machinery/porta_turret name = "turret" icon = 'icons/obj/turrets.dmi' icon_state = "grey_target_prism" anchored = 1 layer = 3 - invisibility = INVISIBILITY_LEVEL_TWO // the turret is invisible if it's inside its cover + invisibility = INVISIBILITY_LEVEL_TWO //the turret is invisible if it's inside its cover density = 1 - use_power = 1 // this turret uses and requires power - idle_power_usage = 50 // when inactive, this turret takes up constant 50 Equipment power - active_power_usage = 300// when active, this turret takes up constant 300 Equipment power + use_power = 1 //this turret uses and requires power + idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power + active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power req_access = list(access_security) - power_channel = EQUIP // drains power from the EQUIPMENT channel + power_channel = EQUIP //drains power from the EQUIPMENT channel + req_access = list(63) - var/lasercolor = "" // Something to do with lasertag turrets, blame Sieve for not adding a comment. - var/raised = 0 // if the turret cover is "open" and the turret is raised - var/raising= 0 // if the turret is currently opening or closing its cover - var/health = 80 // the turret's health - var/locked = 1 // if the turret's behaviour control access is locked + var/lasercolor = "" //Something to do with lasertag turrets, blame Sieve for not adding a comment. + var/raised = 0 //if the turret cover is "open" and the turret is raised + var/raising= 0 //if the turret is currently opening or closing its cover + var/health = 80 //the turret's health + var/locked = 1 //if the turret's behaviour control access is locked + var/controllock = 0 //if the turret responds to control panels - var/installation // the type of weapon installed - var/gun_charge = 0 // the charge of the gun inserted + var/installation = /obj/item/weapon/gun/energy/gun //the type of weapon installed + var/gun_charge = 0 //the charge of the gun inserted var/projectile = null //holder for bullettype - var/eprojectile = null//holder for the shot when emagged - var/reqpower = 0 //holder for power needed - var/sound = null//So the taser can have sound - var/iconholder = null//holder for the icon_state - var/egun = null//holder to handle certain guns switching bullettypes + var/eprojectile = null //holder for the shot when emagged + var/reqpower = 500 //holder for power needed + var/iconholder = null //holder for the icon_state. 1 for orange sprite, null for blue. + var/egun = null //holder to handle certain guns switching bullettypes - var/obj/machinery/porta_turret_cover/cover = null // the cover that is covering this turret - var/last_fired = 0 // 1: if the turret is cooling down from a shot, 0: turret is ready to fire - var/shot_delay = 15 // 1.5 seconds between each shot + var/obj/machinery/porta_turret_cover/cover = null //the cover that is covering this turret + var/last_fired = 0 //1: if the turret is cooling down from a shot, 0: turret is ready to fire + var/shot_delay = 15 //1.5 seconds between each shot - var/check_records = 1 // checks if it can use the security records - var/criminals = 1 // checks if it can shoot people on arrest - var/auth_weapons = 0 // checks if it can shoot people that have a weapon they aren't authorized to have - var/stun_all = 0 // if this is active, the turret shoots everything that isn't security or head of staff - var/check_anomalies = 1 // checks if it can shoot at unidentified lifeforms (ie xenos) - var/ai = 0 // if active, will shoot at anything not an AI or cyborg + var/check_records = 1 //checks if it can use the security records + var/auth_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have + var/stun_all = 1 //if this is active, the turret shoots everything that does not meet the access requirements + var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos) + var/ai = 0 //if active, will shoot at anything not an AI or cyborg + var/ailock = 0 // AI cannot use this - var/attacked = 0 // if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!) + var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!) - //var/emagged = 0 // 1: emagged, 0: not emagged - var/on = 1 // determines if the turret is on + var/on = 1 //determines if the turret is on var/disabled = 0 - var/datum/effect/effect/system/spark_spread/spark_system // the spark system, used for generating... sparks? + var/shot_sound //what sound should play when the turret fires + var/eshot_sound //what sound should play when the emagged turret fires - New() - ..() - icon_state = "[lasercolor]grey_target_prism" - // Sets up a spark system - spark_system = new /datum/effect/effect/system/spark_spread - spark_system.set_up(5, 0, src) - spark_system.attach(src) - sleep(10) - if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots - projectile = /obj/item/projectile/beam/stun//holder for the projectile, here it is being set - eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different - reqpower = 200 - sound = 1 + var/datum/effect/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks? + +/obj/machinery/porta_turret/New() + ..() + icon_state = "[lasercolor]grey_target_prism" + //Sets up a spark system + spark_system = new /datum/effect/effect/system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + + cover = new /obj/machinery/porta_turret_cover(loc) + cover.Parent_Turret = src + setup() + +/obj/machinery/porta_turret/proc/setup() + + var/obj/item/weapon/gun/energy/E = new installation //All energy-based weapons are applicable + //var/obj/item/ammo_casing/shottype = E.projectile_type + + projectile = E.projectile_type + eprojectile = projectile + shot_sound = E.fire_sound + eshot_sound = shot_sound + + switch(E.type) + if(/obj/item/weapon/gun/energy/laser/bluetag) + eprojectile = /obj/item/weapon/gun/energy/laser/bluetag + lasercolor = "b" + req_access = list(access_maint_tunnels, access_theatre) + check_records = 0 + auth_weapons = 1 + stun_all = 0 + check_anomalies = 0 + shot_delay = 30 + + if(/obj/item/weapon/gun/energy/laser/redtag) + eprojectile = /obj/item/weapon/gun/energy/laser/redtag + lasercolor = "r" + req_access = list(access_maint_tunnels, access_theatre) + check_records = 0 + auth_weapons = 1 + stun_all = 0 + check_anomalies = 0 + shot_delay = 30 iconholder = 1 - else - var/obj/item/weapon/gun/energy/E=new installation - // All energy-based weapons are applicable - switch(E.type) - if(/obj/item/weapon/gun/energy/laser/bluetag) - projectile = /obj/item/projectile/beam/lastertag/blue - eprojectile = /obj/item/projectile/beam/lastertag/omni//This bolt will stun ERRYONE with a vest - iconholder = null - reqpower = 100 - lasercolor = "b" - req_access = list(access_maint_tunnels) - check_records = 0 - criminals = 0 - auth_weapons = 1 - stun_all = 0 - check_anomalies = 0 - shot_delay = 30 - if(/obj/item/weapon/gun/energy/laser/redtag) - projectile = /obj/item/projectile/beam/lastertag/red - eprojectile = /obj/item/projectile/beam/lastertag/omni - iconholder = null - reqpower = 100 - lasercolor = "r" - req_access = list(access_maint_tunnels) - check_records = 0 - criminals = 0 - auth_weapons = 1 - stun_all = 0 - check_anomalies = 0 - shot_delay = 30 + if(/obj/item/weapon/gun/energy/laser/practice) + iconholder = 1 + eprojectile = /obj/item/projectile/beam - if(/obj/item/weapon/gun/energy/laser/practice) - projectile = /obj/item/projectile/beam/practice - eprojectile = /obj/item/projectile/beam - iconholder = null - reqpower = 100 +// if(/obj/item/weapon/gun/energy/laser/practice/sc_laser) +// iconholder = 1 +// eprojectile = /obj/item/projectile/beam - if(/obj/item/weapon/gun/energy/pulse_rifle) - projectile = /obj/item/projectile/beam/pulse - eprojectile = projectile - iconholder = null - reqpower = 700 + if(/obj/item/weapon/gun/energy/laser/retro) + iconholder = 1 - if(/obj/item/weapon/gun/energy/staff) - projectile = /obj/item/projectile/change - eprojectile = projectile - iconholder = 1 - reqpower = 700 +// if(/obj/item/weapon/gun/energy/laser/retro/sc_retro) +// iconholder = 1 - if(/obj/item/weapon/gun/energy/ionrifle) - projectile = /obj/item/projectile/ion - eprojectile = projectile - iconholder = 1 - reqpower = 700 + if(/obj/item/weapon/gun/energy/laser/captain) + iconholder = 1 - if(/obj/item/weapon/gun/energy/taser) - projectile = /obj/item/projectile/beam/stun - eprojectile = projectile - iconholder = 1 - reqpower = 200 + if(/obj/item/weapon/gun/energy/lasercannon) + iconholder = 1 - if(/obj/item/weapon/gun/energy/stunrevolver) - projectile = /obj/item/projectile/energy/electrode - eprojectile = projectile - iconholder = 1 - reqpower = 200 + if(/obj/item/weapon/gun/energy/taser) + eprojectile = /obj/item/projectile/beam + eshot_sound = 'sound/weapons/Laser.ogg' - if(/obj/item/weapon/gun/energy/lasercannon) - projectile = /obj/item/projectile/beam/heavylaser - eprojectile = projectile - iconholder = null - reqpower = 600 + if(/obj/item/weapon/gun/energy/stunrevolver) + eprojectile = /obj/item/projectile/beam + eshot_sound = 'sound/weapons/Laser.ogg' - if(/obj/item/weapon/gun/energy/decloner) - projectile = /obj/item/projectile/energy/declone - eprojectile = projectile - iconholder = null - reqpower = 600 + if(/obj/item/weapon/gun/energy/gun) + eprojectile = /obj/item/projectile/beam //If it has, going to kill mode + eshot_sound = 'sound/weapons/Laser.ogg' + egun = 1 - if(/obj/item/weapon/gun/energy/crossbow/largecrossbow) - projectile = /obj/item/projectile/energy/bolt/large - eprojectile = projectile - iconholder = null - reqpower = 125 - - if(/obj/item/weapon/gun/energy/crossbow) - projectile = /obj/item/projectile/energy/bolt - eprojectile = projectile - iconholder = null - reqpower = 50 - - if(/obj/item/weapon/gun/energy/laser) - projectile = /obj/item/projectile/beam - eprojectile = projectile - iconholder = null - reqpower = 500 - - else // Energy gun shots - projectile = /obj/item/projectile/beam/stun// if it hasn't been emagged, it uses normal taser shots - eprojectile = /obj/item/projectile/beam//If it has, going to kill mode - iconholder = 1 - egun = 1 - reqpower = 200 - - Del() - // deletes its own cover with it - del(cover) - ..() + if(/obj/item/weapon/gun/energy/gun/nuclear) + eprojectile = /obj/item/projectile/beam //If it has, going to kill mode + eshot_sound = 'sound/weapons/Laser.ogg' + egun = 1 -/obj/machinery/porta_turret/attack_ai(mob/user as mob) - return attack_hand(user) +/obj/machinery/porta_turret/Del() + //deletes its own cover with it + del(cover) // qdel + ..() -/obj/machinery/porta_turret/attack_hand(mob/user as mob) + +/obj/machinery/porta_turret/attack_ai(mob/user) + if(!ailock) + return attack_hand(user) + else + user << "There seems to be a firewall preventing you from accessing this device." + + +/obj/machinery/porta_turret/attack_hand(mob/user) . = ..() - if (.) + if(.) return var/dat - // The browse() text, similar to ED-209s and beepskies. - if(!(src.lasercolor))//Lasertag turrets have less options + //The browse() text, similar to ED-209s and beepskies. + if(!lasercolor) //Lasertag turrets have less options dat += text({" -Automatic Portable Turret Installation

-Status: []
-Behaviour controls are [src.locked ? "locked" : "unlocked"]"}, + Automatic Portable Turret Installation

+ Status: []
+ Behaviour controls are [locked ? "locked" : "unlocked"]"}, -"[src.on ? "On" : "Off"]" ) + "[on ? "On" : "Off"]" ) - if(!src.locked) - dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"}, + if(!locked || issilicon(user)) + dat += text({"

+ Neutralize All Non-Synthetics: []
+ Check for Weapon Authorization: []
+ Check Security Records: []
+ Neutralize All Non-Authorized Personnel: []
+ Neutralize All Unidentified Life Signs: []
"}, -"[src.auth_weapons ? "Yes" : "No"]", -"[src.check_records ? "Yes" : "No"]", -"[src.criminals ? "Yes" : "No"]", -"[stun_all ? "Yes" : "No"]", -"[check_anomalies ? "Yes" : "No"]" ) + "[ai ? "Yes" : "No"]", + "[auth_weapons ? "Yes" : "No"]", + "[check_records ? "Yes" : "No"]", + "[stun_all ? "Yes" : "No"]", + "[check_anomalies ? "Yes" : "No"]" ) else if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(((src.lasercolor) == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag))) + if(lasercolor == "b" && istype(H.wear_suit, /obj/item/clothing/suit/redtag)) return - if(((src.lasercolor) == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) + if(lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag)) return dat += text({" -Automatic Portable Turret Installation

-Status: []
"}, + Automatic Portable Turret Installation

+ Status: []
"}, -"[src.on ? "On" : "Off"]" ) + "[on ? "On" : "Off"]" ) user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") @@ -232,28 +197,26 @@ Status: []
"}, return /obj/machinery/porta_turret/Topic(href, href_list) - if (..()) + if(..()) return usr.set_machine(src) - src.add_fingerprint(usr) - if ((href_list["power"]) && (src.allowed(usr))) - if(anchored) // you can't turn a turret on/off if it's not anchored/secured - on = !on // toggle on/off + add_fingerprint(usr) + if(href_list["power"] && (!locked || issilicon(usr))) + if(anchored) //you can't turn a turret on/off if it's not anchored/secured + on = !on //toggle on/off else - usr << "\red It has to be secured first!" + usr << "It has to be secured first!" updateUsrDialog() return - switch(href_list["operation"]) - // toggles customizable behavioural protocols - - if ("authweapon") - src.auth_weapons = !src.auth_weapons - if ("checkrecords") - src.check_records = !src.check_records - if ("shootcrooks") - src.criminals = !src.criminals + switch(href_list["operation"]) //toggles customizable behavioural protocols + if("toggleai") + ai = !ai + if("authweapon") + auth_weapons = !auth_weapons + if("checkrecords") + check_records = !check_records if("shootall") stun_all = !stun_all updateUsrDialog() @@ -264,94 +227,93 @@ Status: []
"}, if(!anchored) icon_state = "turretCover" return - - ..() if(stat & BROKEN) icon_state = "[lasercolor]destroyed_target_prism" else - if( !(stat & NOPOWER) ) - if (on) - if (installation == /obj/item/weapon/gun/energy/laser || installation == /obj/item/weapon/gun/energy/pulse_rifle) - // laser guns and pulse rifles have an orange icon + if(powered()) + if(on) + if(iconholder) + //lasers have a orange icon icon_state = "[lasercolor]orange_target_prism" else - // anything else has a blue icon + //almost everything has a blue icon icon_state = "[lasercolor]target_prism" else icon_state = "[lasercolor]grey_target_prism" + stat &= ~NOPOWER else spawn(rand(0, 15)) - src.icon_state = "[lasercolor]grey_target_prism" + icon_state = "[lasercolor]grey_target_prism" + stat |= NOPOWER -/obj/machinery/porta_turret/attackby(obj/item/W as obj, mob/user as mob) +/obj/machinery/porta_turret/attackby(obj/item/I, mob/user) if(stat & BROKEN) - if(istype(W, /obj/item/weapon/crowbar)) - - // If the turret is destroyed, you can remove it with a crowbar to - // try and salvage its components - user << "You begin prying the metal coverings off." + if(istype(I, /obj/item/weapon/crowbar)) + //If the turret is destroyed, you can remove it with a crowbar to + //try and salvage its components + user << "You begin prying the metal coverings off." sleep(20) if(prob(70)) - user << "You remove the turret and salvage some components." + user << "You remove the turret and salvage some components." if(installation) - var/obj/item/weapon/gun/energy/Gun = new installation(src.loc) - Gun.power_supply.charge=gun_charge + var/obj/item/weapon/gun/energy/Gun = new installation(loc) + Gun.power_supply.charge = gun_charge Gun.update_icon() lasercolor = null - if(prob(50)) new /obj/item/stack/sheet/metal( loc, rand(1,4)) - if(prob(50)) new /obj/item/device/assembly/prox_sensor(locate(x,y,z)) + if(prob(50)) + new /obj/item/stack/sheet/metal(loc, rand(1,4)) + if(prob(50)) + new /obj/item/device/assembly/prox_sensor(loc) else - user << "You remove the turret but did not manage to salvage anything." - del(src) + user << "You remove the turret but did not manage to salvage anything." + del(src) // qdel - - if ((istype(W, /obj/item/weapon/card/emag)) && (!src.emagged)) - // Emagging the turret makes it go bonkers and stun everyone. It also makes - // the turret shoot much, much faster. - - user << "\red You short out [src]'s threat assessment circuits." - spawn(0) - for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] hums oddly...", 1) + if(istype(I, /obj/item/weapon/card/emag) && !emagged) + //Emagging the turret makes it go bonkers and stun everyone. It also makes + //the turret shoot much, much faster. + user << "You short out [src]'s threat assessment circuits." + visible_message("[src] hums oddly...") emagged = 1 - src.on = 0 // turns off the turret temporarily - sleep(60) // 6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit - on = 1 // turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here + iconholder = 1 + controllock = 1 + on = 0 //turns off the turret temporarily + sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit + on = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here - else if((istype(W, /obj/item/weapon/wrench)) && (!on)) + else if((istype(I, /obj/item/weapon/wrench)) && (!on)) if(raised) return - // This code handles moving the turret around. After all, it's a portable turret! - - if(!anchored) + //This code handles moving the turret around. After all, it's a portable turret! + if(!anchored && !isinspace()) anchored = 1 invisibility = INVISIBILITY_LEVEL_TWO icon_state = "[lasercolor]grey_target_prism" - user << "You secure the exterior bolts on the turret." - cover=new/obj/machinery/porta_turret_cover(src.loc) // create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second - cover.Parent_Turret = src // make the cover's parent src - else + user << "You secure the exterior bolts on the turret." + cover = new /obj/machinery/porta_turret_cover(loc) //create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second + cover.Parent_Turret = src //make the cover's parent src + else if(anchored) anchored = 0 - user << "You unsecure the exterior bolts on the turret." + user << "You unsecure the exterior bolts on the turret." icon_state = "turretCover" invisibility = 0 - del(cover) // deletes the cover, and the turret instance itself becomes its own cover. + del(cover) //deletes the cover, and the turret instance itself becomes its own cover. - qdel - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - // Behavior lock/unlock mangement - if (allowed(user)) - locked = !src.locked - user << "Controls are now [locked ? "locked." : "unlocked."]" + else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) + //Behavior lock/unlock mangement + if(allowed(user)) + locked = !locked + user << "Controls are now [locked ? "locked" : "unlocked"]." else - user << "\red Access denied." + user << "Access denied." else - // if the turret was attacked with the intention of harming it: - src.health -= W.force * 0.5 - if (src.health <= 0) - src.die() - if ((W.force * 0.5) > 1) // if the force of impact dealt at least 1 damage, the turret gets pissed off + //if the turret was attacked with the intention of harming it: + user.changeNext_move(CLICK_CD_MELEE) + health -= I.force * 0.5 + if(health <= 0) + die() + if(I.force * 0.5 > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off if(!attacked && !emagged) attacked = 1 spawn() @@ -360,8 +322,7 @@ Status: []
"}, ..() - -/obj/machinery/porta_turret/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj) if(on) if(!attacked && !emagged) attacked = 1 @@ -369,34 +330,40 @@ Status: []
"}, sleep(60) attacked = 0 - src.health -= Proj.damage + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + health -= Proj.damage + ..() - if(prob(45) && Proj.damage > 0) src.spark_system.start() - if (src.health <= 0) - src.die() // the death process :( - if((src.lasercolor == "b") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/lastertag/red)) - src.disabled = 1 - del (Proj) + + if(prob(45) && Proj.damage > 0) + spark_system.start() + if(health <= 0) + die() //the death process :( + + if(lasercolor == "b" && disabled == 0) + if(istype(Proj, /obj/item/weapon/gun/energy/laser/redtag)) + disabled = 1 + del(Proj) // qdel sleep(100) - src.disabled = 0 - if((src.lasercolor == "r") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/lastertag/blue)) - src.disabled = 1 - del (Proj) + disabled = 0 + if(lasercolor == "r" && disabled == 0) + if(istype(Proj, /obj/item/weapon/gun/energy/laser/bluetag)) + disabled = 1 + del(Proj) // qdel sleep(100) - src.disabled = 0 - return + disabled = 0 + /obj/machinery/porta_turret/emp_act(severity) if(on) - // if the turret is on, the EMP no matter how severe disables the turret for a while - // and scrambles its settings, with a slight chance of having an emag effect - check_records=pick(0,1) - criminals=pick(0,1) - auth_weapons=pick(0,1) - stun_all=pick(0,0,0,0,1) // stun_all is a pretty big deal, so it's least likely to get turned on - if(prob(5)) emagged=1 + //if the turret is on, the EMP no matter how severe disables the turret for a while + //and scrambles its settings, with a slight chance of having an emag effect + check_records = pick(0, 1) + auth_weapons = pick(0, 1) + stun_all = pick(0, 0, 0, 0, 1) //stun_all is a pretty big deal, so it's least likely to get turned on + if(prob(5)) + emagged = 1 + on=0 sleep(rand(60,600)) if(!on) @@ -405,225 +372,188 @@ Status: []
"}, ..() /obj/machinery/porta_turret/ex_act(severity) - if(severity >= 3) // turret dies if an explosion touches it! - del(src) + if(severity >= 3) //turret dies if an explosion touches it! + del(src) // qdel else - src.die() + die() -/obj/machinery/porta_turret/proc/die() // called when the turret dies, ie, health <= 0 - src.health = 0 - src.density = 0 - src.stat |= BROKEN // enables the BROKEN bit - src.icon_state = "[lasercolor]destroyed_target_prism" - invisibility=0 - src.spark_system.start() // creates some sparks because they look cool - src.density=1 - del(cover) // deletes the cover - no need on keeping it there! +/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0 + health = 0 + density = 0 + stat |= BROKEN //enables the BROKEN bit + icon_state = "[lasercolor]destroyed_target_prism" + invisibility = 0 + spark_system.start() //creates some sparks because they look cool + density = 1 + del(cover) //deletes the cover - no need on keeping it there! - del /obj/machinery/porta_turret/process() - // the main machinery process + //the main machinery process - set background = 1 + set background = BACKGROUND_ENABLED - if(src.cover==null && anchored) // if it has no cover and is anchored - if (stat & BROKEN) // if the turret is borked - del(cover) // delete its cover, assuming it has one. Workaround for a pesky little bug + if(cover == null && anchored) //if it has no cover and is anchored + if(stat & BROKEN) //if the turret is borked + del(cover) //delete its cover, assuming it has one. Workaround for a pesky little bug - qdel else - src.cover = new /obj/machinery/porta_turret_cover(src.loc) // if the turret has no cover and is anchored, give it a cover - src.cover.Parent_Turret = src // assign the cover its Parent_Turret, which would be this (src) + cover = new /obj/machinery/porta_turret_cover(loc) //if the turret has no cover and is anchored, give it a cover + cover.Parent_Turret = src //assign the cover its Parent_Turret, which would be this (src) if(stat & (NOPOWER|BROKEN)) - // if the turret has no power or is broken, make the turret pop down if it hasn't already + //if the turret has no power or is broken, make the turret pop down if it hasn't already popDown() return if(!on) - // if the turret is off, make it pop down + //if the turret is off, make it pop down popDown() return - var/list/targets = list() // list of primary targets - var/list/secondarytargets = list() // targets that are least important + var/list/targets = list() //list of primary targets + var/list/secondarytargets = list() //targets that are least important - if(src.check_anomalies) // if its set to check for xenos/carps, check for non-mob "crittersssss"(And simple_animals) - for(var/mob/living/simple_animal/C in view(7,src)) + if(check_anomalies) //if its set to check for xenos/carps, check for non-mob "crittersssss"(And simple_animals) + for(var/mob/living/simple_animal/C in view(7, src)) if(!C.stat) targets += C - for (var/mob/living/carbon/C in view(7,src)) // loops through all living carbon-based lifeforms in view(12) - if(istype(C, /mob/living/carbon/alien) && src.check_anomalies) // git those fukken xenos - if(!C.stat) // if it's dead/dying, there's no need to keep shooting at it. + for(var/obj/mecha/ME in view(7,src)) + if(ME.occupant) + switch(assess_carbon(ME.occupant)) + if(1) + targets += ME.occupant + if(2) + secondarytargets += ME.occupant + + for(var/obj/vehicle/train/T in view(7,src)) + if(T && T.load && T.is_train_head()) + switch(assess_carbon(T.load)) + if(1) + targets += T.load + if(2) + secondarytargets += T.load + + for(var/mob/living/carbon/C in view(7,src)) //loops through all living carbon-based lifeforms in view + switch(assess_carbon(C)) + if(1) targets += C + if(2) + secondarytargets += C - else - if(emagged) // if emagged, HOLY SHIT EVERYONE IS DANGEROUS beep boop beep - targets += C - else - if (C.stat || C.handcuffed) // if the perp is handcuffed or dead/dying, no need to bother really - continue // move onto next potential victim! + if(!tryToShootAt(targets)) + if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets + spawn() + popDown() // no valid targets, close the cover - var/dst = get_dist(src, C) // if it's too far away, why bother? - if (dst > 7) - continue +/obj/machinery/porta_turret/proc/assess_carbon(var/mob/living/carbon/C) + if(!C) + return 0 - if(ai) // If it's set to attack all nonsilicons, target them! - if(C.lying) - if(lasercolor) - continue - else - secondarytargets += C - continue - else - targets += C - continue - - if (istype(C, /mob/living/carbon/human)) // if the target is a human, analyze threat level - if(src.assess_perp(C)<4) - continue // if threat level < 4, keep going - - else if (istype(C, /mob/living/carbon/monkey)) - continue // Don't target monkeys or borgs/AIs you dumb shit - - if (C.lying) // if the perp is lying down, it's still a target but a less-important target - secondarytargets += C - continue - - targets += C // if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee - - if (targets.len>0) // if there are targets to shoot - - var/atom/t = pick(targets) // pick a perp from the list of targets. Targets go first because they are the most important - - if (istype(t, /mob/living)) // if a mob - var/mob/living/M = t // simple typecasting - if (M.stat!=2) // if the target is not dead - spawn() popUp() // pop the turret up if it's not already up. - dir=get_dir(src,M) // even if you can't shoot, follow the target - spawn() shootAt(M) // shoot the target, finally + if(istype(C, /mob/living/carbon/alien) && check_anomalies) //git those fukken xenos + if(!C.stat) //if it's dead/dying, there's no need to keep shooting at it. + return 2 else - if(secondarytargets.len>0) // if there are no primary targets, go for secondary targets - var/mob/t = pick(secondarytargets) - if (istype(t, /mob/living)) - if (t.stat!=2) - spawn() popUp() - dir=get_dir(src,t) - shootAt(t) + if(emagged) //if emagged, HOLY SHIT EVERYONE IS DANGEROUS beep boop beep + return 2 else - spawn() popDown() + if(C.stat || C.handcuffed) //if the perp is handcuffed or dead/dying, no need to bother really + return 0 //move onto next potential victim! -/obj/machinery/porta_turret/proc - popUp() // pops the turret up - if(disabled) - return - if(raising || raised) return - if(stat & BROKEN) return - invisibility=0 - raising=1 - flick("popup",cover) - sleep(5) - sleep(5) - raising=0 - cover.icon_state="openTurretCover" - raised=1 - layer=4 - - popDown() // pops the turret down - if(disabled) - return - if(raising || !raised) return - if(stat & BROKEN) return - layer=3 - raising=1 - flick("popdown",cover) - sleep(10) - raising=0 - cover.icon_state="turretCover" - raised=0 - invisibility=2 - icon_state="[lasercolor]grey_target_prism" - - -/obj/machinery/porta_turret/proc/assess_perp(mob/living/carbon/human/perp as mob) - var/threatcount = 0 // the integer returned - - if(src.emagged) return 10 // if emagged, always return 10. - - if((stun_all && !src.allowed(perp)) || attacked && !src.allowed(perp)) - // if the turret has been attacked or is angry, target all non-sec people - if(!src.allowed(perp)) - return 10 - - if(auth_weapons) // check for weapon authorization - if((isnull(perp.wear_id)) || (istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))) - - if((src.allowed(perp)) && !(src.lasercolor)) // if the perp has security access, return 0 + var/dst = get_dist(src, C) //if it's too far away, why bother? + if(dst > 7) return 0 - if((istype(perp.l_hand, /obj/item/weapon/gun) && !istype(perp.l_hand, /obj/item/weapon/gun/projectile/shotgun)) || istype(perp.l_hand, /obj/item/weapon/melee/baton)) - threatcount += 4 + if(ai) //If it's set to attack all nonsilicons, target them! + if(C.lying) + if(lasercolor) + return 0 + else + return 1 + else + return 2 - if((istype(perp.r_hand, /obj/item/weapon/gun) && !istype(perp.r_hand, /obj/item/weapon/gun/projectile/shotgun)) || istype(perp.r_hand, /obj/item/weapon/melee/baton)) - threatcount += 4 + if(istype(C, /mob/living/carbon/human)) //if the target is a human, analyze threat level + if(assess_perp(C, auth_weapons, check_records, lasercolor) < 4) + return 0 //if threat level < 4, keep going - if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee/baton)) - threatcount += 2 + else if(istype(C, /mob/living/carbon/monkey)) + return 0 //Don't target monkeys or borgs/AIs you dumb shit - if((src.lasercolor) == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve - threatcount = 0//But does not target anyone else - if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag)) - threatcount += 4 - if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag))) - threatcount += 4 - if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag)) - threatcount += 2 + if(C.lying) //if the perp is lying down, it's still a target but a less-important target + return 1 - if((src.lasercolor) == "r") - threatcount = 0 - if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag)) - threatcount += 4 - if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) - threatcount += 4 - if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag)) - threatcount += 2 + return 2 //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee - if (src.check_records) // if the turret can check the records, check if they are set to *Arrest* on records - for (var/datum/data/record/E in data_core.general) - - var/perpname = perp.name - if (perp.wear_id) - var/obj/item/weapon/card/id/id = perp.wear_id.GetID() - if (id) - perpname = id.registered_name - - if (E.fields["name"] == perpname) - for (var/datum/data/record/R in data_core.security) - if ((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - threatcount = 4 - break +/obj/machinery/porta_turret/proc/tryToShootAt(var/list/mob/living/targets) + while(targets.len > 0) + var/mob/living/M = pick(targets) + targets -= M + if(target(M)) + return 1 - - return threatcount - - - - - -/obj/machinery/porta_turret/proc/shootAt(var/atom/movable/target) // shoots at a target +/obj/machinery/porta_turret/proc/popUp() //pops the turret up if(disabled) return + if(raising || raised) + return + if(stat & BROKEN) + return + invisibility = 0 + raising = 1 + flick("popup", cover) + sleep(10) + raising = 0 + cover.icon_state = "openTurretCover" + raised = 1 + layer = 4 - if(lasercolor && (istype(target,/mob/living/carbon/human))) - var/mob/living/carbon/human/H = target - if(H.lying) +/obj/machinery/porta_turret/proc/popDown() //pops the turret down + if(disabled) + return + if(raising || !raised) + return + if(stat & BROKEN) + return + layer = 3 + raising = 1 + flick("popdown", cover) + sleep(10) + raising = 0 + cover.icon_state = "turretCover" + raised = 0 + invisibility = 2 + icon_state = "[lasercolor]grey_target_prism" + + +/obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp) + if((stun_all || attacked) && !allowed(perp)) + //if the turret has been attacked or is angry, target all non-authorized personnel, see req_access + return 10 + + return ..() + + +/obj/machinery/porta_turret/proc/target(var/mob/living/target) + if(disabled) + return + if(target && (target.stat != DEAD) && (!(target.lying) || emagged)) + spawn() + popUp() //pop the turret up if it's not already up. + dir = get_dir(src, target) //even if you can't shoot, follow the target + spawn() + shootAt(target) + return 1 + return + +/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target) + if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate + if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged return - - if(!emagged) // if it hasn't been emagged, it has to obey a cooldown rate - if(last_fired || !raised) return // prevents rapid-fire shooting, unless it's been emagged last_fired = 1 spawn() sleep(shot_delay) @@ -631,47 +561,47 @@ Status: []
"}, var/turf/T = get_turf(src) var/turf/U = get_turf(target) - if (!istype(T) || !istype(U)) + if(!istype(T) || !istype(U)) return - if (!raised) // the turret has to be raised in order to fire - makes sense, right? + if(!raised) //the turret has to be raised in order to fire - makes sense, right? return - - // any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power! - + //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power! if(iconholder) - icon_state = "[lasercolor]target_prism" - else icon_state = "[lasercolor]orange_target_prism" - if(sound) - playsound(src.loc, 'sound/weapons/Taser.ogg', 75, 1) + else + icon_state = "[lasercolor]target_prism" var/obj/item/projectile/A if(emagged) - A = new eprojectile( loc ) + A = new eprojectile(loc) + playsound(loc, eshot_sound, 75, 1) else - A = new projectile( loc ) - A.original = target.loc + A = new projectile(loc) + playsound(loc, shot_sound, 75, 1) + A.original = target if(!emagged) use_power(reqpower) else - use_power((reqpower*2)) - // Shooting Code: + use_power(reqpower * 2) + //Shooting Code: A.current = T A.yo = U.y - T.y A.xo = U.x - T.x spawn( 1 ) A.process() - return - +/obj/machinery/porta_turret/proc/setState(var/on, var/emagged) + if(controllock) + return + src.on = on + src.emagged = emagged + src.iconholder = emagged + src.power_change() /* - Portable turret constructions - Known as "turret frame"s - */ /obj/machinery/porta_turret_construct @@ -679,66 +609,65 @@ Status: []
"}, icon = 'icons/obj/turrets.dmi' icon_state = "turret_frame" density=1 - var/build_step = 0 // the current step in the building process - var/finish_name="turret" // the name applied to the product turret - var/installation = null // the gun type installed - var/gun_charge = 0 // the gun charge of the gun type installed + var/build_step = 0 //the current step in the building process + var/finish_name="turret" //the name applied to the product turret + var/installation = null //the gun type installed + var/gun_charge = 0 //the gun charge of the gun type installed - -/obj/machinery/porta_turret_construct/attackby(obj/item/W as obj, mob/user as mob) - - // this is a bit unweildy but self-explanitory +/obj/machinery/porta_turret_construct/attackby(obj/item/I, mob/user) + //this is a bit unwieldy but self-explanatory switch(build_step) - if(0) // first step - if(istype(W, /obj/item/weapon/wrench) && !anchored) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue You secure the external bolts." + if(0) //first step + if(istype(I, /obj/item/weapon/wrench) && !anchored) + playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "You secure the external bolts." anchored = 1 build_step = 1 return - else if(istype(W, /obj/item/weapon/crowbar) && !anchored) - playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) - user << "You dismantle the turret construction." + else if(istype(I, /obj/item/weapon/crowbar) && !anchored) + playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) + user << "You dismantle the turret construction." new /obj/item/stack/sheet/metal( loc, 5) - del(src) + del(src) // qdel return if(1) - if(istype(W, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = W - if (M.use(2)) + if(istype(I, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = I + if(M.use(2)) user << "You add some metal armor to the interior frame." build_step = 2 icon_state = "turret_frame2" else - user << "You need two sheets of metal to add armor ot the frame." + user << "You need two sheets of metal to continue construction." return - else if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "You unfasten the external bolts." + else if(istype(I, /obj/item/weapon/wrench)) + playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) + user << "You unfasten the external bolts." anchored = 0 build_step = 0 return if(2) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue You bolt the metal armor into place." + if(istype(I, /obj/item/weapon/wrench)) + playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "You bolt the metal armor into place." build_step = 3 return - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(!WT.isOn()) return - if (WT.get_fuel() < 5) // uses up 5 fuel. - user << "\red You need more fuel to complete this task." + else if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I + if(!WT.isOn()) + return + if(WT.get_fuel() < 5) //uses up 5 fuel. + user << "You need more fuel to complete this task." return - playsound(src.loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) if(do_after(user, 20)) if(!src || !WT.remove_fuel(5, user)) return build_step = 1 @@ -748,130 +677,136 @@ Status: []
"}, if(3) - if(istype(W, /obj/item/weapon/gun/energy)) // the gun installation part + if(istype(I, /obj/item/weapon/gun/energy)) //the gun installation part - var/obj/item/weapon/gun/energy/E = W // typecasts the item to an energy gun - installation = W.type // installation becomes W.type - gun_charge = E.power_supply.charge // the gun's charge is stored in src.gun_charge - user << "\blue You add \the [W] to the turret." + if(isrobot(user)) + return + var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun + if(!user.unEquip(I)) + user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + return + installation = I.type //installation becomes I.type + gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge + user << "You add [I] to the turret." build_step = 4 - del(W) // delete the gun :( + del(I) //delete the gun :( qdel return - else if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "You remove the turret's metal armor bolts." + else if(istype(I, /obj/item/weapon/wrench)) + playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "You remove the turret's metal armor bolts." build_step = 2 return if(4) - if(isprox(W)) + if(isprox(I)) build_step = 5 - user << "\blue You add the prox sensor to the turret." - del(W) + if(!user.unEquip(I)) + user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + return + user << "You add the prox sensor to the turret." + del(I) // qdel return - // attack_hand() removes the gun + //attack_hand() removes the gun if(5) - if(istype(W, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + if(istype(I, /obj/item/weapon/screwdriver)) + playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) build_step = 6 - user << "\blue You close the internal access hatch." + user << "You close the internal access hatch." return - // attack_hand() removes the prox sensor + //attack_hand() removes the prox sensor if(6) - if(istype(W, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = W - if (M.use(2)) + if(istype(I, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = I + if(M.use(2)) user << "You add some metal armor to the exterior frame." build_step = 7 else - user << "You need two sheets of metal to add armor to the frame." + user << "You need two sheets of metal to continue construction." return - else if(istype(W, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + else if(istype(I, /obj/item/weapon/screwdriver)) + playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) build_step = 5 - user << "You open the internal access hatch." + user << "You open the internal access hatch." return if(7) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I if(!WT.isOn()) return - if (WT.get_fuel() < 5) - user << "\red You need more fuel to complete this task." + if(WT.get_fuel() < 5) + user << "You need more fuel to complete this task." - playsound(src.loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) if(do_after(user, 30)) - if(!src || !WT.remove_fuel(5, user)) return + if(!src || !WT.remove_fuel(5, user)) + return build_step = 8 - user << "\blue You weld the turret's armor down." + user << "You weld the turret's armor down." - // The final step: create a full turret - var/obj/machinery/porta_turret/Turret = new/obj/machinery/porta_turret(locate(x,y,z)) + //The final step: create a full turret + var/obj/machinery/porta_turret/Turret = new/obj/machinery/porta_turret(loc) Turret.name = finish_name - Turret.installation = src.installation - Turret.gun_charge = src.gun_charge + Turret.installation = installation + Turret.gun_charge = gun_charge + Turret.setup() -// Turret.cover=new/obj/machinery/porta_turret_cover(src.loc) +// Turret.cover=new/obj/machinery/porta_turret_cover(loc) // Turret.cover.Parent_Turret=Turret // Turret.cover.name = finish_name - Turret.New() - del(src) + del(src) // qdel - else if(istype(W, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) - user << "You pry off the turret's exterior armor." - new /obj/item/stack/sheet/metal( loc, 2) + else if(istype(I, /obj/item/weapon/crowbar)) + playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) + user << "You pry off the turret's exterior armor." + new /obj/item/stack/sheet/metal(loc, 2) build_step = 6 return - if (istype(W, /obj/item/weapon/pen)) // you can rename turrets like bots! - var/t = input(user, "Enter new turret name", src.name, src.finish_name) as text + if(istype(I, /obj/item/weapon/pen)) //you can rename turrets like bots! + var/t = input(user, "Enter new turret name", name, finish_name) as text t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) - if (!t) + if(!t) return - if (!in_range(src, usr) && src.loc != usr) + if(!in_range(src, usr) && loc != usr) return - src.finish_name = t + finish_name = t return ..() - -/obj/machinery/porta_turret_construct/attack_hand(mob/user as mob) +/obj/machinery/porta_turret_construct/attack_hand(mob/user) switch(build_step) if(4) - if(!installation) return + if(!installation) + return build_step = 3 - var/obj/item/weapon/gun/energy/Gun = new installation(src.loc) - Gun.power_supply.charge=gun_charge + var/obj/item/weapon/gun/energy/Gun = new installation(loc) + Gun.power_supply.charge = gun_charge Gun.update_icon() installation = null gun_charge = 0 - user << "You remove \the [Gun] from the turret frame." + user << "You remove [Gun] from the turret frame." if(5) - user << "You remove the prox sensor from the turret frame." - new/obj/item/device/assembly/prox_sensor(locate(x,y,z)) + user << "You remove the prox sensor from the turret frame." + new /obj/item/device/assembly/prox_sensor(loc) build_step = 4 +/obj/machinery/porta_turret_construct/attack_ai() + return - - - - - - - - +/************************ +* PORTABLE TURRET COVER * +************************/ /obj/machinery/porta_turret_cover name = "turret" @@ -883,116 +818,84 @@ Status: []
"}, var/obj/machinery/porta_turret/Parent_Turret = null +//The below code is pretty much just recoded from the initial turret object. It's necessary but uncommented because it's exactly the same! +//>necessary +//I'm not fixing it because i'm fucking bored of this code already, but someone should just reroute these to the parent turret's procs. -// The below code is pretty much just recoded from the initial turret object. It's necessary but uncommented because it's exactly the same! - -/obj/machinery/porta_turret_cover/attack_ai(mob/user as mob) - . = ..() - if (.) - return - var/dat - if(!(Parent_Turret.lasercolor)) - dat += text({" -Automatic Portable Turret Installation

-Status: []
-Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, - -"[Parent_Turret.on ? "On" : "Off"]" ) - - - dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"}, - -"[Parent_Turret.auth_weapons ? "Yes" : "No"]", -"[Parent_Turret.check_records ? "Yes" : "No"]", -"[Parent_Turret.criminals ? "Yes" : "No"]", -"[Parent_Turret.stun_all ? "Yes" : "No"]" , -"[Parent_Turret.check_anomalies ? "Yes" : "No"]" ) +/obj/machinery/porta_turret_cover/attack_ai(mob/user) + if(!Parent_Turret.ailock) + return attack_hand(user) else - dat += text({" -Automatic Portable Turret Installation

-Status: []
"}, + user << "There seems to be a firewall preventing you from accessing this device." -"[Parent_Turret.on ? "On" : "Off"]" ) - - user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") - onclose(user, "autosec") - return - -/obj/machinery/porta_turret_cover/attack_hand(mob/user as mob) +/obj/machinery/porta_turret_cover/attack_hand(mob/user) . = ..() - if (.) + if(.) return var/dat - if(!(Parent_Turret.lasercolor)) + if(!Parent_Turret.lasercolor) dat += text({" -Automatic Portable Turret Installation

-Status: []
-Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, + Automatic Portable Turret Installation

+ Status: []
+ Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, -"[Parent_Turret.on ? "On" : "Off"]" ) + "[Parent_Turret.on ? "On" : "Off"]" ) - if(!Parent_Turret.locked) - dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"}, + if(!src.Parent_Turret.locked || issilicon(user)) + dat += text({"

+ Neutralize All Non-Synthetics: []
+ Check for Weapon Authorization: []
+ Check Security Records: []
+ Neutralize All Non-Authorized Personnel: []
+ Neutralize All Unidentified Life Signs: []
"}, -"[Parent_Turret.auth_weapons ? "Yes" : "No"]", -"[Parent_Turret.check_records ? "Yes" : "No"]", -"[Parent_Turret.criminals ? "Yes" : "No"]", -"[Parent_Turret.stun_all ? "Yes" : "No"]" , -"[Parent_Turret.check_anomalies ? "Yes" : "No"]" ) + "[Parent_Turret.ai ? "Yes" : "No"]", + "[Parent_Turret.auth_weapons ? "Yes" : "No"]", + "[Parent_Turret.check_records ? "Yes" : "No"]", + "[Parent_Turret.stun_all ? "Yes" : "No"]" , + "[Parent_Turret.check_anomalies ? "Yes" : "No"]" ) else if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(((Parent_Turret.lasercolor) == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag))) + if(Parent_Turret.lasercolor == "b" && istype(H.wear_suit, /obj/item/clothing/suit/redtag)) return - if(((Parent_Turret.lasercolor) == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) + if(Parent_Turret.lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag)) return dat += text({" -Automatic Portable Turret Installation

-Status: []
"}, - -"[Parent_Turret.on ? "On" : "Off"]" ) - + Automatic Portable Turret Installation

+ Status: []
"}, + "[Parent_Turret.on ? "On" : "Off"]" ) user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") onclose(user, "autosec") - return + /obj/machinery/porta_turret_cover/Topic(href, href_list) - if (..()) + if(..()) return usr.set_machine(src) Parent_Turret.add_fingerprint(usr) - src.add_fingerprint(usr) - if ((href_list["power"]) && (Parent_Turret.allowed(usr))) + add_fingerprint(usr) + if(href_list["power"] && (!src.Parent_Turret.locked || issilicon(usr))) if(Parent_Turret.anchored) - if (Parent_Turret.on) - Parent_Turret.on=0 + if(Parent_Turret.on) + Parent_Turret.on = 0 else - Parent_Turret.on=1 + Parent_Turret.on = 1 else - usr << "\red It has to be secured first!" + usr << "It has to be secured first!" updateUsrDialog() return switch(href_list["operation"]) - if ("authweapon") + if("toggleai") + Parent_Turret.ai = !Parent_Turret.ai + if("authweapon") Parent_Turret.auth_weapons = !Parent_Turret.auth_weapons - if ("checkrecords") + if("checkrecords") Parent_Turret.check_records = !Parent_Turret.check_records - if ("shootcrooks") - Parent_Turret.criminals = !Parent_Turret.criminals if("shootall") Parent_Turret.stun_all = !Parent_Turret.stun_all if("checkxenos") @@ -1001,47 +904,44 @@ Status: []
"}, updateUsrDialog() - -/obj/machinery/porta_turret_cover/attackby(obj/item/W as obj, mob/user as mob) - - if ((istype(W, /obj/item/weapon/card/emag)) && (!Parent_Turret.emagged)) - user << "\red You short out [Parent_Turret]'s threat assessment circuits." - spawn(0) - for(var/mob/O in hearers(Parent_Turret, null)) - O.show_message("\red [Parent_Turret] hums oddly...", 1) +/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/card/emag) && !Parent_Turret.emagged) + user << "You short out [Parent_Turret]'s threat assessment circuits." + visible_message("[Parent_Turret] hums oddly...") Parent_Turret.emagged = 1 Parent_Turret.on = 0 sleep(40) Parent_Turret.on = 1 - else if((istype(W, /obj/item/weapon/wrench)) && (!Parent_Turret.on)) + else if(istype(I, /obj/item/weapon/wrench) && !Parent_Turret.on) if(Parent_Turret.raised) return if(!Parent_Turret.anchored) Parent_Turret.anchored = 1 Parent_Turret.invisibility = INVISIBILITY_LEVEL_TWO Parent_Turret.icon_state = "grey_target_prism" - user << "You secure the exterior bolts on the turret." + user << "You secure the exterior bolts on the turret." else Parent_Turret.anchored = 0 - user << "You unsecure the exterior bolts on the turret." + user << "You unsecure the exterior bolts on the turret." Parent_Turret.icon_state = "turretCover" Parent_Turret.invisibility = 0 - del(src) + del(src) // qdel - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (Parent_Turret.allowed(user)) + else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) + if(Parent_Turret.allowed(user)) Parent_Turret.locked = !Parent_Turret.locked - user << "Controls are now [Parent_Turret.locked ? "locked." : "unlocked."]" + user << "Controls are now [Parent_Turret.locked ? "locked" : "unlocked"]." updateUsrDialog() else - user << "\red Access denied." + user << "Access denied." else - Parent_Turret.health -= W.force * 0.5 - if (Parent_Turret.health <= 0) + user.changeNext_move(CLICK_CD_MELEE) + Parent_Turret.health -= I.force * 0.5 + if(Parent_Turret.health <= 0) Parent_Turret.die() - if ((W.force * 0.5) > 2) + if(I.force * 0.5 > 2) if(!Parent_Turret.attacked && !Parent_Turret.emagged) Parent_Turret.attacked = 1 spawn() @@ -1050,11 +950,9 @@ Status: []
"}, ..() - - /obj/machinery/porta_turret/stationary emagged = 1 New() - installation = new/obj/item/weapon/gun/energy/laser(src.loc) + installation = new/obj/item/weapon/gun/energy/laser(loc) ..() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 0e34d316ff..6f7a0daa3a 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -1,18 +1,31 @@ +//////////////////////// +//Turret Control Panel// +//////////////////////// + /obj/machinery/turretid - name = "Turret deactivation control" - icon = 'icons/obj/device.dmi' - icon_state = "motion3" + name = "turret control panel" + desc = "Used to control a room's automated defenses." + icon = 'icons/obj/machines/turret_control.dmi' + icon_state = "control_standby" anchored = 1 density = 0 - var/enabled = 1 + var/enabled = 0 var/lethal = 0 var/locked = 1 var/control_area //can be area name, path or nothing. var/ailock = 0 // AI cannot use this req_access = list(access_ai_upload) -/obj/machinery/turretid/New() - ..() +/obj/machinery/turretid/stun + enabled = 1 + icon_state = "control_stun" + +/obj/machinery/turretid/lethal + enabled = 1 + lethal = 1 + icon_state = "control_kill" + +/obj/machinery/turretid/initialize() if(!control_area) var/area/CA = get_area(src) if(CA.master && CA.master != CA) @@ -24,6 +37,7 @@ if(A.name && A.name==control_area) control_area = A break + power_change() //Checks power and initial settings //don't have to check if control_area is path, since get_area_all_atoms can take path. return @@ -33,7 +47,7 @@ return src.attack_hand(user) if (istype(W, /obj/item/weapon/card/emag) && !emagged) - user << "\red You short out the turret controls' access analysis module." + user << "You short out the turret controls' access analysis module." emagged = 1 locked = 0 if(user.machine==src) @@ -66,12 +80,11 @@ user << "There seems to be a firewall preventing you from accessing this device." /obj/machinery/turretid/attack_hand(mob/user as mob) - if ( get_dist(src, user) > 0 ) - if ( !issilicon(user) ) - user << "You are too far away." - user.unset_machine() - user << browse(null, "window=turretid") - return + if (get_dist(src, user) > 0 && !issilicon(user)) + user << "You are too far away." + user.unset_machine() + user << browse(null, "window=turretid") + return user.set_machine(src) var/loc = src.loc @@ -81,53 +94,57 @@ user << text("Turret badly positioned - loc.loc is [].", loc) return var/area/area = loc - var/t = "Turret Control Panel ([area.name])
" + var/t = "" if(src.locked && (!istype(user, /mob/living/silicon))) - t += "(Swipe ID card to unlock control panel.)
" + t += "
Swipe ID card to unlock interface
" else + if (!istype(user, /mob/living/silicon)) + t += "
Swipe ID card to lock interface
" t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable") t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal") - user << browse(t, "window=turretid") - onclose(user, "turretid") + //user << browse(t, "window=turretid") + //onclose(user, "turretid") + var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])") + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() -/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0) - if(..(href, href_list)) +/obj/machinery/turretid/Topic(href, href_list) + if(..()) return if (src.locked) if (!istype(usr, /mob/living/silicon)) usr << "Control panel is locked!" return - if ( get_dist(src, usr) == 0 || issilicon(usr)) - if (href_list["toggleOn"]) - src.enabled = !src.enabled - src.updateTurrets() - else if (href_list["toggleLethal"]) - src.lethal = !src.lethal - src.updateTurrets() - if(!nowindow) - src.attack_hand(usr) + if (href_list["toggleOn"]) + src.enabled = !src.enabled + src.updateTurrets() + else if (href_list["toggleLethal"]) + src.lethal = !src.lethal + src.updateTurrets() + src.attack_hand(usr) /obj/machinery/turretid/proc/updateTurrets() if(control_area) - for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area)) + for (var/obj/machinery/porta_turret/aTurret in get_area_all_atoms(control_area)) aTurret.setState(enabled, lethal) - src.update_icons() + src.update_icon() -/obj/machinery/turretid/proc/update_icons() - if (src.enabled) - if (src.lethal) - icon_state = "motion1" +/obj/machinery/turretid/power_change() + ..() + updateTurrets() + update_icon() + +/obj/machinery/turretid/update_icon() + ..() + if(stat & NOPOWER) + icon_state = "control_off" + else if (enabled) + if (lethal) + icon_state = "control_kill" else - icon_state = "motion3" + icon_state = "control_stun" else - icon_state = "motion0" - //CODE FIXED BUT REMOVED -// if(control_area) //USE: updates other controls in the area -// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was -// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person -// Turret_Control.icon_state = icon_state //who coded it originally was just tired -// Turret_Control.enabled = enabled //or something. I don't see any situation -// Turret_Control.lethal = lethal //in which this would be used on the current map. - //If he wants it back he can uncomment it \ No newline at end of file + icon_state = "control_standby" diff --git a/icons/obj/machines/turret_control.dmi b/icons/obj/machines/turret_control.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b7c81cd923e5a7e75a96cc982625d81cc07cd8c9 GIT binary patch literal 700 zcmV;t0z>_YP)C0000pP)t-sz`(#7 z8X7k@H!UqKB_$;l6%_!P003qH05bq)009300GR*)|Nj90%mDwH0L%aYz`(%qpyECN z0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DLFr{q$ocpK0hr@iHkEO zv#1y-YRJWzR+N~V3S}3imS^UrfY})OfC70bNtM|3ngB&pa}p~-!a86`$gt8p>X?+B znUh17Ny-YYelFmU1ORc7U-56+F%tj)0g*{WK~#90?V90kgD?<-A%PXh3h)26yJkoc z+T{WY2Bi7>i7mwnDXI^eh7dxCLMz;=JHc?^buV;T2TE_-b!WuT_kRs=-MMvVbOT=Z zo$$G?8sy^FYZxs3B?e0$#E{ju0mi-`tpK{70_b`Qpy=Z0B5{i}16to4l2Nb@5k!x8 z7Y$PglWIWgzXsQ?dv(43aX9CVMo&xB43ZUr6`u!rDtsm<5kV6>R+3&MIvs#_=frj$| zLI@#*5VG?4`GE1a`V_s`@AEGnYxD!v3iE3BK)+YZYqjoY>CaZbpOz4;`o4(4(t{ZC zukSYj^nRZL=mApzT~7h@TYRA3tGB39zkf&-LHGZ&<^$OWRjtnX03n1BLI`;brTz|I zztG>|>lgYxY~4MdUL)5p^mqLFK1hEyKEJ;*K)$^q6BPS9Ji(s+j;7e(F9~4wcYK0U ie}^Yve Date: Thu, 23 Oct 2014 20:36:38 +0200 Subject: [PATCH 5/8] Replaces the normal turrets with the new porta-turrets. --- maps/tgstation2.dmm | 53 ++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index 9b3f1f8c87..151781128a 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -2804,11 +2804,11 @@ "bbV" = (/obj/machinery/door/airlock/maintenance{name = "Crematorium Maintenance"; req_access_txt = "27"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/chapel/office) "bbW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bbX" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bbY" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bbY" = (/obj/machinery/porta_turret{ai = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bbZ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/requests_console{department = "Chapel"; departmentType = 2; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "bca" = (/obj/machinery/door_control{id = "chapel"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "bcb" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"bcc" = (/obj/machinery/turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bcc" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/porta_turret{ai = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bcd" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bce" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bcf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) @@ -3049,7 +3049,7 @@ "bgG" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/starboard) "bgH" = (/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{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep) "bgI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6; icon_state = "intact-supply"; tag = "icon-intact (SOUTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"bgJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bgJ" = (/obj/machinery/porta_turret{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bgK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bgL" = (/obj/item/weapon/extinguisher,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/evahallway) "bgM" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/rd,/obj/item/weapon/storage/secure/safe{pixel_x = -22},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi) @@ -3122,13 +3122,13 @@ "bib" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "bic" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bid" = (/turf/simulated/wall,/area/medical/patient_wing) -"bie" = (/obj/machinery/turret{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bie" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -12; pixel_y = 20},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 6; pixel_y = 24},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bif" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "big" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "bih" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "bii" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/shotgun/doublebarrel,/obj/item/weapon/paper{info = "This permit signifies that the Bartender is permitted to posess this firearm in the bar, and ONLY the bar. Failure to adhere to this permit will result in confiscation of the weapon and possibly arrest."; name = "Shotgun permit"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bij" = (/obj/machinery/door/airlock/maintenance,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/sleep) -"bik" = (/obj/machinery/turret{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bik" = (/obj/machinery/light/small{dir = 4},/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bil" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "bim" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = -30; pixel_y = 0},/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bin" = (/obj/structure/urinal{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -3785,7 +3785,7 @@ "buO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/aft) "buP" = (/turf/simulated/floor/airless{dir = 10; icon_state = "warning"},/area/rnd/test_area) "buQ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/device/flashlight,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6; icon_state = "intact-supply"; tag = "icon-intact (SOUTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/research_port) -"buR" = (/obj/machinery/turret{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"buR" = (/obj/machinery/light/small{dir = 8},/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "buS" = (/obj/structure/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/research_port) "buT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "buU" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/research_starboard) @@ -4945,7 +4945,7 @@ "bRe" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/turret_protected/ai_cyborg_station) "bRf" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bRg" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access_txt = "16"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) -"bRh" = (/obj/machinery/turretid{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 8; pixel_y = 24},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -8; pixel_y = 22},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bRh" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access_txt = "109"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/flasher{id = "AI"; pixel_x = 22; pixel_y = 24},/obj/machinery/turretid/lethal{name = "AI Chamber turret control"; pixel_x = 36; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bRi" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) "bRj" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bRk" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -5106,7 +5106,7 @@ "bUj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bUk" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bUl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/locker) -"bUm" = (/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 24; pixel_y = 24},/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access_txt = "109"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bUm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bUn" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bUo" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bUp" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -5198,7 +5198,7 @@ "bVX" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "bVY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"; tag = "icon-intact (EAST)"},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "bVZ" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab) -"bWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bWa" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bWb" = (/obj/structure/table,/obj/item/weapon/aiModule/nanotrasen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bWd" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4; icon_state = "intact-supply"; tag = "icon-intact (EAST)"},/turf/space,/area/space) @@ -5246,9 +5246,9 @@ "bWT" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/medical/reception) "bWU" = (/obj/machinery/door/window/eastright{name = "Medical Reception"; req_access_txt = "5"},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/medical/reception) "bWV" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/medical/reception) -"bWW" = (/obj/machinery/turret{dir = 8},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bWW" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bWX" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/turret_protected/ai_upload) -"bWY" = (/obj/machinery/turret{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bWY" = (/obj/machinery/porta_turret/stationary{ai = 1; ailock = 1},/turf/simulated/floor/plating/airless,/area/turret_protected/tcomsat) "bWZ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan,/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "bXa" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bXb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) @@ -8143,7 +8143,7 @@ "daE" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/tcommsat/chamber) "daF" = (/turf/simulated/shuttle/wall{icon_state = "swallc3"},/area/shuttle/escape/centcom) "daG" = (/turf/simulated/wall/r_wall,/area/hallway/primary/aft) -"daH" = (/obj/machinery/turret{lasers = 1; lasertype = 2},/turf/simulated/floor/plating/airless,/area/turret_protected/tcomsat) +"daH" = (/obj/machinery/turretid/stun{ailock = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor,/area/tcommsat/entrance) "daI" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "daJ" = (/obj/machinery/computer/crew,/obj/machinery/status_display{pixel_y = 30},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "daK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/tcommsat/chamber) @@ -8241,13 +8241,13 @@ "dcy" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) "dcz" = (/obj/structure/window/reinforced,/obj/structure/lattice,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) "dcA" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomfoyer) -"dcB" = (/obj/machinery/turret{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"dcB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera{c_tag = "Telecoms Foyer"; dir = 2; network = list("Tcomsat")},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/turretid/lethal{ailock = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/turret_protected/tcomfoyer) "dcC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access_txt = "45"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/medical/surgeryprep) "dcD" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area/space) "dcE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/surgery2) "dcF" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/shuttle/plating,/area/centcom/evac) "dcG" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/shuttle/plating,/area/centcom/evac) -"dcH" = (/obj/machinery/turret{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"dcH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/porta_turret{ai = 1; ailock = 1; dir = 6},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/turret_protected/tcomfoyer) "dcI" = (/obj/structure/window/reinforced,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) "dcJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) "dcK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) @@ -9080,7 +9080,7 @@ "dsF" = (/turf/simulated/floor{icon_state = "white"},/area/research_outpost/sample) "dsG" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/sample) "dsH" = (/obj/structure/table,/obj/machinery/light{dir = 1},/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/sample) -"dsI" = (/obj/machinery/turretid{ailock = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; icon_state = "motion3"; lethal = 0; name = "Telecoms Foyer turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor,/area/tcommsat/entrance) +"dsI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/obj/machinery/porta_turret{ai = 1; ailock = 1; dir = 10},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/turret_protected/tcomfoyer) "dsJ" = (/obj/machinery/door/window/westleft{dir = 1; name = "Sample Preparation Loading"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/research_outpost/sample) "dsK" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/research_outpost/sample) "dsL" = (/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -9095,7 +9095,6 @@ "dsU" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/power) "dsV" = (/obj/machinery/door/airlock/hatch{name = "Telecoms East Wing"; req_access_txt = "61"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) "dsW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/turret_protected/tcomfoyer) -"dsX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/turretid{ailock = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; icon_state = "motion1"; lethal = 1; name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61)},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera{c_tag = "Telecoms Foyer"; dir = 2; network = list("Tcomsat")},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/turret_protected/tcomfoyer) "dsY" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/research_outpost/atmos) "dsZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos) "dta" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) @@ -11251,22 +11250,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaWEaWFaWGayWauQaPpaPDaOyaFsaFyaRjaRiaSAaVbaDPaOAaOCaDBaNlaPEaWVaNkaNiaNjaNgaNhaNtaNraNraNraNoaNqaPEaNvbdLbbLbdNbqrbdUbdObdVaNlaNDaPSaNCaNBaNAaHEaNzaUCaAcaVpaVqaAcaVWaVKaVXaNFaNMaNNaNOaNNaNIaNJaNKaNLaOhaOaaOlaOkaNSaNQaNYaNNaOsaOqaOoaOuaIfaWNaXNaXpaYVaXOaYWauWaRSatTaXQaTkaQoaXRaOHaODaOOaToaTkaQoaQraXTaRWaGJaRXaOVaXUaRXaRXaUOaVuaWhaOUaWkaOTaKdavyaWtauaaUUbcqbecdPxdPxaOYaOXaOZaPgaPgaPgaPgaPgaPgaPgaEyaPeaKSaTHaSoaTGaTHaIbaPbaEyaZKaSsaEJaSsaKQaYkaYlaYmaaeaMCaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaUQaURaLHaLEaMgaPpaFsaFsaFsaFsaFsaEpaFsaNuaDPaMuaMtaDBaYyaYyaYyaYyaKBaYyaLDaRnaLMaUKaWZaWZaLGaLJaPEaEtbfzbenbfAbsBbgnbfFbgEaLfaLfaYSaYSaYSaYSaYSaYTatFaZmaYYbcmaZobdgbcnaLSaZaaPWaZlaMdaMfaLZaPWaPWaPWaPWaPWaLQaPWaPWaPWaLOaLNaLUaZlaPWaZaaLSbdibdkbdjbffbeiaLYaPUaQoaQoaQoaQoaQoaFHaFFaQoaMBaQoaZraZraZraZraZsaMyaMzaMAaRXaRXaRXaZwaZxasfaMvaMwaMxaKdavyaKTauaaVjbcqbhbbhhaMZaMXaMTaMUaMTaMTaMTaMTaMTaMMaMNaMKaMLaMRaMSaMPaMQaMFaMIaMDaMEaMJaSsaEJaZJaKQaSsbusaYmaaeaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaZLaZMaWGaFkasDaPpaFfaFwaFsaFyaFeaEpaFsaFjaDPaFcaFdaDBaYyaZYaZZaFvaFxaYyaFXbadaFPaPEaDGaDJaErbhjaPEaEtbjsbalbalbsCbalbalbalbalbanbaobaobaobapbaobaqatFboHbjvbpcasMasMasMbaAbaAbaAbayaFlbaybaAbaBbaBbaBbaBbaBaFrbaBbaBbaBbaDbaDaFqbaDaPWaPWaPWbqlbqlbqlbffbeiaLYauWbaFbaGaBlaUDaQobaIaFFbaJaFEbaLaZraZrbhWbaObcqbcqbcqaWPbaMbaMbaMbcqbcqbcqaFLaFMaFJaFKavyaKTaKTaKVbcqbjuaZFbaYbcqbaZaFAbbbaWmaQCbbabbdaFCaHPaEyaIbaQMaFBbbgaQMaQNaIbaIbaEyaFDaSsaEJaSsaKQbblbbmaYmaaeaFpaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaCDaxRbbnaIQaDVaPnaFfaFhaFgaFfaFeaEpaDUaDTaDPaDDaDCaDBaYyaYyaYybcJaEvaYyaEwbadaEqaPEaDGaDJaErbGtaPEaEtbjsbalaEoaBkbbHbbHbbIbalbbJbbKaEkbbMbarbarbaratFaAcaYYbcmasMbbPbbQbbRefHaEhaEiaEfbbWbaAbaBbbXbbYaEeaEdaEcbccbcdbaBbaDbceaDZaDYaDXaDWaEbaEabjtbqlbrHbqnbrIauWbcqbcqbcqbcqaEZaEYaFbaFabcqbcqaEXbcqbcqbcqbcqaEUaERaETbcrbcrbcrbcsaKObcqaKKaKMaLAaKNaKIaKIaKIaKhbcqbjuaZFaEObcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqaEIaJtaEHaExaEAaEIaJtbcqaPtbcBaSsaEJaSsaKQaWAbcDbcEaTMaWDaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaCDaxRbbnaIQaDVaPnaFfaFhaFgaFfaFeaEpaDUaDTaDPaDDaDCaDBaYyaYyaYybcJaEvaYyaEwbadaEqaPEaDGaDJaErbGtaPEaEtbjsbalaEoaBkbbHbbHbbIbalbbJbbKaEkbbMbarbarbaratFaAcaYYbcmasMbbPbbQbbRefHaEhaEiaEfbbWbaAbaBbbXbccaEeaEdaEcbbYbcdbaBbaDbceaDZaDYaDXaDWaEbaEabjtbqlbrHbqnbrIauWbcqbcqbcqbcqaEZaEYaFbaFabcqbcqaEXbcqbcqbcqbcqaEUaERaETbcrbcrbcrbcsaKObcqaKKaKMaLAaKNaKIaKIaKIaKhbcqbjuaZFaEObcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqaEIaJtaEHaExaEAaEIaJtbcqaPtbcBaSsaEJaSsaKQaWAbcDbcEaTMaWDaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazQasSbcFaAFaWGatHatHatHatHatHatHaNUaHuatHaDPaDPaDPaDPaDPaJmaDPaDPaDPaHtaHtaFRaYyaZYbcIbcJaHvaYybcLbcMbcLaPEaDGaDJaErbGtaPEaEtbjsbalbToaScbcQbbHbcQbalbbJbcRbPhbcSbcTbcUbcVatFbtfbrJbcmbtgbcYbgCbdabdbbdbaHyaHzaHAbaAbaBbdeaHkaIebdhbbXaNPaHYbaBbaDaHxaHNaHMaHXbfhaHGaHFaLgbqlbuFbuDaLYaKlbdubdvaZFaZFaIjaZFaIiaZFaZFaZFaZFbgGaZFaZFaZFaZFaBDaZFaZFaZFaZFaZFaZFbdvaZFaZFaIkaIlaIlaImaIlaIlaIobLxaZFaBDaItaJybgGaZFaIxaZFaZFaZFaIyaIzaIAaIBaZFaICaZFaIDaZFaZFbdzaIEaIFaSsaEJaSsaHLaHKaHJaJYaPcaHHaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaaaaebdRazTaHcaFWaTraFQaFQaFQaFQaFQaHwaFOaFNaFUaFTaFSaFRaYyaYyaYybdXaEvaYyaPEaPEaPEaPEaDGaHhaFZbSaaPEaGbbTmbalaJfaJlefIbcQbeebalbbJbefbPhbcSbcSbcSbehatFbvdaMabcmbvqaGvaGwaGraGsaGpaGqaGlaGmbaAbaBberaGkbetbetbetaNPbevbaBbaDbexaGibclbdpbeyaGeaGdaGcbqlbwybwxbwJbwIaGKaGEaGDaGDaGMaGLaGNaGzaGzaGzaGPaGzaGzaGzaGzaGzaGAaGBaGBaGBaGCaGDaGDaGEaGDaGDaGFaGBaGBaHiaGzaHeaHpaHlaGzaHjaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGRaGPaGQaGzaGXaGSaGTaHaaHaaGYaGZaKQaStbeLaTMaTMaTNaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaWEaWFbeMaKRbUWatHbePbePbeQbePbePbePbUVaNlaNlaNlaNlaDBaYyaZYbeSbeTaHvaYybVdbVebVdaPEaPEaPEaPEbTwaPEbVcbjsbalbTpcnLbcQbRAbVabalbbJbarbUXbcSbcSbcSbfeatFbwKaMabcmbxHblvbgCbembfibfjbepbVtbhZbaAbVnbVmbVlbetbVkbetaHkbUFbUGbaDbfrbVibVjbVgbVgbVgbVhbVfbqlbxJbxIbyybyxcxRdPwdPxdTPbmZcFsbVFcegceibVGbVHctbctbctaaZFaZFaZFaZFaZFbfDbVwbEuaZFctcbVybVxbVBaZFbfDbfybVIbVJbdzaZFaZFbVKaZFaZFcejbfOaZFbfDaZFaZFaZFaZFaZFaZFaZFaZFaZFaBDaZFaZFbdzbfQbfRbfSbfTbfUcGxcGybfWaaeaaaaaeaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQcrWcrQcdlcdmbUbatHbfYbfZbgabgabgbbgcbTWbTXbTYbTYbTZbUaaYyaYyaYybcJbUgaYyaNlaNlaNlaNlbUfaEtaEtbTxbUdbUcbTybUCbMpbYMbUqbUBbUjbalbTKbarbUibcSbcSbcSbgzbyzbyAaMabcmasMbUsbUrbUubUtbUobUnbUpbfkbaAbaBbgFbTabTdbUmbgJbTabgKbaBbaDbaDbUybUDbgObgPbclbUwbUxbqlbyCbyBbyDbqlbTqbTqbTqbTqbTqbTqbcqbcqbUMbUNbUJbUKbUNbUMbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbUObcqbcqbcqbcqbcqbcqcuObcqaZFaZFbURbhkbhkbTqbTqbTqbTqbTqbhmbhnbhnbhobhnaZFbhnbhobUSbhnbhpbTqcuRcuRcuRcvMaPtcBhaPtaPtaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaZLaZMbeMaKRbSTatHbhtbePbhubhvbePbePbePauUbSSbSRbSRbRuaYyaZYbhzbcJbTzaYybTCbTAbTvbTubUlbUebUebVbbUebUecabbalaFibLsbbHbLwbTtbUCbTibarbTjbcSbcSbTkbhUbyEbyAaMabyHasMbTbbTbbTbbTbbTbbTbbiybTbbaAbaBbiebSYbRVbSXbRVbSUbikbaBbaDbaDbimbRmbiobipbclaGdbSVbqlbffaLXaLYbqlcqlcqncqSbTncrDcrGcrMcrFcqUcqVbTTbTUcqVbTOcpscoYcmTbTMbTNcmUcpMckbcrscpNbTRbTPbTScktcktclSbktbSibTqbTqbTJbTqbTLbTLbTqbiVbiWbiXbTqbTEbTFbTEbTqbhmbhnbhpbTqbTDbTIbTDbTqbThbTgbNtbTHbTGbkebhgaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQcrWcrQcdlcdmbUbatHbfYbfZbgabgabgbbgcbTWbTXbTYbTYbTZbUaaYyaYyaYybcJbUgaYyaNlaNlaNlaNlbUfaEtaEtbTxbUdbUcbTybUCbMpbYMbUqbUBbUjbalbTKbarbUibcSbcSbcSbgzbyzbyAaMabcmasMbUsbUrbUubUtbUobUnbUpbfkbaAbaBbgFbTabTdbRhbUmbTabgKbaBbaDbaDbUybUDbgObgPbclbUwbUxbqlbyCbyBbyDbqlbTqbTqbTqbTqbTqbTqbcqbcqbUMbUNbUJbUKbUNbUMbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbUObcqbcqbcqbcqbcqbcqcuObcqaZFaZFbURbhkbhkbTqbTqbTqbTqbTqbhmbhnbhnbhobhnaZFbhnbhobUSbhnbhpbTqcuRcuRcuRcvMaPtcBhaPtaPtaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaZLaZMbeMaKRbSTatHbhtbePbhubhvbePbePbePauUbSSbSRbSRbRuaYyaZYbhzbcJbTzaYybTCbTAbTvbTubUlbUebUebVbbUebUecabbalaFibLsbbHbLwbTtbUCbTibarbTjbcSbcSbTkbhUbyEbyAaMabyHasMbTbbTbbTbbTbbTbbTbbiybTbbaAbaBbuRbSYbRVbSXbRVbSUbikbaBbaDbaDbimbRmbiobipbclaGdbSVbqlbffaLXaLYbqlcqlcqncqSbTncrDcrGcrMcrFcqUcqVbTTbTUcqVbTOcpscoYcmTbTMbTNcmUcpMckbcrscpNbTRbTPbTScktcktclSbktbSibTqbTqbTJbTqbTLbTLbTqbiVbiWbiXbTqbTEbTFbTEbTqbhmbhnbhpbTqbTDbTIbTDbTqbThbTgbNtbTHbTGbkebhgaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaacbCaMYcbFaIQbRzatHbjibePbjjbjkbjlbRxbePbRybRobRrbRsbRuaYyaYyaYyaYyaYyaYybSebSdbScbSbcavbalbalbalbalbalbalbalbShbalbalbalbMVbalbSgbRFbSfbcSbcSbcSbjAbyzbyAaMabyJasMbRPbRObRRbRQbREbLrbRKbRIaaebaBbRMbRLbRUbRkbRWbRYbRZbaBaaebaDbjNbRSbjObjPbclaGdbRTbqlbyLbyKaLYbyMcqOcgPbSwbSxbSKbSLbSGbSIchochocgRcgScjtcjtbSOciEciDbSNbSMciAckcckbcjDbSQbSPcgecjvcjucgecgfbktbSibiSbkwbkxcgdbSlbkAbkBbkCbkDbkCbSjbkFbSsbkHbTqbcqbSrbSmbTqbSzbSEbSDbSvbNHbSAbNtbSubkSbkTbhgaaaaaaaaaaafaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazQasSbcFaAFaZMaTPaTPaTPbkUaTPbkVayWcRSchTatHbkWbkXbkYbkZblacaHcaGaJaaEtaEtaEtcaIbTYcyRbTYbTYbTYbTYbZYbZXbZXbZZctsbalbljblkcrwblmblnbloboAbZVblrblschfckRbTibgAbSfbcSbcSbZWbaratFbyAbztbzuboqbpwcaucaucatcaFcaEbzYcazcacbaBbaBbaBbaBbZlbaBbaBbaBbaBaaebaDcaqbRScahcajcaecafcadbqlbzEaLXaLYbqldVHdVIdVJcaXcaVbgUcUZbZscjtcjtcjtcjtcjtcjtbZNcaLcaQbSNcaUcaScaJckbdVwbZDcaKcgecjvcjucgedVLbktbSibiScbtbLZbLZcbpcbqcbmcbncbncbncbrcbncbhcbgbhlcbfcbkcbjbNtcbibNHcbdcbabXbbXfbNtbmPbkSbmsbhgaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmQcOfcgmcgtcgncgDcgDcgGcgLaxTatHbmSbmTbkZbmUbePbePbePaNlbZqbZrbYsbYtbYsbYsbYsbYtbYsaNlaNlbalbalbalbYubalblpblpblpblpblpblpboAbIwbnbbVobndbYwbYJbYLbYHbYIbqfbYFbYxbzFbzWbzVbsLbJfbYOcwZbYSbTscDdbUkbRKbRIbXkbXmbnybnzbXnbZebnCbnzbnDbXmaaebaDbnFbZobnFbaDbaDbaDbZkbqlbzZaLXaLYbyMcqOcgPbZzbZAbZubgUdUSbZsdUXdUYdUVdUWdVnbZObZNbZMcmTdVpbZRbZQbZIckbbZGbZDbSPcgecjvcjucgecgfbktbSibiSdTXbnYdTYbXPbkxbocbodboebofbZSbpDbZTbohbhlbZUbsqchDbNtbVZbVAbVzbXBbVVbVXbNtbmPbkSborbhgaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaabmQcLFcIHcInaxSaxSaxSbosaxSaxSatHbotboubovbkZbePaaaaaaaaaaaeaaebowbowbowbowbowbowbowaaaaaaboxbXzbXybXAboBblpblpblpblpblpblpbXobXrbXsbqebXtbXvbPNboFbarbarbXwbarbarbAabAcbAbbAdbOxbXibTbbTbbTbbTbbTbbMsbTbbXkbWZbWYbIqbWjbWpbWjbIqbWWbWXaaebnFboVbXdbXabXcbXebnFbLjauWbAeaXObAfbqlbWmcqnbYlbYnbYjbixdUObYkdUJdUKdULbVWdUGdUFbYibYfcmTckbbYebYcbXYckbdUCbYbbXWbXVdUzdUzbXUdUwbktbSibiSdUubkxbkxbXPbXQbXNbXObXLbXMbXIbXJbXHbpFbhlbXGbXFbXEbNtbUYbUTbUPbXBbNHbUIbNtbSubkSbpMbhgaaaaaaaaaaaaaaebpNbpObMebpObMebpObpQaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceTaxRcHMcHMbpRaTPbpSazQasSbpTbpSatHbpUbpVbpWbpXbePaaaaaaaaaaaaaaabowbowbowbowbowbowbowaaaaaabpYbpZblpbWrbWqbWqbWqbWqbWqbWtbWubWqbWsbWxbWybWvbWwbWzbWAbarbqjbcSbWCbWBbBabBfbBebCubAabOxbInbTcbMtbVMbTQbTrbInbVsbVpbWbbWabWcbVUbWebWgbWhbVYbWdbWkbWnbWobqFbaDbqGbnFbWiauWbCzbeibCBbqldUjdUkbWPdUibWObixdUebWNbWLbWMbWKbWKbWVbWUbWTbWSdUpbPZbWRbHJbPZbPZbPZbPZbWQbPZbPZbPZbktbktbktbSibiSdTXbnYdTYbWDbWEbrcbrdbrebrebrebpDbKEbrfbrgbtCbWJbWIbNtbUEbUzbWGbWHbNHbUvbNtbWFbmrbhgbhgaaaaaaaaaaaaaaebrobrpbrqbrrbrrbrsbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaabmQcLFcIHcInaxSaxSaxSbosaxSaxSatHbotboubovbkZbePaaaaaaaaaaaeaaebowbowbowbowbowbowbowaaaaaaboxbXzbXybXAboBblpblpblpblpblpblpbXobXrbXsbqebXtbXvbPNboFbarbarbXwbarbarbAabAcbAbbAdbOxbXibTbbTbbTbbTbbTbbMsbTbbXkbWZbWWbIqbWjbWpbWjbIqbWabWXaaebnFboVbXdbXabXcbXebnFbLjauWbAeaXObAfbqlbWmcqnbYlbYnbYjbixdUObYkdUJdUKdULbVWdUGdUFbYibYfcmTckbbYebYcbXYckbdUCbYbbXWbXVdUzdUzbXUdUwbktbSibiSdUubkxbkxbXPbXQbXNbXObXLbXMbXIbXJbXHbpFbhlbXGbXFbXEbNtbUYbUTbUPbXBbNHbUIbNtbSubkSbpMbhgaaaaaaaaaaaaaaebpNbpObMebpObMebpObpQaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceTaxRcHMcHMbpRaTPbpSazQasSbpTbpSatHbpUbpVbpWbpXbePaaaaaaaaaaaaaaabowbowbowbowbowbowbowaaaaaabpYbpZblpbWrbWqbWqbWqbWqbWqbWtbWubWqbWsbWxbWybWvbWwbWzbWAbarbqjbcSbWCbWBbBabBfbBebCubAabOxbInbTcbMtbVMbTQbTrbInbVsbVpbWbbnzbWcbVUbWebWgbWhbVYbWdbWkbWnbWobqFbaDbqGbnFbWiauWbCzbeibCBbqldUjdUkbWPdUibWObixdUebWNbWLbWMbWKbWKbWVbWUbWTbWSdUpbPZbWRbHJbPZbPZbPZbPZbWQbPZbPZbPZbktbktbktbSibiSdTXbnYdTYbWDbWEbrcbrdbrebrebrebpDbKEbrfbrgbtCbWJbWIbNtbUEbUzbWGbWHbNHbUvbNtbWFbmrbhgbhgaaaaaaaaaaaaaaebrobrpbrqbrrbrrbrsbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbrubrvbrwbrxblpbIyblpbZKbZKbZKccZbIvbIwblpblpbnbbqgbqTbMlbJXbrCbrDbrEbcSbcSbMkbCCbBfbLpbLkbKAbJPbVNbVObMrbMqbJNbRbbInaaebrQbMnbnzbqybIibqybnzbMDbrUaaebnFbMBbMCbMvbaDbrZbnFbLjauWbDSbeiaLYbqlbLFbLGbLHbLIbLKbPZbPMbLLbPZbLDbPubWfbLDbPZbLNbLMbPZbPZbLPbLObQFbApbQIbQHbLSbLQbQVbPZbLWbLYbLUbLVbiSbMabLZbLZbMbbMcbkBbsFbrebrebrebpDbKEbsHbtCbStbMfbMdbtCbNEbMibNJbMhbNHbMjbNtbmPbsPbhgaaaaaaaaaaaaaaaaaebsQbsRbrqbrrbrqcfLbMeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcfDbsUcfDbsVbsWbIyblpblpblpblpblpbIvbIwbsXbalbalbsYbcSbndbJXbtabtbbLebSWbSWbKZbFcbFpbFobIhbBabLBbVQbJmbJNbDNbCHbHWbInaaebrUbrUbLibIqbJWbnzbLfbrUbrUaaebtvbtvbtvbtvbtvbtvbtvbIkbqlbKubyBbyDbqlbKvbMmbMmbHMbCGbPZbKxbKzbHJbKDbKBbKCbKebHJbKdbKbbKlbKkbKjbKfbKfbKfbKmbKfbKsbKrbKqbKnbKQbKRbKSbKTcuBbrbbKVbKWbKXbKYbkBbzPbkCbkCbucbpDbKEbuebuqbUAbKHbKGbuqbKIbKMbKLbKObGwbtCbtCbKPbhgbhgbRDbSpbSpbSpbSqcDfbrobrrbrqbrrbrrcfjbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaafaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbuublpbIyblpbrybrybrybrybIvbIwbuvbuwbalbuxbcSbndbJXbuybuzbJZbcSbKabcSbLbbLubBebLAbLzbLBbXjbJObJNbJNbJNbJMbInbOpbOpbOpbrUbuRbIibuRbrUcdacdacdabtvbJQbuVbuWbuXbuYbJSbJRbqlbLTaLXaLYbqlbJcbJdbJebJgbJnbJobJpbJqbJhbJjbJkbJlbJwbJvbJybJxbJtbJrbJubJtbJFbJEbJHbJGbJCbJBbJDbPZbICbIDbIAbIBbiSbvybIzbMgbvBbvBbkBbvCbvDbvEbkBbIEbIMbvGbSobSnbIKbIIbIHbIFbIFbJbbIZbIXbIWbIPbIObINbJIbJJbJLbXpbXpbZcbZtbvXbpObMeccRbMebpObvZaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaafaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbuublpbIyblpbrybrybrybrybIvbIwbuvbuwbalbuxbcSbndbJXbuybuzbJZbcSbKabcSbLbbLubBebLAbLzbLBbXjbJObJNbJNbJNbJMbInbOpbOpbOpbrUbgJbIibgJbrUcdacdacdabtvbJQbuVbuWbuXbuYbJSbJRbqlbLTaLXaLYbqlbJcbJdbJebJgbJnbJobJpbJqbJhbJjbJkbJlbJwbJvbJybJxbJtbJrbJubJtbJFbJEbJHbJGbJCbJBbJDbPZbICbIDbIAbIBbiSbvybIzbMgbvBbvBbkBbvCbvDbvEbkBbIEbIMbvGbSobSnbIKbIIbIHbIFbIFbJbbIZbIXbIWbIPbIObINbJIbJJbJLbXpbXpbZcbZtbvXbpObMeccRbMebpObvZaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbwabrvbwbbXSblpbIyblpblpblpblpblpbIvbIwbuvbwdbalbwebcSbIxbIubcSbItbPhbcSbcSbrFbBabBfbBebLAbLzbLBbInbIsbIlbImbIlbIobInbwpbtqbIrbOpbrUbnAbrUcdabIjbrabXubtvbIbbIcbIdbIebIfbIfbIgbNpbLTaLXaLYbqlbSkbLRbLRbHMbvNbPZbHObHSbPZbLXbHNbHNbHGbPZbHxbHrbPZbPZbPZbPZbPZbPZbHKbPZbPZbHJbHIbPZbAqbAqbAqbHobiSbtCbuqbuqbuqbuqbuqbuqbuqbuqbuqbGwbHcbHbbHebSnbGZbGlbHabsabsabsabHibRpbRlbRibHhbHgbHZbRBbRtbRwbRtbIabRCbRDbSpbSqbRHcDfbRJaaaaaeaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbxubxvbQQblpblpblpbxvblpbIvbIwbuvbQSbalbQRbcSbndbJXbcSbgAbQTbcSbcSbxGbCCbBfbBebNqbCCbNsbInbQWbQUbRdbRcbRbbInbRabQXbPUbMubRhbRjbRfbRgbQYbQZbRebtvbRnbycbycbydbyebyfbQEbqlbNxbNwbNybqlbymbQhbQibQjcarbQdbApbQfbHJcbccbebHNbQlbHJbzzbQmbHJceEceJcqebDccckbNbccEbAqbQkbOYcpybRvcbbbAqbQsbQubQwbPGbQtbPwbPwbQnbQobQpbQrbQpbQqbQMbQLbQpbQKbQPbGlbQObQNbQxbtCbtCbtCbtCbtCbQJbQDbywbRDbSqbRCefSefTefUefVckkctpdKtefRaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbxubxvbQQblpblpblpbxvblpbIvbIwbuvbQSbalbQRbcSbndbJXbcSbgAbQTbcSbcSbxGbCCbBfbBebNqbCCbNsbInbQWbQUbRdbRcbRbbInbRabQXbPUbMubiebRjbRfbRgbQYbQZbRebtvbRnbycbycbydbyebyfbQEbqlbNxbNwbNybqlbymbQhbQibQjcarbQdbApbQfbHJcbccbebHNbQlbHJbzzbQmbHJceEceJcqebDccckbNbccEbAqbQkbOYcpybRvcbbbAqbQsbQubQwbPGbQtbPwbPwbQnbQobQpbQrbQpbQqbQMbQLbQpbQKbQPbGlbQObQNbQxbtCbtCbtCbtCbtCbQJbQDbywbRDbSqbRCefSefTefUefVckkctpdKtefRaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcoMbzdcoMbPQbzfbzgbzgbzgbzgbzgbzhbPKbPLbuvbzjbalbzkbPIbPJbPPbzobPNbPObzqbzrbarbAadSVbBebNAbNzbLBbInbPXbPWbQbbIlbQcbInbRGbPYbQabOpbPSbPTbLocdabPRcoOcoXbtvbzKbzLbzMbzNbyebyfbPVbqlbDSaLXaLYbNBbPjbOubzGbPibEpbPfbNfbPebPZbPZbPZbPgbPZbPZbCbbPcbXqbZFbZBbPdbDcbOVbNbbOTbLJbPabOYbOXbAybPBbPCbPDbPEbPFbPGbPHbPwbPwbPxbPybPzbPybPybPAbPqbPpbPsbPrbPtbGlbwtbPvbPlbPkbPnbPmbPobzlbzbbNXbBcaaeaaebRCcaocapcamcanbZycalbZxbRCaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbAKbALbAMbalbalbANbrvbrvbrvbAObalbalbAPbAQbARbalbASbASbASbOQbASbAUbORbAWbAXbAYbAabBfbBebNDbNCbAabOxbOxbOxbOxbOxbOObOxbOxbOxbOxbOxbOxbOPbOxbOxbOxbOxbOxbOxbOxbOxbqlbqlbqlbqlbqlbqlbDSaLXaLYbNBbOtbOubBxbOvbOnbOobOqbOrbOkbOlbOmbApbOLbOKbONbOMbOHbOGbOJbOIbODbOCbOFbOEbOzbOybOBbOAbNUbNVbAqbNNbSJbtCbtCbtCbtCbtCbNMbtCbtCbtCbuqbNLbuqbuqbZhbSnbGZbGlbwtbOjbOibOhbOfbOebObbzlbzbbNXbNKaaaaaabRCbZvbZwbRCbZtbRCbRCbZtbRCaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYZaaeaaaaaaaaaaaabASbChbNFbNIbCkbAUbNGbCmbEZbCobAabBfbBebLAbLubRNbQgbSCbSybSHbSFbTVbTlbULbUHbULbVvbVDbVCbVLbVEbLubXgbLubXhbLubLbbYBbYqbYEbYDbYYbYVbDSaLXbNyauWbymbSBbSBbSBbymbPZbNmbNobNkbNlcuKbNjbNhbRXbNgbmKbHJbYAbYzbNebDcbNbbNabMWbMUbMTbAybMRbEKbNrbAqcuCblubzCbPbbXXbXxbXDbMNbMObOSbELbMLbMMbOcblTbuqbDybGZbGlbrWbMKbMHbMGbMJbMIbMEbzlbzbbMFbywbywbywbRCbRCbRCbRCaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaaaaa @@ -11762,7 +11761,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWcYZcYYcYZcYZdqddqcdpRcZNcZOcZPdpVdpSdpZcZmcZmcZTdbucYXdELcYXdpQdbydbpcZYcZZdaacYXaalaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWcYZcYYcYZcZAdcPdtMdqydqxdqxdqxdqtdqsdUgdUadTNdTMdaldaldalcYXdamdqmdqndaodapdaqdardTQdTQdTZdTIdTLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHciHciHciHciHciHciHciHbCVciHciHciHciHciHciHciHciHciHciHciHaalcYWcYZcYYcYZcZAdcndawdaxdaydaydaycYXdcmdTHdaBcZmdbTdaDdaEdalcYXcYXcYXdqlcYXcYXcYXcYXaalaalciHciHciHciHciHciHciHciHciHciHciHciHciHciHciHciHciHbCVciHciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeciHaalcYWcYYdaHcYYdaIdcncZtdaldaldaldaldalddjdaKddgdaKdUvdVadaOdaPdaldaldaIdqIdaScYYdaHcYYcYWaalciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeciHaalcYWcYYbWYcYYdaIdcncZtdaldaldaldaldalddjdaKddgdaKdUvdVadaOdaPdaldaldaIdqIdaScYYbWYcYYcYWaalciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaedUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaaaaaciHaalcYWcYZcYYcYZcZAdcTdcSdaldaVdaVdaVdgUdcUdaYdaZdaVdaVddbdbbdaVdaVdaldaIdqIcZFcYZcYYcYZcYWaalciHciHaaaaaedUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaaciHaalcYWcYZcYYcYZcZAdqQddHdaldaVdbbdbbdbbddBdbbdbfdbbdbbddBdbbdbbdaVdaldaIdqIcZFdqSdcrdcscYWaalaalciHaaeaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaeciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaadUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaLaaaciHaalcYWcYZcYYcYZcZAddwddrdaldaVdbldbbdbbddBdbbdbmdbbdbbddBdbndbodaVdaldqPdqKcZFdcgdbqdqOdbscYWaalciHaaaaaLdUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11772,12 +11771,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaadUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaLaaaciHaalcYWcYZcYYcYZcZAdqIcZFdaldaVdbbdbbdbbddBdbbdbmdbbdbbddBdbbdbbdaVdalcZAdqIcZFdcgdchdcidcjcYWaalciHaaaaaLdUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaaciHaalcYWcYZcYYcYZcZAdcncZFdaldaVdckdclduIdWHdbbdbfdbbdbbddBdcodcpdaVdalcZAdqIcZFdcqdcrdcscYWaalaalciHaaeaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaeciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaedUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaaaaaciHaalcYWcYZcYYcYZcZAdcncZFdaldaVdaVdaVdWCdaVdaVdcudaVdaVdWGdaVdaVdaVdalcZAdqIcZFcYZcYYcYZcYWaalciHciHaaaaaedUodUodUodUodUodUodUodUodUodUodUodUodUodUodUodUoaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHaalcYWcYYdaHcYYdaIdqIcZtdaldaldaldaldaldaldaldcwdaldaldaldaldaldaldaldaIdqIcZtcYYdaHcYYcYWaalciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHciHciHciHciHciHciHciHciHciHciHbCVciHciHciHciHciHciHciHciHaalcYWcYZcYYcYZcZAdqIdcydczcZPcZPdcAdcBdjCdsWdsXdthdtmdcHdcAcZPcZPdcIdcJdqIcZFcYZcYYcYZcYWaalciHciHciHciHciHciHciHbCVciHciHciHciHciHciHciHciHciHciHbCVciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHaalcYWcYYbWYcYYdaIdqIcZtdaldaldaldaldaldaldaldcwdaldaldaldaldaldaldaldaIdqIcZtcYYbWYcYYcYWaalciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHciHciHciHciHciHciHciHciHciHciHbCVciHciHciHciHciHciHciHciHaalcYWcYZcYYcYZcZAdqIdcydczcZPcZPdcAdcHdjCdsWdcBdthdtmdsIdcAcZPcZPdcIdcJdqIcZFcYZcYYcYZcYWaalciHciHciHciHciHciHciHbCVciHciHciHciHciHciHciHciHciHciHbCVciHciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWcYZcYYcYZcZAdsPdtMdtMdtMdtMdsSdtNdtPdtPdsQdtPdtPduldsVdtMdtMdtMdtMdsTcZFcYZcYYdcWcYWaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWdcXcYYcYZcYZdaydaydcYdaydaydcAdcZddaddcdsOddcdddddedcAdaydaydaydaydaycYZcYZcYYcYZcYWaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWcYZcYYcYZcYZcYZcYZcYYcYZddfdcAdcAdcAdcAdsMdcAdcAdcAdcAddfcYZcYZcYZcYZcYZcYZcYYcYZcYWaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWcYYcYYcYYcYYcYYcYYcYYcYYddidAKdBEddpdsEdshdsIddpddqdtuddscYYcYYcYYcYYcYYcYYcYYcYYcYWaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalcYWcYYcYYcYYcYYcYYcYYcYYcYYddidAKdBEddpdsEdshdaHddpddqdtuddscYYcYYcYYcYYcYYcYYcYYcYYcYWaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaalaalcYWcYYcYZcYZcYZcYZcYZcYWddfduLdnTddvddydsDddyddzddyddAddfcYWcYZcYZcYZcYZcYZcYYcYWaalaalciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHaalaalcYWcYWcYWcYWcYWcYWcYWddfddfddfddfddDdsCddDddfddfddfddfcYWcYWcYWcYWcYWcYWcYWaalaalciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHaalaalaalaalaalaalaalaalaalaalaalddfdsidssddGddfaalaalaalaalaalaalaalaalaalaalaalciHciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From a49fd527328be75a85d496df98670d83d35b0a38 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 23 Oct 2014 20:55:10 +0200 Subject: [PATCH 6/8] Fixes a bug with stationary turrets. Removes quotes in path-name to ensure type always exists. Includes code review suggestions. --- code/game/machinery/machinery.dm | 9 +- code/game/machinery/portable_turret.dm | 90 +++++++++---------- code/game/machinery/turret_control.dm | 6 +- code/modules/mob/inventory.dm | 2 +- code/modules/mob/mob_helpers.dm | 9 ++ code/modules/projectiles/guns/energy/laser.dm | 4 +- 6 files changed, 60 insertions(+), 60 deletions(-) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index e7b93e46cf..6a1b832d0b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -318,9 +318,9 @@ Class Procs: if(is_assess_emagged()) return 10 //if emagged, always return 10. - var/assess_result = on_assess_perp(perp) - if(assess_result) - return assess_result + threatcount += on_assess_perp(perp) + if(threatcount >= 10) + return threatcount if(auth_weapons && !src.allowed(perp)) if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) @@ -341,9 +341,6 @@ Class Procs: && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/practice)) threatcount += 2 - if(istype(perp.wear_suit, /obj/item/clothing/suit/wizrobe)) - threatcount += 2 - if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none") threatcount += 2 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 8bbadc1659..035b7bab97 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -3,6 +3,10 @@ This code is slightly more documented than normal, as requested by XSI on IRC. */ +#define TURRET_PRIORITY_TARGET 2 +#define TURRET_SECONDARY_TARGET 1 +#define TURRET_NOT_TARGET 0 + /obj/machinery/porta_turret name = "turret" icon = 'icons/obj/turrets.dmi' @@ -14,9 +18,9 @@ use_power = 1 //this turret uses and requires power idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power - req_access = list(access_security) + req_access = null + req_one_access = list(access_security, access_heads) power_channel = EQUIP //drains power from the EQUIPMENT channel - req_access = list(63) var/lasercolor = "" //Something to do with lasertag turrets, blame Sieve for not adding a comment. var/raised = 0 //if the turret cover is "open" and the turret is raised @@ -304,6 +308,7 @@ if(allowed(user)) locked = !locked user << "Controls are now [locked ? "locked" : "unlocked"]." + updateUsrDialog() else user << "Access denied." @@ -421,72 +426,63 @@ targets += C for(var/obj/mecha/ME in view(7,src)) - if(ME.occupant) - switch(assess_carbon(ME.occupant)) - if(1) - targets += ME.occupant - if(2) - secondarytargets += ME.occupant + assess_and_assign_carbon(ME.occupant, targets, secondarytargets) for(var/obj/vehicle/train/T in view(7,src)) - if(T && T.load && T.is_train_head()) - switch(assess_carbon(T.load)) - if(1) - targets += T.load - if(2) - secondarytargets += T.load + assess_and_assign_carbon(T.load, targets, secondarytargets) for(var/mob/living/carbon/C in view(7,src)) //loops through all living carbon-based lifeforms in view - switch(assess_carbon(C)) - if(1) - targets += C - if(2) - secondarytargets += C + assess_and_assign_carbon(C, targets, secondarytargets) if(!tryToShootAt(targets)) if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets spawn() popDown() // no valid targets, close the cover +/obj/machinery/porta_turret/proc/assess_and_assign_carbon(var/mob/living/carbon/C, var/list/targets, var/list/secondarytargets) + switch(assess_carbon(C)) + if(TURRET_PRIORITY_TARGET) + targets += C + if(TURRET_SECONDARY_TARGET) + secondarytargets += C + /obj/machinery/porta_turret/proc/assess_carbon(var/mob/living/carbon/C) if(!C) - return 0 + return TURRET_NOT_TARGET - if(istype(C, /mob/living/carbon/alien) && check_anomalies) //git those fukken xenos - if(!C.stat) //if it's dead/dying, there's no need to keep shooting at it. - return 2 + if(emagged) //if emagged, HOLY SHIT EVERYONE IS DANGEROUS beep boop beep + return TURRET_PRIORITY_TARGET + if(isxenomorph(C) && check_anomalies) + return C.stat ? TURRET_NOT_TARGET : TURRET_PRIORITY_TARGET //if it's dead/dying, there's no need to keep shooting at it. else - if(emagged) //if emagged, HOLY SHIT EVERYONE IS DANGEROUS beep boop beep - return 2 - else - if(C.stat || C.handcuffed) //if the perp is handcuffed or dead/dying, no need to bother really - return 0 //move onto next potential victim! + if(C.stat || C.handcuffed) //if the perp is handcuffed or dead/dying, no need to bother really + return TURRET_NOT_TARGET //move onto next potential victim! - var/dst = get_dist(src, C) //if it's too far away, why bother? - if(dst > 7) - return 0 + var/dst = get_dist(src, C) //if it's too far away, why bother? + if(dst > 7) + return 0 - if(ai) //If it's set to attack all nonsilicons, target them! - if(C.lying) - if(lasercolor) - return 0 - else - return 1 + if(ai) //If it's set to attack all nonsilicons, target them! + if(C.lying) + if(lasercolor) + return TURRET_NOT_TARGET else - return 2 + return TURRET_SECONDARY_TARGET + else + return TURRET_PRIORITY_TARGET - if(istype(C, /mob/living/carbon/human)) //if the target is a human, analyze threat level - if(assess_perp(C, auth_weapons, check_records, lasercolor) < 4) - return 0 //if threat level < 4, keep going + if(ishuman(C)) //if the target is a human, analyze threat level + if(assess_perp(C, auth_weapons, check_records, lasercolor) < 4) + return TURRET_NOT_TARGET //if threat level < 4, keep going - else if(istype(C, /mob/living/carbon/monkey)) - return 0 //Don't target monkeys or borgs/AIs you dumb shit + else if(ismonkey(C)) + return TURRET_NOT_TARGET //Don't target monkeys or borgs/AIs - if(C.lying) //if the perp is lying down, it's still a target but a less-important target - return 1 + if(C.lying) //if the perp is lying down, it's still a target but a less-important target + return TURRET_SECONDARY_TARGET - return 2 //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee + return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee /obj/machinery/porta_turret/proc/tryToShootAt(var/list/mob/living/targets) while(targets.len > 0) @@ -954,5 +950,5 @@ emagged = 1 New() - installation = new/obj/item/weapon/gun/energy/laser(loc) + installation = /obj/item/weapon/gun/energy/laser ..() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 6f7a0daa3a..82df39956b 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -89,10 +89,8 @@ user.set_machine(src) var/loc = src.loc if (istype(loc, /turf)) - loc = loc:loc - if (!istype(loc, /area)) - user << text("Turret badly positioned - loc.loc is [].", loc) - return + var/turf/T = loc + loc = T.loc var/area/area = loc var/t = "" diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index f3fbb8c4a3..711b0594a1 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -181,7 +181,7 @@ update_inv_wear_mask(0) return -/mob/proc/unEquip(obj/item/I, force) //Force overrides NODROP for things like wizarditis and admin undress. +/mob/proc/unEquip(obj/item/I, force = 0) //Force overrides NODROP for things like wizarditis and admin undress. if(!I) //If there's nothing to drop, the drop is automatically successful. If(unEquip) should generally be used to check for NODROP. return 1 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 51676ca04f..86933365e5 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -10,6 +10,15 @@ return 1 return 0 +/proc/isxenomorph(A) + if(isalien(A)) + return 1 + if(istype(A, /mob/living/carbon)) + var/mob/living/carbon/C = A + var/xeno = "Xenomorph" + return findtext(C.species.name, xeno, 0, lentext(xeno)) + return 0 + /proc/ismonkey(A) if(A && istype(A, /mob/living/carbon/monkey)) return 1 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 29cd912074..31623971f7 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -7,12 +7,12 @@ w_class = 3.0 matter = list("metal" = 2000) origin_tech = "combat=3;magnets=2" - projectile_type = "/obj/item/projectile/beam" + projectile_type = /obj/item/projectile/beam /obj/item/weapon/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." - projectile_type = "/obj/item/projectile/beam/practice" + projectile_type = /obj/item/projectile/beam/practice clumsy_check = 0 obj/item/weapon/gun/energy/laser/retro From 04c3cb13d3caa88852701c36852643b9f7b36bd4 Mon Sep 17 00:00:00 2001 From: MagmaRam Date: Tue, 28 Oct 2014 17:10:56 -0400 Subject: [PATCH 7/8] Updated EVA and atmos manuals to match recent game changes. --- code/game/objects/items/weapons/manuals.dm | 43 +++++++++++++++------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index b301a77e76..d6cea1f403 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1085,6 +1085,9 @@
  • Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • + An important note here is that pipes are now done in three distinct lines - general, supply, and scrubber. You can move gases between these with a universal adapter. Use the correct position for the correct location. + Connecting scrubbers to a supply position pipe makes you an idiot who gives everyone a difficult job. Insulated and HE pipes don't go through these positions. +

    Insulated Pipes

  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • @@ -1103,22 +1106,19 @@ Stop it. It's unbecoming. Most of these are fairly straightforward.
      -
    • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 4500 kPa (kilopascals). +
    • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 15000 kPa (kilopascals). Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa - (though 18 kPa is preferred using internals, for various reasons).
    • -
    • Volume pump: This pump goes based on volume, instead of pressure, and the possible maximum pressure it can create in the pipe on the receiving end is double the gas pump because of this, - clocking in at an incredible 9000 kPa. If a pipe with this is destroyed or damaged, and this pressure of gas escapes, it can be incredibly dangerous depending on the size of the pipe filled. - Don't hook this to the distribution loop, or you will make babies cry and the Chief Engineer brutally beat you.
    • -
    • Passive gate: This is essentially a cap on the pressure of gas allowed to flow in a specific direction. - When turned on, instead of actively pumping gas, it measures the pressure flowing through it, and whatever pressure you set is the maximum: it'll cap after that. - In addition, it only lets gas flow one way. The direction the gas flows is opposite the red handle on it, which is confusing to people used to the red stripe on pumps pointing the way.
    • + (though 18 kPa is preferred using internals, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa. + You will make engiborgs cry and the Chief Engineer will beat you. +
    • Pressure regulator: These replaced the old passive gates. You can choose to regulate pressure by input or output, and regulate flow rate. Regulating by input means that when input pressure is above the limit, gas will flow. + Regulating by output means that when pressure is below the limit, gas will flow. Flow rate can be controlled.
    • Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
    • Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
    • Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
    • -
    • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference. - Can output this gas at pressures from 0-4500 kPa.
    • +
    • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers.. + Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely..
    • Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe, - the rest will continue out the other side. Can also output from 0-4500 kPa.
    • + the rest will continue out the other side. Can also output from 0-4500 kPa. The "omni" vairant allows you to set input and output sections freely.

    Heat Exchange Systems

    @@ -1130,10 +1130,11 @@
  • Bent pipe: Take a wild guess.
  • Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
  • Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch. - This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions...

  • + This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions.
    That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please. + "} @@ -1164,6 +1165,7 @@
  • A foreword on using EVA gear
  • Donning a Civilian Suit
  • Putting on a Hardsuit
  • +
  • Cyclers and Other Modification Equipment
  • Final Checks

  • @@ -1172,7 +1174,7 @@ but apparently there are some on a space station who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections: Civilian suits and hardsuits.

    -

    Civilian Suits

    +

    Civilian Suits

    z The bulkiest things this side of Alpha Centauri
    These suits are the grey ones that are stored in EVA. They're the more simple to get on, but are also a lot bulkier, and provide less protection from environmental hazards such as radiation or physical impact. As Medical, Engineering, Security, and Mining all have hardsuits of their own, these don't see much use, but knowing how to put them on is quite useful anyways.

    @@ -1185,6 +1187,8 @@ There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit, but it is recommended to have a full-sized tank on your back for EVA.

    + These suits tend to be wearable by most species. They're large and flexible. They might be pretty uncomfortable for some, though, so keep that in mind.

    +

    Hardsuits

    Heavy, uncomfortable, still the best option.
    These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.

    @@ -1194,9 +1198,22 @@ and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light. The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.

    + These suits generally only fit one species. Nanotrasen's are usually human-fitting by default, but there's equipment that can make modifications to the hardsuits to fit them to other species.

    + +

    Modification Equipment

    + How to actually make hardsuits fit you.
    + There's a variety of equipment that can modify hardsuits to fit species that can't fit into them, making life quite a bit easier.

    + + The first piece of equipment is a suit cycler. This is a large machine resembling the storage pods that are in place in some places. These are machines that will automatically tailor a suit to certain specifications. + The largest uses of them are for their cleaning functions and their ability to tailor suits for a species. Do not enter them physically. You will die from any of the functions being activated, and it will be painful. + These machines can both tailor a suit between species, and between types. This means you can convert engineering hardsuits to atmospherics, or the other way. This is useful. Use it if you can.

    + + There's also modification kits that let you modify suits yourself. These are extremely difficult to use unless you understand the actual construction of the suit. I do not reccomend using them unless no other option is available. +

    Final Checks

    • Are all seals fastened correctly?
    • +
    • If you have modified it manually, is absolutely everything sealed perfectly?
    • Do you either have shoes on under the suit, or magnetic boots on over it?
    • Do you have a mask on and internals on the suit or your back?
    • Do you have a way to communicate with the station in case something goes wrong?
    • From b12674c18c28539ee5d0f66683c98f3ecc2bd48a Mon Sep 17 00:00:00 2001 From: MagmaRam Date: Wed, 29 Oct 2014 01:49:28 -0400 Subject: [PATCH 8/8] Changed phrasing about pressure with full oxygen internals as suggested by mwerezak. Fixed typo pointed out by Glloyd. --- code/game/objects/items/weapons/manuals.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index d6cea1f403..99c4f960b0 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1060,7 +1060,7 @@

      HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS


      - Or: What the fuck does a "passive gate" do?

      + Or: What the fuck does a "pressure regulator" do?

      Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does. Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So, @@ -1108,7 +1108,7 @@
      • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 15000 kPa (kilopascals). Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa - (though 18 kPa is preferred using internals, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa. + (though 18 kPa is preferred when using internals with pure oxygen, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa. You will make engiborgs cry and the Chief Engineer will beat you.
      • Pressure regulator: These replaced the old passive gates. You can choose to regulate pressure by input or output, and regulate flow rate. Regulating by input means that when input pressure is above the limit, gas will flow. Regulating by output means that when pressure is below the limit, gas will flow. Flow rate can be controlled.
      • @@ -1174,7 +1174,7 @@ but apparently there are some on a space station who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections: Civilian suits and hardsuits.

        -

        Civilian Suits

        z +

        Civilian Suits

        The bulkiest things this side of Alpha Centauri
        These suits are the grey ones that are stored in EVA. They're the more simple to get on, but are also a lot bulkier, and provide less protection from environmental hazards such as radiation or physical impact. As Medical, Engineering, Security, and Mining all have hardsuits of their own, these don't see much use, but knowing how to put them on is quite useful anyways.