From da6ff0a251a93e9709057341a5315e80b9412359 Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Sat, 5 Jul 2014 19:55:23 -0600 Subject: [PATCH 01/48] Patched PDA scanner to be more useful PDA's integrated scanner was VERY rudimentary. Patched it to resolve some formatting issues and improve usability. --- code/game/objects/items/devices/PDA/PDA.dm | 49 +++++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index bc402a7a39..f524826b7c 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1214,8 +1214,53 @@ var/global/list/obj/item/device/pda/PDAs = list() user << "\blue Tank is empty!" if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) - note = A:info - user << "\blue Paper scanned." //concept of scanning paper copyright brainoblivion 2009 + // JMO 20140705: Makes scanned document show up in edit window if you edit notes. Not pretty for formatted documents, + // as this will clobber the HTML, but at least it lets you scan a document and add notes after the end. + var/raw_scan = (A:info) + var/formatted_scan = "" + // Scrub out the tags (replacing a few formatting ones along the way) + + // Find the beginning and end of the first tag. + var/tag_start = findtext(raw_scan,"<") + var/tag_stop = findtext(raw_scan,">") + + // Until we run out of complete tags... + while(tag_start&&tag_stop) + var/pre = copytext(raw_scan,1,tag_start) // Get the stuff that comes before the tag + var/tag = lowertext(copytext(raw_scan,tag_start+1,tag_stop)) // Get the tag so we can do intellegent replacement + var/tagend = findtext(tag," ") // Find the first space in the tag if there is one. + + // Anything that's before the tag can just be added as is. + formatted_scan = formatted_scan+pre + + // If we have a space after the tag (and presumably attributes) just crop that off. + if (tagend) + tag=copytext(tag,1,tagend) + + if (tag=="p"||tag=="/p"||tag=="br") // Check if it's I vertical space tag. + formatted_scan=formatted_scan+"
" // If so, add some padding in. + + raw_scan = copytext(raw_scan,tag_stop+1) // continue on with the stuff after the tag + + // Look for the next tag in what's left + tag_start = findtext(raw_scan,"<") + tag_stop = findtext(raw_scan,">") + + // Anything that is left in the page. just tack it on to the end as is + formatted_scan=formatted_scan+raw_scan + + // If there is something in there already, pad it out. + if (length(note)>0) + note = note + "

" + + // Store the scanned document to the notes + note = "Scanned Document. Edit to restore previous notes/delete scan.
----------
" + formatted_scan + "
" + // notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents" + // feature to the PDA, which would better convey the availability of the feature, but this will work for now. + + // Inform the user + user << "\blue Paper scanned and OCRed to notekeeper." //concept of scanning paper copyright brainoblivion 2009 + /obj/item/device/pda/proc/explode() //This needs tuning. //Sure did. From 0e1d549ff13c9c3b01b65347dd4994a5a1064595 Mon Sep 17 00:00:00 2001 From: John-Michael O'Brien Date: Mon, 7 Jul 2014 22:57:37 -0600 Subject: [PATCH 02/48] Update PDA.dm Patched the comment to match the actual, final behavior (Doh!) --- code/game/objects/items/devices/PDA/PDA.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index f524826b7c..818326b806 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1214,8 +1214,9 @@ var/global/list/obj/item/device/pda/PDAs = list() user << "\blue Tank is empty!" if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) - // JMO 20140705: Makes scanned document show up in edit window if you edit notes. Not pretty for formatted documents, - // as this will clobber the HTML, but at least it lets you scan a document and add notes after the end. + // JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents, + // as this will clobber the HTML, but at least it lets you scan a document. You can restore the original + // notes by editing the note again. (Was going to allow you to edit, but scanned documents are too long.) var/raw_scan = (A:info) var/formatted_scan = "" // Scrub out the tags (replacing a few formatting ones along the way) From 9297b56b7ac813a5577fd02412c0740b6097c67a Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Jul 2014 16:01:44 -0400 Subject: [PATCH 03/48] Cyborgs now understand all languages besides vox-pidgin --- code/modules/mob/living/silicon/robot/robot_modules.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 94346fa374..0eadb02860 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -41,7 +41,15 @@ modules += O /obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) + //full set of languages + R.add_language("Sol Common", 0) + R.add_language("Sinta'unathi", 0) + R.add_language("Siik'maas", 0) + R.add_language("Siik'tajr", 0) + R.add_language("Skrellian", 0) + R.add_language("Rootspeak", 0) R.add_language("Tradeband", 0) + R.add_language("Gutter", 0) /obj/item/weapon/robot_module/standard name = "standard robot module" From b583754f3ec97fbecfccbb9bdeb7a53070140cca Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 9 Jul 2014 17:05:54 +0930 Subject: [PATCH 04/48] Neatened a few oversights with the suit cycler up. --- code/game/machinery/suit_storage_unit.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 58da1b1d9e..9095bee17c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1036,8 +1036,11 @@ return switch(target_species) - if("Human" || "Skrell") - if(helmet) helmet.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + if("Skrell") + if(helmet) helmet.species_restricted = list("Skrell") + if(suit) suit.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + if("Human") + if(helmet) helmet.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox","Skrell") if(suit) suit.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") if("Unathi") if(helmet) helmet.species_restricted = list("Unathi") @@ -1106,4 +1109,7 @@ if(suit) suit.name = "blood-red hardsuit" suit.item_state = "syndie_hardsuit" - suit.icon_state = "rig-syndie" \ No newline at end of file + suit.icon_state = "rig-syndie" + + if(helmet) helmet.name = "refitted [helmet.name]" + if(suit) suit.name = "refitted [suit.name]" \ No newline at end of file From b2033c0825f75a2c9686db94c2622806987b025a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 9 Jul 2014 17:55:25 +0930 Subject: [PATCH 05/48] Adjusted suit cycler code, added cyclers to EVA, Engineering and Mining. --- code/game/machinery/suit_storage_unit.dm | 51 ++++++++++++++---- maps/tgstation2.dmm | 68 ++++++++++++------------ 2 files changed, 74 insertions(+), 45 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 9095bee17c..7e6f1e3f7e 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -575,7 +575,7 @@ /obj/machinery/suit_cycler name = "suit cycler" - desc = "An industrial machine for repairing, painting and equipping hardsuits." + desc = "An industrial machine for painting and refitting hardsuits." anchored = 1 density = 1 @@ -591,6 +591,7 @@ var/model_text = "" // Some flavour text for the topic box. var/locked = 1 // If locked, nothing can be taken from or added to the cycler. var/panel_open = 0 // Hacking! + var/can_repair // If set, the cycler can repair hardsuits. // Wiring bollocks. var/wires = 15 @@ -604,26 +605,54 @@ //Species that the suits can be configured to fit. var/list/species = list("Human","Skrell","Unathi","Tajaran") - var/target_department = "Engineering" - var/target_species = "Human" + var/target_department + var/target_species var/mob/living/carbon/human/occupant = null var/obj/item/clothing/suit/space/rig/suit = null var/obj/item/clothing/head/helmet/space/helmet = null +/obj/machinery/suit_cycler/New() + ..() + target_department = departments[1] + target_species = species[1] + if(!target_department || !target_species) del(src) + /obj/machinery/suit_cycler/engineering name = "Engineering suit cycler" model_text = "Engineering" req_access = list(access_construction) departments = list("Engineering","Atmos") - species = list("Human","Unathi","Tajaran") + species = list("Human","Tajaran") //Add Unathi when sprites exist for their suits. /obj/machinery/suit_cycler/mining name = "Mining suit cycler" model_text = "Mining" req_access = list(access_mining) departments = list("Mining") - species = list("Human","Unathi","Tajaran") + species = list("Human","Tajaran") + +/obj/machinery/suit_cycler/security + name = "Security suit cycler" + model_text = "Security" + req_access = list(access_security) + departments = list("Security") + species = list("Human","Tajaran") + +/obj/machinery/suit_cycler/medical + name = "Medical suit cycler" + model_text = "Medical" + req_access = list(access_medical) + departments = list("Medical") + species = list("Human","Tajaran") + +/obj/machinery/suit_cycler/syndicate + name = "Nonstandard suit cycler" + model_text = "Nonstandard" + req_access = list(access_syndicate) + departments = list("Mercenary") + species = list("Human","Tajaran","Unathi","Skrell") + can_repair = 1 /obj/machinery/suit_cycler/attack_ai(mob/user as mob) return src.attack_hand(user) @@ -780,7 +809,7 @@ dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. \[eject\]
" dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. \[eject\]" - if(suit && istype(suit)) + if(can_repair && suit && istype(suit)) dat += "[(suit.damage ? " \[repair\]" : "")]" dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" @@ -839,7 +868,7 @@ radiation_level = input("Please select the desired radiation level.","Suit cycler",null) as null|anything in choices else if(href_list["repair_suit"]) - if(!suit) return + if(!suit || !can_repair) return active = 1 spawn(100) repair_suit() @@ -943,7 +972,7 @@ /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) - T.visible_message("\The [src] pings loudly.") + T.visible_message("\icon[src] \blue The [src] pings loudly.") icon_state = initial(icon_state) active = 0 src.updateUsrDialog() @@ -1100,7 +1129,7 @@ suit.name = "atmospherics hardsuit" suit.icon_state = "rig-atmos" suit.item_state = "atmos_hardsuit" - if("^%###^%$") + if("^%###^%$" || "Mercenary") if(helmet) helmet.name = "blood-red hardsuit helmet" helmet.icon_state = "rig0-syndie" @@ -1111,5 +1140,5 @@ suit.item_state = "syndie_hardsuit" suit.icon_state = "rig-syndie" - if(helmet) helmet.name = "refitted [helmet.name]" - if(suit) suit.name = "refitted [suit.name]" \ No newline at end of file + if(helmet) helmet.name = "refitted [helmet.name]" + if(suit) suit.name = "refitted [suit.name]" \ No newline at end of file diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index fcbe24ca1b..cc72b6ed6a 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -109,7 +109,7 @@ "ace" = (/turf/simulated/wall,/area/security/main) "acf" = (/turf/simulated/wall/r_wall,/area/security/main) "acg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/brig) -"ach" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/prison) +"ach" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aci" = (/obj/machinery/door_timer/cell_1{dir = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) "acj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "ack" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) @@ -1270,7 +1270,7 @@ "ayv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) "ayw" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) "ayx" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Security Hardsuits"; req_access_txt = "1"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"ayy" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"ayy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera{c_tag = "EVA South"; dir = 1},/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/ai_monitored/storage/eva) "ayz" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "ayA" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) "ayB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hydroponics,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) @@ -1315,8 +1315,8 @@ "azo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "azp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "azq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"azr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) -"azs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"azr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"azs" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "azt" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "azu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) "azv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep) @@ -1545,7 +1545,7 @@ "aDK" = (/obj/structure/table/woodentable,/obj/item/weapon/deck,/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry) "aDL" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aDM" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aDN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aDN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aDO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aDP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/starboard) "aDQ" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) @@ -1622,9 +1622,9 @@ "aFj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aFk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port) "aFl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"aFm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aFn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aFo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aFm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aFn" = (/obj/machinery/suit_cycler/medical,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) +"aFo" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A. Cycler Access"; req_access_txt = "0"; req_one_access_txt = "1;5;11;18;24"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aFp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency2) "aFq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hydroponics) "aFr" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -1715,7 +1715,7 @@ "aGY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/turret_protected/ai) "aGZ" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor,/area/crew_quarters/fitness) "aHa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/crew_quarters/captain) -"aHb" = (/obj/machinery/light/small{dir = 8},/obj/structure/dispenser/oxygen,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) +"aHb" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aHc" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/storage/tools) "aHd" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/skrell/black,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/skrell/black,/obj/item/clothing/head/helmet/space/skrell/white,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/skrell/white,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aHe" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/bridge) @@ -1796,12 +1796,12 @@ "aIB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/central) "aIC" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plating,/area/security/vacantoffice) "aID" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/sleep/bedrooms) -"aIE" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) +"aIE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aIF" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aIG" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/ai_monitored/storage/eva) "aIH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aII" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera{c_tag = "EVA South"; dir = 1},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"aIJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aII" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"aIJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aIK" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aIL" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aIM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/unathi/helmet_cheap,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/unathi/rig_cheap,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) @@ -2463,7 +2463,7 @@ "aVs" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aVt" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "exterior access button"; pixel_x = 5; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "13"},/turf/space,/area) "aVu" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aVv" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"aVv" = (/obj/machinery/suit_cycler/security,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/hallway/primary/fore) "aVx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/toilet) "aVy" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -3300,7 +3300,7 @@ "blx" = (/obj/structure/table/reinforced,/obj/machinery/ignition_switch{id = "Xenobio"; pixel_x = -6; pixel_y = 4},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bly" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2) "blz" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"blA" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/modkit/tajaran,/obj/item/device/modkit/tajaran,/obj/item/device/modkit/tajaran,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) +"blA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "EVA East"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "blB" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact"; level = 2},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/medical/sleeper) "blC" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/medical/sleeper) "blD" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor,/area/medical/sleeper) @@ -3386,7 +3386,7 @@ "bnf" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry) "bng" = (/turf/simulated/wall,/area/rnd/mixing) "bnh" = (/obj/machinery/requests_console{department = "EVA"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/machinery/camera/motion{c_tag = "EVA Motion Sensor"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"bni" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "EVA East"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"bni" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "bnj" = (/turf/simulated/floor/plating/airless,/area/rnd/mixing) "bnk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bnl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -3516,7 +3516,7 @@ "bpF" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bpG" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) "bpH" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) -"bpI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"bpI" = (/obj/machinery/camera{c_tag = "Engineering EVA Storage"; dir = 1; network = list("SS13")},/obj/machinery/suit_cycler/engineering,/turf/simulated/floor,/area/engine/engine_eva) "bpJ" = (/obj/machinery/gateway,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway) "bpK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "bpL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/rnd/test_area) @@ -6383,7 +6383,7 @@ "csM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northleft{name = "Atmospherics Hardsuits"; req_access_txt = "24"},/turf/simulated/floor,/area/engine/engine_eva) "csN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/engine/engine_eva_maintenance) "csO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/engine/engine_eva_maintenance) -"csP" = (/obj/machinery/camera{c_tag = "Engineering EVA Storage"; dir = 1; network = list("SS13")},/obj/structure/table/reinforced{icon_state = "table"},/obj/item/device/modkit/tajaran,/turf/simulated/floor,/area/engine/engine_eva) +"csP" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor,/area/mine/eva) "csQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "csR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "csS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -9544,6 +9544,7 @@ "dBB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/research_outpost/iso3) "dBC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Isolation room two"; req_access_txt = "65"},/turf/simulated/floor,/area/research_outpost/iso2) "dBD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/entry) +"dBE" = (/obj/machinery/alarm{pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor,/area/mine/production) "dBF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/research_outpost/entry) "dBG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) "dBH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) @@ -9665,9 +9666,12 @@ "dDT" = (/obj/structure/cable,/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/research_outpost/entry) "dDU" = (/obj/machinery/recharge_station,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plating,/area/engine/drone_fabrication) "dDV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor,/area/research_outpost/gearstore) +"dDW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/mine/eva) "dDX" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/med) "dDY" = (/turf/simulated/wall,/area/research_outpost/tempstorage) +"dDZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/mine/production) "dEa" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/research_outpost/maint) +"dEb" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/turf/simulated/floor,/area/mine/production) "dEc" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the isolation room cameras."; layer = 4; name = "Isolation Room Telescreen"; network = list("Anomaly Isolation"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/maint) "dEd" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/research_outpost/hallway) "dEe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/research_outpost/hallway) @@ -9966,7 +9970,6 @@ "dKm" = (/turf/simulated/floor,/area/mine/living_quarters) "dKn" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/living_quarters) "dKo" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/eva) -"dKp" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/mine/eva) "dKq" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "dKr" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/mine/west_outpost) "dKs" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor,/area/mine/west_outpost) @@ -9996,7 +9999,6 @@ "dKW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) "dKX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) "dKY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/mine/production) -"dKZ" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor,/area/mine/production) "dLa" = (/turf/simulated/floor,/area/mine/production) "dLb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/medical/surgeryprep) "dLc" = (/obj/machinery/door/firedoor/border_only{dir = 4; layer = 2.6; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/research_outpost/hallway) @@ -10085,9 +10087,7 @@ "dMM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/mine/west_outpost) "dMN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/mine/west_outpost) "dMO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/mine/living_quarters) -"dMQ" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/mine/eva) "dMR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/mine/eva) -"dMS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/mine/production) "dMT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/mine/eva) "dMU" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/mine/eva) "dMV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/mine/eva) @@ -10823,7 +10823,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaaiabKaaPabIabJaaPabSabRabMabMabNaaPabOaaiaafaafaagaafaafabPabuabsabuabPaafaagaaaaaaaafaagaagaagaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaacaacaacaacaacaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaiabKaaPabIabQaaPabLabHaaaaaaaaaaaPabTabTabTabTabTaafaafabUabsabuabsabVaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaacaacaacaacaacaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaiamSaaPabXabYaaiamTamUaaiaaaaaaabTabTacbaccacdabTabTaafaaVabsabsabuaaVaceaceaceaceaceaceapRapRapRapRapRapRaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaaiamXachancamZaneandanfaaPaaaabTabTapeacoacoacoapVabTabTaaVacqabsacraaVaceacsactaqNacvacwapRavoavoavoavoapRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaaiamXahSancamZaneandanfaaPaaaabTabTapeacoacoacoapVabTabTaaVacqabsacraaVaceacsactaqNacvacwapRavoavoavoavoapRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaiacxamvalBamuamnamkacDaaPaaaabTacEalbacGacoacHalaacJabTacKacLacMacNacOaceacsacPamJapjapjapnanKarLasvaejapRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaiaaiaaiakAamIamDamCaaPaaPaaPaaPaaaabTacYalbacZacoacHalaadaabTadbadcaddadeadfaceacsactapQacRaqcapRapCavgatFaurapRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiadiadjadkadlaldalcaloalhaavadqadraaPaaaabTadsalbadtacoacHalaaduabTadvadwadxadyalGaceaceaceakSakWaceapRaqnaqPaqWarfapRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10862,15 +10862,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatHavsavtavuatHavsavtavuatHaYnaYgaXWaXWaXWaXWaYQaYHarwaaaaaaalPaaaaafaaaaafaafaaaaaaavAaaaaaaaafaaaaaaaafaaaalPaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaagapxapxapxapxaHDapxarbarbarbarbarbaYRaHIaHHaHGaHGaHGaHGaHKaHJaNqapEaJmalNaIjaIkaIhaIiaHYaIfaHNaHVaNQaLlavPavRavRaTIavRaKSavVavWavhaKPaviaviaKPaLcaKXaLaawbasRasRasRasRasRawbawcawdaweaaaalQalQalPaaaaaaaafaaaaaaaoPaaaaafaafaafaafalPalPalPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaasSatHaZAawgasSatHaZyawgasSatKaZzatKatKatKatKatKaZeaspaaaaaaalPalPalPaaaaaaaafaaaawjawkawjaafaafaafaafalPalPalPaafapxapxapxapxawlawmawmawmawmawmawmawmawnapxapxawoawpawqapxawrawsaNJawwaZCaJfaJfaJfaJfaJfaZBaJfaJpaLDaJfaJfaJeaJeaJlaIYaJaaJnahmaIxaIAaIDaITaIvaHravdaIwawLawLbcxawMawNaVcawLauiawPawQaLQayMayMayMayMaMdaMmaMqawUasRasRasRasRasRawUawVawdaweaaaaaaaaaaafaafaaaaafaaaaaaawWaaaaaaaafaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXawYbaUawYawZawYaZOawYbaRaxcbaiaxbaxbaxbbaVatKbbEaspaaaaafaafaaaaaaaaaaaaaafaaaaxgbbFaKgaafaaaaafaaaaaaaaaaaaaaaapxapaapaaxjapaapaapaapaapaapaapaapaaxkaxlaxmaxnaxnaxnaxnaxnaxnaxoaJBaMMaxraxraxraxraxsaJAaxraMIaxraxsaxraxraxraxraxwaxxaxyaKdaKaaHxaJRaJRaJRaHrauhaJQawLawOawMaxCawMaVeaxEaWraxGaxHaMuaMmaMmaMmaMBaMEaMGaMHaJwasRasRasRasRasRaJxaJyaxNaxOaaaaaaaaaaaaaafaaaaafaaaaxPaxQaxPaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxRaxSaxTaxUaxVaxTaxTaxWaxUaxTaxXaxYaxZaxZbmzatKbbEatLaafaafaaaaaaaaaaaaaaaaafaybaycaydbdBayfaaaaafaaaaaaaaaaaaaaaapxapaapxaygayhayiayiayiayiayiayiayiayjaygaykaylaylaylaylaylaylaylaQnaynaxrayoaypayqayrbdCbbraPaaPdaywayxaypayyaxrayzapEayAalNaQvaNFaNIbdEaHqaHravdbdFayDaxFaxFayEayFayGbeDayIavVbdHbdcbbUbbUbbUbaNbaTaPnbavbdGasRasRasRasRasRbdIasPasPasPaaaaaaaaaaafaafaafaafaaaaySbmRaySaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafatHayUayVayUayWaxTaxTayXayUayVayUayYaxSaxVbnfatHbbEatKatKazaatOatOatOatOatPatKazbazcazdazeazbapxapxawoawpawqapxapxapxapaaryaygaaaaafaaaaafaaaaafaaaaafaaaaygaykaylazfazgazhaziazjaylaQnapaaxrazkazkazlazmaznazoaPpaBdazrazsaztaztaxrayzapEazualNaQvaNFaHybdEaHqaHrauhazvbbOazxazyazzazAazBazBazCazBasPbeXbfGbeFbeGbeHbeObeEasPbdLasRasRasRasRasRbdKasPaafaaaaaaaaaaaaaafaafaaaaafazLazMbdMazOazPaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafazQasSazRavtazSazTazUazVazWazSavtazXazYasSazZbnnatHbnPboUboUboUboUboUboUaYHbezaAeazbaAfaAgaAhazbbghapaapaapaapaapaapaapaapaaAjaygaafaAkaAkaAkaAkaAkaAkaAkaafaygaykaylaAlaAmaAnaAoaAlaylaQnaApaxraxraxraxrbnhaAraypaAsaArbniaxraxraxraxrayzapEaAualNaQvaNFaHybdEaHqaHravdaEhazBazBazBazBazBazBaAwaAxaAyazBasPasPasPasPbgobgrasPasPbdKasRasRasRasRasRbdKasPaaaaaaaaaaaeaaaaaaaaaaaaaafaAAaABbdTaADaAAaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxRayVaAEaAFaAFaAFaAFaAGayVaxRaAHasSaAIbqOaAKaAKaAKaAKaAKaAKaAKaAKaZebfxbfzazbbckaANaAOazbaAPaAQaAPaAPaAPaAPaAPaAPaAPaAPaARaaaaAkaASaATaAUbbTaAWaAkaaaaygaykaylaAlbqMbpJbqBaAlaylaQnapxaxraBaaBbazlbpdaBdazoazpaBdbpIazsaBfaBfaxrayzapEayAalNbdZaIkaIhbdEbejbelavdaEiaHraBiaAxaBjaBjazBaAwaBkaAyazBaBlaBmaBnaBobhDaULaBqaafbfBbfdbfdbfdbfdbfdbfgaafaaaaaaaaaaaaaaaaaaaaaaaaaafaAAaBuaBvaBwaAAaafaaaaaaaBqaBqaBqaBqaBqbhqbhCaBqaBqaBqaBqaBqaBqaBqbgHaBFaBFaBFaBGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaBHaBIaBJaBIaBIaDRaDSaBIaBIaBJaBMaBNasSbewbeAaQlbebbeuaBSaBTaBUaxeaAKaZeaPOatKazbazbaBXaBYaARaBZaCaaCbaCcaCdaCeaCfaCgaXEaCiaARaafaAkaQmaCkaClaCmaCnaAkaafaygaykaylbfCaAlbfFaAlaCraylaQnaCsaxrayoaypaCtaCuaAraCvaAsaAraCwaCxaypaCyaxrayzapEayAalNaQvaIAaIDaQxaIvaHraCAaEoaHraEpaAxaAxaAxazCaCDaCEaCFazBaCGaCHaCIaCJaYFaULaBqaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaAAaZbaCMaCNaAAaBqaCOaCPaBqaQSaQDaQDaQDaQDaQDaQDaQFaRdaRdaRdaRdaRfaRdaRdaRdaRhaDaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBHaBMaBIaDbaDcaDcaDdaDeaDfaDgaDhaDcaDcaDiaDjayUayWaZuaAKbgsbiraDnaDoaDnaBVaDpbfVaDsaqYaZnaDuaDvaAcaDwaDxaDyaDzaDzaDzaDAaDzaDzaDBbjWaARaaaaAkaRAaRTaRVaCmaSaaAkaaaaygaykaylbjgbjoaDIbjobjVaylaQnaDLaxraxraxraxraDMaAraypaDNaBdaDOaTuaypaDQaVHaVzaVAaVpaVwaKJaVGaShaShaShaSEaScaFRbjYaTnbabaSPaSPaSPaUgaSPaTFaTTaTUaTVaUkaUGaVQaULaBqaBqaBqaBqaBqaBqaBqaBqaBqaCOaCPaBqaBqaBqaCOaEjaEkaBqaBqaAAaAAaElaEmaAAaEnaVqaVoaVoaVsaEsaEsaEsaEsaEsaWyaVraEuaEuaEuaEuaUNaEuaEyaEyaVnaEyaEyaEyaEyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDiaEBaECaEDaDcaEEaDcaEEaDcaEEaDcaEEaDcaEFaEGazSayWaEHaAKblwblyaEKaELaEMaENaAKbjZbkiaAcaEQaAcaERaqYaAPaESaDBaDzaDzaDzaDzaDzaDzaETaWjaWgaVJaVIaWMaWNaWKaWLaWJaAkaafaygaWIaWpblGaWxaWqaWsblEaWpaZdaZcaxraFmaypazlaFnaBdazoaFoaAraCwaVvaypblAaVHaWTaFsaFtaXcbdZagjagjagjagjaVEaVFaWSaVxaVybazaVxaXfaVxaXeaVxaXgaXhaFGaFHaFIaBoaXjaXmaXXaXVaXVaXCaYcaXYaXYaXYaXYaXYbaCaXYaXYaYwaYeaXnaRdaRdaYGaYxblNaWPaWQaWQaWQaWRaEsaEsaGeaEsaGfaGgaGhaEsaEuaWUaEuaGjaXlaXkaGmaGnaGoaIbasHaGraGsaGtaGuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXoaDcaDcaBJaDcaEEaDcaEEaGxaEEaDcaEEaDcaEFaEGazSayWaGyaAKaAKblVaYKaYPaYKaQlaQlaYJaYNaYOaYLaYMaYLaYLbakbajaGKaGLaGLaGLaGMaGLaGLaGNaGOaARaaaaZXaAkayJbmqayJaAkaAkaaaaygavOaylbmjaZIaZiaZqaZDaZEaZhbglaxraHbaypaCxaCuaAraypaAsaAraCwaZgaypaHdawGaYhaHfaHgaUnaYfalNalNalNalNalNaHjaYbazBaHlaAxazBaHmazBaHnazBaHobcvbcwbcNbczbdNbcXaYUbdlbdmbbvbdAbbwbbvbbvbbxbbzbbybbAbbybbybbybbibcubcbbawbawbawbmxbaSbawbaxbawbaWaYIaHOaHPaHQaHRaHSaHTaEsaHUbaXaEuaHWaHXaYiaHZaGnaIaaIbasHaIcaEyaEyaEyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDiaIdaECaEDaDcaEEaDcaEEaDcaEEaDcaEEaDcaEFaEGazSaIeawzawyawxawuawuawuawzawCawDawzawAaImaInawBauKauKaAPaGOaIpaCaaIqaBOaGOaIraIsaItaIuaARaaaawaaaaavMavNavMaaaaafaaaaygavOaylaAZaAXavZaBeaBcaylaAtaAJaxraIEaypazlaIFaIGazoaIHaIIaIJaIKaILaIMawGaBsaIOaIPaAqaBKaISaaaaaaaUnaIUaIVaBLazBaIXaAxaAxaAxaCEaAxaAxaAxauOaBoaKyaBoaBoavJaBoaJcaBoaJdavHavGaJgaJhaJiaJjaJkavFaJjaJjaJjaJjaJjavDaJjaJjaJjaJjaJjaJjaJjaJjasIayRayvaAzaAiaBraBpazHbMsazIavpavlavmavnazFayNayPazDazEasHaIbaJDaJEaJFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxRaxSaxTaxUaxVaxTaxTaxWaxUaxTaxXaxYaxZaxZbmzatKbbEatLaafaafaaaaaaaaaaaaaaaaafaybaycaydbdBayfaaaaafaaaaaaaaaaaaaaaapxapaapxaygayhayiayiayiayiayiayiayiayjaygaykaylaylaylaylaylaylaylaQnaynaxrayoaypayqayrbdCbbraPaaPdaywayxaypaztaxrayzapEayAalNaQvaNFaNIbdEaHqaHravdbdFayDaxFaxFayEayFayGbeDayIavVbdHbdcbbUbbUbbUbaNbaTaPnbavbdGasRasRasRasRasRbdIasPasPasPaaaaaaaaaaafaafaafaafaaaaySbmRaySaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafatHayUayVayUayWaxTaxTayXayUayVayUayYaxSaxVbnfatHbbEatKatKazaatOatOatOatOatPatKazbazcazdazeazbapxapxawoawpawqapxapxapxapaaryaygaaaaafaaaaafaaaaafaaaaafaaaaygaykaylazfazgazhaziazjaylaQnapaaxrazkazkazlazmaznazoaPpaBdaIEaIIaypaztaxrayzapEazualNaQvaNFaHybdEaHqaHrauhazvbbOazxazyazzazAazBazBazCazBasPbeXbfGbeFbeGbeHbeObeEasPbdLasRasRasRasRasRbdKasPaafaaaaaaaaaaaaaafaafaaaaafazLazMbdMazOazPaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafazQasSazRavtazSazTazUazVazWazSavtazXazYasSazZbnnatHbnPboUboUboUboUboUboUaYHbezaAeazbaAfaAgaAhazbbghapaapaapaapaapaapaapaapaaAjaygaafaAkaAkaAkaAkaAkaAkaAkaafaygaykaylaAlaAmaAnaAoaAlaylaQnaApaxraxraxraxrbnhaAraypaAsaArblAaIJaypaVvaxrayzapEaAualNaQvaNFaHybdEaHqaHravdaEhazBazBazBazBazBazBaAwaAxaAyazBasPasPasPasPbgobgrasPasPbdKasRasRasRasRasRbdKasPaaaaaaaaaaaeaaaaaaaaaaaaaafaAAaABbdTaADaAAaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxRayVaAEaAFaAFaAFaAFaAGayVaxRaAHasSaAIbqOaAKaAKaAKaAKaAKaAKaAKaAKaZebfxbfzazbbckaANaAOazbaAPaAQaAPaAPaAPaAPaAPaAPaAPaAPaARaaaaAkaASaATaAUbbTaAWaAkaaaaygaykaylaAlbqMbpJbqBaAlaylaQnapxaxraBaaBbazlbpdaBdazoazpaBdbniaxraxraxraxrayzapEayAalNbdZaIkaIhbdEbejbelavdaEiaHraBiaAxaBjaBjazBaAwaBkaAyazBaBlaBmaBnaBobhDaULaBqaafbfBbfdbfdbfdbfdbfdbfgaafaaaaaaaaaaaaaaaaaaaaaaaaaafaAAaBuaBvaBwaAAaafaaaaaaaBqaBqaBqaBqaBqbhqbhCaBqaBqaBqaBqaBqaBqaBqbgHaBFaBFaBFaBGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaBHaBIaBJaBIaBIaDRaDSaBIaBIaBJaBMaBNasSbewbeAaQlbebbeuaBSaBTaBUaxeaAKaZeaPOatKazbazbaBXaBYaARaBZaCaaCbaCcaCdaCeaCfaCgaXEaCiaARaafaAkaQmaCkaClaCmaCnaAkaafaygaykaylbfCaAlbfFaAlaCraylaQnaCsaxrayoaypaCtaCuaAraCvaAsaArazsaDNaBfaBfaxrayzapEayAalNaQvaIAaIDaQxaIvaHraCAaEoaHraEpaAxaAxaAxazCaCDaCEaCFazBaCGaCHaCIaCJaYFaULaBqaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaAAaZbaCMaCNaAAaBqaCOaCPaBqaQSaQDaQDaQDaQDaQDaQDaQFaRdaRdaRdaRdaRfaRdaRdaRdaRhaDaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBHaBMaBIaDbaDcaDcaDdaDeaDfaDgaDhaDcaDcaDiaDjayUayWaZuaAKbgsbiraDnaDoaDnaBVaDpbfVaDsaqYaZnaDuaDvaAcaDwaDxaDyaDzaDzaDzaDAaDzaDzaDBbjWaARaaaaAkaRAaRTaRVaCmaSaaAkaaaaygaykaylbjgbjoaDIbjobjVaylaQnaDLaxraxraxraxraDMaAraypaAsaAraCwaCxaypaCyaVHaVzaVAaVpaVwaKJaVGaShaShaShaSEaScaFRbjYaTnbabaSPaSPaSPaUgaSPaTFaTTaTUaTVaUkaUGaVQaULaBqaBqaBqaBqaBqaBqaBqaBqaBqaCOaCPaBqaBqaBqaCOaEjaEkaBqaBqaAAaAAaElaEmaAAaEnaVqaVoaVoaVsaEsaEsaEsaEsaEsaWyaVraEuaEuaEuaEuaUNaEuaEyaEyaVnaEyaEyaEyaEyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDiaEBaECaEDaDcaEEaDcaEEaDcaEEaDcaEEaDcaEFaEGazSayWaEHaAKblwblyaEKaELaEMaENaAKbjZbkiaAcaEQaAcaERaqYaAPaESaDBaDzaDzaDzaDzaDzaDzaETaWjaWgaVJaVIaWMaWNaWKaWLaWJaAkaafaygaWIaWpblGaWxaWqaWsblEaWpaZdaZcaxraFnaypazlaFmaBdazoazpaBdaDOaTuaypaDQaVHaWTaFsaFtaXcbdZagjagjagjagjaVEaVFaWSaVxaVybazaVxaXfaVxaXeaVxaXgaXhaFGaFHaFIaBoaXjaXmaXXaXVaXVaXCaYcaXYaXYaXYaXYaXYbaCaXYaXYaYwaYeaXnaRdaRdaYGaYxblNaWPaWQaWQaWQaWRaEsaEsaGeaEsaGfaGgaGhaEsaEuaWUaEuaGjaXlaXkaGmaGnaGoaIbasHaGraGsaGtaGuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXoaDcaDcaBJaDcaEEaDcaEEaGxaEEaDcaEEaDcaEFaEGazSayWaGyaAKaAKblVaYKaYPaYKaQlaQlaYJaYNaYOaYLaYMaYLaYLbakbajaGKaGLaGLaGLaGMaGLaGLaGNaGOaARaaaaZXaAkayJbmqayJaAkaAkaaaaygavOaylbmjaZIaZiaZqaZDaZEaZhbglaxraHbaypaFoaCuaAraypaAsaAraCwaZgaypaHdawGaYhaHfaHgaUnaYfalNalNalNalNalNaHjaYbazBaHlaAxazBaHmazBaHnazBaHobcvbcwbcNbczbdNbcXaYUbdlbdmbbvbdAbbwbbvbbvbbxbbzbbybbAbbybbybbybbibcubcbbawbawbawbmxbaSbawbaxbawbaWaYIaHOaHPaHQaHRaHSaHTaEsaHUbaXaEuaHWaHXaYiaHZaGnaIaaIbasHaIcaEyaEyaEyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDiaIdaECaEDaDcaEEaDcaEEaDcaEEaDcaEEaDcaEFaEGazSaIeawzawyawxawuawuawuawzawCawDawzawAaImaInawBauKauKaAPaGOaIpaCaaIqaBOaGOaIraIsaItaIuaARaaaawaaaaavMavNavMaaaaafaaaaygavOaylaAZaAXavZaBeaBcaylaAtaAJaxrachaypazlaIFaIGazoaIHayyazraIKaILaIMawGaBsaIOaIPaAqaBKaISaaaaaaaUnaIUaIVaBLazBaIXaAxaAxaAxaCEaAxaAxaAxauOaBoaKyaBoaBoavJaBoaJcaBoaJdavHavGaJgaJhaJiaJjaJkavFaJjaJjaJjaJjaJjavDaJjaJjaJjaJjaJjaJjaJjaJjasIayRayvaAzaAiaBraBpazHbMsazIavpavlavmavnazFayNayPazDazEasHaIbaJDaJEaJFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJHaJIaBIaDbaDcaDcaDcaJJaDcaDcaJKaDcaDcaDiaJLaJMayWaxTaJNaJOaJOaJOaJOaJOaJOaJOaJPasDatKatKavkatKatKaAPaJSaJTaJUaJVaJVaJVaJVaJWaJXaJYaARaJZavaaKbaKcavbaKeaKbaKbaKfaygavcaylaylazJaAbaAaayLawGaUnazGaxraxraxraxraKlaKmaCxaCxaKnayHawGawGaxraxraIOaIOaIOaIOaKpaKqaKraKsaUnaKtaIVaKuazBazBazBazBazBazBazBazBazBauOaKwaKvaKxaIZauMavIaKBaKCaJdauyauWauXaKGaKHaJjayOayQayZayCaIyaPbayKaxDaxJayaayBaxBaJbaxfaDqaJjauwauvaKYaJraxdaxaaJuaysaEsaLbauuaLdavfauoaveaunaEuaEyaLhasHaIbaLiaLjaLkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJHaBIaBJaBIaBIaDRaDSaBIaBIaBJaJIaLmasSaLnaxTawXaLoaLoaLpaLoaLqatHaLraLsasDaLtaLuaACaLwazwaLyaLzaLAaLzaLzaLzaLzaLzaLzaLzaLBaLCazNaAdaLFaLFayTaLHaLFaLFaLFaLIazKaLJaLKaLzaxtaNmaLOaLPaIOaIBaMkaLSaLWaLUaLTaLTaLTaLTaLTaLTaOraLVaOAaLXaLYaLZaMaaMbaMcaIOaIOaIOaOBaMeaMfaMeaMgaMhaLSaMjaIzaMkaGQaBoaMlaxMaOOaMoaMnaMpaxKaMraMsaMtaJdaxLaMvaMwaMwaMxaJjaGwaFTaEJaEJaEJaEJaEJaFqaFNaEOaEUaHLaEJaEJaHMaJjasIarZaHPaHPaCXaDFaHPaHPaEsaMOaMPaEuaytaMRaHZavTaEuaMSaymayeaIbaEyaEyaEyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXayVaMVaAFaAFaAFaAFaMWayVawXaAHasSaAIaMXaMYaDKavSaNbaNbaNcatHaNdaLsaxAaNfaLuaxzaNhaNiaNjaNkaNlaLzaLzaLzaLzaLzaLzaLzaxhaxiaxuaLzaLzaLzaxpayuaLzaLzaLzaLzaxvaLzaLzaLzaxtaNmaLuaLPaIOaIOaIOaIOaIOaIOaIOaIOaIOaIOaIOaIOaNsaNtaNuaNvaNwaNxaNyaNzaNAaIOaIOaIOaLPaIOaIOaIOaIOaIOaIOaIOaIOaNBbNwaCjaCWaCQaMpaNEaMpaMpawEaNGaMsaCoaJdawFawJawSaNLaNMaJjaDraDHaCpaCpaCpaCpaCpaCqaCTaDlaDmaCpaCpaDJaNRaJjasIarZaNVaHPaHPaNWaHPaNXaEsaEuaEuaEuaEuaEuaEuavQaEuaIbaIbasHaIbaNZaOaaEyaaaaafaaaaaaaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10921,7 +10921,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbSFbSGcnjcngcnhcnQbSFdgmdgldgkdgjcrEcrCcrrcrrcrucnEcnEcnDcnFbAkbYpbjqbjxcnCbwMcnzctfcnBcnwcnxcnybfNbtVcnpcnqdTTbfNbkjbqZdZLdZOdZOdZMdZNbqZdYtdgpdZQbiDdZTdZRdZSdZHbiDdZGbtBcrVbwUbxPbtKbxQbiKdZKdZJbiKcrXbPwbiddgCbssdZVdZWbidbfMdWwdXGbGKaaaaafaaaaaabwwctuctjdgrdgqdgtdgsdgvdgudgxdgwdgzdgydgodgAdfQdfQdgBdgodgodgodgndfTbYUcoebYWbYUaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaafaafaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaafaafaafbTebTebTebTebTebTebTebTebTebTebTebTebTeaaaaaacmobSGbSGbSGbSGcmAbSFdfNdfMdfLdfKcqdcpVcqccpVcpUcpTcpScpQcpOcpLcqjcqwcmCdfPbgXbgXbgXbgXbgXbgXbgXbfNbfNcmBbfNbfNbfNbkjbqZbqZdZrdZsdZtdZubqZdfUcqDcqTbiDbkdbiDbiDbiDbiDbwUdZydZzbwUcqXcqWcqXbiKbXLdZBbiKbPybPybiddZDbssbidbidbidbfMcpWcmNbGKaaaaafaaaaaedfXdfVdfWdgbdgadfZdfYdggdgfdgedgcdfQdfQdfQdfQdgidghdfQdfQdfQdfRdfSdfTcqQcmGbZVbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecnScqacnSbTecnOcpYcnObTecnMcpZcnMbTeaaaaaacphbSGcpXbSGbSGcpRbSFcFVcFUcQKcFXcRqcRpcFMcFKcFRbqVbqVcFTbqVbqKcFIcFJbjxcpCcpDcpucpucpEdgZdhadgGdhbdhcdhddhedhfdgGbkjbEaeaxbMXbMXeaveaweaDeaEdLbdPueazeaAeayeaeeaeeaudXBbwUbwUbwUdhtcZLdhubiKbiKbiKbiKbPybPybiddZDbsseareasbidbfMbGKbGKbGKaaaaafaaaaaadhqdhrdhsdhldhkdhmcWQdQSdhgdhidhhdfQdfQdfQdfQdhodhndfQdhpdfQdfRdghdfTcaycqbcaAbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecnScnRcnSbTecnOcnPcnObTecnMcnNcnMbTeaaaaaacphbSGbSGbSGcpicoIcoHcsOcsNcvgcuVcsWcsPcsMcsEcsmcoycoEcoDdgFbAkbYpcpdcpbcpccpgcpfcpecpfdgIcoWdgGdgHdgKdgLdgJdgHdgGbkjbEaeabbMXbOsbMXeaaeageahcCNeajeaceadeaeeafeaeeandXBciZboNcDacEycExdgYcFGboNboNboNboNcEzbidbidbidbidbidbidbfMbGKaafaafaafcbfaafaafdgRdgPdgQdgQdgQccQbudcCKcyldgTdgSdgMdgMdgMdgXdgWdgWdgVdgMdgMdgNdgOdfTcbjcpjcblbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecnScnRcnSbTecnOcnPcnObTecnMcnNcnMbTeaaaaaacphbSGbSGbSGcpicoIcoHcsOcsNcvgcuVcsWbpIcsMcsEcsmcoycoEcoDdgFbAkbYpcpdcpbcpccpgcpfcpecpfdgIcoWdgGdgHdgKdgLdgJdgHdgGbkjbEaeabbMXbOsbMXeaaeageahcCNeajeaceadeaeeafeaeeandXBciZboNcDacEycExdgYcFGboNboNboNboNcEzbidbidbidbidbidbidbfMbGKaafaafaafcbfaafaafdgRdgPdgQdgQdgQccQbudcCKcyldgTdgSdgMdgMdgMdgXdgWdgWdgVdgMdgMdgNdgOdfTcbjcpjcblbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaaaaaabTecrgcnicrebTecrccnfcrbbTecracnccqZbTeaaaaafcphcrdbSGbSGcqqbWbbSFdPYdPVcvgcvgdPTcvgcvgcvgcvgcrzbYpcrxcrybAkbYpdRPcrlbyOcrhcricrkcridhIcrqdhKdhLdhGdhHdgGdgGdgGbkjbEadhOebrdBIebpebqebiebjdQhebhebmebnebkdBNebcdhNebadQabJNebfdQedQddhMbCTbyDbXPbXQbGKbvKboNboNboNboNboNboNciNbGKaaaaaaaaaaafaaaaaabwwdhWdhUdBXdhTbuddQidQSdQRdfTdhVbyYbyYbyYdhPcvudhQdhSbyYbyYbyYdhYdfTdhXcrNcccccdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalQaaaaaaaafaafbTecqocdMcqpbTecdWcdMcdXbTecdLcdMcdNbTeaaaaafcqrbSGbSGbSIcqqcqybSFdPAdPvcqvcqucqtcqscqAcqAdhvcqBcqAcmpcqzbAkbAkbjqcqIcqJcpDcqCcqCcqHdhBdhCdgGdhAdhydhzdhwdhxdgGbkjbEadhDeaMdCpeaOeaPbEaeaFdPDeaHdXBeaIeaJdCqeaSdhEdXBbfMbPydXFeaUeaTeaQdXFaaaaaaaaabGKbGKbGKbXObXPbXPbXQbGKbGKbGKaaaaaaaaabudbudbudbudbudbudbudbudbuddPHdPSdPPdfTdfTbZPbOwcdqdfTdfTdfTdfTcoTbOwcdqdfTdfTccSdhFccSaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachdaafaafaafaaaaafcsLaafcsLaafcdmaafcdlaafcdmaafcdlaafaafaaabSFcsKbUXcsIdbicszbQGcsBcsAbQGcsCcsDcmJcmJdTDcmJchBcsGcsFchBcsHcstcsucsvcswcaOcaOcaOcaOcsxcsycaOcjXcjXcjXcjXcjXcjXbkjbEaebRdibdCyebNebObEaeaFdTLebMdXBebKebIdCzdiaebGdXBbfMbPydXFebFebEdhZdXFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaabudcnbcmXcmYdTJdTKcdydTHcfcdTIdTFdTEdTGcrHaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcebceccebaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11967,9 +11967,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndH aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHVdHVdHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHndHndCidCidCidCidCidCidCidCidJjdJkdJldCidCidCidBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadIPdJmdIPdIPdIPdIPdIPdIPdMvdJndCidCidCidCidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdDQdysdMCdytdytdyudCidIedHIdHJdCidCidCidCidCidCidCidGpdGpdBvdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndCidCidJodJodJodJodJodJodJpdJqdJrdJodJodJodJodJodCidCidCidBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdBvdBvdCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadIPdIPdIPdIPdJsdJtdJudIPdITdJvdIPdRxdIPdIPdIPdJwdJxdJydIPdCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdBvdDQdyndFpdyodyodOsdCidHEdHOdHGdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHndHndBvdCidCidCidJodJzdwgdJBdJCdJDdMfdMcdMtdMpdMudJJdJKdJLdHJdCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdsadsadsadIPdJMdJNdJOdJPdJNdJNdIPdIXdIYdJQdMvdIPdJRdJSdJTdJTdJTdJedCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadBvdBvdBvdDQdwydNbdwkdwkdHGdCidCidJUdJVdJWdJXdJVdJVdCidCidCidCidCidCidBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwdKddKedJKdKfdKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmdKndKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdKodKodKodKpdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwdKddKedJKdKfdKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmdKndKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdKodKodKocsPdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndqTdBvdCidCidCidJodKrdJAdJAdKsdJAdMydJAdJAdMEdMFdwzdKvdJLdHGdCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidJfdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdIPdKwdJNdKxdJNdKydJNdKzdKndKAdKBdMHdIPdJRdKmdKDdMIdwIdJndCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidKFdKFdKGdKHdJUdMJdMLdMKdKLdJVdJVdJVdJVdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadBvdBvdCidCidJodKMdJAdKNdMMdMpdMNdKRdJAdJodJodJodJodJodJodIedHJdCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidIedHJdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdIPdIPdIPdIPdIPdIPdIPdKSdMOdKUdKSdMOdIPdIPdIPdIPdwJdIPdIPdIPdKWdKXdCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidKYdKHdKZdLadMSdMRdMQdLedMVdMUdMTdLidLjdLkdHJdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadBvdBvdCidCidJodKMdJAdKNdMMdMpdMNdKRdJAdJodJodJodJodJodJodIedHJdCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidIedHJdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdIPdIPdIPdIPdIPdIPdIPdKSdMOdKUdKSdMOdIPdIPdIPdIPdwJdIPdIPdIPdKWdKXdCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidKYdKHdBEdEbdDZdMRdDWdLedMVdMUdMTdLidLjdLkdHJdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndsadsadqTdBvdCidCidJodLldJAdLmdKadOFdLodLpdJAdLqdLrdLsdLtdLudLvdIkdIldIcdIcdIcdIcdIcdIbdCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadqTdqTdqTdqTdBvdBvdCidCidIhdIcdIcdIcdIcdIcdIcdIcdIcdIkdIldIcdIcdIcdIcdIbdCidCidCidCidCidBvdqTdqTdqTdqTdqTdIPdLwdLxdLydKmdMIdLzdKndMIdKzdRudwNdLCdMIdwKdKmdKmdLDdLEdJxdJydLFdLGdLGdLGdLGdLGdLGdLGdLHdLHdLHdLHdLHdLHdLHdKGdLIdLJdLKdLadLLdMYdLNdLOdLedMXdLPdLQdLRdLSdLTdLUdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndsadsadqTdBvdCidCidJodJodJodJodJodNldLWdLXdJodJodLYdJodJodJodJodHEdHGdCidCidCidCidCidHSdCidCidCidCidBvdCidBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdBvdCidCidCidHSdCidCidCidCidCidCidCidCidHEdHGdCidCidCidCidHSdCidCidCidCidCidBvdBvdDQdBvdBvdqTdIPdIPdIPdIPdLZdMIdMadOkdNWdKBdMddMedMedNKdNKdMgdMedMhdMidMedMidMjdMjdMjdMjdMjdMjdMjdMjdMkdMkdMkdMkdMkdMkdMkdMldMmdMldMndMmdModNGdMqdUtdMsdNCdNrdNndwOdMxdLkdHGdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndsadsadqTdBvdBvdCidCidCidCidCidJodOndMzdMAdwPdJodMCdMDdFrdCidCidCidCidCidHUdCidCidCidIadIcdIcdIbdCidCidCidCidBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdCidCidIhdIcdIidCidCidCidCidBvdCidCidHUdCidCidCidCidCidCidHSdCidCidCidCidCidCidCidJfdCidBvdBvdBvdBvdBvdIPdKmdPLdPEdPJdPJdPEdPCdPzdPydPJdPIdPGdPzdOSdPadOQdORdOodOodOodOodOodOodOodOodOLdOLdOLdOLdOLdOLdPRdPOdPXdPWdQldQbdPNdPMdMZdKFdKFdKFdKFdKFdKFdKFdKFdNadNbdNcdNbdFrdDPdBvdqTdqTdsadsadsadsadqTdqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 5ace6d3bc03901f0c4255099c12544f0c0461671 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 9 Jul 2014 19:12:32 +0930 Subject: [PATCH 06/48] Mining rework. Added ore scanner, adjusted values for spawn, added debug verbs. --- baystation12.dme | 1 + code/controllers/master_controller.dm | 8 ++- code/controllers/verbs.dm | 21 ++++++ code/modules/admin/admin_verbs.dm | 18 ++--- code/modules/mining/drilling/distribution.dm | 73 +++++++++++--------- code/modules/mining/drilling/drill.dm | 6 +- code/modules/mining/drilling/scanner.dm | 54 +++++++++++++++ maps/tgstation2.dmm | 4 +- 8 files changed, 137 insertions(+), 48 deletions(-) create mode 100644 code/modules/mining/drilling/scanner.dm diff --git a/baystation12.dme b/baystation12.dme index df06cf606b..de02865c78 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -884,6 +884,7 @@ #include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mining\drilling\distribution.dm" #include "code\modules\mining\drilling\drill.dm" +#include "code\modules\mining\drilling\scanner.dm" #include "code\modules\mob\abilities.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index cb52b2252f..171bef7c69 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -33,7 +33,9 @@ datum/controller/game_controller var/mob/list/expensive_mobs = list() var/rebuild_active_areas = 0 - var/list/shuttle_list //for debugging and VV + var/list/shuttle_list // For debugging and VV + var/datum/ore_distribution/asteroid_ore_map // For debugging and VV. + datum/controller/game_controller/New() //There can be only one master_controller. Out with the old and in with the new. @@ -80,8 +82,8 @@ datum/controller/game_controller/proc/setup() make_mining_asteroid_secret() //Create the mining ore distribution map. - var/datum/ore_distribution/O = new() - O.populate_distribution_map() + asteroid_ore_map = new /datum/ore_distribution() + asteroid_ore_map.populate_distribution_map() //Set up spawn points. populate_spawn_points() diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index e8785482a9..a331dab556 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -1,6 +1,27 @@ //TODO: rewrite and standardise all controller datums to the datum/controller type //TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done +/client/proc/show_distribution_map() + set category = "Debug" + set name = "Show Distribution Map" + set desc = "Print the asteroid ore distribution map to the world." + + if(!holder) return + + if(master_controller && master_controller.asteroid_ore_map) + master_controller.asteroid_ore_map.print_distribution_map() + +/client/proc/remake_distribution_map() + set category = "Debug" + set name = "Remake Distribution Map" + set desc = "Rebuild the asteroid ore distribution map." + + if(!holder) return + + if(master_controller && master_controller.asteroid_ore_map) + master_controller.asteroid_ore_map = new /datum/ore_distribution() + master_controller.asteroid_ore_map.populate_distribution_map() + /client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply")) set category = "Debug" set name = "Restart Controller" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 21a3047ce3..bf6c555997 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -144,8 +144,10 @@ var/list/admin_verbs_debug = list( /client/proc/cmd_debug_tog_aliens, /client/proc/air_report, /client/proc/reload_admins, - /client/proc/reload_mentors, + /client/proc/reload_mentors, /client/proc/restart_controller, + /client/proc/remake_distribution_map, + /client/proc/show_distribution_map, /client/proc/enable_debug_verbs, /client/proc/callproc, /client/proc/toggledebuglogs, @@ -585,22 +587,22 @@ var/list/admin_verbs_mentor = list( feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) - + /client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom set category = "Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." - + var/datum/disease2/disease/D = new /datum/disease2/disease() - + var/greater = ((input("Is this a lesser or greater disease?", "Give Disease") in list("Lesser", "Greater")) == "Greater") - + D.makerandom(greater) if (!greater) D.infectionchance = 1 - + D.infectionchance = input("How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num - + if(istype(T,/mob/living/carbon/human)) var/mob/living/carbon/human/H = T if (H.species) @@ -609,7 +611,7 @@ var/list/admin_verbs_mentor = list( var/mob/living/carbon/monkey/M = T D.affected_species = list(M.greaterform) infect_virus2(T,D,1) - + feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].", 1) diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index 2ca9a3f685..72a288a8c3 100644 --- a/code/modules/mining/drilling/distribution.dm +++ b/code/modules/mining/drilling/distribution.dm @@ -18,9 +18,9 @@ #define MAX_DEEP_COUNT 300 #define ITERATE_BEFORE_FAIL 200 -#define RESOURCE_HIGH_MAX 3 -#define RESOURCE_HIGH_MIN 0 -#define RESOURCE_MID_MAX 2 +#define RESOURCE_HIGH_MAX 4 +#define RESOURCE_HIGH_MIN 2 +#define RESOURCE_MID_MAX 3 #define RESOURCE_MID_MIN 1 #define RESOURCE_LOW_MAX 1 #define RESOURCE_LOW_MIN 0 @@ -106,6 +106,14 @@ Deep minerals: for(var/y = 1, y <= real_size, y++) map[MAP_CELL] = 0 +/datum/ore_distribution/proc/print_distribution_map() + var/line = "" + for(var/x = 1, x <= real_size, x++) + for(var/y = 1, y <= real_size, y++) + line += num2text(round(map[MAP_CELL]/25.5)) + world << line + line = "" + /datum/ore_distribution/proc/generate_distribution_map(var/x,var/y,var/input_size) var/size = input_size @@ -160,36 +168,37 @@ Deep minerals: if(target_turf && target_turf.has_resources) target_turf.resources = list() - target_turf.resources["silicates"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) - target_turf.resources["carbonaceous rock"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) + target_turf.resources["silicates"] = rand(3,5) + target_turf.resources["carbonaceous rock"] = rand(3,5) - if(map[MAP_CELL] > (range*0.60)) - target_turf.resources["iron"] = 0 - target_turf.resources["gold"] = 0 - target_turf.resources["silver"] = 0 - target_turf.resources["uranium"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) - target_turf.resources["diamond"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) - target_turf.resources["phoron"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["osmium"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["hydrogen"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - else if(map[MAP_CELL] > (range*0.40)) - target_turf.resources["iron"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["gold"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["silver"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["uranium"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["diamond"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) - target_turf.resources["phoron"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["osmium"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["hydrogen"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - else - target_turf.resources["iron"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["gold"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["silver"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["uranium"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["diamond"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) - target_turf.resources["phoron"] = 0 - target_turf.resources["osmium"] = 0 - target_turf.resources["hydrogen"] = 0 + switch(map[MAP_CELL]) + if(0 to 100) + target_turf.resources["iron"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) + target_turf.resources["gold"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) + target_turf.resources["silver"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) + target_turf.resources["uranium"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) + target_turf.resources["diamond"] = 0 + target_turf.resources["phoron"] = 0 + target_turf.resources["osmium"] = 0 + target_turf.resources["hydrogen"] = 0 + if(100 to 124) + target_turf.resources["iron"] = 0 + target_turf.resources["gold"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) + target_turf.resources["silver"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) + target_turf.resources["uranium"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) + target_turf.resources["diamond"] = 0 + target_turf.resources["phoron"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) + target_turf.resources["osmium"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) + target_turf.resources["hydrogen"] = 0 + if(125 to 255) + target_turf.resources["iron"] = 0 + target_turf.resources["gold"] = 0 + target_turf.resources["silver"] = 0 + target_turf.resources["uranium"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) + target_turf.resources["diamond"] = rand(RESOURCE_LOW_MIN,RESOURCE_LOW_MAX) + target_turf.resources["phoron"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) + target_turf.resources["osmium"] = rand(RESOURCE_HIGH_MIN,RESOURCE_HIGH_MAX) + target_turf.resources["hydrogen"] = rand(RESOURCE_MID_MIN,RESOURCE_MID_MAX) tx += chunk_size tx = origin_x diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index cbfdd53f9a..f02434beb4 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -265,13 +265,13 @@ update_icon() /obj/machinery/mining/drill/proc/get_harvest_capacity() - return 3 * (cutter ? cutter.rating : 0) + return (cutter ? cutter.rating : 0) /obj/machinery/mining/drill/proc/get_storage_capacity() - return 100 * (storage ? storage.rating : 0) + return 200 * (storage ? storage.rating : 0) /obj/machinery/mining/drill/proc/get_charge_use() - return 100 - (20 * (cellmount ? cellmount.rating : 0)) + return 50 - (10 * (cellmount ? cellmount.rating : 0)) /obj/machinery/mining/drill/proc/get_resource_field() diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm new file mode 100644 index 0000000000..5b19064160 --- /dev/null +++ b/code/modules/mining/drilling/scanner.dm @@ -0,0 +1,54 @@ +/obj/item/weapon/mining_scanner + name = "ore detector" + desc = "A complex device used to locate ore deep underground." + icon = 'icons/obj/device.dmi' + icon_state = "forensic0-old" //GET A BETTER SPRITE. + item_state = "electronic" + matter = list("metal" = 150) + + origin_tech = "magnets=1;engineering=1" + +/obj/item/weapon/mining_scanner/attack_self(mob/user as mob) + + user << "You begin sweeping \the [src] about, scanning for metal deposits." + + if(!do_after(user,50)) return + + if(!user || !src) return + + var/list/metals = list( + "surface minerals" = 0, + "precious metals" = 0, + "nuclear fuel" = 0, + "exotic matter" = 0 + ) + + for(var/turf/T in oview(3,get_turf(user))) + + if(!T.has_resources) + continue + + for(var/metal in T.resources) + + var/ore_type + + switch(metal) + if("silicates" || "carbonaceous rock" || "iron") ore_type = "surface minerals" + if("gold" || "silver" || "diamond") ore_type = "precious metals" + if("uranium") ore_type = "nuclear fuel" + if("phoron" || "osmium" || "hydrogen") ore_type = "exotic matter" + + if(ore_type) metals[ore_type] += T.resources[metal] + + user << "\icon[src] \blue The scanner beeps and displays a readout." + + for(var/ore_type in metals) + + var/result = "no sign" + + switch(metals[ore_type]) + if(1 to 50) result = "trace amounts" + if(51 to 150) result = "significant amounts" + if(151 to INFINITY) result = "huge quantities" + + user << "- [result] of [ore_type]." \ No newline at end of file diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index fcbe24ca1b..19ef7f5bc8 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -9544,6 +9544,7 @@ "dBB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/research_outpost/iso3) "dBC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Isolation room two"; req_access_txt = "65"},/turf/simulated/floor,/area/research_outpost/iso2) "dBD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/entry) +"dBE" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/obj/item/weapon/mining_scanner,/turf/simulated/floor,/area/mine/eva) "dBF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/research_outpost/entry) "dBG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) "dBH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) @@ -9965,7 +9966,6 @@ "dKl" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/mine/living_quarters) "dKm" = (/turf/simulated/floor,/area/mine/living_quarters) "dKn" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/living_quarters) -"dKo" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/eva) "dKp" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/mine/eva) "dKq" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "dKr" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/mine/west_outpost) @@ -11967,7 +11967,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndH aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHVdHVdHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHndHndCidCidCidCidCidCidCidCidJjdJkdJldCidCidCidBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadIPdJmdIPdIPdIPdIPdIPdIPdMvdJndCidCidCidCidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdDQdysdMCdytdytdyudCidIedHIdHJdCidCidCidCidCidCidCidGpdGpdBvdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndCidCidJodJodJodJodJodJodJpdJqdJrdJodJodJodJodJodCidCidCidBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdBvdBvdCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadIPdIPdIPdIPdJsdJtdJudIPdITdJvdIPdRxdIPdIPdIPdJwdJxdJydIPdCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdBvdDQdyndFpdyodyodOsdCidHEdHOdHGdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHndHndBvdCidCidCidJodJzdwgdJBdJCdJDdMfdMcdMtdMpdMudJJdJKdJLdHJdCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdsadsadsadIPdJMdJNdJOdJPdJNdJNdIPdIXdIYdJQdMvdIPdJRdJSdJTdJTdJTdJedCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadBvdBvdBvdDQdwydNbdwkdwkdHGdCidCidJUdJVdJWdJXdJVdJVdCidCidCidCidCidCidBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwdKddKedJKdKfdKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmdKndKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdKodKodKodKpdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwdKddKedJKdKfdKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmdKndKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdBEdBEdBEdKpdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndqTdBvdCidCidCidJodKrdJAdJAdKsdJAdMydJAdJAdMEdMFdwzdKvdJLdHGdCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidJfdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdIPdKwdJNdKxdJNdKydJNdKzdKndKAdKBdMHdIPdJRdKmdKDdMIdwIdJndCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidKFdKFdKGdKHdJUdMJdMLdMKdKLdJVdJVdJVdJVdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadBvdBvdCidCidJodKMdJAdKNdMMdMpdMNdKRdJAdJodJodJodJodJodJodIedHJdCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidIedHJdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdIPdIPdIPdIPdIPdIPdIPdKSdMOdKUdKSdMOdIPdIPdIPdIPdwJdIPdIPdIPdKWdKXdCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidKYdKHdKZdLadMSdMRdMQdLedMVdMUdMTdLidLjdLkdHJdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndsadsadqTdBvdCidCidJodLldJAdLmdKadOFdLodLpdJAdLqdLrdLsdLtdLudLvdIkdIldIcdIcdIcdIcdIcdIbdCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadqTdqTdqTdqTdBvdBvdCidCidIhdIcdIcdIcdIcdIcdIcdIcdIcdIkdIldIcdIcdIcdIcdIbdCidCidCidCidCidBvdqTdqTdqTdqTdqTdIPdLwdLxdLydKmdMIdLzdKndMIdKzdRudwNdLCdMIdwKdKmdKmdLDdLEdJxdJydLFdLGdLGdLGdLGdLGdLGdLGdLHdLHdLHdLHdLHdLHdLHdKGdLIdLJdLKdLadLLdMYdLNdLOdLedMXdLPdLQdLRdLSdLTdLUdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From d5784c653c2d01086ca325c983d37be1a6a057f0 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 10 Jul 2014 20:13:59 +0930 Subject: [PATCH 07/48] Reapplied scanners to map, stopped braces working on drill turfs with no resources. --- code/modules/mining/drilling/drill.dm | 5 +++++ maps/tgstation2.dmm | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index f02434beb4..4ed2cd0867 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -346,6 +346,11 @@ /obj/machinery/mining/brace/proc/connect() var/turf/T = get_step(get_turf(src), src.dir) + + if(!T.has_resources) + src.visible_message("\red The terrain near the brace is unsuitable!") + return + for(var/thing in T.contents) if(istype(thing,/obj/machinery/mining/drill)) connected = thing diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index cc72b6ed6a..4318e1b6ff 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -9679,6 +9679,7 @@ "dEg" = (/obj/machinery/door_control{id = "rbath"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/research_outpost/hallway) "dEh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/maintstore2) "dEi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway) +"dEj" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/obj/item/weapon/mining_scanner,/turf/simulated/floor,/area/mine/eva) "dEk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage) "dEl" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage) "dEm" = (/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/research_outpost/longtermstorage) @@ -9969,7 +9970,6 @@ "dKl" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/mine/living_quarters) "dKm" = (/turf/simulated/floor,/area/mine/living_quarters) "dKn" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/living_quarters) -"dKo" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/eva) "dKq" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "dKr" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/mine/west_outpost) "dKs" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor,/area/mine/west_outpost) @@ -11967,7 +11967,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndH aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHVdHVdHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHndHndCidCidCidCidCidCidCidCidJjdJkdJldCidCidCidBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadIPdJmdIPdIPdIPdIPdIPdIPdMvdJndCidCidCidCidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdDQdysdMCdytdytdyudCidIedHIdHJdCidCidCidCidCidCidCidGpdGpdBvdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndCidCidJodJodJodJodJodJodJpdJqdJrdJodJodJodJodJodCidCidCidBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdBvdBvdCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadIPdIPdIPdIPdJsdJtdJudIPdITdJvdIPdRxdIPdIPdIPdJwdJxdJydIPdCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdBvdDQdyndFpdyodyodOsdCidHEdHOdHGdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHndHndBvdCidCidCidJodJzdwgdJBdJCdJDdMfdMcdMtdMpdMudJJdJKdJLdHJdCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdsadsadsadIPdJMdJNdJOdJPdJNdJNdIPdIXdIYdJQdMvdIPdJRdJSdJTdJTdJTdJedCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadBvdBvdBvdDQdwydNbdwkdwkdHGdCidCidJUdJVdJWdJXdJVdJVdCidCidCidCidCidCidBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwdKddKedJKdKfdKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmdKndKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdKodKodKocsPdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwdKddKedJKdKfdKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmdKndKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdEjdEjdEjcsPdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndqTdBvdCidCidCidJodKrdJAdJAdKsdJAdMydJAdJAdMEdMFdwzdKvdJLdHGdCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidJfdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdIPdKwdJNdKxdJNdKydJNdKzdKndKAdKBdMHdIPdJRdKmdKDdMIdwIdJndCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidKFdKFdKGdKHdJUdMJdMLdMKdKLdJVdJVdJVdJVdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadBvdBvdCidCidJodKMdJAdKNdMMdMpdMNdKRdJAdJodJodJodJodJodJodIedHJdCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidIedHJdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdIPdIPdIPdIPdIPdIPdIPdKSdMOdKUdKSdMOdIPdIPdIPdIPdwJdIPdIPdIPdKWdKXdCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidKYdKHdBEdEbdDZdMRdDWdLedMVdMUdMTdLidLjdLkdHJdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndsadsadqTdBvdCidCidJodLldJAdLmdKadOFdLodLpdJAdLqdLrdLsdLtdLudLvdIkdIldIcdIcdIcdIcdIcdIbdCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadqTdqTdqTdqTdBvdBvdCidCidIhdIcdIcdIcdIcdIcdIcdIcdIcdIkdIldIcdIcdIcdIcdIbdCidCidCidCidCidBvdqTdqTdqTdqTdqTdIPdLwdLxdLydKmdMIdLzdKndMIdKzdRudwNdLCdMIdwKdKmdKmdLDdLEdJxdJydLFdLGdLGdLGdLGdLGdLGdLGdLHdLHdLHdLHdLHdLHdLHdKGdLIdLJdLKdLadLLdMYdLNdLOdLedMXdLPdLQdLRdLSdLTdLUdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 5b3f7b30c09ad1e37570154bec7792ff54e8c65e Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 12:50:20 +0200 Subject: [PATCH 08/48] fixes #5548 missing range check for Alt click on laptops --- code/WorkInProgress/computer3/laptop.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/WorkInProgress/computer3/laptop.dm b/code/WorkInProgress/computer3/laptop.dm index 1868f82c83..cce4e7032c 100644 --- a/code/WorkInProgress/computer3/laptop.dm +++ b/code/WorkInProgress/computer3/laptop.dm @@ -58,7 +58,8 @@ del src AltClick() - open_computer() + if(Adjacent(usr)) + open_computer() /obj/machinery/computer3/laptop name = "Laptop Computer" @@ -133,5 +134,5 @@ AltClick() - close_computer() - + if(Adjacent(usr)) + close_computer() From e1a8e95081a3859f6ca942cdbd002cd0e4262941 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 16:24:38 +0200 Subject: [PATCH 09/48] fixes rangecheck on laptop verbs --- code/WorkInProgress/computer3/laptop.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/WorkInProgress/computer3/laptop.dm b/code/WorkInProgress/computer3/laptop.dm index cce4e7032c..377d9363ac 100644 --- a/code/WorkInProgress/computer3/laptop.dm +++ b/code/WorkInProgress/computer3/laptop.dm @@ -33,7 +33,11 @@ set name = "open laptop" set category = "Object" set src in view(1) - + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + if(!istype(loc,/turf)) usr << "[src] is too bulky! You'll have to set it down." return @@ -82,7 +86,11 @@ set name = "Close Laptop" set category = "Object" set src in view(1) - + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + if(istype(loc,/obj/item/device/laptop)) testing("Close closed computer") return From cd0c49ab819d817709f775be8acb81db16e866cb Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 16:31:29 +0200 Subject: [PATCH 10/48] another laptop verb range fix --- code/WorkInProgress/computer3/computer.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/WorkInProgress/computer3/computer.dm b/code/WorkInProgress/computer3/computer.dm index 95824e555e..5b9e88bd71 100644 --- a/code/WorkInProgress/computer3/computer.dm +++ b/code/WorkInProgress/computer3/computer.dm @@ -75,6 +75,11 @@ set name = "Reset Computer" set category = "Object" set src in view(1) + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + Reset() New(var/L, var/built = 0) @@ -446,4 +451,4 @@ icon_state = "wallframe" density = 0 pixel_y = -3 - show_keyboard = 0 \ No newline at end of file + show_keyboard = 0 From 323ced2803f29a75aa6cbf47d23108fd12ac5117 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 16:55:23 +0200 Subject: [PATCH 11/48] part 1 of fixing #5521 --- code/WorkInProgress/computer3/computer.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/WorkInProgress/computer3/computer.dm b/code/WorkInProgress/computer3/computer.dm index 5b9e88bd71..093f7b5ed7 100644 --- a/code/WorkInProgress/computer3/computer.dm +++ b/code/WorkInProgress/computer3/computer.dm @@ -76,6 +76,10 @@ set category = "Object" set src in view(1) + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "\red You can't do that." + return + if(!Adjacent(usr)) usr << "You can't reach it." return From 6bff77c0ba9e2acaca512558f300c462ef53e586 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 16:55:38 +0200 Subject: [PATCH 12/48] part 2 of fixing #5521 --- code/WorkInProgress/computer3/laptop.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/WorkInProgress/computer3/laptop.dm b/code/WorkInProgress/computer3/laptop.dm index 377d9363ac..bff5a116f3 100644 --- a/code/WorkInProgress/computer3/laptop.dm +++ b/code/WorkInProgress/computer3/laptop.dm @@ -34,6 +34,10 @@ set category = "Object" set src in view(1) + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "\red You can't do that." + return + if(!Adjacent(usr)) usr << "You can't reach it." return @@ -87,6 +91,10 @@ set category = "Object" set src in view(1) + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "\red You can't do that." + return + if(!Adjacent(usr)) usr << "You can't reach it." return From a36d0b3ff4519cf62bdb9e147c22b57388af41c4 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 17:04:27 +0200 Subject: [PATCH 13/48] part 3 of fixing #5521 --- code/WorkInProgress/computer3/computers/law.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/WorkInProgress/computer3/computers/law.dm b/code/WorkInProgress/computer3/computers/law.dm index 8f7a639ae2..409552cc79 100644 --- a/code/WorkInProgress/computer3/computers/law.dm +++ b/code/WorkInProgress/computer3/computers/law.dm @@ -13,7 +13,7 @@ set category = "Object" set name = "Access Computer's Internals" set src in oview(1) - if(get_dist(src, usr) > 1 || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon)) + if(!Adjacent(usr) || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon) || !istype(usr, /mob/living)) return opened = !opened From 0ff5d021de8730f0df95c9d59b0b5139b8c92700 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 18:21:00 +0200 Subject: [PATCH 14/48] fixes #5449 missing variable updating lead to APCs stuck in green status during powersinks. --- code/modules/power/apc.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 42ab0a1812..a1796aa5c3 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1288,6 +1288,7 @@ chargecount++ else chargecount = 0 + charging = 0 if(chargecount == 10) From 5289776e337081b16777bf440d78904b3cc89d28 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 19:47:59 +0200 Subject: [PATCH 15/48] removes sharpness from forks too commonly available to enjoy the sharp bonus. --- code/game/objects/items/weapons/kitchen.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 7244d45520..12af48f6c8 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -66,7 +66,6 @@ name = "fork" desc = "It's a fork. Sure is pointy." icon_state = "fork" - sharp = 1 /obj/item/weapon/kitchen/utensil/pfork name = "plastic fork" @@ -456,4 +455,4 @@ for(var/i = 1, i <= rand(1,2), i++) if(I) step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2,4)) + sleep(rand(2,4)) From 9827838917b3bdd7b90f86605f3392584a7e009c Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 19:58:01 +0200 Subject: [PATCH 16/48] shrapnel check for human get_visible_implants() --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f4edb30e24..dc23eecd03 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1166,7 +1166,7 @@ var/list/visible_implants = list() for(var/datum/organ/external/organ in src.organs) for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && O.w_class > class) + if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel)) visible_implants += O return(visible_implants) From 10ab66aa40b10fc94d45260f603806eccfdb361f Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 19:58:16 +0200 Subject: [PATCH 17/48] adjusts verb for w_class 1 yankability --- code/modules/mob/mob.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 37b69afdaa..d12a6df238 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -950,7 +950,7 @@ mob/proc/yank_out_object() if(S == U) self = 1 // Removing object from yourself. - valid_objects = get_visible_implants(1) + valid_objects = get_visible_implants(0) if(!valid_objects.len) if(self) src << "You have nothing stuck in your body that is large enough to remove." @@ -961,9 +961,9 @@ mob/proc/yank_out_object() var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) - src << "You attempt to get a good grip on the [selection] in your body." + src << "You attempt to get a good grip on [selection] in your body." else - U << "You attempt to get a good grip on the [selection] in [S]'s body." + U << "You attempt to get a good grip on [selection] in [S]'s body." if(!do_after(U, 80)) return From a3cc178ad69091beba599945aac5b6c5e9ed8ae4 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 10 Jul 2014 19:58:20 +0200 Subject: [PATCH 18/48] adjusts examine for w_class 1 yankability --- code/modules/mob/living/carbon/human/examine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6ce436e12a..026ef891a9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -388,7 +388,7 @@ if(display_gloves) msg += "[src] has blood running from under [t_his] gloves!\n" - for(var/implant in get_visible_implants(1)) + for(var/implant in get_visible_implants(0)) msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" From 81f27320f3ade2cc0898146d15215b2de16895b5 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 08:52:09 +0930 Subject: [PATCH 19/48] Removes vox as a spawn race. --- code/modules/mob/living/carbon/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index c2ecf6d539..b67f78c2e9 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -200,7 +200,7 @@ breath_type = "nitrogen" poison_type = "oxygen" - flags = NO_SCAN | IS_WHITELISTED + flags = NO_SCAN blood_color = "#2299FC" flesh_color = "#808D11" From 008981c8317c5a1cc3913204f0f714a00eeef7af Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 11 Jul 2014 10:29:52 -0400 Subject: [PATCH 20/48] Moves misplaced var from airlock_control.dm Moved explosion_resistance from airlock_control.dm to airlock.dm proper. --- code/game/machinery/doors/airlock.dm | 1 + code/game/machinery/doors/airlock_control.dm | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 83d58a975d..7c34359236 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -77,6 +77,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. icon_state = "door_closed" power_channel = ENVIRON + explosion_resistance = 15 var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = 0 // if 1, this door can't be hacked by the AI var/secondsMainPowerLost = 0 //The number of seconds until power is restored. diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 59ed905a0a..733124a73c 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -6,7 +6,6 @@ obj/machinery/door/airlock var/frequency var/shockedby = list() var/datum/radio_frequency/radio_connection - explosion_resistance = 15 obj/machinery/door/airlock/proc/can_radio() if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_AI_CONTROL) ) From d1fc362032ceddc663c29c9805591baa446e9e81 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 11 Jul 2014 10:49:41 -0400 Subject: [PATCH 21/48] Doors now retry if they fail to complete commands --- code/game/machinery/doors/airlock_control.dm | 41 +++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 733124a73c..afd2f72529 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -6,12 +6,16 @@ obj/machinery/door/airlock var/frequency var/shockedby = list() var/datum/radio_frequency/radio_connection + var/cur_command = null //the command the door is currently attempting to complete obj/machinery/door/airlock/proc/can_radio() if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_AI_CONTROL) ) return 0 return 1 +obj/machinery/door/airlock/process() + ..() + execute_current_command() obj/machinery/door/airlock/receive_signal(datum/signal/signal) if (!can_radio()) return @@ -20,7 +24,19 @@ obj/machinery/door/airlock/receive_signal(datum/signal/signal) if(id_tag != signal.data["tag"] || !signal.data["command"]) return - switch(signal.data["command"]) + cur_command = signal.data["command"] + execute_current_command() + +obj/machinery/door/airlock/proc/execute_current_command() + if (!cur_command) + return + + do_command(cur_command) + if (command_completed(cur_command)) + cur_command = null + +obj/machinery/door/airlock/proc/do_command(var/command) + switch(command) if("open") open() @@ -47,9 +63,30 @@ obj/machinery/door/airlock/receive_signal(datum/signal/signal) lock() sleep(2) - + send_status() +obj/machinery/door/airlock/proc/command_completed(var/command) + switch(command) + if("open") + return (!density) + + if("close") + return density + + if("unlock") + return !locked + + if("lock") + return locked + + if("secure_open") + return (locked && !density) + + if("secure_close") + return (locked && density) + + return 1 //Unknown command. Just assume it's completed. obj/machinery/door/airlock/proc/send_status() if(radio_connection) From 6632cf7be032fa939a6dfa9f137b92c74af6bdaf Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 12 Jul 2014 09:23:39 +0930 Subject: [PATCH 22/48] Removes alarm sound from air alarm. --- code/game/machinery/alarm.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index ad70d7ca01..fe868e82b5 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -104,7 +104,7 @@ var/phoron_dangerlevel = 0 var/temperature_dangerlevel = 0 var/other_dangerlevel = 0 - + var/alarm_sound_cooldown = 200 var/last_sound_time = 0 @@ -173,7 +173,6 @@ if(!istype(location)) return//returns if loc is not simulated if ((alarm_area.fire || alarm_area.atmosalm >= 2) && world.time > last_sound_time + alarm_sound_cooldown) - playsound(src.loc, 'sound/machines/airalarm.ogg', 40, 0, 5) last_sound_time = world.time var/datum/gas_mixture/environment = location.return_air() @@ -324,11 +323,11 @@ if((stat & (NOPOWER|BROKEN)) || shorted) icon_state = "alarmp" return - + var/icon_level = danger_level if (alarm_area.atmosalm) icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow - + switch(icon_level) if (0) icon_state = "alarm0" @@ -728,7 +727,7 @@ Toxins: [phoron_percent]%
output += "Fire alarm in area" else output += "No alerts" - + return output /obj/machinery/alarm/proc/rcon_text() From 6981ca52f46d720bdfae15f14567d921c3f98492 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 12 Jul 2014 10:35:31 +0930 Subject: [PATCH 23/48] Trying to fix the loadout spawn issue, at least this will make it more informative. --- code/game/jobs/job_controller.dm | 22 ++++++++++++++-------- code/modules/client/preferences_gear.dm | 3 +++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index c8be3a2351..d0600b4cca 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -377,6 +377,8 @@ var/global/datum/controller/occupations/job_master if(G.slot) H.equip_to_slot_or_del(new G.path(H), G.slot) + H << "\blue Equipping you with [thing]!" + else spawn_in_storage += thing @@ -462,15 +464,19 @@ var/global/datum/controller/occupations/job_master H.equip_to_slot_or_del(BPK, slot_back,1) //Deferred item spawning. - var/obj/item/weapon/storage/B = locate(/obj/item/weapon/storage/backpack) in H.contents + if(spawn_in_storage && spawn_in_storage.len) + var/obj/item/weapon/storage/B + for(var/obj/item/weapon/storage/S in H.contents) + B = S + break - if(isnull(B) || istype(B)) - B = locate(/obj/item/weapon/storage/box) in H.contents - - if(!isnull(B)) - for(var/thing in spawn_in_storage) - var/datum/gear/G = gear_datums[thing] - new G.path(B) + if(!isnull(B)) + for(var/thing in spawn_in_storage) + H << "\blue Placing [thing] in your [B]!" + var/datum/gear/G = gear_datums[thing] + new G.path(B) + else + H << "\red Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug." //TODO: Generalize this by-species if(H.species) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index e8df54ddfd..aee6547694 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -367,6 +367,7 @@ proc/populate_gear_list() display_name = "engineering bandana" path = /obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 cost = 2 + slot = slot_head allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") //Science @@ -381,12 +382,14 @@ proc/populate_gear_list() display_name = "Zhan-Khazan furs" path = /obj/item/clothing/suit/tajaran/furs cost = 3 + slot = slot_wear_suit whitelisted = "Tajaran" /datum/gear/zhan_scarf display_name = "Zhan-Khazan headscarf" path = /obj/item/clothing/head/tajaran/scarf cost = 2 + slot = slot_head whitelisted = "Tajaran" /datum/gear/unathi_robe From 835f9e52f653ca93b6a7719d4005914e0c07c88d Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 12 Jul 2014 02:56:32 -0400 Subject: [PATCH 24/48] Fixes webbing and holsters shielding EMP --- code/modules/clothing/clothing.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 805f85f875..034fede96a 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -405,4 +405,8 @@ BLIND // can't see anything sensor_mode = pick(0,1,2,3) ..() +/obj/item/clothing/under/emp_act(severity) + if (hastie) + hastie.emp_act(severity) + ..() From f8d0e02b8385823c798dc9b5f4dfd3050d55780d Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sat, 12 Jul 2014 00:36:13 -0700 Subject: [PATCH 25/48] Nerf on sound distance. --- code/game/sound.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index d3f47aff82..0fe756eca5 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -25,7 +25,7 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur var/mob/M = P if(!M || !M.client) continue - if(get_dist(M, turf_source) <= (world.view + extrarange) * 6) + if(get_dist(M, turf_source) <= (world.view + extrarange) * 3) var/turf/T = get_turf(M) if(T && T.z == turf_source.z) M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff) @@ -52,7 +52,7 @@ var/const/SURROUND_CAP = 255 if(isturf(turf_source)) // 3D sounds, the technology is here! var/turf/T = get_turf(src) - S.volume -= get_dist(T, turf_source) * 0.5 + S.volume -= get_dist(T, turf_source) * 0.75 if (S.volume < 0) S.volume = 0 var/dx = turf_source.x - T.x // Hearing from the right/left From 55c7fbe739a2f1b81202eb38058e6e4b1ccba052 Mon Sep 17 00:00:00 2001 From: SparklySheep Date: Sat, 12 Jul 2014 10:26:54 -0500 Subject: [PATCH 26/48] Changes Space Law book to Corporate Regulations Because fuck anyone that thinks "Space Law" is a good name for a roleplaying server. --- code/game/objects/items/weapons/manuals.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 319486d6a3..73d3001549 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -737,11 +737,11 @@ /obj/item/weapon/book/manual/security_space_law - name = "Space Law" + name = "Corporate Regulations" desc = "A set of NanoTrasen guidelines for keeping law and order on their space stations." icon_state = "bookSpaceLaw" author = "NanoTrasen" - title = "Space Law" + title = "Corporate Regulations" dat = {" From c0487b9c90a4d4c9454e1f75752c16e8889a152d Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 12 Jul 2014 16:15:37 -0400 Subject: [PATCH 27/48] Fixes human internal organs list --- code/ZAS/Phoron.dm | 2 +- code/game/machinery/adv_med.dm | 3 +-- code/game/machinery/flasher.dm | 2 +- code/game/objects/items.dm | 2 +- .../objects/items/weapons/grenades/flashbang.dm | 2 +- code/game/objects/items/weapons/tools.dm | 2 +- code/modules/events/organ_failure.dm | 5 ++--- code/modules/mob/living/carbon/human/human.dm | 7 +++---- .../mob/living/carbon/human/human_damage.dm | 2 +- code/modules/organs/blood.dm | 2 +- code/modules/organs/organ_external.dm | 2 +- code/modules/organs/organ_internal.dm | 4 ++-- code/modules/organs/pain.dm | 3 +-- code/modules/reagents/Chemistry-Reagents.dm | 13 +++++++------ code/modules/surgery/braincore.dm | 3 ++- code/modules/surgery/eye.dm | 10 +++++----- code/modules/surgery/ribcage.dm | 15 ++++++++------- code/modules/virus2/effect.dm | 2 +- 18 files changed, 40 insertions(+), 41 deletions(-) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index 1e3df5292a..f96e47c188 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -118,7 +118,7 @@ obj/var/contaminated = 0 /mob/living/carbon/human/proc/burn_eyes() //The proc that handles eye burning. if(prob(20)) src << "\red Your eyes burn!" - var/datum/organ/internal/eyes/E = internal_organs["eyes"] + var/datum/organ/internal/eyes/E = internal_organs_by_name["eyes"] E.damage += 2.5 eye_blurry = min(eye_blurry+1.5,50) if (prob(max(0,E.damage - 15) + 1) &&!eye_blind) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index ec5529c80c..dac4bf7b00 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -332,8 +332,7 @@ else dat += "[e.display_name]--Not Found" dat += "" - for(var/organ_name in occupant.internal_organs) - var/datum/organ/internal/i = occupant.internal_organs[organ_name] + for(var/datum/organ/internal/i in occupant.internal_organs) var/mech = "" if(i.robotic == 1) mech = "Assisted:" diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 303e814ef1..eff51fc697 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -81,7 +81,7 @@ O.Weaken(strength) if (istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O - var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] if ((E.damage > E.min_bruised_damage && prob(E.damage + 50))) flick("e_flash", O:flash) E.damage += rand(1, 5) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b0897829e2..6beb98c40c 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -539,7 +539,7 @@ "\red You stab yourself in the eyes with [src]!" \ ) if(istype(M, /mob/living/carbon/human)) - var/datum/organ/internal/eyes/eyes = H.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"] eyes.damage += rand(3,4) if(eyes.damage >= eyes.min_bruised_damage) if(M.stat != 2) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 2716719fda..dd60f16645 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -83,7 +83,7 @@ //This really should be in mob not every check if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] if (E.damage >= E.min_bruised_damage) M << "\red Your eyes start to burn badly!" if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index a05d2eac37..d148b3b758 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -356,7 +356,7 @@ var/safety = user:eyecheck() if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] if(H.species.flags & IS_SYNTHETIC) return switch(safety) diff --git a/code/modules/events/organ_failure.dm b/code/modules/events/organ_failure.dm index 1499afcb45..f51c463328 100644 --- a/code/modules/events/organ_failure.dm +++ b/code/modules/events/organ_failure.dm @@ -13,7 +13,7 @@ datum/event/organ_failure/announce() datum/event/organ_failure/start() var/list/candidates = list() //list of candidate keys for(var/mob/living/carbon/human/G in player_list) - if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70) + if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70 && G.internal_organs) candidates += G if(!candidates.len) return candidates = shuffle(candidates)//Incorporating Donkie's list shuffle @@ -24,8 +24,7 @@ datum/event/organ_failure/start() var/acute = prob(15) if (prob(75)) //internal organ infection - var/O = pick(C.internal_organs) - var/datum/organ/internal/I = C.internal_organs[O] + var/datum/organ/internal/I = pick(C.internal_organs) if (acute) I.germ_level = max(INFECTION_LEVEL_TWO, I.germ_level) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index dc23eecd03..af74fd2853 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1086,8 +1086,7 @@ H.brainmob.mind.transfer_to(src) del(H) - for(var/E in internal_organs) - var/datum/organ/internal/I = internal_organs[E] + for(var/datum/organ/internal/I in internal_organs) I.damage = 0 for (var/datum/disease/virus in viruses) @@ -1099,11 +1098,11 @@ ..() /mob/living/carbon/human/proc/is_lung_ruptured() - var/datum/organ/internal/lungs/L = internal_organs["lungs"] + var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"] return L.is_bruised() /mob/living/carbon/human/proc/rupture_lung() - var/datum/organ/internal/lungs/L = internal_organs["lungs"] + var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"] if(!L.is_bruised()) src.custom_pain("You feel a stabbing pain in your chest!", 1) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 36aec93a02..dbf8379eeb 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -17,7 +17,7 @@ /mob/living/carbon/human/getBrainLoss() var/res = brainloss - var/datum/organ/internal/brain/sponge = internal_organs["brain"] + var/datum/organ/internal/brain/sponge = internal_organs_by_name["brain"] if (sponge.is_bruised()) res += 20 if (sponge.is_broken()) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index e9f1563c15..1459098db7 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -63,7 +63,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 // Damaged heart virtually reduces the blood volume, as the blood isn't // being pumped properly anymore. - var/datum/organ/internal/heart/heart = internal_organs["heart"] + var/datum/organ/internal/heart/heart = internal_organs_by_name["heart"] if(heart.damage > 1 && heart.damage < heart.min_bruised_damage) blood_volume *= 0.8 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 5cf4d01302..5f369141f4 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -98,7 +98,7 @@ return // High brute damage or sharp objects may damage internal organs - if(internal_organs != null) if( (sharp && brute >= 5) || brute >= 10) if(prob(5)) + if(internal_organs && ( (sharp && brute >= 5) || brute >= 10) && prob(5)) // Damage an internal organ var/datum/organ/internal/I = pick(internal_organs) I.take_damage(brute / 2) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 3721633dce..69a86d82ce 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -27,8 +27,8 @@ var/datum/organ/external/E = H.organs_by_name[src.parent_organ] if(E.internal_organs == null) E.internal_organs = list() - E.internal_organs += src - H.internal_organs[src.name] = src + E.internal_organs |= src + H.internal_organs |= src src.owner = H /datum/organ/internal/process() diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 250e9b984d..49cc2073df 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -102,8 +102,7 @@ mob/living/carbon/human/proc/handle_pain() pain(damaged_organ.display_name, maxdam, 0) // Damage to internal organs hurts a lot. - for(var/organ_name in internal_organs) - var/datum/organ/internal/I = internal_organs[organ_name] + for(var/datum/organ/internal/I in internal_organs) if(I.damage > 2) if(prob(2)) var/datum/organ/external/parent = get_organ(I.parent_organ) src.custom_pain("You feel a sharp pain in your [parent.display_name]", 1) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 2bb33f891a..145e3fd44c 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1312,7 +1312,7 @@ datum M.eye_blind = max(M.eye_blind-5 , 0) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] if(istype(E)) if(E.damage > 0) E.damage -= 1 @@ -1332,8 +1332,9 @@ datum if(!M) M = holder.my_atom if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/organ/external/chest/C = H.get_organ("chest") - for(var/datum/organ/internal/I in C.internal_organs) + + //Peridaxon is hard enough to get, it's probably fair to make this all internal organs + for(var/datum/organ/internal/I in H.internal_organs) if(I.damage > 0) I.damage -= 0.20 ..() @@ -3036,7 +3037,7 @@ datum M:drowsyness = max(M:drowsyness, 30) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/organ/internal/liver/L = H.internal_organs["liver"] + var/datum/organ/internal/liver/L = H.internal_organs_by_name["liver"] if (istype(L)) L.take_damage(0.1, 1) H.adjustToxLoss(0.1) @@ -3273,13 +3274,13 @@ datum if(prob(30)) M.adjustToxLoss(2) if(prob(5)) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/organ/internal/heart/L = H.internal_organs["heart"] + var/datum/organ/internal/heart/L = H.internal_organs_by_name["heart"] if (istype(L)) L.take_damage(5, 0) if (300 to INFINITY) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/organ/internal/heart/L = H.internal_organs["heart"] + var/datum/organ/internal/heart/L = H.internal_organs_by_name["heart"] if (istype(L)) L.take_damage(100, 0) holder.remove_reagent(src.id, FOOD_METABOLISM) diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index b89c48275b..85f3913195 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -107,6 +107,7 @@ B.transfer_identity(target) target.internal_organs -= B + target.internal_organs_by_name -= "brain" target:brain_op_stage = 4.0 target.death()//You want them to die after the brain was transferred, so not to trigger client death() twice. @@ -173,7 +174,7 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\blue [user] mends hematoma in [target]'s brain with \the [tool].", \ "\blue You mend hematoma in [target]'s brain with \the [tool].") - var/datum/organ/internal/brain/sponge = target.internal_organs["brain"] + var/datum/organ/internal/brain/sponge = target.internal_organs_by_name["brain"] if (sponge) sponge.damage = 0 diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 9977271c76..69e238679e 100644 --- a/code/modules/surgery/eye.dm +++ b/code/modules/surgery/eye.dm @@ -39,7 +39,7 @@ target.blinded += 1.5 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \ "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" ) @@ -69,7 +69,7 @@ target.op_stage.eyes = 2 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \ "\red Your hand slips, damaging [target]'s eyes with \the [tool]!") @@ -100,7 +100,7 @@ target.op_stage.eyes = 3 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \ "\red Your hand slips, stabbing \the [tool] into [target]'s eye!") @@ -126,7 +126,7 @@ "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].") end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"] user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \ "\blue You cauterize the incision around [target]'s eyes with \the [tool].") if (target.op_stage.eyes == 3) @@ -136,7 +136,7 @@ target.op_stage.eyes = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \ "\red Your hand slips, searing [target]'s eyes with \the [tool]!") diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 1532dda210..ab16f56915 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -202,9 +202,10 @@ var/is_chest_organ_damaged = 0 var/datum/organ/external/chest/chest = target.get_organ("chest") - for(var/datum/organ/internal/I in chest.internal_organs) if(I.damage > 0) - is_chest_organ_damaged = 1 - break + for(var/datum/organ/internal/I in chest.internal_organs) + if(I.damage > 0) + is_chest_organ_damaged = 1 + break return ..() && is_chest_organ_damaged && target.op_stage.ribcage == 2 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -285,7 +286,7 @@ return 0 var/is_chest_organ_damaged = 0 - var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"] var/datum/organ/external/chest/chest = target.get_organ("chest") for(var/datum/organ/internal/I in chest.internal_organs) if(I.damage > 0) is_chest_organ_damaged = 1 @@ -293,7 +294,7 @@ return ..() && is_chest_organ_damaged && heart.robotic == 2 && target.op_stage.ribcage == 2 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"] if(heart.damage > 0) user.visible_message("[user] starts mending the mechanisms on [target]'s heart with \the [tool].", \ @@ -302,14 +303,14 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"] if(heart.damage > 0) user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \ "\blue You repair [target]'s heart with \the [tool]." ) heart.damage = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"] user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s heart, gumming it up!!" , \ "\red Your hand slips, smearing [tool] in the incision in [target]'s heart, gumming it up!") heart.take_damage(5, 0) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index e5600b7633..41fda7a150 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -202,7 +202,7 @@ activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob, /mob/living/carbon/human)) var/mob/living/carbon/human/H = mob - var/datum/organ/internal/brain/B = H.internal_organs["brain"] + var/datum/organ/internal/brain/B = H.internal_organs_by_name["brain"] if (B.damage < B.min_broken_damage) B.take_damage(5) else From 1502799afdfaaee4fee6280cf069eec0974eebd8 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 12 Jul 2014 16:18:29 -0400 Subject: [PATCH 28/48] Fixes germ levels going below zero --- code/modules/organs/organ.dm | 2 +- code/modules/organs/organ_external.dm | 4 ++-- code/modules/organs/organ_internal.dm | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index f75f9e055d..a483a43d0f 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -21,7 +21,7 @@ /datum/organ/proc/handle_antibiotics() var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") - if (antibiotics < 5) + if (!germ_level || antibiotics < 5) return if (germ_level < INFECTION_LEVEL_ONE) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 5f369141f4..b885d7610e 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -355,7 +355,7 @@ INFECTION_LEVEL_THREE above this germ level the player will take additional toxi Note that amputating the affected organ does in fact remove the infection from the player's body. */ /datum/organ/external/proc/update_germs() - + if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. germ_level = 0 return @@ -387,7 +387,7 @@ Note that amputating the affected organ does in fact remove the infection from t /datum/organ/external/proc/handle_germ_effects() var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") - if (germ_level < INFECTION_LEVEL_ONE && prob(60)) //this could be an else clause, but it looks cleaner this way + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE && prob(60)) //this could be an else clause, but it looks cleaner this way germ_level-- //since germ_level increases at a rate of 1 per second with dirty wounds, prob(60) should give us about 5 minutes before level one. if(germ_level >= INFECTION_LEVEL_ONE) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 69a86d82ce..4ad6e328af 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -33,8 +33,6 @@ /datum/organ/internal/process() //Process infections - if (!germ_level) - return if (robotic >= 2 || (owner.species && owner.species.flags & IS_PLANT)) //TODO make robotic internal and external organs separate types of organ instead of a flag germ_level = 0 @@ -47,7 +45,7 @@ //** Handle the effects of infections var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") - if (germ_level < INFECTION_LEVEL_ONE/2 && prob(30)) + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30)) germ_level-- if (germ_level >= INFECTION_LEVEL_ONE/2) From b8e81f31d376c184e904f1a3d8d7866a30f67565 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 10:18:37 +0930 Subject: [PATCH 29/48] Fixes #5595 --- code/modules/mob/living/carbon/human/emote.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 591e4426e0..d4050c06b8 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -66,8 +66,10 @@ return custom_emote(m_type, message) if ("me") - if(silent) - return + + //if(silent && silent > 0 && findtext(message,"\"",1, null) > 0) + // return //This check does not work and I have no idea why, I'm leaving it in for reference. + if (src.client) if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." From 4f032ef7f4c19faaeb691ba93ee11007f43ff029 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 10:43:47 +0930 Subject: [PATCH 30/48] Fixes #5600 --- code/WorkInProgress/computer3/laptop.dm | 49 +++++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/code/WorkInProgress/computer3/laptop.dm b/code/WorkInProgress/computer3/laptop.dm index bff5a116f3..b88f782c2c 100644 --- a/code/WorkInProgress/computer3/laptop.dm +++ b/code/WorkInProgress/computer3/laptop.dm @@ -30,18 +30,18 @@ var/obj/machinery/computer3/laptop/stored_computer = null verb/open_computer() - set name = "open laptop" + set name = "Open Laptop" set category = "Object" set src in view(1) - + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) usr << "\red You can't do that." return - + if(!Adjacent(usr)) usr << "You can't reach it." return - + if(!istype(loc,/turf)) usr << "[src] is too bulky! You'll have to set it down." return @@ -69,9 +69,42 @@ if(Adjacent(usr)) open_computer() +//Quickfix until Snapshot works out how he wants to redo power. ~Z +/obj/item/device/laptop/verb/eject_id() + set category = "Object" + set name = "Eject ID Card" + set src in oview(1) + + if(stored_computer) + stored_computer.eject_id() + +/obj/machinery/computer3/laptop/verb/eject_id() + set category = "Object" + set name = "Eject ID Card" + set src in oview(1) + + var/obj/item/part/computer/cardslot/C = locate() in src.contents + + if(!C) + usr << "There is no card port on the laptop." + return + + var/obj/item/weapon/card/id/card + if(C.reader) + card = C.reader + else if(C.writer) + card = C.writer + else + usr << "There is nothing to remove from the laptop card port." + return + + usr << "You remove [card] from the laptop." + C.remove(card) + + /obj/machinery/computer3/laptop name = "Laptop Computer" - desc = "A clamshell portable computer. It is open." + desc = "A clamshell portable computer. It is open." icon_state = "laptop" density = 0 @@ -90,15 +123,15 @@ set name = "Close Laptop" set category = "Object" set src in view(1) - + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) usr << "\red You can't do that." return - + if(!Adjacent(usr)) usr << "You can't reach it." return - + if(istype(loc,/obj/item/device/laptop)) testing("Close closed computer") return From 8ba723695f4a756835dc59eb1ab0c28525527c64 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 10:47:45 +0930 Subject: [PATCH 31/48] Fixes #5540 --- icons/mob/species/tajaran/helmet.dmi | Bin 11193 -> 10957 bytes icons/mob/species/tajaran/suit.dmi | Bin 5157 -> 5159 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index dc431a835afc4fdcdfd8974fce1fdf4ce881a6c1..7316d42bb398f3b61064fb61bd28b150df45f2f0 100644 GIT binary patch delta 10210 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 RARGhzQBl-XD3`Mg{U3m#C!zoV diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index d0eca318fd2b655231346279ebbb3a3c24f492b6..13eb7174d941c17463cfb89d809adfa7497f7e5d 100644 GIT binary patch delta 4699 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 Date: Mon, 14 Jul 2014 11:42:39 +0930 Subject: [PATCH 32/48] Bandaid fix for #5589 --- code/modules/supermatter/supermatter.dm | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 129f54daa4..e7e3cc4972 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -123,20 +123,22 @@ shift_light(5, warning_color) if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY) var/stability = num2text(round((damage / explosion_point) * 100)) + var/alert_msg if(damage > emergency_point) shift_light(7, emergency_color) - radio.autosay(addtext(emergency_alert, " Instability: ",stability,"%"), "Supermatter Monitor") + alert_msg = addtext(emergency_alert, " Instability: ",stability,"%") lastwarning = world.timeofday - else if(damage >= damage_archived) // The damage is still going up - radio.autosay(addtext(warning_alert," Instability: ",stability,"%"), "Supermatter Monitor") + alert_msg = addtext(warning_alert," Instability: ",stability,"%") lastwarning = world.timeofday - 150 - - else // Phew, we're safe - radio.autosay(safe_alert, "Supermatter Monitor") + else // Phew, we're safe + alert_msg = safe_alert lastwarning = world.timeofday + if(!istype(L, /turf/space) && alert_msg) + radio.autosay(alert_msg, "Supermatter Monitor") + if(damage > explosion_point) for(var/mob/living/mob in living_mob_list) if(istype(mob, /mob/living/carbon/human)) From 2b9b9b7a7d7bb7dd49825a8d1d3eaf3347c8a215 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 11:50:16 +0930 Subject: [PATCH 33/48] Fixes #5573 --- code/modules/mob/living/carbon/human/life.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 211da1cdac..09ffb42681 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1098,6 +1098,9 @@ return //TODO: DEFERRED proc/handle_regular_status_updates() + + if(status_flags & GODMODE) return 0 + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP blinded = 1 silent = 0 From 2c634a8d7ad03e2e718750d51ee8725497fe370d Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 12:00:15 +0930 Subject: [PATCH 34/48] Fixes #5611 --- code/modules/mob/new_player/new_player.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index b4d3f02196..0f18e02cf3 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -134,6 +134,7 @@ return 1 if(href_list["late_join"]) + if(!ticker || ticker.current_state != GAME_STATE_PLAYING) usr << "\red The round is either not ready, or has already finished..." return @@ -143,6 +144,11 @@ src << alert("You are currently not whitelisted to play [client.prefs.species].") return 0 + var/datum/species/S = all_species[client.prefs.species] + if(!(S.flags & IS_WHITELISTED)) + src << alert("Your current species,[client.prefs.species], is not available for play on the station.") + return 0 + LateChoices() if(href_list["manifest"]) @@ -159,6 +165,11 @@ src << alert("You are currently not whitelisted to play [client.prefs.species].") return 0 + var/datum/species/S = all_species[client.prefs.species] + if(!(S.flags & IS_WHITELISTED)) + src << alert("Your current species,[client.prefs.species], is not available for play on the station.") + return 0 + AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint) return From bc2f91b4e4913b2598460cb4acee22b1e0abe4d9 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 12:02:48 +0930 Subject: [PATCH 35/48] Fixes #5608 --- code/modules/mining/machine_processing.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index d350e2052c..d8b671af25 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -142,10 +142,20 @@ /obj/machinery/mineral/processing_unit/process() - if (!active || !src.output || !src.input) return + if (!src.output || !src.input) return var/list/tick_alloys = list() + //Grab some more ore to process this tick. + for(var/i = 0,i Date: Mon, 14 Jul 2014 12:16:02 +0930 Subject: [PATCH 36/48] Fixes #5508 --- code/modules/mob/living/carbon/human/death.dm | 3 --- code/modules/organs/organ_external.dm | 22 ++++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index bebd5680ef..e14cd9c534 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -58,7 +58,6 @@ dizziness = 0 jitteriness = 0 - hud_updateflag |= 1 << HEALTH_HUD hud_updateflag |= 1 << STATUS_HUD @@ -117,8 +116,6 @@ ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now return ..(gibbed) - - /mob/living/carbon/human/proc/makeSkeleton() if(SKELETON in src.mutations) return diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index b885d7610e..713de4aef4 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -32,6 +32,7 @@ var/damage_msg = "\red You feel an intense pain" var/broken_description + var/vital //Lose a vital limb, die immediately. var/status = 0 var/open = 0 var/stage = 0 @@ -355,7 +356,7 @@ INFECTION_LEVEL_THREE above this germ level the player will take additional toxi Note that amputating the affected organ does in fact remove the infection from the player's body. */ /datum/organ/external/proc/update_germs() - + if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. germ_level = 0 return @@ -363,7 +364,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs //** Syncing germ levels with external wounds handle_germ_sync() - + //** Handle antibiotics and curing infections handle_antibiotics() @@ -386,10 +387,10 @@ Note that amputating the affected organ does in fact remove the infection from t /datum/organ/external/proc/handle_germ_effects() var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") - + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE && prob(60)) //this could be an else clause, but it looks cleaner this way germ_level-- //since germ_level increases at a rate of 1 per second with dirty wounds, prob(60) should give us about 5 minutes before level one. - + if(germ_level >= INFECTION_LEVEL_ONE) //having an infection raises your body temperature var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 1)* min(germ_level/INFECTION_LEVEL_THREE, 1) + owner.species.body_temperature @@ -400,7 +401,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(prob(round(germ_level/10))) if (antibiotics < 5) germ_level++ - + if (prob(5)) //adjust this to tweak how fast people take toxin damage from infections owner.adjustToxLoss(1) @@ -411,7 +412,7 @@ Note that amputating the affected organ does in fact remove the infection from t if (I.germ_level > 0 && I.germ_level < min(germ_level, INFECTION_LEVEL_TWO)) //once the organ reaches whatever we can give it, or level two, switch to a different one if (!target_organ || I.germ_level > target_organ.germ_level) //choose the organ with the highest germ_level target_organ = I - + if (!target_organ) //figure out which organs we can spread germs to and pick one at random var/list/candidate_organs = list() @@ -420,7 +421,7 @@ Note that amputating the affected organ does in fact remove the infection from t candidate_organs += I if (candidate_organs.len) target_organ = pick(candidate_organs) - + if (target_organ) target_organ.germ_level++ @@ -666,6 +667,9 @@ Note that amputating the affected organ does in fact remove the infection from t // OK so maybe your limb just flew off, but if it was attached to a pair of cuffs then hooray! Freedom! release_restraints() + if(vital) + owner.death() + /**************************************************** HELPERS ****************************************************/ @@ -829,7 +833,7 @@ Note that amputating the affected organ does in fact remove the infection from t max_damage = 75 min_broken_damage = 40 body_part = UPPER_TORSO - + vital = 1 /datum/organ/external/groin name = "groin" @@ -838,6 +842,7 @@ Note that amputating the affected organ does in fact remove the infection from t max_damage = 50 min_broken_damage = 30 body_part = LOWER_TORSO + vital = 1 /datum/organ/external/l_arm name = "l_arm" @@ -931,6 +936,7 @@ Note that amputating the affected organ does in fact remove the infection from t min_broken_damage = 40 body_part = HEAD var/disfigured = 0 + vital = 1 /datum/organ/external/head/get_icon() if (!owner) From a2a5991baecf7467ce89954a425a9fe0540224a9 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 12:23:28 +0930 Subject: [PATCH 37/48] Fixes #5523 --- code/modules/clothing/head/jobs.dm | 2 +- icons/obj/clothing/hats.dmi | Bin 59315 -> 59313 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index d2ef8deccf..692cc90b63 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -3,7 +3,7 @@ /obj/item/clothing/head/chefhat name = "chef's hat" desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work." - icon_state = "chef" + icon_state = "chefhat" item_state = "chefhat" desc = "The commander in chef's head wear." flags = FPRINT | TABLEPASS diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 31be71e8e9eecca1d639cc38d64c8593f365bc0d..901928b4145bd83ecc9cc33635a2cfb8c932ac68 100644 GIT binary patch delta 933 zcmV;W16usE&jYc~1CS&Ev9TpD0e{G{^b(7V0;?|37@+2AY*v+vL8{~_&0|_knNGhp()KU{9yp*|fl=AEhO;}%HXhPD@IGQ|3 z=v<8D(ZdXaDzTgfVb;V@ZGR9K&*d~tY*IV|9m&ddM=#R^7~Y`F0X7zzfT{MZoV%VZ za8GboLyw#lIY<`{K;bxXhIVKq@gtSp%*;MR2guCalP{NWj#8c#JCkfpgj#$Zf#T5( z>y`9NmVN#``!c62h9?Q-PIP0z5@@5Lf@Wi}u6Bcwf?%X!PJkil5PzZkypec@da^>u zRc=UaA9d);SKzIJn&xpj0o~KBib4Z83~3_69r!|JxC&Pp+6Jo@RfYqOwhf0t0<$8O zo62yg4QQKD0xXWRZL`QLxEdJPHi^xDUolM#HM7s1i_ww?&cy69dLVi~Gn9dEAe?}! zTS40IXx#-2iQmW??SCsOeXUYn+dxSB9fj4WStpOFzoW3al7t@I(4SabpDm`nai^roFR!n;#wHz>Zby2orfMRB~Q4sE#bYj4pE+ZxANz{os zac~U0?_D^=aAELk~FGHi->v_T^S&*1^!!ttkrQ*nh7J8;sR^bD->`bL_{? zI0jlrN1{g`7ogoasf5r$M`6vLs;oH2OEW2_G%N6I9WRX`C8&v}vAhgxJ*2raaU3aF zU^&)`s5WFB1%6t-MO1je8t_)D;ong+sYC6g4t0~NX_n9N(xlAfbGaQj$II%F<@+{z zG3?lv`)d~y^nXedb;4Sw4TP_?bW-+yD6OVi^t@+!Y4Bd>P|3GV zx&|xUWO@M|y^6o-uisuZ1Rio5W!;skQSgwrQEKFYhnDTf)lcQ(n?pttB`uVp#QW({ z82f&W(8Hd}aHwG0CXqiAU{&kFg7B-O&?Q59{1f_d{}JW;)Bfq(^X`A6h=ur2dP`HY H-~`j+M$XJ6 delta 935 zcmV;Y16cgA&jYj11CS&Ev#}*F0e?lPmsn&Ju-sl^H*jDj53yz}kK0S^&Z5!B;R?Zt z&8(6!_=SSxsF<)34p~z9jP-Hs(=0gHElz+8d&B?r<-KsE)=_S|D|;Uols{DRZD%2` zy~$VMZ3nvQO}>tA!G*ucSK)1k`1(y7fu}{vIe+w&J3~|1irHJlL?%(>0)OZ!SPE2@ z^EAwCqd_vyG1=q=aKxS!C^P5eD4fW~rR>KWI|C~zucYPeTO=D-wptmQ2&A~O1;_2@ z5Xy#lmgqTyk|)WC$8L_5*dSlD9Y|ooM^Z`Uqn4T=;ib%-qm*Z7Xu_HbLlcsI#?jVKs^E}qM2n%Jax1lp06>yBQg2{61tnFDMrGyzlXSvhw- zS>T@Fu7(~tD{_!79Du5E;tcK3Na9B-yP27Nh7ORKxhG#P;T)wrD|RN?nh5pxIs(O` z8`dl7mn{4Id-i2cSqx7S%5CVzf+f&KLj}#oVlC|kBL%@o!<+y^(tjaB`FSJp4E1D% zkgME~+CJ*gm9M~C1vSm%bOKtZTNQ-{a2V1=hCA?i%5W8~GPDg=EvgI$9Bms8g9K(p zDmRtkP#e%TqXbwSXWM3xS8z2jux%2X|Gr|H7;0vpI~SuR51fhFXY@eyer6~G-#|D4 zSGR(+-_g1Y7!tpcHGkSyRQg(_ytaXm_B#rzPqR)QQ-4QcbtMTsxS>C>xISA9_c;CBlh~;8KWoR49BZeMuv~3a_*zC)#$gG2*sasPN#(%M&7B(2G_vS#^N$1#) zopB7bj*di+J}yAJb5aSRgO0+QJylt8j+bUqPH9%)%{pEhLrPE+O=Ec()_O>DXW}?g zu)uPx6;W--Itu)>e2b{?fHmN)R>QxeW>SaRNge7YRnsh=(xAaE_PNAP8$ecYw4uy{Z>GNPs_i?U_Y*I_R=epap-x^^wQwH&Y_ZT zn{*9UxXJVaI(ij<(_g>6Y6v{!Hp;pyRioe`Z==-60}n0RFRP!*#W#nHBuZK+Ly7m( zqcHaU8li_hmElmqwoM{`CcvuJg$3bPN1;oG^pC&0eiPh(`Tn$j`u4p0AI8vxyN!=o JCbQlI)8bDo&o}@8 From 338602ee181d8d4871acac51dd1580bb0997514c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 12:41:10 +0930 Subject: [PATCH 38/48] Fixes #5531 --- baystation12.dme | 1 + code/modules/mob/living/carbon/brain/login.dm | 3 ++- code/modules/mob/living/silicon/login.dm | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/baystation12.dme b/baystation12.dme index 411f58ddd3..855bd5368e 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -954,6 +954,7 @@ #include "code\modules\mob\living\carbon\brain\death.dm" #include "code\modules\mob\living\carbon\brain\emote.dm" #include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" #include "code\modules\mob\living\carbon\brain\posibrain.dm" #include "code\modules\mob\living\carbon\brain\say.dm" diff --git a/code/modules/mob/living/carbon/brain/login.dm b/code/modules/mob/living/carbon/brain/login.dm index 84bccdfe96..e90297dfe5 100644 --- a/code/modules/mob/living/carbon/brain/login.dm +++ b/code/modules/mob/living/carbon/brain/login.dm @@ -1,2 +1,3 @@ /mob/living/carbon/brain/Login() - return ..() \ No newline at end of file + ..() + sleeping = 0 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 32e0c8d346..a95a754eae 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,4 +1,5 @@ /mob/living/silicon/Login() + sleeping = 0 if(mind && ticker && ticker.mode) ticker.mode.remove_cultist(mind, 1) ticker.mode.remove_revolutionary(mind, 1) From a0291b0d7aac8b7ae1696d30b7e5dbcd1ec0de3e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 14 Jul 2014 12:51:30 +0930 Subject: [PATCH 39/48] Fixes #5485 --- code/modules/mob/living/carbon/human/life.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 09ffb42681..f772fe5840 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -690,6 +690,7 @@ loc_temp = environment.temperature if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1 && environment.phoron < MOLES_PHORON_VISIBLE) + pressure_alert = 0 return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection From 177560cf4bfae830c721ec0b3874a3a6b046bfb4 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 14 Jul 2014 22:06:14 -0400 Subject: [PATCH 40/48] Moves turf collision handling into living_defense --- code/game/atoms.dm | 2 +- code/modules/mob/living/living_defense.dm | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3253f272d0..d4c15b23e1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -40,7 +40,7 @@ step(src, turn(src.dir, 180)) if(istype(src,/mob/living)) var/mob/living/M = src - M.take_organ_damage(20) + M.turf_collision(T, speed) /atom/proc/assume_air(datum/gas_mixture/giver) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 0b7be48153..c3bbfe0728 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -73,6 +73,9 @@ if(istype(O,/obj/item/weapon)) var/obj/item/weapon/W = O dtype = W.damtype + + //run to-hit check here + src.visible_message("\red [src] has been hit by [O].") var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].") @@ -117,6 +120,9 @@ src.anchored = 1 src.pinned += O +//This is called when the mob is thrown into a dense turf +/mob/living/proc/turf_collision(var/turf/T, var/speed) + src.take_organ_damage(speed*4) /mob/living/proc/near_wall(var/direction,var/distance=1) var/turf/T = get_step(get_turf(src),direction) From 836d2e40a83dbc7e698753f11afcef852262215a Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 14 Jul 2014 23:53:27 -0400 Subject: [PATCH 41/48] Adds miss chance and shield checks to thrown atoms Also makes setting a thrown atom's throwing var the responsibility of the handler, so that impact handling code can decide if the thrown atom should keep on going. --- code/game/atoms.dm | 23 ++------------- code/game/atoms_movable.dm | 29 +++++++++++++++---- code/game/mecha/mecha.dm | 1 + .../living/carbon/alien/special/facehugger.dm | 1 + code/modules/mob/living/living_defense.dm | 22 +++++++++++--- code/modules/mob/mob_helpers.dm | 6 +++- 6 files changed, 51 insertions(+), 31 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d4c15b23e1..05a52137cc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -22,27 +22,6 @@ //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom -/atom/proc/throw_impact(atom/hit_atom, var/speed) - if(istype(hit_atom,/mob/living)) - var/mob/living/M = hit_atom - M.hitby(src,speed) - - else if(isobj(hit_atom)) - var/obj/O = hit_atom - if(!O.anchored) - step(O, src.dir) - O.hitby(src,speed) - - else if(isturf(hit_atom)) - var/turf/T = hit_atom - if(T.density) - spawn(2) - step(src, turn(src.dir, 180)) - if(istype(src,/mob/living)) - var/mob/living/M = src - M.turf_collision(T, speed) - - /atom/proc/assume_air(datum/gas_mixture/giver) return null @@ -237,6 +216,8 @@ its easier to just keep the beam vertical. return /atom/proc/hitby(atom/movable/AM as mob|obj) + if (density) + AM.throwing = 0 return /atom/proc/add_hiddenprint(mob/living/M as mob) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 41da5ea7c8..6870d3ab6f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -25,7 +25,6 @@ /atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes) if(src.throwing) src.throw_impact(A) - src.throwing = 0 spawn( 0 ) if ((A && yes)) @@ -44,6 +43,29 @@ return 1 return 0 +//called when src is thrown into hit_atom +/atom/movable/proc/throw_impact(atom/hit_atom, var/speed) + if(istype(hit_atom,/mob/living)) + var/mob/living/M = hit_atom + M.hitby(src,speed) + + else if(isobj(hit_atom)) + var/obj/O = hit_atom + if(!O.anchored) + step(O, src.dir) + O.hitby(src,speed) + + else if(isturf(hit_atom)) + src.throwing = 0 + var/turf/T = hit_atom + if(T.density) + spawn(2) + step(src, turn(src.dir, 180)) + if(istype(src,/mob/living)) + var/mob/living/M = src + M.turf_collision(T, speed) + +//decided whether a movable atom being thrown can pass through the turf it is in. /atom/movable/proc/hit_check(var/speed) if(src.throwing) for(var/atom/A in get_turf(src)) @@ -51,12 +73,9 @@ if(istype(A,/mob/living)) if(A:lying) continue src.throw_impact(A,speed) - if(src.throwing == 1) - src.throwing = 0 if(isobj(A)) if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement src.throw_impact(A,speed) - src.throwing = 0 /atom/movable/proc/throw_at(atom/target, range, speed) if(!target || !src) return 0 @@ -149,8 +168,8 @@ a = get_area(src.loc) //done throwing, either because it hit something or it finished moving - src.throwing = 0 if(isobj(src)) src.throw_impact(get_turf(src),speed) + src.throwing = 0 //Overlays diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index e3465c3b7c..0cb89ee683 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -469,6 +469,7 @@ return /obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper + ..() src.log_message("Hit by [A].",1) call((proc_res["dynhitby"]||src), "dynhitby")(A) return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 4edcbd3dc7..48c16a9983 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -107,6 +107,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(stat == CONSCIOUS) icon_state = "[initial(icon_state)]" Attach(hit_atom) + throwing = 0 /obj/item/clothing/mask/facehugger/proc/Attach(M as mob) if( (!iscorgi(M) && !iscarbon(M)) || isalien(M)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index c3bbfe0728..5f5018e382 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -65,6 +65,7 @@ P.on_hit(src, absorb, def_zone) return absorb +//this proc handles being hit by a thrown atom /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve if(istype(AM,/obj/)) var/obj/O = AM @@ -73,14 +74,27 @@ if(istype(O,/obj/item/weapon)) var/obj/item/weapon/W = O dtype = W.damtype + var/throw_damage = O.throwforce*(speed/5) - //run to-hit check here + //def_zone = get_zone_with_miss_chance(zone, src, 15*AM.throwing_dist_travelled) + zone = get_zone_with_miss_chance(zone, src) //TODO: store the location of the thrower and adjust miss chance with distance + + if(!zone) + visible_message("\blue \The [AM] misses [src] narrowly!") + return + + AM.throwing = 0 //it hit, so stop moving + + if (istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + if (H.check_shields(throw_damage, "[O]")) + return src.visible_message("\red [src] has been hit by [O].") - var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].") + var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened the hit to your [zone].") if(armor < 2) - apply_damage(O.throwforce*(speed/5), dtype, zone, armor, is_sharp(O), has_edge(O), O) + apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) if(!O.fingerprintslast) return @@ -99,7 +113,7 @@ if(speed >= 15) var/obj/item/weapon/W = O var/momentum = speed/2 - var/dir = get_dir(M,src) + var/dir = get_dir(M,src) //TODO: store the location of the thrower and move this out of the fingerprintslast block visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") src.throw_at(get_edge_target_turf(src,dir),1,momentum) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 314a4026ab..bb7881f0a0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -147,7 +147,11 @@ proc/hasorgans(A) */ return zone - +// Returns zone with a certain probability. +// If the probability misses, returns "chest" instead. +// If "chest" was passed in as zone, then on a "miss" will return "head", "l_arm", or "r_arm" +// Do not use this if someone is intentionally trying to hit a specific body part. +// Use get_zone_with_miss_chance() for that. /proc/ran_zone(zone, probability) zone = check_zone(zone) if(!probability) probability = 90 From f2845dbe76c5869616f59e31b81f332ad3b7c68e Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 01:14:04 -0400 Subject: [PATCH 42/48] Thrown items can be targeted, has miss chance... ...based on distance, similar to projectiles. --- code/_onclick/telekinesis.dm | 2 +- code/defines/obj.dm | 3 ++- code/game/atoms_movable.dm | 8 +++++++- code/game/machinery/bots/farmbot.dm | 2 +- code/game/machinery/kitchen/gibber.dm | 2 +- code/game/machinery/kitchen/smartfridge.dm | 2 +- code/game/machinery/vending.dm | 2 +- code/game/mecha/equipment/tools/tools.dm | 2 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- .../objects/items/weapons/extinguisher.dm | 9 ++++++--- .../structures/stool_bed_chair_nest/chairs.dm | 2 +- .../stool_bed_chair_nest/wheelchair.dm | 7 ++++++- code/modules/games/cards.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/living_defense.dm | 20 ++++++++++++++----- code/modules/projectiles/guns/alien.dm | 2 +- .../projectiles/guns/projectile/bow.dm | 2 +- .../projectiles/guns/projectile/pneumatic.dm | 2 +- .../projectiles/guns/projectile/rocket.dm | 2 +- code/modules/reagents/grenade_launcher.dm | 2 +- 21 files changed, 52 insertions(+), 27 deletions(-) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 0abb637cce..3f74cbd0ea 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -141,7 +141,7 @@ var/const/tk_maxrange = 15 else apply_focus_overlay() - focus.throw_at(target, 10, 1) + focus.throw_at(target, 10, 1, user) last_throw = world.time return diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 25a5242c07..c7e3df319d 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -303,9 +303,10 @@ var/global/list/PDA_Manifest = list() throw_speed = 1 throw_range = 20 flags = FPRINT | TABLEPASS | CONDUCT + afterattack(atom/target as mob|obj|turf|area, mob/user as mob) user.drop_item() - src.throw_at(target, throw_range, throw_speed) + src.throw_at(target, throw_range, throw_speed, user) /obj/effect/stop var/victim = null diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6870d3ab6f..de6b84d655 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -7,6 +7,8 @@ var/l_move_time = 1 var/m_flag = 1 var/throwing = 0 + var/thrower + var/turf/throw_source = null var/throw_speed = 2 var/throw_range = 7 var/moved_recently = 0 @@ -77,11 +79,13 @@ if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement src.throw_impact(A,speed) -/atom/movable/proc/throw_at(atom/target, range, speed) +/atom/movable/proc/throw_at(atom/target, range, speed, thrower) if(!target || !src) return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target src.throwing = 1 + src.thrower = thrower + src.throw_source = get_turf(src) //store the origin turf if(usr) if(HULK in usr.mutations) @@ -170,6 +174,8 @@ //done throwing, either because it hit something or it finished moving if(isobj(src)) src.throw_impact(get_turf(src),speed) src.throwing = 0 + src.thrower = null + src.throw_source = null //Overlays diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm index 228b525049..1c0bd0875f 100644 --- a/code/game/machinery/bots/farmbot.dm +++ b/code/game/machinery/bots/farmbot.dm @@ -394,7 +394,7 @@ if ( emagged ) // Warning, hungry humans detected: throw fertilizer at them spawn(0) fert.loc = src.loc - fert.throw_at(target, 16, 3) + fert.throw_at(target, 16, 3, src) src.visible_message("\red [src] launches [fert.name] at [target.name]!") flick("farmbot_broke", src) spawn (FARMBOT_EMAG_DELAY) diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 4b2fce70cd..b74d3a587a 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -217,7 +217,7 @@ var/obj/item/meatslab = allmeat[i] var/turf/Tx = locate(src.x - i, src.y, src.z) meatslab.loc = src.loc - meatslab.throw_at(Tx,i,3) + meatslab.throw_at(Tx,i,3,src) if (!Tx.density) new /obj/effect/decal/cleanable/blood/gibs(Tx,i) src.operating = 0 diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 6242626bc7..8eca8dce3a 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -403,7 +403,7 @@ if(!throw_item) return 0 spawn(0) - throw_item.throw_at(target,16,3) + throw_item.throw_at(target,16,3,src) src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") return 1 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 5dd31a036e..e69a2b36de 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -552,7 +552,7 @@ if (!throw_item) return 0 spawn(0) - throw_item.throw_at(target, 16, 3) + throw_item.throw_at(target, 16, 3, src) src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") return 1 diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 08cc9a65d0..629e3b9d7d 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -464,7 +464,7 @@ return else if(target!=locked) if(locked in view(chassis)) - locked.throw_at(target, 14, 1.5) + locked.throw_at(target, 14, 1.5, chassis) locked = null send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) set_ready_state(0) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index e8a9dc072f..fb1174814d 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -231,7 +231,7 @@ var/missile_range = 30 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target, turf/aimloc) - AM.throw_at(target,missile_range, missile_speed) + AM.throw_at(target,missile_range, missile_speed, chassis) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive name = "SRM-8 Missile Rack" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 219843e68b..652e51e95c 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -82,16 +82,19 @@ C = usr.buckled var/obj/B = usr.buckled var/movementdirection = turn(direction,180) - if(C) C.propelled = 1 - B.Move(get_step(usr,movementdirection), movementdirection) - sleep(1) + if(C) C.propelled = 4 B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 3 + sleep(1) + B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 2 sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 1 sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) if(C) C.propelled = 0 diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 9982017c6b..115806277c 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -138,7 +138,7 @@ if(propelled) var/mob/living/occupant = buckled_mob unbuckle() - occupant.throw_at(A, 3, 2) + occupant.throw_at(A, 3, propelled) occupant.apply_effect(6, STUN, 0) occupant.apply_effect(6, WEAKEN, 0) occupant.apply_effect(6, STUTTER, 0) diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index adec836a78..705351acfc 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -136,7 +136,12 @@ if(propelled || (pulling && (pulling.a_intent == "hurt"))) var/mob/living/occupant = buckled_mob unbuckle() - occupant.throw_at(A, 3, 2) + + if (pulling && (pulling.a_intent == "hurt")) + occupant.throw_at(A, 3, 3, pulling) + else if (propelled) + occupant.throw_at(A, 3, propelled) + occupant.apply_effect(6, STUN, 0) occupant.apply_effect(6, WEAKEN, 0) occupant.apply_effect(6, STUTTER, 0) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index d7ee461161..60adf1e704 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -116,7 +116,7 @@ H.concealed = 1 H.update_icon() usr.visible_message("\The [usr] deals a card to \the [M].") - H.throw_at(get_step(M,M.dir),10,1) + H.throw_at(get_step(M,M.dir),10,1,H) /obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob) if(istype(O,/obj/item/weapon/hand)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a3c9babd97..c7bf755356 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -330,7 +330,7 @@ */ - item.throw_at(target, item.throw_range, item.throw_speed) + item.throw_at(target, item.throw_range, item.throw_speed, src) /mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 45a6647aff..8580099124 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1383,7 +1383,7 @@ status_flags |= LEAPING src.visible_message("\The [src] leaps at [T]!") - src.throw_at(get_step(get_turf(T),get_turf(src)), 5, 1) + src.throw_at(get_step(get_turf(T),get_turf(src)), 5, 1, src) playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1) sleep(5) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5f5018e382..aca29b3e0e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -69,21 +69,31 @@ /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve if(istype(AM,/obj/)) var/obj/O = AM - var/zone = ran_zone("chest",75)//Hits a random part of the body, geared towards the chest var/dtype = BRUTE if(istype(O,/obj/item/weapon)) var/obj/item/weapon/W = O dtype = W.damtype var/throw_damage = O.throwforce*(speed/5) + var/zone + if (istype(O.thrower, /mob/living)) + var/mob/living/L = O.thrower + zone = check_zone(L.zone_sel.selecting) + else + zone = ran_zone("chest",75) //Hits a random part of the body, geared towards the chest + //def_zone = get_zone_with_miss_chance(zone, src, 15*AM.throwing_dist_travelled) - zone = get_zone_with_miss_chance(zone, src) //TODO: store the location of the thrower and adjust miss chance with distance + if (O.throw_source) + var/distance = get_dist(O.throw_source, loc) + zone = get_zone_with_miss_chance(zone, src, min(15*(distance-2), 0)) + else + zone = get_zone_with_miss_chance(zone, src, 15) if(!zone) - visible_message("\blue \The [AM] misses [src] narrowly!") + visible_message("\blue \The [O] misses [src] narrowly!") return - AM.throwing = 0 //it hit, so stop moving + O.throwing = 0 //it hit, so stop moving if (istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src @@ -136,7 +146,7 @@ //This is called when the mob is thrown into a dense turf /mob/living/proc/turf_collision(var/turf/T, var/speed) - src.take_organ_damage(speed*4) + src.take_organ_damage(speed*5) /mob/living/proc/near_wall(var/direction,var/distance=1) var/turf/T = get_step(get_turf(src),direction) diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index f192873090..9ac058bc88 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -110,7 +110,7 @@ user.visible_message("\red [user] fires [src]!", "\red You fire [src]!") spike.loc = get_turf(src) - spike.throw_at(target,10,fire_force) + spike.throw_at(target,10,fire_force,user) spike = null update_icon() diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 912b5f2f1e..7788d35627 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -191,7 +191,7 @@ var/obj/item/weapon/arrow/A = arrow A.loc = get_turf(user) - A.throw_at(target,10,tension*release_speed) + A.throw_at(target,10,tension*release_speed,user) arrow = null tension = 0 icon_state = "crossbow" diff --git a/code/modules/projectiles/guns/projectile/pneumatic.dm b/code/modules/projectiles/guns/projectile/pneumatic.dm index 43c1fed24a..7f1de5e43c 100644 --- a/code/modules/projectiles/guns/projectile/pneumatic.dm +++ b/code/modules/projectiles/guns/projectile/pneumatic.dm @@ -131,7 +131,7 @@ user.visible_message("[user] fires [src] and launches [object] at [target]!","You fire [src] and launch [object] at [target]!") src.remove_from_storage(object,user.loc) - object.throw_at(target,10,speed) + object.throw_at(target,10,speed,user) var/lost_gas_amount = tank.air_contents.total_moles*(pressure_setting/100) var/datum/gas_mixture/removed = tank.air_contents.remove(lost_gas_amount) diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index a1575b937c..0cf732c9c2 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -43,7 +43,7 @@ var/obj/item/missile/M = new projectile(user.loc) playsound(user.loc, 'sound/effects/bang.ogg', 50, 1) M.primed = 1 - M.throw_at(target, missile_range, missile_speed) + M.throw_at(target, missile_range, missile_speed,user) message_admins("[key_name_admin(user)] fired a rocket from a rocket launcher ([src.name]).") log_game("[key_name_admin(user)] used a rocket launcher ([src.name]).") rockets -= I diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index 5545883c2f..b69f428410 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -56,7 +56,7 @@ var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc - F.throw_at(target, 30, 2) + F.throw_at(target, 30, 2, user) message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") log_game("[key_name_admin(user)] used a grenade ([src.name]).") F.active = 1 From 2edfda5682e95c9685e11b72d8c664b77ab259f3 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 01:26:08 -0400 Subject: [PATCH 43/48] Thrown momentum no longer depends on fingerprints --- code/modules/mob/living/living_defense.dm | 57 +++++++++++------------ 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index aca29b3e0e..9779e7bb63 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -82,7 +82,6 @@ else zone = ran_zone("chest",75) //Hits a random part of the body, geared towards the chest - //def_zone = get_zone_with_miss_chance(zone, src, 15*AM.throwing_dist_travelled) if (O.throw_source) var/distance = get_dist(O.throw_source, loc) zone = get_zone_with_miss_chance(zone, src, min(15*(distance-2), 0)) @@ -106,43 +105,39 @@ if(armor < 2) apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) - if(!O.fingerprintslast) - return + if(ismob(O.thrower)) + var/mob/M = O.thrower + var/client/assailant = M.client + if(assailant) + src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [M.name] ([assailant.ckey])") + M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") + if(!istype(src,/mob/living/simple_animal/mouse)) + msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)") - var/client/assailant = directory[ckey(O.fingerprintslast)] - if(assailant && assailant.mob && istype(assailant.mob,/mob)) - var/mob/M = assailant.mob + // Begin BS12 momentum-transfer code. + if(O.throw_source && speed >= 15) + var/obj/item/weapon/W = O + var/momentum = speed/2 + var/dir = get_dir(O.throw_source, src) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a thrown [O], last touched by [M.name] ([assailant.ckey])") - M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") - if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[src.name] ([src.ckey]) was hit by a thrown [O], last touched by [M.name] ([assailant.ckey]) (JMP)") + visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") + src.throw_at(get_edge_target_turf(src,dir),1,momentum) - // Begin BS12 momentum-transfer code. + if(!W || !src) return - if(speed >= 15) - var/obj/item/weapon/W = O - var/momentum = speed/2 - var/dir = get_dir(M,src) //TODO: store the location of the thrower and move this out of the fingerprintslast block + if(istype(W.loc,/mob/living) && W.sharp) //Projectile is embedded and suitable for pinning. - visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") - src.throw_at(get_edge_target_turf(src,dir),1,momentum) + if(!istype(src,/mob/living/carbon/human)) //Handles embedding for non-humans and simple_animals. + O.loc = src + src.embedded += O - if(!W || !src) return + var/turf/T = near_wall(dir,2) - if(istype(W.loc,/mob/living) && W.sharp) //Projectile is embedded and suitable for pinning. - - if(!istype(src,/mob/living/carbon/human)) //Handles embedding for non-humans and simple_animals. - O.loc = src - src.embedded += O - - var/turf/T = near_wall(dir,2) - - if(T) - src.loc = T - visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!") - src.anchored = 1 - src.pinned += O + if(T) + src.loc = T + visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!") + src.anchored = 1 + src.pinned += O //This is called when the mob is thrown into a dense turf /mob/living/proc/turf_collision(var/turf/T, var/speed) From 852215834a2f05847589bbc0cd4e329a087bf9d7 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 01:55:24 -0400 Subject: [PATCH 44/48] Bad indentation causing robot modules to embed --- code/modules/mob/living/carbon/human/human_damage.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 81a756845b..62ac94e2f7 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -309,7 +309,7 @@ This function restores all organs. //Sharp objects will always embed if they do enough damage. if((sharp && damage > (10*W.w_class)) || (sharp && !ismob(W.loc)) || (damage > embed_threshold && prob(embed_chance))) organ.embed(W) - else if( (damage > (5*W.w_class)) && ((!ismob(W.loc) && !sharp)) || (prob((damage - 2)/W.w_class) ) ) - organ.embed(W) + else if( (damage > (5*W.w_class)) && ((!ismob(W.loc) && !sharp)) || (prob((damage - 2)/W.w_class) ) ) + organ.embed(W) return 1 From dbf507062e7243bf616da075f7b22b7afd037552 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 02:21:05 -0400 Subject: [PATCH 45/48] Moves human specific hitby code to human_defense --- .../mob/living/carbon/human/human_defense.dm | 71 +++++++++++++++++++ code/modules/mob/living/living_defense.dm | 40 ++++------- 2 files changed, 84 insertions(+), 27 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 0f091a5654..6a96557162 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -282,6 +282,77 @@ emp_act bloody_body(src) return 1 +//this proc handles being hit by a thrown atom +/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5) + if(istype(AM,/obj/)) + var/obj/O = AM + var/dtype = BRUTE + if(istype(O,/obj/item/weapon)) + var/obj/item/weapon/W = O + dtype = W.damtype + var/throw_damage = O.throwforce*(speed/5) + + var/zone + if (istype(O.thrower, /mob/living)) + var/mob/living/L = O.thrower + zone = check_zone(L.zone_sel.selecting) + else + zone = ran_zone("chest",75) //Hits a random part of the body, geared towards the chest + + //check if we hit + if (O.throw_source) + var/distance = get_dist(O.throw_source, loc) + zone = get_zone_with_miss_chance(zone, src, min(15*(distance-2), 0)) + else + zone = get_zone_with_miss_chance(zone, src, 15) + + if(!zone) + visible_message("\blue \The [O] misses [src] narrowly!") + return + + O.throwing = 0 //it hit, so stop moving + + if ((O.thrower != src) && check_shields(throw_damage, "[O]")) + return + + var/datum/organ/external/affecting = get_organ(zone) + var/hit_area = affecting.display_name + + src.visible_message("\red [src] has been hit in the [hit_area] by [O].") + var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here + + if(armor < 2) + apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) + + if(ismob(O.thrower)) + var/mob/M = O.thrower + var/client/assailant = M.client + if(assailant) + src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [M.name] ([assailant.ckey])") + M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") + if(!istype(src,/mob/living/simple_animal/mouse)) + msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)") + + // Begin BS12 momentum-transfer code. + if(O.throw_source && speed >= 15) + var/obj/item/weapon/W = O + var/momentum = speed/2 + var/dir = get_dir(O.throw_source, src) + + visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") + src.throw_at(get_edge_target_turf(src,dir),1,momentum) + + if(!W || !src) return + + if(W.loc == src && W.sharp) //Projectile is embedded and suitable for pinning. + var/turf/T = near_wall(dir,2) + + if(T) + src.loc = T + visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!") + src.anchored = 1 + src.pinned += O + /mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) if (gloves) gloves.add_blood(source) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 9779e7bb63..8b9bfccb87 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -75,36 +75,23 @@ dtype = W.damtype var/throw_damage = O.throwforce*(speed/5) - var/zone - if (istype(O.thrower, /mob/living)) - var/mob/living/L = O.thrower - zone = check_zone(L.zone_sel.selecting) - else - zone = ran_zone("chest",75) //Hits a random part of the body, geared towards the chest - + var/miss_chance = 15 if (O.throw_source) var/distance = get_dist(O.throw_source, loc) - zone = get_zone_with_miss_chance(zone, src, min(15*(distance-2), 0)) - else - zone = get_zone_with_miss_chance(zone, src, 15) - - if(!zone) + miss_chance = min(15*(distance-2), 0) + + if (prob(miss_chance)) visible_message("\blue \The [O] misses [src] narrowly!") return - O.throwing = 0 //it hit, so stop moving - - if (istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - if (H.check_shields(throw_damage, "[O]")) - return - src.visible_message("\red [src] has been hit by [O].") - var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened the hit to your [zone].") + var/armor = run_armor_check(null, "melee") if(armor < 2) - apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) + apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O) + O.throwing = 0 //it hit, so stop moving + if(ismob(O.thrower)) var/mob/M = O.thrower var/client/assailant = M.client @@ -124,12 +111,11 @@ src.throw_at(get_edge_target_turf(src,dir),1,momentum) if(!W || !src) return - - if(istype(W.loc,/mob/living) && W.sharp) //Projectile is embedded and suitable for pinning. - - if(!istype(src,/mob/living/carbon/human)) //Handles embedding for non-humans and simple_animals. - O.loc = src - src.embedded += O + + if(W.sharp) //Projectile is suitable for pinning. + //Handles embedding for non-humans and simple_animals. + O.loc = src + src.embedded += O var/turf/T = near_wall(dir,2) From 08f45dc1cf982a553bf0433fb9318fd442ed798f Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 02:21:25 -0400 Subject: [PATCH 46/48] Thrown sharp objects no longer always embed --- code/modules/mob/living/carbon/human/human_damage.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 62ac94e2f7..570e141c65 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -307,9 +307,8 @@ This function restores all organs. var/embed_threshold = sharp? 5*W.w_class : 15*W.w_class //Sharp objects will always embed if they do enough damage. - if((sharp && damage > (10*W.w_class)) || (sharp && !ismob(W.loc)) || (damage > embed_threshold && prob(embed_chance))) - organ.embed(W) - else if( (damage > (5*W.w_class)) && ((!ismob(W.loc) && !sharp)) || (prob((damage - 2)/W.w_class) ) ) + //Thrown objects have some momentum already and have a small chance to embed even if the damage is below the threshold + if((sharp && damage > (10*W.w_class)) || (sharp && !ismob(W.loc) && prob(damage/(10*W.w_class)*100)) || (damage > embed_threshold && prob(embed_chance))) organ.embed(W) return 1 From 005c6589c27069e7903aa911d0e44b0de00f306e Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 15:30:10 -0400 Subject: [PATCH 47/48] Limits hearing sounds in a vacuum --- code/game/sound.dm | 17 +++++++++++++++-- code/modules/mob/living/say.dm | 3 +-- code/setup.dm | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index 0fe756eca5..84abfeeae4 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -25,10 +25,23 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur var/mob/M = P if(!M || !M.client) continue - if(get_dist(M, turf_source) <= (world.view + extrarange) * 3) + + var/distance = get_dist(M, turf_source) + if(distance <= (world.view + extrarange) * 3) var/turf/T = get_turf(M) + if(T && T.z == turf_source.z) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff) + //check that the air can transmit sound + var/datum/gas_mixture/environment = T.return_air() + if (!environment || environment.return_pressure() < SOUND_MINIMUM_PRESSURE) + if (distance > 1) + continue + + var/new_frequency = 32000 + (frequency - 32000)*0.75 //lower the frequency a bit. very rudimentary + var/new_volume = vol*0.5 //muffle the sound, like we're hearing through contact + M.playsound_local(turf_source, soundin, new_volume, vary, new_frequency, falloff) + else + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff) var/const/FALLOFF_SOUNDS = 2 var/const/SURROUND_CAP = 255 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 4fd99b4293..3344a9e210 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -1,4 +1,3 @@ -#define SAY_MINIMUM_PRESSURE 10 var/list/department_radio_keys = list( ":r" = "right ear", "#r" = "right ear", ".r" = "right ear", ":l" = "left ear", "#l" = "left ear", ".l" = "left ear", @@ -112,7 +111,7 @@ var/list/department_radio_keys = list( var/datum/gas_mixture/environment = T.return_air() if(environment) var/pressure = environment.return_pressure() - if(pressure < SAY_MINIMUM_PRESSURE) + if(pressure < SOUND_MINIMUM_PRESSURE) italics = 1 message_range = 1 diff --git a/code/setup.dm b/code/setup.dm index 55c1510234..e337d651f2 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -27,6 +27,8 @@ #define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16 //Amount of air needed before pass out/suffocation commences +#define SOUND_MINIMUM_PRESSURE 10 + // Pressure limits. #define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) #define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) From 90f7029f4efdafedfe24e0c7ea741ed6677167c8 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 15 Jul 2014 16:26:05 -0400 Subject: [PATCH 48/48] Adjusts the volume change in space Did some playtesting with energy guns and revolvers in space. --- code/game/sound.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index 84abfeeae4..3f89ea4d18 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -37,8 +37,8 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur if (distance > 1) continue - var/new_frequency = 32000 + (frequency - 32000)*0.75 //lower the frequency a bit. very rudimentary - var/new_volume = vol*0.5 //muffle the sound, like we're hearing through contact + var/new_frequency = 32000 + (frequency - 32000)*0.125 //lower the frequency. very rudimentary + var/new_volume = vol*0.15 //muffle the sound, like we're hearing through contact M.playsound_local(turf_source, soundin, new_volume, vary, new_frequency, falloff) else M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff)