Merge branch 'master' of https://github.com/tgstation/-tg-station into qdel_r

Conflicts:
	code/game/gamemodes/changeling/changeling_mutations.dm
	code/game/gamemodes/changeling/changeling_powers.dm
	code/game/gamemodes/malfunction/Malf_Modules.dm
	code/game/objects/items/weapons/tanks/watertank.dm
	code/game/objects/structures/tables_racks.dm
	code/modules/research/server.dm
This commit is contained in:
MrPerson
2014-03-21 03:05:39 -07:00
207 changed files with 2989 additions and 2670 deletions
File diff suppressed because it is too large Load Diff
+44 -45
View File
@@ -5020,7 +5020,7 @@
"bSB" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/structure/closet/secure_closet/security/engine,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/engineering)
"bSC" = (/obj/structure/filingcabinet,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint/engineering)
"bSD" = (/obj/structure/closet/fireaxecabinet{pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/atmos)
"bSE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos)
"bSE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/item/weapon/watertank/atmos,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos)
"bSF" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/atmos)
"bSG" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/atmos)
"bSH" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos)
@@ -5384,12 +5384,12 @@
"bZB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"bZC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
"bZD" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/aft)
"bZE" = (/obj/structure/bookcase/manuals/engineering,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZG" = (/obj/machinery/light{dir = 1},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZH" = (/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZJ" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "CE Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZE" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZG" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/pill/kelotane{pixel_x = -3; pixel_y = -8},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZI" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZJ" = (/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/structure/table/reinforced,/obj/machinery/light_switch{pixel_x = 27},/obj/item/weapon/cartridge/atmos,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"bZK" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/engine/engineering)
"bZL" = (/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/turf/simulated/floor,/area/engine/engineering)
"bZM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/engine/engineering)
@@ -5426,11 +5426,11 @@
"car" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cas" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/engineering)
"cat" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cau" = (/obj/machinery/computer/atmos_alert,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 3; name = "Chief Engineer RC"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cav" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"caw" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cay" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/elite,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cau" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cav" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"caw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cax" = (/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cay" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"caz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"caA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering)
"caB" = (/turf/simulated/floor,/area/engine/engineering)
@@ -5471,11 +5471,11 @@
"cbk" = (/obj/machinery/computer/station_alert,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/engine/engineering)
"cbl" = (/obj/machinery/computer/monitor,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor,/area/engine/engineering)
"cbm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cbn" = (/obj/machinery/computer/station_alert,/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -24; pixel_y = -10; req_access_txt = "10"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = -24; pixel_y = 0; req_access_txt = "11"},/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = -24; pixel_y = 10; req_access_txt = "24"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbo" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chief Engineer"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbp" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/paper/monitorkey,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbr" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbn" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "CE Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbo" = (/obj/machinery/light{dir = 1},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbp" = (/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbq" = (/obj/structure/bookcase/manuals/engineering,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/chiefs_office)
"cbt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/engine/engineering)
"cbu" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/engine/engineering)
@@ -5505,10 +5505,10 @@
"cbS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/engineering)
"cbT" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering)
"cbU" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cbV" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbX" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbY" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/pill/kelotane{pixel_x = -3; pixel_y = -8},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbV" = (/obj/machinery/computer/station_alert,/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -24; pixel_y = -10; req_access_txt = "10"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = -24; pixel_y = 0; req_access_txt = "11"},/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = -24; pixel_y = 10; req_access_txt = "24"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbW" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbX" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chief Engineer"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbY" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/paper/monitorkey,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cbZ" = (/obj/machinery/door/poddoor/preopen{id = "Engineering"; name = "engineering security door"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"cca" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos)
"ccb" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos)
@@ -5524,10 +5524,10 @@
"ccl" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering)
"ccm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering)
"ccn" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cco" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccp" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccr" = (/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/structure/table/reinforced,/obj/machinery/light_switch{pixel_x = 27},/obj/item/weapon/cartridge/atmos,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cco" = (/obj/machinery/computer/atmos_alert,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 3; name = "Chief Engineer RC"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccq" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccs" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engine/engineering)
"cct" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
"ccu" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "n2_in"; on = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
@@ -5554,7 +5554,7 @@
"ccP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"ccQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"ccR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"ccS" = (/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccS" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/elite,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ccT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"ccU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"ccV" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering)
@@ -7556,7 +7556,7 @@
"cPp" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cPq" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cPr" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cPs" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cPs" = (/obj/machinery/sleeper{dir = 4; icon_state = "sleeper-open"; initial_bin_rating = 0.5},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cPt" = (/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned)
"cPu" = (/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned)
"cPv" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned)
@@ -7573,7 +7573,7 @@
"cPG" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cPH" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/space,/area/mine/abandoned)
"cPI" = (/obj/structure/lattice,/turf/space,/area/mine/abandoned)
"cPJ" = (/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cPJ" = (/obj/structure/sink{pixel_y = 24},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cPK" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned)
"cPL" = (/obj/structure/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned)
"cPM" = (/obj/machinery/door/airlock,/turf/simulated/floor/airless,/area/mine/abandoned)
@@ -7699,7 +7699,7 @@
"cSc" = (/turf/simulated/wall/r_wall,/area/mine/laborcamp)
"cSd" = (/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/mine/abandoned)
"cSe" = (/obj/structure/girder,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/abandoned)
"cSf" = (/obj/machinery/sleep_console{icon_state = "console"; dir = 4},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSf" = (/obj/machinery/camera{c_tag = "Labor Camp Medical"; dir = 2; network = list("Labor"); pixel_x = 16},/obj/machinery/sleeper{dir = 8; icon_state = "sleeper-open"; initial_bin_rating = 0.5},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSg" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored)
"cSh" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/north_outpost)
"cSi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/turf/simulated/floor{icon_state = "warning"},/area/mine/north_outpost)
@@ -7714,10 +7714,10 @@
"cSr" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored)
"cSs" = (/obj/machinery/door/airlock/external{name = "Mining North Outpost Airlock"; req_access_txt = "54"},/turf/simulated/floor/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost)
"cSt" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/explored)
"cSu" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSu" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/suit/xenos,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cSv" = (/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSw" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "54"},/turf/simulated/floor/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost)
"cSx" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/obj/machinery/camera{c_tag = "Labor Camp Medical"; dir = 8; network = list("Labor")},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSx" = (/obj/item/clothing/head/xenos,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cSy" = (/turf/simulated/wall,/area/mine/laborcamp)
"cSz" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"cSA" = (/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
@@ -7730,7 +7730,7 @@
"cSH" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/north_outpost)
"cSI" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored)
"cSJ" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored)
"cSK" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSK" = (/obj/machinery/sleeper{dir = 4; icon_state = "sleeper-open"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters)
"cSL" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSM" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Storage"; location = "Sleeper"},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSN" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
@@ -8095,14 +8095,13 @@
"cZI" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/mine/west_outpost)
"cZJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/mine/west_outpost)
"cZK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/item/weapon/storage/box/lights/bulbs,/turf/simulated/floor/plating,/area/mine/west_outpost)
"cZL" = (/obj/machinery/sleep_console{icon_state = "console"; dir = 8},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters)
"cZL" = (/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters)
"cZM" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8},/turf/simulated/floor,/area/mine/living_quarters)
"cZN" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters)
"cZO" = (/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/floor,/area/mine/living_quarters)
"cZP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters)
"cZQ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1},/turf/simulated/floor,/area/mine/living_quarters)
"cZR" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor,/area/mine/living_quarters)
"cZS" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters)
"cZT" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/mine/living_quarters)
"cZU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/living_quarters)
"cZV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/living_quarters)
@@ -8442,12 +8441,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaabWwbXgbWyaaabWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaaaaaaaafaaaaaabwJbwJbwJbXhbXibXjbQxbRubXkbXlbRubXmbXnbRubSrbXobXpbXqbXqbXrbXsbXtbXubXvbXwbXxbXybXzbXAbXBbUtbUtbUubXCbGJbXDbIVbIYbOsbJcbXEbXFbXGbXHbIabXIbXJbQSbMtbKcbXKbWibWibJeaafaaaaaaaaaaaaaafaaaaaabwRbXLbXMbXNbXNbXNbXNbXNbXNbXObGbbXPbXQbXRbXRbXRbXRbXRbXRbXSbXTbXTbXTbXTbXTbXTbXTbXUbUbaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaaaaaaaaabXVaaaaafaafaaaaaaaaaaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwbXgbWyaaabWwbXgbWyaafbWwbXgbWyaafaafaaaaaaaaaaaaaaaaaaaafaaaaaabXWbXXbXWbzebzebQwbQxbRubXYbXZbYabYbbYcbRubYdbYebYfbYgbYhbQybYibYjbYkbYlbYmbYnbYobYpbYqbYrbYsbYtbYubYvbGJbYwbLebYxbYybIVbIVbIVbJbbPHbYybPNbRRbLiaafbJebJebJebJebJeaafaafaafaafaafaafaafaafbwRbYzbYAbYAbYBbYCbYDbYAbYAbYEbGbbYFbYGbYHbYIbYJbYJbYGbYGbYGbYGbYKbYGbYGbYLbYMbYNbYObYPaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaaaaafaafaafaafaafaafaaaaafaaaaafbwJbwJbwJbzebzebQwbQxbQxbQxbQxbQxbQxbQxbQxbQybQybQybQybQybQybwJbYSbwJbYTbYUbYUbYUbYVbYWbYXbYUbYYbYZbZabZbbZcbZdbMpbZebZfbZgbZfbZebZhbZebZibOsbZjaafaafaafaafaafaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabZkbUHbZkaaaaaaaafbGbbZlbZmbZnbZnbZobakbZmbZnbZnbZobakbZmbZnbZnbZobakbakbakaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaafaafbZvbZwbZwbZwbZwbZxbzebzebQwbwJbZybZzbZAbZAbZAbZAbZAbZAbZAbZAbZAbZBbZBbZAbZCbZDbYTbZEbZFbZGbZHbZIbZJbYUbZKbZLbZMbGJbZNbZObZPbSJbZRbZSbZTbWfbIVbZVbZWbSIbIXaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabZYbYCbZYaaaaaaaafbZZcaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaaacabcabcabcabcabaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcacaafaafaafcacaafaaaaafcacaafaaaaafaaaaaaaaaaaacadcaecafcagcahcaicajcakcalcalcambwJcancaocapcapcapcapcapcapcapcapcapcapcapcapcaqcarcascatcaucavcawcaxcaycazcaAcaBcaCcaDcaEcaFcaGcaHcaGcaFcaGcaHcaGcaIcaGcaIcaJaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaKcaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaafaafaaabYRaaaaafaaaaafaaaaafaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafcaLcaMcaMcaNcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaPcaMcaMcaMcaMcaQcaRcaQcaScaTcaUcaVbzebzebzecaWcaXcaYcaZcapcbacbacbbcapcbccbdcbecbfcbgcbhcbicbjcbkcblcbmcbncbocbpcbqcbrcbscbtcbucbvcapaafcbwaafcbxaafcbwaafcbxaafcbyaafcbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcbzaafaaaaafcbzaafaaaaafcbzaafaaaaaaaaaaaaaaaaaacadcaecbAcbBcbCcbDbZwcbEbzebzebzebzebzfcbFcapcbGcbHcbIcbJcbKcbLcbMcbNcbOcbPcbQcbRcbScbTcbUcbVcbWcbXcbqcbYbYUcbZcbZcbZcapbJeccabLjccabJeccabLjccabJeccbbLjcccbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccdaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaafaafccfbZwbZwbZwbZwbwJbwJbwJbwJbzeccgbNjcapcchcbIcbIcbJcciccjcckcckcckccjccjcclcaBccmccnccoccpccpccqccrbYUccsbZLcctcapbJeccuccvccwbJeccxccycczbJeccAccBccCbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaafcabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWwccebWyaafbWwccebWyaaabWwccebWyaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaafaafbwJccDbzebzebzebzebNjcapccEccEccFcapccGccHccIccJccJcaBccKccLccMccNccOccPccQccRccSccTccUccVccWccXcapbJeccYccZccYbJecdacdbcdabJecdccddcdebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXfaaaaafaaaaafaaaaafaaacdfaaaaafaaaaafaafaafaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaafaafbZvbZwbZwbZwbZwbZxbzebzebQwbwJbZybZzbZAbZAbZAbZAbZAbZAbZAbZAbZAbZBbZBbZAbZCbZDbYTcbqcbrcbocbpcaycbnbYUbZKbZLbZMbGJbZNbZObZPbSJbZRbZSbZTbWfbIVbZVbZWbSIbIXaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabZYbYCbZYaaaaaaaafbZZcaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaaacabcabcabcabcabaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcacaafaafaafcacaafaaaaafcacaafaaaaafaaaaaaaaaaaacadcaecafcagcahcaicajcakcalcalcambwJcancaocapcapcapcapcapcapcapcapcapcapcapcapcaqcarcascatccoccpccqccrccScazcaAcaBcaCcaDcaEcaFcaGcaHcaGcaFcaGcaHcaGcaIcaGcaIcaJaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaKcaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaafaafaaabYRaaaaafaaaaafaaaaafaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafcaLcaMcaMcaNcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaPcaMcaMcaMcaMcaQcaRcaQcaScaTcaUcaVbzebzebzecaWcaXcaYcaZcapcbacbacbbcapcbccbdcbecbfcbgcbhcbicbjcbkcblcbmcbVcbXcbYbZHcbWcbscbtcbucbvcapaafcbwaafcbxaafcbwaafcbxaafcbyaafcbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcbzaafaaaaafcbzaafaaaaafcbzaafaaaaaaaaaaaaaaaaaacadcaecbAcbBcbCcbDbZwcbEbzebzebzebzebzfcbFcapcbGcbHcbIcbJcbKcbLcbMcbNcbOcbPcbQcbRcbScbTcbUbZIbZFbZEbZHbZGbYUcbZcbZcbZcapbJeccabLjccabJeccabLjccabJeccbbLjcccbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccdaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaafaafccfbZwbZwbZwbZwbwJbwJbwJbwJbzeccgbNjcapcchcbIcbIcbJcciccjcckcckcckccjccjcclcaBccmccncawcavcavcaubZJbYUccsbZLcctcapbJeccuccvccwbJeccxccycczbJeccAccBccCbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaafcabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWwccebWyaafbWwccebWyaaabWwccebWyaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaafaafbwJccDbzebzebzebzebNjcapccEccEccFcapccGccHccIccJccJcaBccKccLccMccNccOccPccQccRcaxccTccUccVccWccXcapbJeccYccZccYbJecdacdbcdabJecdccddcdebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXfaaaaafaaaaafaaaaafaaacdfaaaaafaaaaafaafaafaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwJcdgbzebzebzebzebNjcapccEccEccFcapcdhcdicdjcdkcdlcdmcdncbjcdmcdocdpcdqcdrcdscdtcducdvcdscaBcdwcapbJeccYcdxccYbJecdacdycdabJecdecdzcdebJeaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbVFaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwccebWyaaabWwccebWyaafbWwccebWyaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaabwJbzebzecapcdAcapcdBcapccEccFccFcapcdCcdDcdEcdFccJcducdGcdHcdGcdIcdJcdKcdLcdLcdMcdLcdLcdLcdNcdOcapbJebJebJebJebJebJebJebJebJebJebJebJebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaabXeaafbZpbZqbZqbZqbZqcdPcdQcdPbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagxaafbWwcdRbWyaaabWwcdRbWyaaabWwcdRbWyaafafRaafaafaafaafaafaafaafaafaafaafaafbwJbzecdScapcdTcapcdUcapcapcapcapcapcdVcaBcdWcdXcdXcbQcbQcbQcdYcdZcdNcaBcaBcaBcaBceacaBcaBcdtcebcapaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabVFaaacabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9360,9 +9359,9 @@ cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcO
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcTHcPbcPccPdcOWcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPecPfcPgcOWcPhcPicOWcOWcOWcOWcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcUhcPkcONcPlcPmcPncOFcORcPocOWcPpcPqcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPrcPscPkcORcPtcPucPvcPwcPocPhcPqcPxcPpcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPrcSucPkcORcPtcPucPvcPwcPocPhcPqcPxcPpcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcXWcPrcPzcPrcONcONcPAcPBcPtcOWcPCcPDcOWcPqcPEcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPFcPGcONcPHcPIcPJcPKcPLcPucPMcPAcOPcOWcOWcOWcOWcOWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOEcOEcOEcOEcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPNcPNcPOcPNcPNcPNcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPFcPGcONcPHcPIcSxcPKcPLcPucPMcPAcOPcOWcOWcOWcOWcOWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOEcOEcOEcOEcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPNcPNcPOcPNcPNcPNcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPPcPQcPRcONcPIcPqcORcPScPtcOIcOWcPLcPTcOWcPUcPVcPtcPWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOZcOZcPNcPXcPYcPZcQacPNcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcOZcOEcOEcOWcPncPdcQbcPpcPRcQccQdcPucPUcOFcPucQecOWcPUcPCcPVcPWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcRjcRjcRjcRjcRjcOTcOTcOEcOEcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOZcOZcOZcPNcQfcQgcQhcQicPNcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOWcOWcOWcOWcOWcOWcPmcPtcQjcPdcPtcPLcQkcPUcPUcPwcPVcPCcOWcPUcORcPCcPWcOWcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcRjcQlcQlcQlcQlcRjcRjcRjcOTcOTcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOZcPNcPNcPNcPNcPNcQmcQncPNcPNcPNcPNcPNcPNcPNcPNcPNcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
@@ -9375,8 +9374,8 @@ cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcR
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcSncSncRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOWcRocOWcPCcPtcOPcPVcPRcPCcPvcOWcRocOWcOWcPUcOIcRIcRQcRRcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRScRTcRUcRVcRVcRVcRVcRVcRVcTpcRScRTcQlcQlcRXcRYcRZcPNcSacQDcSbcPNcRicQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccSccSccSccSccSccSncSncSncSncSncSncRjcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOWcRocOWcOWcOWcOWcOWcOWcOWcOWcOWcRocOWcPUcOIcSdcOIcRJcSecRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcSwcSgcSgcSgcSgcSgcSgcSgcSgcSwcQlcQlcQlcShcShcShcPNcSicSjcSkcPNcRicQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccSccSccSccSccScdcVdcVdcVdcWcSccSncSncSncSncSncSncSncSncSncRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOWcRocRocRocRocSpcRocRocRocRocRocRocOWcPUcSdcSdcSdcPWcOWcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRScRTcSHcSrcSrcSrcSrcSrcSrcSrcRScRTcQlcQlcQlcQlcQlcPNcRNcSscRNcPNcStcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccSucSvcSfcSxcSycSzcSAcSAcSAcSccRacRacRacRacSBcSncSncSncSncSncSncRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcRBcSCcSDcOWcOWcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcQlcQlcQlcQlcQlcQlcSEcSFcSGcSqcSIcSJcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOUcOUcOUcOUcOUcOUcOUcSccSKcSLcSMcSNcSydcUcSAcSPcSQcSRcSScSTcSTcRacSBcSUcSncSncSncSncSncSncSncRjcRjcRjcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcRKcOWcRIcRIcSdcOWcRKcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcQlcSEcSVcSGcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccPscPJcPJcSfcSycSzcSAcSAcSAcSccRacRacRacRacSBcSncSncSncSncSncSncRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcRBcSCcSDcOWcOWcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcQlcQlcQlcQlcQlcQlcSEcSFcSGcSqcSIcSJcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOUcOUcOUcOUcOUcOUcOUcSccSvcSLcSMcSNcSydcUcSAcSPcSQcSRcSScSTcSTcRacSBcSUcSncSncSncSncSncSncSncRjcRjcRjcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcRKcOWcRIcRIcSdcOWcRKcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcQlcSEcSVcSGcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOUcOUcOUcOUcOUcSccSccSccSycSWcSXcSWcSycSYcSZcSycSycSccSccSccTacTbcTccSncSncSncSncSncSncSncSncSncRjcRjcRjcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcRKcOWcTdcTecTdcOWcRKcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcTfcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcPacOZcOZcOZcOZcOZcSccTgcThcSycTicSAcSzcTjdcTcSAdcScSycTmcTmcTmcSBcSTcSTcSncSncSncSncSncSncSncSncSncRjcRjcRjcRjcRjcOUcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcOWcTncSCcTocOWcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcTfcQlcQlcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcTqcTqcTqcTqcTqcSccTrcTscTtcTucTvcTwcSAcTicSAcSAcTycTmcTmcSTcSTcSTcSTcSOcSncSncSncSncSncSncSncSncSncRjcRjcRjcRjcOUcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcRKcTzcTAcTBcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOTcOTcOTcRjcRjcRjcRjcRjcQlcQlcRbcRbcRjcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcTfcQlcQlcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
@@ -9486,7 +9485,7 @@ cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcO
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOUcOTcOTcOTcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcQlcQlcWFcZHcZIcZJcZKcWFcVucVxcWxcQlcQlcQlcQlcQlcQlcQlcQlcQlcTTcUTcUTcTUcQlcQlcQlcQlcRjcOTcOTcOTcOTcOTcOTcOTcOTcOTcOTcRjcQlcQlcVvcUTcVwcQlcQlcQlcQlcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcTfcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcWgcXBcZMcZNcZOcZOcZNcZPcZQcZRcZOcZOcZNcZNcZTcZUcZVcZWcZXcZXcZXcZXcZXcZXcZXcZXcZYcZYcZYcZYcZYcZYcZZdaadabdacdaddaedafdagdahcXTcXTcXTcXTcXTcXTcXTcXTcVAcVEcVJcVEcVLcRbcRjcRjcRjcRjcRjcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOUcOTcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcQlcWFdakdaldamdancWFcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcQlcQlcQlcQlcQlcTfcQlcQlcQlcQlcQlcRjcOTcOTcOTcOTcOTcRjcRjcRjcRjcRjcQlcVvcVwcQlcQlcQlcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcQlcTfcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcWgcWgdaodapdaocWgcWgdaqdardascWgcWgdaocVSdaocWgdaucQlcQlcQlcOUcOUcOUcOUcOZcOUcOUcOUcOZcOUcOUcOUcOUcOUcOZcOUdavcXVcYodawdaxdaydazdaAdaAdaBcXTcURcTQdaEcWncWncWncWncVLcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcWFcWFcWFcWFcWFcWFcQlcQlcRjcRjcRjcRjcRjcOTcOTcRjcRjcQlcQlcQlcQlcTfcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcTfcQlcQlcRjcRjcRjcOTcOTcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcTfcQlcQlcQlcVrcSJcQlcQlcQlcQlcQlcQlcQlcRjcWgdaGdaHdaIdaHcWgdaJdaKdaLdaMdaNcWgdaOcYNdaQcZqcQlcQlcQlcQlcQlcQlcOUcOUcOZcOUcOUcOUcOZcOZcOZcOZcOZcOZcOZcOZcOZcXTdaRdaScZzcXTcXTcXTcXTdaTcXTdaTcXTcXTcWwcVLcVLcVLcVLcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOTcOTcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcTTcUTcUTcUTcTUcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcTfcQlcRjcRjcOTcOTcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcQlcQlcTTcUTcUTcUTcVCcVDcUTcUTcUTcTUcQlcQlcQlcQlcWgcZScZLdaYdaZcWgdbadaNdaNdbbdbccWgdbddaidbfcWgcQlcQlcQlcQlcQlcQlcOZcOZcOZcOZcOZcOZcOZdbgdbgdbgdbgdbgcOZcOUcOUcXTdbhdbicZzdcrdcncUQdaAdaAdbmdaAdaBcXTcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOTcOTcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcTTcUTcUTcUTcTUcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcTfcQlcRjcRjcOTcOTcOTcOTcOTcOTcOTcRjcRjcQlcQlcQlcQlcQlcTTcUTcUTcUTcVCcVDcUTcUTcUTcTUcQlcQlcQlcQlcWgcZLcSKdaYdaZcWgdbadaNdaNdbbdbccWgdbddaidbfcWgcQlcQlcQlcQlcQlcQlcOZcOZcOZcOZcOZcOZcOZdbgdbgdbgdbgdbgcOZcOUcOUcXTdbhdbicZzdcrdcncUQdaAdaAdbmdaAdaBcXTcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcOTcOTcOTcOEcOEcOTcOTcOTcRjcRjcRjcQlcQlcQlcQlcQlcTTcTUcQlcQlcVrcSJcQlcQlcVvcUTcUTcUTcUTcUTcVwcQlcRjcOTcOTcOTcOTcOTcOTcOTcOTcOTcRjcRjcRjcQlcQlcQlcQlcQlcQlcQlcSEcSGcQlcQlcQlcTfcQlcQlcQlcQlcZqcWgcWgcWgcWgcWgdbndbodbpdbqdbccWgdaodajdaocWgcQlcQlcQlcQlcQlcQlcOUcOUcOZcOUcOUcOUcOZdbgdbgdbgdbgdbgcOZcOUcYmcXVdbsdbtdbucXTcXTcXTcXTcXTcXTdbvcYEcXTcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcRjcRjcRjcRjcQlcQlcQlcQlcRjcRjcRjcOTcOTcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcRjcRjcQlcQlcQlcQlcTTcUTcUTcVCcVDcUTcUTcVwcQlcQlcQlcQlcQlcQlcQlcRjcOTcOTcOTcOTcOTcOTcOEcOEcOTcOTcOTcRjcRjcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcTTcUTcUTcTUcQlcQlcQlcQlcQlcQlcZqcWgcWgcWgcWgcWgcZqdbxdbxcXvdatcQlcQlcQlcQlcQlcOUcOUcOUcOZcOUcOUcOUcOZdbgdbgdbgdbgdbgdbAcYUdbBdbCcYodbDcZzdaCdaCdbGdbHdbIdbJdbKdbwcXTcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcRjcRjcRjcRjcRjcRjcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcRjcRjcRjcRjcQlcQlcQlcQlcSEcSGcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcOTcOTcOTcOTcOTcOTcOEcOEcOEcOTcOTcOTcOTcOTcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcTfcQlcQlcQlcQlcQlcQlcQlcQlcSEcSFcSFcSFcSFcSFcSFcSGcQlcQlcQlcQlcQlcQlcOZcOZcOZcOZcOZcOZcOZcOZdbgdbgdbgdbgdbgdbOcYodbOcYocYodbDcZzcYocYodbPcYocYodbQdbRcUicXTcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
+2 -2
View File
@@ -1,8 +1,8 @@
#if !defined(MAP_FILE)
#include "map_files\MetaStation.v39F.dmm"
#include "map_files\MetaStation.v39G.dmm"
#define MAP_FILE "MetaStation.v39F.dmm"
#define MAP_FILE "MetaStation.v39G.dmm"
#define MAP_NAME "MetaStation"
#elif !defined(MAP_OVERRIDE)
+13
View File
@@ -0,0 +1,13 @@
###################################################################################
# This is a list of ckeys authorized to use client-side debug options: #
# Profile, Reboot, Resume, Status, and Trace-client #
# Of these, Profile is the most relevant as it allows you to easily #
# retrieve information regarding the game's processing. #
# If a ckey is on this list, and has proper admin privledges, #
# they will be able to right-click the top of the client to access these options. # #
# Case is not important for ckey. #
###################################################################################
aranclanos
cheridan
giacomand
rockdtben
@@ -10,7 +10,7 @@ obj/machinery/atmospherics/trinary/filter
can_unwrench = 1
var/on = 0
var/temp = null // -- TLE
var/temp = null
var/target_pressure = ONE_ATMOSPHERE
@@ -138,7 +138,7 @@ Filter types:
set_frequency(frequency)
return ..()
obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob)
if(..())
return
@@ -191,7 +191,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
onclose(user, "atmo_filter")
return
obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
obj/machinery/atmospherics/trinary/filter/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
@@ -24,7 +24,7 @@
//2: Do not pass internal_pressure_bound
//3: Do not pass either
var/welded = 0 // Added for aliens -- TLE
var/welded = 0
var/frequency = 1439
var/datum/radio_frequency/radio_connection
+1 -1
View File
@@ -95,7 +95,7 @@
return
if(location.excited_group)
location.excited_group.breakdown = 0
location.excited_group.reset_cooldowns()
if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
Kill()
-1
View File
@@ -287,7 +287,6 @@ atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
/datum/excited_group
var/list/turf_list = list()
var/breakdown = 0
var/breakdown_cooldown = 0
/datum/excited_group/New()
@@ -74,7 +74,6 @@
/var/const/access_cent_living = 105//Living quarters.
/var/const/access_cent_storage = 106//Generic storage areas.
/var/const/access_cent_teleporter = 107//Teleporter.
/var/const/access_cent_creed = 108//Creed's office.
/var/const/access_cent_captain = 109//Captain's office/ID comp/AI.
//The Syndicate
@@ -198,11 +197,11 @@
return list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
if("Medical Doctor")
return list(access_medical, access_morgue, access_surgery)
if("Botanist") // -- TLE
if("Botanist")
return list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
if("Librarian") // -- TLE
if("Librarian")
return list(access_library)
if("Lawyer") //Muskets 160910
if("Lawyer")
return list(access_lawyer, access_court, access_sec_doors)
if("Captain")
return get_all_accesses()
@@ -283,7 +282,7 @@
if("Research Officer")
return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage)
if("BlackOps Commander")
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed)
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage)
if("Supreme Commander")
return get_all_centcom_access()
@@ -301,7 +300,7 @@
access_keycard_auth, access_tcomsat, access_gateway)
/proc/get_all_centcom_access()
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_captain)
/proc/get_all_syndicate_access()
return list(access_syndicate)
@@ -490,8 +489,6 @@
return "Code Blue"
if(access_cent_specops)
return "Code Black"
if(access_cent_creed)
return "Code Silver"
if(access_cent_captain)
return "Code Gold"
+389 -403
View File
@@ -1,403 +1,389 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/proc/get_area(O)
var/atom/location = O
var/i
for(i=1, i<=20, i++)
if(isarea(location))
return location
else if (istype(location))
location = location.loc
else
return null
return 0
/proc/get_area_master(O)
var/area/A = get_area(O)
if(A && A.master)
A = A.master
return A
/proc/get_area_name(N) //get area by its name
for(var/area/A in world)
if(A.name == N)
return A
return 0
/proc/in_range(source, user)
if(get_dist(source, user) <= 1)
return 1
return 0 //not in range and not telekinetic
// Like view but bypasses luminosity check
/proc/hear(var/range, var/atom/source)
var/lum = source.luminosity
source.luminosity = 6
var/list/heard = view(range, source)
source.luminosity = lum
return heard
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area_master(the_area)
for(var/C in living_mob_list)
if(!istype(C, check_type))
continue
if(C == must_be_alone)
continue
if(our_area == get_area_master(C))
return 0
return 1
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
//They should approximate pythagoras theorem well enough for our needs.
#define k1 0.934
#define k2 0.427
/proc/cheap_hypotenuse(Ax,Ay,Bx,By) // T is just the second atom to check distance to center with
var/dx = abs(Ax - Bx) //sides of right-angled triangle
var/dy = abs(Ay - By)
if(dx>=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :)
else return (k2*dx) + (k1*dy)
#undef k1
#undef k2
/proc/circlerange(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
var/list/turfs = new/list()
var/rsq = radius * (radius+0.5)
for(var/atom/T in range(radius, centerturf))
var/dx = T.x - centerturf.x
var/dy = T.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
turfs += T
//turfs += centerturf
return turfs
/proc/circleview(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
var/list/atoms = new/list()
var/rsq = radius * (radius+0.5)
for(var/atom/A in view(radius, centerturf))
var/dx = A.x - centerturf.x
var/dy = A.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
atoms += A
//turfs += centerturf
return atoms
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
var/dx = Loc1.x - Loc2.x
var/dy = Loc1.y - Loc2.y
var/dist = sqrt(dx**2 + dy**2)
return dist
/proc/circlerangeturfs(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
var/list/turfs = new/list()
var/rsq = radius * (radius+0.5)
for(var/turf/T in range(radius, centerturf))
var/dx = T.x - centerturf.x
var/dy = T.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
turfs += T
return turfs
/proc/circleviewturfs(center=usr,radius=3) //Is there even a diffrence between this proc and circlerangeturfs()?
var/turf/centerturf = get_turf(center)
var/list/turfs = new/list()
var/rsq = radius * (radius+0.5)
for(var/turf/T in view(radius, centerturf))
var/dx = T.x - centerturf.x
var/dy = T.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
turfs += T
return turfs
//var/debug_mob = 0
// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy.
//No need for a recursive limit either
proc/recursive_mob_check(var/atom/O, var/client_check=1, var/sight_check=1, var/include_radio=1)
var/list/processing_list = list(O)
var/list/processed_list = list()
var/list/found_mobs = list()
if(!O.contents.len)
return found_mobs
while(processing_list.len)
var/atom/A = processing_list[1]
var/passed = 1
if(ismob(A))
var/mob/A_tmp = A
if(client_check && !A_tmp.client)
passed=0
if(A_tmp && sight_check && !isInSight(A_tmp, O))
passed=0
else if(include_radio && istype(A, /obj/item/device/radio))
if(sight_check && !isInSight(A, O))
passed=0
else passed = 0
if(passed)
if(!(A in found_mobs)) found_mobs += A
for(var/atom/B in A)
if(!(B in processed_list) && (istype(A, /obj/item/device/radio)||ismob(B)) )
processing_list += B
processing_list-=A
processed_list += A
return found_mobs
/proc/get_mobs_in_view(var/R, var/atom/source)
// Returns a list of mobs in range of R from source. Used in radio and say code.
var/turf/T = get_turf(source)
var/list/hear = list()
if(!T)
return hear
var/list/range = hear(R, T)
for(var/atom/A in range)
/*if(ismob(A))
var/mob/M = A
if(M.client)
hear += M
//world.log << "Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])"
else if(istype(A, /obj/item/device/radio))
hear += A*/
if(isobj(A) || ismob(A))
hear += recursive_mob_check(A, 1, 0, 1)
return hear
/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios)
set background = BACKGROUND_ENABLED
. = list()
// Returns a list of mobs who can hear any of the radios given in @radios
var/list/speaker_coverage = list()
for(var/i = 1; i <= radios.len; i++)
var/obj/item/device/radio/R = radios[i]
if(R)
var/turf/speaker = get_turf(R)
if(speaker)
for(var/turf/T in hear(R.canhear_range,speaker))
speaker_coverage[T] = T
// Try to find all the players who can hear the message
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
if(M)
var/turf/ear = get_turf(M)
if(ear)
if(speaker_coverage[ear])
. |= M
return .
#define SIGN(X) ((X<0)?-1:1)
proc
inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
var/turf/T
if(X1==X2)
if(Y1==Y2)
return 1 //Light cannot be blocked on same tile
else
var/s = SIGN(Y2-Y1)
Y1+=s
while(Y1!=Y2)
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
Y1+=s
else
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
var/signX = SIGN(X2-X1)
var/signY = SIGN(Y2-Y1)
if(X1<X2)
b+=m
while(X1!=X2 || Y1!=Y2)
if(round(m*X1+b-Y1))
Y1+=signY //Line exits tile vertically
else
X1+=signX //Line exits tile horizontally
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
return 1
#undef SIGN
proc/isInSight(var/atom/A, var/atom/B)
var/turf/Aturf = get_turf(A)
var/turf/Bturf = get_turf(B)
if(!Aturf || !Bturf)
return 0
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
return 1
else
return 0
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
//returns only NORTH, SOUTH, EAST, or WEST
var/dx = finish.x - start.x
var/dy = finish.y - start.y
if(abs(dy) > abs (dx)) //slope is above 1:1 (move horizontally in a tie)
if(dy > 0)
return get_step(start, SOUTH)
else
return get_step(start, NORTH)
else
if(dx > 0)
return get_step(start, WEST)
else
return get_step(start, EAST)
/proc/try_move_adjacent(atom/movable/AM)
var/turf/T = get_turf(AM)
for(var/direction in cardinal)
if(AM.Move(get_step(T, direction)))
break
/proc/get_mob_by_key(var/key)
for(var/mob/M in mob_list)
if(M.ckey == lowertext(key))
return M
return null
// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
/proc/get_candidates(be_special_flag=0, afk_bracket=3000)
var/list/candidates = list()
// Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
while(!candidates.len && afk_bracket < 6000)
for(var/mob/dead/observer/G in player_list)
if(G.client != null)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag))
candidates += G.client
afk_bracket += 600 // Add a minute to the bracket, for every attempt
return candidates
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
if(!isobj(O)) O = new /obj/screen/text()
O.maptext = maptext
O.maptext_height = maptext_height
O.maptext_width = maptext_width
O.screen_loc = screen_loc
return O
/proc/Show2Group4Delay(obj/O, list/group, delay=0)
if(!isobj(O)) return
if(!group) group = clients
for(var/client/C in group)
C.screen += O
if(delay)
spawn(delay)
for(var/client/C in group)
C.screen -= O
/proc/flick_overlay(image/I, list/show_to, duration)
for(var/client/C in show_to)
C.images += I
sleep(duration)
for(var/client/C in show_to)
C.images -= I
/proc/get_active_player_count()
// Get active players who are playing in the round
var/active_players = 0
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
if(M && M.client)
if(istype(M, /mob/new_player)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
if(O.started_as_observer) // Exclude people who started as observers
continue
active_players++
return active_players
/datum/projectile_data
var/src_x
var/src_y
var/time
var/distance
var/power_x
var/power_y
var/dest_x
var/dest_y
/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \
var/power_x, var/power_y, var/dest_x, var/dest_y)
src.src_x = src_x
src.src_y = src_y
src.time = time
src.distance = distance
src.power_x = power_x
src.power_y = power_y
src.dest_x = dest_x
src.dest_y = dest_y
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
// rotated at [rotation] and with the power of [power]
// Thanks to VistaPOWA for this function
var/power_x = power * cos(angle)
var/power_y = power * sin(angle)
var/time = 2* power_y / 10 //10 = g
var/distance = time * power_x
var/dest_x = src_x + distance*sin(rotation);
var/dest_y = src_y + distance*cos(rotation);
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/proc/get_area(O)
var/atom/location = O
var/i
for(i=1, i<=20, i++)
if(isarea(location))
return location
else if (istype(location))
location = location.loc
else
return null
return 0
/proc/get_area_master(O)
var/area/A = get_area(O)
if(A && A.master)
A = A.master
return A
/proc/get_area_name(N) //get area by its name
for(var/area/A in world)
if(A.name == N)
return A
return 0
/proc/in_range(source, user)
if(get_dist(source, user) <= 1)
return 1
return 0 //not in range and not telekinetic
// Like view but bypasses luminosity check
/proc/hear(var/range, var/atom/source)
var/lum = source.luminosity
source.luminosity = 6
var/list/heard = view(range, source)
source.luminosity = lum
return heard
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area_master(the_area)
for(var/C in living_mob_list)
if(!istype(C, check_type))
continue
if(C == must_be_alone)
continue
if(our_area == get_area_master(C))
return 0
return 1
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
//They should approximate pythagoras theorem well enough for our needs.
#define k1 0.934
#define k2 0.427
/proc/cheap_hypotenuse(Ax,Ay,Bx,By) // T is just the second atom to check distance to center with
var/dx = abs(Ax - Bx) //sides of right-angled triangle
var/dy = abs(Ay - By)
if(dx>=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :)
else return (k2*dx) + (k1*dy)
#undef k1
#undef k2
/proc/circlerange(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
var/list/turfs = new/list()
var/rsq = radius * (radius+0.5)
for(var/atom/T in range(radius, centerturf))
var/dx = T.x - centerturf.x
var/dy = T.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
turfs += T
//turfs += centerturf
return turfs
/proc/circleview(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
var/list/atoms = new/list()
var/rsq = radius * (radius+0.5)
for(var/atom/A in view(radius, centerturf))
var/dx = A.x - centerturf.x
var/dy = A.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
atoms += A
//turfs += centerturf
return atoms
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
var/dx = Loc1.x - Loc2.x
var/dy = Loc1.y - Loc2.y
var/dist = sqrt(dx**2 + dy**2)
return dist
/proc/circlerangeturfs(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
var/list/turfs = new/list()
var/rsq = radius * (radius+0.5)
for(var/turf/T in range(radius, centerturf))
var/dx = T.x - centerturf.x
var/dy = T.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
turfs += T
return turfs
/proc/circleviewturfs(center=usr,radius=3) //Is there even a diffrence between this proc and circlerangeturfs()?
var/turf/centerturf = get_turf(center)
var/list/turfs = new/list()
var/rsq = radius * (radius+0.5)
for(var/turf/T in view(radius, centerturf))
var/dx = T.x - centerturf.x
var/dy = T.y - centerturf.y
if(dx*dx + dy*dy <= rsq)
turfs += T
return turfs
//var/debug_mob = 0
// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy.
//No need for a recursive limit either
proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1)
var/list/processing_list = list(O)
var/list/processed_list = list()
var/list/found_mobs = list()
while(processing_list.len)
var/atom/A = processing_list[1]
var/passed = 0
if(ismob(A))
var/mob/A_tmp = A
passed=1
if(client_check && !A_tmp.client)
passed=0
if(sight_check && !isInSight(A_tmp, O))
passed=0
else if(include_radio && istype(A, /obj/item/device/radio))
passed=1
if(sight_check && !isInSight(A, O))
passed=0
if(passed)
found_mobs |= A
for(var/atom/B in A)
if(!(B in processed_list))
processing_list |= B
processing_list -= A
processed_list |= A
return found_mobs
proc/get_mobs_in_view(var/R, var/atom/source)
// Returns a list of mobs in range of R from source. Used in radio and say code.
var/turf/T = get_turf(source)
var/list/hear = list()
if(!T)
return hear
var/list/range = hear(R, T)
for(var/atom/movable/A in range)
hear |= recursive_mob_check(A, 1, 0, 1)
return hear
/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios)
set background = BACKGROUND_ENABLED
. = list()
// Returns a list of mobs who can hear any of the radios given in @radios
var/list/speaker_coverage = list()
for(var/i = 1; i <= radios.len; i++)
var/obj/item/device/radio/R = radios[i]
if(R)
var/turf/speaker = get_turf(R)
if(speaker)
for(var/turf/T in hear(R.canhear_range,speaker))
speaker_coverage[T] = T
// Try to find all the players who can hear the message
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
if(M)
var/turf/ear = get_turf(M)
if(ear)
if(speaker_coverage[ear])
. |= M
return .
#define SIGN(X) ((X<0)?-1:1)
proc
inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
var/turf/T
if(X1==X2)
if(Y1==Y2)
return 1 //Light cannot be blocked on same tile
else
var/s = SIGN(Y2-Y1)
Y1+=s
while(Y1!=Y2)
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
Y1+=s
else
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
var/signX = SIGN(X2-X1)
var/signY = SIGN(Y2-Y1)
if(X1<X2)
b+=m
while(X1!=X2 || Y1!=Y2)
if(round(m*X1+b-Y1))
Y1+=signY //Line exits tile vertically
else
X1+=signX //Line exits tile horizontally
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
return 1
#undef SIGN
proc/isInSight(var/atom/A, var/atom/B)
var/turf/Aturf = get_turf(A)
var/turf/Bturf = get_turf(B)
if(!Aturf || !Bturf)
return 0
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
return 1
else
return 0
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
//returns only NORTH, SOUTH, EAST, or WEST
var/dx = finish.x - start.x
var/dy = finish.y - start.y
if(abs(dy) > abs (dx)) //slope is above 1:1 (move horizontally in a tie)
if(dy > 0)
return get_step(start, SOUTH)
else
return get_step(start, NORTH)
else
if(dx > 0)
return get_step(start, WEST)
else
return get_step(start, EAST)
/proc/try_move_adjacent(atom/movable/AM)
var/turf/T = get_turf(AM)
for(var/direction in cardinal)
if(AM.Move(get_step(T, direction)))
break
/proc/get_mob_by_key(var/key)
for(var/mob/M in mob_list)
if(M.ckey == lowertext(key))
return M
return null
// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
/proc/get_candidates(be_special_flag=0, afk_bracket=3000)
var/list/candidates = list()
// Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
while(!candidates.len && afk_bracket < 6000)
for(var/mob/dead/observer/G in player_list)
if(G.client != null)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag))
candidates += G.client
afk_bracket += 600 // Add a minute to the bracket, for every attempt
return candidates
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
if(!isobj(O)) O = new /obj/screen/text()
O.maptext = maptext
O.maptext_height = maptext_height
O.maptext_width = maptext_width
O.screen_loc = screen_loc
return O
/proc/Show2Group4Delay(obj/O, list/group, delay=0)
if(!isobj(O)) return
if(!group) group = clients
for(var/client/C in group)
C.screen += O
if(delay)
spawn(delay)
for(var/client/C in group)
C.screen -= O
/proc/flick_overlay(image/I, list/show_to, duration)
for(var/client/C in show_to)
C.images += I
sleep(duration)
for(var/client/C in show_to)
C.images -= I
/proc/get_active_player_count()
// Get active players who are playing in the round
var/active_players = 0
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
if(M && M.client)
if(istype(M, /mob/new_player)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
if(O.started_as_observer) // Exclude people who started as observers
continue
active_players++
return active_players
/datum/projectile_data
var/src_x
var/src_y
var/time
var/distance
var/power_x
var/power_y
var/dest_x
var/dest_y
/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \
var/power_x, var/power_y, var/dest_x, var/dest_y)
src.src_x = src_x
src.src_y = src_y
src.time = time
src.distance = distance
src.power_x = power_x
src.power_y = power_y
src.dest_x = dest_x
src.dest_y = dest_y
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
// rotated at [rotation] and with the power of [power]
// Thanks to VistaPOWA for this function
var/power_x = power * cos(angle)
var/power_y = power * sin(angle)
var/time = 2* power_y / 10 //10 = g
var/distance = time * power_x
var/dest_x = src_x + distance*sin(rotation);
var/dest_y = src_y + distance*cos(rotation);
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
+11
View File
@@ -39,3 +39,14 @@
if(path == prototype) continue
L += new path()
return L
//returns a list of paths to every subtype of prototype (excluding prototype)
//if no list/L is provided, one is created.
/proc/init_paths(prototype, list/L)
if(!istype(L))
L = list()
for(var/path in typesof(prototype))
if(path == prototype)
continue
L+= path
return L
+1 -1
View File
@@ -656,7 +656,7 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu
noIcon = TRUE // Do not render this object.
var/curdir
if(A.dir)
if(A.dir != 2)
curdir = A.dir
else
curdir = defdir
+12 -10
View File
@@ -256,7 +256,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(R) R.fields["name"] = newname
//update our pda and id if we have them on our person
var/list/searching = GetAllContents(3)
var/list/searching = GetAllContents()
var/search_id = 1
var/search_pda = 1
@@ -330,6 +330,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
A.aiPDA.owner = newname
A.aiPDA.name = newname + " (" + A.aiPDA.ownjob + ")"
if(cmptext("cyborg",role))
if(isrobot(src))
var/mob/living/silicon/robot/A = src
A.custom_name = newname
fully_replace_character_name(oldname,newname)
@@ -596,7 +600,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
atom/proc/GetAllContents()
var/list/processing_list = list(src)
var/list/processed = list()
var/list/assembled = list()
while(processing_list.len)
@@ -604,14 +607,14 @@ atom/proc/GetAllContents()
processing_list -= A
for(var/atom/a in A)
if(!(a in processed))
processing_list += a
if(!(a in assembled))
processing_list |= a
if(!(A in assembled))
assembled += A
assembled |= A
return assembled
atom/proc/GetTypeInAllContents(typepath)
var/list/processing_list = list(src)
var/list/processed = list()
@@ -627,10 +630,9 @@ atom/proc/GetTypeInAllContents(typepath)
for(var/atom/a in A)
if(!(a in processed))
processing_list += a
processing_list |= a
if(!(A in processed))
processed += A
processed |= A
return found
@@ -1288,4 +1290,4 @@ proc/check_target_facings(mob/living/initator, mob/living/target)
if(initator.dir + 4 == target.dir || initator.dir - 4 == target.dir) //mobs are facing each other
return 2
if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st
return 3
return 3
+6 -2
View File
@@ -53,7 +53,7 @@
var/server
var/banappeals
var/wikiurl = "http://wiki.ss13.eu" // Default wiki link.
var/wikiurl = "http://www.ss13.eu/wiki" // Default wiki link.
var/forumurl
var/forbid_singulo_possession = 0
@@ -98,6 +98,8 @@
var/revival_cloning = 1
var/revival_brain_life = -1
var/rename_cyborg = 0
//Used for modifying movement speed for mobs.
//Unversal modifiers
var/run_speed = 0
@@ -277,6 +279,8 @@
config.revival_cloning = text2num(value)
if("revival_brain_life")
config.revival_brain_life = text2num(value)
if("rename_cyborg")
config.rename_cyborg = 1
if("run_delay")
config.run_speed = text2num(value)
if("walk_delay")
@@ -371,7 +375,7 @@
else
diary << "Unknown setting in configuration: '[name]'"
/datum/configuration/proc/loadsql(filename) // -- TLE
/datum/configuration/proc/loadsql(filename)
var/list/Lines = file2list(filename)
for(var/t in Lines)
if(!t) continue
+3 -3
View File
@@ -98,7 +98,7 @@ datum/shuttle_controller
for(var/SC in shuttle_caller_list)
if(istype(SC,/mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = SC
if(AI.stat && !AI.client)
if(AI.stat || !AI.client)
continue
var/turf/T = get_turf(SC)
if(T && T.z == 1)
@@ -111,8 +111,8 @@ datum/shuttle_controller
if(callshuttle)
if(!online && direction == 1) //we don't call the shuttle if it's already coming
incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1)
captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
world << sound('sound/AI/shuttlecalled.ogg')
@@ -0,0 +1,81 @@
/*
//////////////////////////////////////
DNA Saboteur
Very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity temrendously.
Fatal Level.
Bonus
Cleans the DNA of a person and then randomly gives them a disability.
//////////////////////////////////////
*/
/datum/symptom/genetic_mutation
name = "Deoxyribonucleic Acid Saboteur"
stealth = -2
resistance = -3
stage_speed = 0
transmittable = -3
level = 6
var/good_mutations = 0
var/archived_dna = null
/datum/symptom/genetic_mutation/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M << "<span class='notice'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>"
clean_randmut(M, good_mutations == 1 ? (good_se_blocks | op_se_blocks) : bad_se_blocks, 20) // Give them a random good/bad mutation.
domutcheck(M, null, 1) // Force the power to manifest
return
// Archive their DNA before they were infected.
/datum/symptom/genetic_mutation/Start(var/datum/disease/advance/A)
var/mob/living/carbon/M = A.affected_mob
if(M)
if(!check_dna_integrity(M))
return
archived_dna = M.dna.struc_enzymes
// Give them back their old DNA when cured.
/datum/symptom/genetic_mutation/End(var/datum/disease/advance/A)
var/mob/living/carbon/M = A.affected_mob
if(M && archived_dna)
if(!check_dna_integrity(M))
return
hardset_dna(M, se = archived_dna)
/*
//////////////////////////////////////
DNA Aide
Very very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity temrendously.
Fatal Level.
Bonus
Cleans the DNA of a person and then randomly gives them a power..
//////////////////////////////////////
*/
/datum/symptom/genetic_mutation/powers
name = "Deoxyribonucleic Acid Aide"
stealth = -3
resistance = -4
stage_speed = 0
transmittable = -4
level = 6
good_mutations = 1
+6 -5
View File
@@ -56,10 +56,11 @@
/datum/disease/dnaspread/Del()
if ((original_dna["name"]) && (original_dna["UI"]) && (original_dna["SE"]))
affected_mob.dna.uni_identity = original_dna["UI"]
updateappearance(affected_mob)
affected_mob.dna.struc_enzymes = original_dna["SE"]
affected_mob.real_name = original_dna["name"]
if(affected_mob)
affected_mob.dna.uni_identity = original_dna["UI"]
updateappearance(affected_mob)
affected_mob.dna.struc_enzymes = original_dna["SE"]
affected_mob.real_name = original_dna["name"]
affected_mob << "\blue You feel more like yourself."
affected_mob << "\blue You feel more like yourself."
..()
+2 -10
View File
@@ -64,14 +64,10 @@ datum/mind
error("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn")
if(current) //remove ourself from our old body's mind variable
if(changeling)
current.remove_changeling_powers()
current.verbs -= /datum/changeling/proc/EvolutionMenu
current.mind = null
nanomanager.user_transferred(current, new_character)
if(key)
if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours
new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless.
@@ -84,10 +80,6 @@ datum/mind
current = new_character //associate ourself with our new body
new_character.mind = src //and associate our new body with ourself
if(changeling && istype(new_character, /mob/living/carbon)) //if we are a changeling mind, re-add any powers
var/mob/living/carbon/C = new_character
C.make_changeling()
if(active)
new_character.key = key //now transfer the key to link the client to our new body
@@ -672,8 +664,8 @@ datum/mind
ticker.mode.changelings -= src
special_role = null
current.remove_changeling_powers()
current.verbs -= /datum/changeling/proc/EvolutionMenu
if(changeling) del(changeling)
if(changeling)
del(changeling)
current << "<FONT color='red' size = 3><B>You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!</B></FONT>"
message_admins("[key_name_admin(usr)] has de-changeling'ed [current].")
log_admin("[key_name(usr)] has de-changeling'ed [current].")
+24
View File
@@ -123,6 +123,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containertype = /obj/structure/closet/crate
containername = "firefighting crate"
/datum/supply_packs/emergency/atmostank
name = "Firefighting Watertank"
contains = list(/obj/item/weapon/watertank/atmos)
cost = 10
containertype = /obj/structure/closet/crate/secure
containername = "firefighting watertank crate"
access = access_atmospherics
/datum/supply_packs/emergency/weedcontrol
name = "Weed Control Crate"
@@ -740,6 +748,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containertype = /obj/structure/closet/crate/hydroponics
containername = "hydroponics crate"
/datum/supply_packs/misc/hydroponics/hydrotank
name = "Hydroponics Watertank Backpack Crate"
contains = list(/obj/item/weapon/watertank)
cost = 10
containertype = /obj/structure/closet/crate/secure
containername = "hydroponics watertank crate"
access = access_hydroponics
/datum/supply_packs/organic/hydroponics/seeds
name = "Seeds Crate"
@@ -961,6 +977,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containertype = /obj/structure/largecrate
containername = "janitorial cart crate"
/datum/supply_packs/misc/janitor/janitank
name = "Janitor Watertank Backpack Crate"
contains = list(/obj/item/weapon/watertank/janitor)
cost = 10
containertype = /obj/structure/closet/crate/secure
containername = "janitor watertank crate"
access = access_janitor
/datum/supply_packs/misc/janitor/lightbulbs
name = "Replacement lights"
+7 -4
View File
@@ -34,13 +34,13 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
/datum/wires/airlock/GetInteractWindow()
var/obj/machinery/door/airlock/A = holder
. += ..()
. += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]", (A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
. += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]", (A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
(A.lights ? "The door bolt lights are on." : "The door bolt lights are off!"),
((A.arePowerSystemsOn() && !(A.stat & NOPOWER)) ? "The test light is on." : "The test light is off!"),
(A.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."),
(A.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."),
(A.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."))
(A.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."),
(A.emergency==0 ? "The emergency lights are off." : "The emergency lights are on."))
/datum/wires/airlock/UpdateCut(var/index, var/mended)
@@ -123,9 +123,12 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
var/obj/machinery/door/airlock/A = holder
switch(index)
if(AIRLOCK_WIRE_IDSCAN)
//Sending a pulse through this flashes the red light on the door (if the door has power).
//Sending a pulse through this disables emergency access and flashes the red light on the door (if the door has power).
if((A.arePowerSystemsOn()) && (!(A.stat & NOPOWER)) && A.density)
A.do_animate("deny")
if(A.emergency)
A.emergency = 0
A.update_icon()
if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
A.loseMainPower()
+2 -2
View File
@@ -341,12 +341,12 @@ proc/process_ghost_teleport_locs()
//EXTRA
/area/asteroid // -- TLE
/area/asteroid
name = "\improper Asteroid"
icon_state = "asteroid"
requires_power = 0
/area/asteroid/cave // -- TLE
/area/asteroid/cave
name = "\improper Asteroid - Underground"
icon_state = "cave"
requires_power = 0
+31 -17
View File
@@ -154,33 +154,36 @@
/proc/randomize_radiation_accuracy(position_we_were_supposed_to_hit, radduration, number_of_blocks)
return Wrap(round(position_we_were_supposed_to_hit + gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration), 1), 1, number_of_blocks+1)
/proc/randmutb(mob/living/carbon/M)
if(!check_dna_integrity(M)) return
var/num
var/newdna
num = pick(bad_se_blocks)
newdna = setblock(M.dna.struc_enzymes, num, construct_block(2,2))
/proc/randmut(mob/living/carbon/M, list/candidates, difficulty = 2)
if(!check_dna_integrity(M))
return
var/num = pick(candidates)
var/newdna = setblock(M.dna.struc_enzymes, num, construct_block(difficulty,difficulty))
M.dna.struc_enzymes = newdna
return
/proc/randmutb(mob/living/carbon/M)
return randmut(M, bad_se_blocks)
/proc/randmutg(mob/living/carbon/M)
if(!check_dna_integrity(M)) return
var/num
var/newdna
num = pick(good_se_blocks | op_se_blocks)
newdna = setblock(M.dna.struc_enzymes, num, construct_block(2,2))
M.dna.struc_enzymes = newdna
return
return randmut(M, good_se_blocks | op_se_blocks)
/proc/randmuti(mob/living/carbon/M)
if(!check_dna_integrity(M)) return
var/num
var/newdna
num = rand(1, DNA_STRUC_ENZYMES_BLOCKS)
newdna = setblock(M.dna.uni_identity, num, random_string(DNA_BLOCK_SIZE, hex_characters))
var/num = rand(1, DNA_STRUC_ENZYMES_BLOCKS)
var/newdna = setblock(M.dna.uni_identity, num, random_string(DNA_BLOCK_SIZE, hex_characters))
M.dna.uni_identity = newdna
return
/proc/clean_dna(mob/living/carbon/M)
if(!check_dna_integrity(M))
return
M.dna.struc_enzymes = M.dna.generate_struc_enzymes(M) // Give clean DNA.
/proc/clean_randmut(mob/living/carbon/M, list/candidates, difficulty = 2)
clean_dna(M)
randmut(M, candidates, difficulty)
/proc/scramble_dna(mob/living/carbon/M, ui=FALSE, se=FALSE, probability)
if(!check_dna_integrity(M))
return 0
@@ -852,14 +855,17 @@
if(buffer_slot["SE"])
I = new /obj/item/weapon/dnainjector(loc)
I.fields = list("SE"=buffer_slot["SE"])
I.damage_coeff = connected.damage_coeff
if("ui")
if(buffer_slot["UI"])
I = new /obj/item/weapon/dnainjector(loc)
I.fields = list("UI"=buffer_slot["UI"])
I.damage_coeff = connected.damage_coeff
else
if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
I = new /obj/item/weapon/dnainjector(loc)
I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"])
I.damage_coeff = connected.damage_coeff
if(I)
injectorready = 0
spawn(INJECTOR_TIMEOUT)
@@ -971,3 +977,11 @@ proc/deconstruct_block(value, values, blocksize=DNA_BLOCK_SIZE)
if(value > values)
value = values
return value
/datum/dna/proc/is_same_as(var/datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
if(mutantrace == D.mutantrace && blood_type == D.blood_type)
return 1
return 0
+26 -54
View File
@@ -223,6 +223,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/chem_charges = 20
var/chem_storage = 50
var/chem_recharge_rate = 0.5
var/chem_recharge_slowdown = 0
var/sting_range = 2
var/changelingID = "Changeling"
var/geneticdamage = 0
@@ -232,7 +233,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/mimicing = ""
var/canrespec = 0
var/datum/dna/chosen_dna
var/chosen_sting
var/obj/effect/proc_holder/changeling/sting/chosen_sting
var/space_suit_active = 0
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -249,63 +251,33 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling/proc/regenerate()
chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage)
geneticdamage = max(0, geneticdamage-1)
/datum/changeling/proc/GetDNA(var/dna_owner)
var/datum/dna/chosen_dna
/datum/changeling/proc/get_dna(var/dna_owner)
for(var/datum/dna/DNA in absorbed_dna)
if(dna_owner == DNA.real_name)
chosen_dna = DNA
break
return chosen_dna
//Checks if the target DNA is valid and absorbable.
/datum/changeling/proc/can_absorb_dna(mob/living/carbon/T, mob/living/carbon/U)
if(absorbed_dna[1] == U.dna)//If our current DNA is the stalest, we gotta ditch it.
U << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
return 0
if(T)
if(NOCLONE in T.mutations || HUSK in T.mutations)
U << "<span class='warning'>DNA of [T] is ruined beyond usability!</span>"
return 0
if(!ishuman(T))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
U << "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>"
return 0
for(var/datum/dna/D in absorbed_dna)
if(T.dna.uni_identity == D.uni_identity)
if(T.dna.struc_enzymes == D.struc_enzymes)
if(T.dna.real_name == D.real_name)
if(T.dna.mutantrace == D.mutantrace)
if(T.dna.blood_type == D.blood_type)
U << "<span class='warning'>We already have that DNA in storage.</span>"
return 0
if(!check_dna_integrity(T))
U << "<span class='warning'>[T] is not compatible with our biology.</span>"
return 0
return DNA
/datum/changeling/proc/can_absorb_dna(var/mob/living/carbon/user, var/mob/living/carbon/target)
if(absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it.
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
return
if(!target)
return
if(NOCLONE in target.mutations || HUSK in target.mutations)
user << "<span class='warning'>DNA of [target] is ruined beyond usability!</span>"
return
if(!ishuman(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
user << "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>"
return
var/datum/dna/tDna = target.dna
for(var/datum/dna/D in absorbed_dna)
if(tDna.is_same_as(D))
user << "<span class='warning'>We already have that DNA in storage.</span>"
return
if(!check_dna_integrity(target))
user << "<span class='warning'>[target] is not compatible with our biology.</span>"
return
return 1
//Absorbs the target DNA.
/datum/changeling/proc/absorb_dna(mob/living/carbon/T)
shuffle_dna()
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
var/datum/dna/new_dna = new T.dna.type
new_dna.uni_identity = T.dna.uni_identity
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.mutantrace = T.dna.mutantrace
new_dna.blood_type = T.dna.blood_type
absorbed_dna |= new_dna //And add the target DNA to our absorbed list.
absorbedcount++ //all that done, let's increment the objective counter.
/datum/changeling/proc/shuffle_dna()//boots out the stalest DNA.
if(absorbed_dna.len)
absorbed_dna.Cut(1,2)
@@ -1,52 +0,0 @@
//This only contains the arm blade for now because I'm a lazy fuck. Yers truely, Miauw, resident lazy fuck.
/obj/item/weapon/melee/arm_blade
name = "arm blade"
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter"
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
w_class = 5.0
force = 25
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
/obj/item/weapon/melee/arm_blade/New()
..()
if(ismob(loc))
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
visible_message("<span class='warning'>With a sickening crunch, [user] reforms his blade into an arm!</span>", "<span class='notice'>We assimilate our blade into our body</span>", "<span class='warning>You hear organic matter ripping and tearing!</span>")
qdel(src)
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
if(istype(target, /obj/structure/table))
var/obj/structure/table/T = target
T.table_destroy(1, user)
else if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
C.attack_alien(user) //muh copypasta
else if(istype(target, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = target
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
return
if(A.arePowerSystemsOn() && !(A.stat & NOPOWER))
user << "<span class='notice'>The airlock's motors resist our efforts to force it.</span>"
return
else if(A.locked)
user << "<span class='notice'>The airlock's bolts prevent it from being forced.</span>"
return
else
//user.say("Heeeeeeeeeerrre's Johnny!")
user.visible_message("<span class='warning'>[user] forces the door to open with \his [src]!</span>", "<span class='warning'>We force the door to open.</span>", "<span class='warning'>You hear a metal screeching sound.</span>")
A.open(1)
@@ -0,0 +1,80 @@
/*
* Don't use the apostrophe in name or desc. Causes script errors.
* TODO: combine atleast some of the functionality with /proc_holder/spell
*/
/obj/effect/proc_holder/changeling
panel = "Changeling"
name = "Prototype Sting"
desc = "" // Fluff
var/helptext = "" // Details
var/chemical_cost = 0 // negative chemical cost is for passive abilities (chemical glands)
var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase, -1 = cannot be purchased
var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1
var/req_human = 0 //if you need to be human to use this ability
var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD
var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss.
var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet.
/obj/effect/proc_holder/changeling/proc/on_purchase(var/mob/user)
return
/obj/effect/proc_holder/changeling/Click()
var/mob/user = usr
if(!user || !user.mind || !user.mind.changeling)
return
try_to_sting(user)
/obj/effect/proc_holder/changeling/proc/try_to_sting(var/mob/user, var/mob/target)
if(!can_sting(user, target))
return
var/datum/changeling/c = user.mind.changeling
if(sting_action(user, target))
sting_feedback(user, target)
take_chemical_cost(c)
/obj/effect/proc_holder/changeling/proc/sting_action(var/mob/user, var/mob/target)
return 0
/obj/effect/proc_holder/changeling/proc/sting_feedback(var/mob/user, var/mob/target)
return 0
/obj/effect/proc_holder/changeling/proc/take_chemical_cost(var/datum/changeling/changeling)
changeling.chem_charges -= chemical_cost
changeling.geneticdamage += genetic_damage
//Fairly important to remember to return 1 on success >.<
/obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target)
if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards
return 0
if(req_human && !ishuman(user))
user << "<span class='warning'>We cannot do that in this form!</span>"
return 0
var/datum/changeling/c = user.mind.changeling
if(c.chem_charges<chemical_cost)
user << "<span class='warning'>We require at least [chemical_cost] unit\s of chemicals to do that!</span>"
return 0
if(c.absorbedcount<req_dna)
user << "<span class='warning'>We require at least [req_dna] sample\s of compatible DNA.</span>"
return 0
if(req_stat < user.stat)
user << "<span class='warning'>We are incapacitated.</span>"
return 0
if((user.status_flags & FAKEDEATH) && name!="Regenerate")
user << "<span class='warning'>We are incapacitated.</span>"
return 0
if(c.geneticdamage > max_genetic_damage)
user << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
return 0
return 1
//used in /mob/Stat()
/obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user)
if(!ishuman(user) && !ismonkey(user))
return 0
if(req_human && !ishuman(user))
return 0
return 1
@@ -1,728 +0,0 @@
//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
/mob/proc/make_changeling()
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
if(!ishuman(src) && !ismonkey(src)) return
verbs += /datum/changeling/proc/EvolutionMenu
var/lesser_form = !ishuman(src)
if(!powerinstances)
powerinstances = init_subtypes(/datum/power/changeling)
// Code to auto-purchase free powers.
for(var/datum/power/changeling/P in powerinstances)
if(!P.genomecost) // Is it free?
if(!(P in mind.changeling.purchasedpowers)) // Do we not have it already?
mind.changeling.purchasePower(mind, P.name, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
if(P.isVerb)
if(lesser_form && !P.allowduringlesserform) continue
verbs += P.verbpath //byond won't allow two of the same verb to be added to the verbs list. No additional checks necessary
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
mind.changeling.absorbed_dna |= C.dna
return 1
//removes our changeling verbs
/mob/proc/remove_changeling_powers()
var/mob/living/carbon/C = src
if(ishuman(C) || ismonkey(C))
C.unset_sting()
for(var/datum/power/changeling/P in powerinstances)
if(P.isVerb)
verbs -= P.verbpath
//Helper proc. Does all the checks and stuff for us to avoid copypasta
//includes a check to see if we're a carbon mob. This means that you can't use powers (even with the verbs) unless you're a carbon-based mob.
/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=3, var/max_stat=0)
if(!src.mind) return
if(!iscarbon(src)) return
var/datum/changeling/changeling = src.mind.changeling
if(!changeling) return
if(src.stat > max_stat)
src << "<span class='warning'>We are incapacitated.</span>"
return
if(changeling.absorbedcount < required_dna)
src << "<span class='warning'>We require at least [required_dna] sample\s of compatible DNA.</span>"
return
if(changeling.chem_charges < required_chems)
src << "<span class='warning'>We require at least [required_chems] unit\s of chemicals to do that!</span>"
return
if(changeling.geneticdamage > max_genetic_damage)
src << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
return
return changeling
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/living/carbon/proc/changeling_absorb_dna()
set category = "Changeling"
set name = "Absorb DNA"
var/datum/changeling/changeling = changeling_power(0,0,100)
if(!changeling) return
var/obj/item/weapon/grab/G = src.get_active_hand()
if(!istype(G))
src << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
return
if(G.state <= GRAB_NECK)
src << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
return
if(changeling.isabsorbing)
src << "<span class='warning'>We are already absorbing!</span>"
return
var/mob/living/carbon/T = G.affecting
if(changeling.can_absorb_dna(T, usr))
changeling.isabsorbing = 1
else
return
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
if(2)
src << "<span class='notice'>We extend a proboscis.</span>"
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
if(3)
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
T.take_overall_damage(40)
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(src, T, 150))
src << "<span class='warning'>Our absorption of [T] has been interrupted!</span>"
changeling.isabsorbing = 0
return
src << "<span class='notice'>We have absorbed [T]!</span>"
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
changeling.absorb_dna(T)
if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400)
if(T.mind)//if the victim has got a mind
T.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
if(T.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(T.mind.changeling.chem_charges, changeling.chem_storage)
changeling.absorbedcount += T.mind.changeling.absorbedcount
T.mind.changeling.absorbed_dna.len = 1
T.mind.changeling.absorbedcount = 0
else
changeling.chem_charges += 10
changeling.isabsorbing = 0
changeling.canrespec = 1
T.death(0)
T.Drain()
return 1
//Change our DNA to that of somebody we've absorbed.
/mob/living/carbon/proc/changeling_transform()
set category = "Changeling"
set name = "Transform (5)"
var/datum/changeling/changeling = changeling_power(5, 0, 3)
if(!changeling) return
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
names += "[DNA.real_name]"
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
changeling.chem_charges -= 5
changeling.geneticdamage = 3
src.dna = chosen_dna
src.real_name = chosen_dna.real_name
updateappearance(src)
domutcheck(src, null)
feedback_add_details("changeling_powers","TR")
return 1
//Transform into a monkey.
/mob/living/carbon/proc/changeling_lesser_form()
set category = "Changeling"
set name = "Lesser Form (5)"
var/datum/changeling/changeling = changeling_power(5,0,3)
if(!changeling) return
changeling.chem_charges -= 5
remove_changeling_powers()
changeling.geneticdamage = 3
src << "<span class='warning'>Our genes cry out!</span>"
var/mob/living/carbon/monkey/O = monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC)
O.make_changeling(1)
O.verbs += /mob/living/carbon/proc/changeling_human_form
O.unset_sting()
feedback_add_details("changeling_powers","LF")
. = 1
qdel(src)
//Transform into a human
/mob/living/carbon/proc/changeling_human_form()
set category = "Changeling"
set name = "Human Form (5)"
var/datum/changeling/changeling = changeling_power(5,0,3)
if(!changeling) return
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
names += "[DNA.real_name]"
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
changeling.chem_charges -= 5
remove_changeling_powers()
src << "<span class='notice'>We transform our appearance.</span>"
src.dna = chosen_dna
var/mob/living/carbon/human/O = humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
if(O)
O.make_changeling()
O.unset_sting()
feedback_add_details("changeling_powers","LFT")
. = 1
qdel(src)
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
/mob/living/carbon/proc/changeling_fakedeath()
set category = "Changeling"
set name = "Regenerative Stasis (10)"
set desc = "Begin stasis, allowing us to regenerate."
var/datum/changeling/changeling = changeling_power(10,1,100,DEAD)
if(!changeling) return
if(status_flags & FAKEDEATH) return //Make sure we can't stack regenerations and such.
changeling.chem_charges -= 10
if(!stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
return
src << "<span class='notice'>We begin our stasis, preparing energy to arise once more.</span>"
status_flags |= FAKEDEATH //play dead
update_canmove()
remove_changeling_powers()
emote("deathgasp")
tod = worldtime2text()
spawn(800)
src << "<span class='notice'>We have now stored enough power to regenerate.</span>"
verbs -= /mob/living/carbon/proc/changeling_fakedeath
verbs += /mob/living/carbon/proc/changeling_revive
feedback_add_details("changeling_powers","FD")
return 1
//Separated from regenerative stasis, so that they can choose when to pop up rather than having no control over it.
/mob/living/carbon/proc/changeling_revive()
set category = "Changeling"
set name = "Regenerate! (10)"
set desc = "Regenerate, healing all damage from our form."
var/datum/changeling/changeling = changeling_power(10,1,100,DEAD)
if(!changeling) return
changeling.chem_charges -= 10
if(stat == DEAD)
dead_mob_list -= src
living_mob_list += src
stat = CONSCIOUS
tod = null
setToxLoss(0)
setOxyLoss(0)
setCloneLoss(0)
SetParalysis(0)
SetStunned(0)
SetWeakened(0)
radiation = 0
heal_overall_damage(getBruteLoss(), getFireLoss())
reagents.clear_reagents()
src << "<span class='notice'>We have regenerated.</span>"
status_flags &= ~(FAKEDEATH)
update_canmove()
make_changeling()
verbs -= /mob/living/carbon/proc/changeling_revive
verbs += /mob/living/carbon/proc/changeling_fakedeath
feedback_add_details("changeling_powers","CR")
return 1
//Recover from stuns.
/mob/living/carbon/proc/changeling_unstun()
set category = "Changeling"
set name = "Epinephrine Overdose (30)"
set desc = "Removes all stuns instantly, and adds a short-term reduction in further stuns."
var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
if(!changeling) return 0
changeling.chem_charges -= 30
src << "<span class='notice'>We arise.</span>"
stat = 0
SetParalysis(0)
SetStunned(0)
SetWeakened(0)
lying = 0
update_canmove()
reagents.add_reagent("synaptizine", 20)
feedback_add_details("changeling_powers","UNS")
return 1
//Increases maximum chemical storage and regeneraton.
/mob/proc/changeling_advglands()
src.mind.changeling.chem_storage += 25
src.mind.changeling.chem_recharge_rate *= 2
return 1
//A flashy ability, good for crowd control and sewing chaos.
/mob/living/carbon/proc/changeling_shriek()
set category = "Changeling"
set name = "Resonant Shriek (25)"
set desc = "Deafen and confuse those around us."
var/datum/changeling/changeling = changeling_power(25)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 25
for(var/mob/living/M in hearers(4, usr))
if(iscarbon(M))
if(!M.mind || !M.mind.changeling)
M.ear_deaf += 30
M.confused += 20
M.Jitter(50)
else
M << sound('sound/effects/screech.ogg')
if(issilicon(M))
M << sound('sound/weapons/flash.ogg')
M.Weaken(rand(5,10))
for(var/obj/machinery/light/L in range(4, usr))
L.on = 1
L.broken()
feedback_add_details("changeling_powers","RS")
return 1
//Makes some spiderlings. Good for setting traps and causing general trouble.
/mob/living/carbon/proc/changeling_spiders()
set category = "Changeling"
set name = "Spread Infestation (50)"
set desc = "Creates spiderlings."
var/datum/changeling/changeling = changeling_power(50, 5)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 50
for(var/i=0, i<2, i++)
var/obj/effect/spider/spiderling/S = new(src.loc)
S.grow_as = /mob/living/simple_animal/hostile/giant_spider/hunter
feedback_add_details("changeling_powers","SI")
return 1
//Heals the things that the other regenerative abilities don't.
/mob/living/carbon/proc/changeling_panacea()
set category = "Changeling"
set name = "Anatomic Panacea (25)"
set desc = "Cures diseases, disabilities, toxins and radiation."
var/datum/changeling/changeling = changeling_power(25,0,100,UNCONSCIOUS)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 25
src << "<span class='notice'>We cleanse impurities from our form.</span>"
reagents.add_reagent("ryetalyn", 10)
reagents.add_reagent("hyronalin", 10)
reagents.add_reagent("anti_toxin", 20)
for(var/datum/disease/D in src.viruses)
D.cure()
feedback_add_details("changeling_powers","AP")
return 1
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
/mob/living/carbon/proc/changeling_digitalcamo()
set category = "Changeling"
set name = "Toggle Digital Camouflage"
set desc = "The AI can no longer track us, but we will look different if examined."
var/datum/changeling/changeling = changeling_power()
if(!changeling) return 0
if(digitalcamo) src << "<span class='notice'>We return to normal.</span>"
else src << "<span class='notice'>We distort our form to prevent AI-tracking.</span>"
digitalcamo = !digitalcamo
feedback_add_details("changeling_powers","CAM")
return 1
//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
/mob/living/carbon/proc/changeling_fleshmend()
set category = "Changeling"
set name = "Fleshmend (30)"
set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals."
var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 30
src << "<span class='notice'>We begin to heal rapidly.</span>"
spawn(0)
for(var/i = 0, i<10,i++)
adjustBruteLoss(-10)
adjustOxyLoss(-10)
adjustFireLoss(-10)
sleep(10)
feedback_add_details("changeling_powers","RR")
return 1
// HIVE MIND UPLOAD/DOWNLOAD DNA
var/list/datum/dna/hivemind_bank = list()
/mob/living/carbon/proc/changeling_hiveupload()
set category = "Changeling"
set name = "Hive Channel (10)"
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
var/datum/changeling/changeling = changeling_power(10)
if(!changeling) return
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
if(!(DNA in hivemind_bank))
names += DNA.real_name
if(names.len <= 0)
src << "<span class='notice'>The airwaves already have all of our DNA.</span>"
return
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
changeling.chem_charges -= 10
hivemind_bank += chosen_dna
src << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
feedback_add_details("changeling_powers","HU")
return 1
/mob/living/carbon/proc/changeling_hivedownload()
set category = "Changeling"
set name = "Hive Absorb (20)"
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
var/datum/changeling/changeling = changeling_power(20)
if(!changeling) return
var/list/names = list()
for(var/datum/dna/DNA in hivemind_bank)
if(!(DNA in changeling.absorbed_dna))
names[DNA.real_name] = DNA
if(names.len <= 0)
src << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = names[S]
if(!chosen_dna)
return
if(changeling.can_absorb_dna(null, usr))
changeling.chem_charges -= 20
changeling.shuffle_dna()
changeling.absorbed_dna |= chosen_dna
src << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
feedback_add_details("changeling_powers","HD")
return 1
// Fake Voice
/mob/living/carbon/proc/changeling_mimicvoice()
set category = "Changeling"
set name = "Mimic Voice"
set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing."
var/datum/changeling/changeling = changeling_power()
if(!changeling) return
if(changeling.mimicing)
changeling.mimicing = ""
src << "<span class='notice'>We return our vocal glands to their original location.</span>"
return
var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
if(!mimic_voice)
return
changeling.mimicing = mimic_voice
src << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
src << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
feedback_add_details("changeling_powers","MV")
spawn(0)
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
src.mind.changeling.chem_charges = max(src.mind.changeling.chem_charges - 1, 0)
sleep(40)
if(src && src.mind && src.mind.changeling)
src.mind.changeling.mimicing = ""
/mob/living/carbon/proc/changeling_emp_shriek()
set category = "Changeling"
set name = "Dissonant Shriek (20)"
var/datum/changeling/changeling = changeling_power(20)
if(!changeling) return
for(var/obj/machinery/light/L in range(5, usr))
L.on = 1
L.broken()
empulse(get_turf(src), 2, 5, 1)
changeling.chem_charges -= 20
/mob/living/carbon/proc/changeling_arm_blade()
set category = "Changeling"
set name = "Arm Blade (20)"
if(istype(l_hand, /obj/item/weapon/melee/arm_blade)) //Not the nicest way to do it, but eh
qdel(l_hand) //Arm blades can't be dropped, we have to delete them directly.
update_inv_l_hand()
return
if(istype(r_hand, /obj/item/weapon/melee/arm_blade))
qdel(r_hand)
update_inv_r_hand()
return
var/datum/changeling/changeling = changeling_power(20)
if(!changeling)
return
if(!drop_item())
usr << "The [get_active_hand()] is stuck to your hand, you cannot grow a blade over it!"
return
put_in_hands(new /obj/item/weapon/melee/arm_blade(src))
changeling.geneticdamage += 6
changeling.chem_charges -= 20
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
/mob/living/carbon/proc/set_sting(A, icon, dna=null) //setting the sting and ui icon for it
src << "<span class='notice'>We prepare our sting, use alt+click or middle mouse button on target to sting them.</span>"
src.mind.changeling.chosen_sting = A
if(dna)
src.mind.changeling.chosen_dna = dna
hud_used.lingstingdisplay.icon_state = icon
hud_used.lingstingdisplay.invisibility = 0
/mob/living/carbon/proc/unset_sting() //unsetting the previous
src << "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>"
src.mind.changeling.chosen_sting = null
hud_used.lingstingdisplay.icon_state = null
hud_used.lingstingdisplay.invisibility = 101
/mob/living/carbon/proc/sting_can_reach(mob/living/carbon/C, chem_cost) //handles all the checks there are
if(!isturf(src.loc)) return 0
if(get_dist(src, C) > (src.mind.changeling.sting_range)) return 0 //sanity check as AStar is still throwing insane stunts
if(!AStar(src.loc, C.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, src.mind.changeling.sting_range)) return 0 //hope this ancient magic still works
if(src.mind.changeling.chem_charges < chem_cost)
src << "<span class='warning'>Not enough chemicals.</span>"
return 0
src.mind.changeling.chem_charges -= chem_cost
src << "<span class='notice'>We stealthly sting [C.name].</span>"
if(C.mind && C.mind.changeling)
C << "<span class='warning'>You feel a tiny prick.</span>"
add_logs(src, C, "unsuccessfully stung")
return 0
else
return 1
/mob/living/carbon/proc/changeling_transformation_sting()
set category = "Changeling"
set name = "Transformation Sting (40)"
set desc= "Transform the target to one of our stored DNAs"
var/list/names = list()
for(var/datum/dna/DNA in mind.changeling.absorbed_dna)
names += DNA.real_name
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/D = mind.changeling.GetDNA(S)
if(!D)
return
set_sting(/mob/living/carbon/proc/sting_effect_trasnform, "sting_transform", D)
/mob/living/carbon/proc/sting_effect_trasnform(mob/living/carbon/T)
if(!sting_can_reach(T, 40))
return 0
add_logs(src, T, "stung", object="transformation sting", addition=" new identity is [src.mind.changeling.chosen_dna.real_name]")
if((HUSK in T.mutations) || !check_dna_integrity(T))
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
return 0
var/datum/dna/NewDNA = src.mind.changeling.chosen_dna
hardset_dna(T, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type)
updateappearance(T)
feedback_add_details("changeling_powers","TS")
return 1
/mob/living/carbon/proc/changeling_extract_dna_sting()
set category = "Changeling"
set name = "Extract DNA Sting (25)"
set desc="Stealthily sting a target to extract their DNA."
set_sting(/mob/living/carbon/proc/sting_effect_extract, "sting_extract")
/mob/living/carbon/proc/sting_effect_extract(mob/living/carbon/T)
if(!sting_can_reach(T, 25))
return 0
add_logs(src, T, "stung", object="extraction sting")
if(src.mind.changeling.can_absorb_dna(T, usr))
src.mind.changeling.absorb_dna(T, usr)
else//If the sting fails, give the guy most of his chems back.
src.mind.changeling.chem_charges += 20
feedback_add_details("changeling_powers","ED")
return 1
/mob/living/carbon/proc/changeling_mute_sting()
set category = "Changeling"
set name = "Mute sting (20)"
set desc= "Temporarily mutes the target."
set_sting(/mob/living/carbon/proc/sting_effect_mute, "sting_mute")
/mob/living/carbon/proc/sting_effect_mute(mob/living/carbon/T)
if(!sting_can_reach(T, 20))
return 0
add_logs(src, T, "stung", object="mute sting")
T.silent += 30
feedback_add_details("changeling_powers","MS")
return 1
/mob/living/carbon/proc/changeling_blind_sting()
set category = "Changeling"
set name = "Blind Sting (25)"
set desc= "Temporarily blinds the target."
set_sting(/mob/living/carbon/proc/sting_effect_blind, "sting_blind")
/mob/living/carbon/proc/sting_effect_blind(mob/living/carbon/T)
if(!sting_can_reach(T, 25))
return 0
add_logs(src, T, "stung", object="blind sting")
T << "<span class='danger'>Your eyes burn horrifically!</span>"
T.disabilities |= NEARSIGHTED
T.eye_blind = 20
T.eye_blurry = 40
feedback_add_details("changeling_powers","BS")
return 1
/mob/living/carbon/proc/changeling_lsd_sting()
set category = "Changeling"
set name = "Hallucination Sting (5)"
set desc = "Causes terror in the target."
set_sting(/mob/living/carbon/proc/sting_effect_lsd, "sting_lsd")
/mob/living/carbon/proc/sting_effect_lsd(mob/living/carbon/T)
if(!sting_can_reach(T, 5))
return 0
add_logs(src, T, "stung", object="LSD sting")
spawn(rand(300,600))
if(T) T.hallucination += 400
feedback_add_details("changeling_powers","HS")
return 1
/mob/living/carbon/proc/changeling_cryo_sting()
set category = "Changeling"
set name = "Cryogenic Sting (15)"
set desc = "Cools the target, slowing them."
set_sting(/mob/living/carbon/proc/sting_effect_cryo, "sting_cryo")
/mob/living/carbon/proc/sting_effect_cryo(mob/living/carbon/T)
if(!sting_can_reach(T, 15))
return 0
add_logs(src, T, "stung", object="cryo sting")
if(T.reagents)
T.reagents.add_reagent("frostoil", 30)
T.reagents.add_reagent("ice", 30)
feedback_add_details("changeling_powers","CS")
return 1
@@ -0,0 +1,391 @@
var/list/sting_paths
// totally stolen from the new player panel. YAYY
/obj/effect/proc_holder/changeling/evolution_menu
name = "-Evolution Menu-" //Dashes are so it's listed before all the other abilities.
desc = "Choose our method of subjugation."
dna_cost = 0
/obj/effect/proc_holder/changeling/evolution_menu/Click()
if(!usr || !usr.mind || !usr.mind.changeling)
return
var/datum/changeling/changeling = usr.mind.changeling
if(!sting_paths)
sting_paths = init_paths(/obj/effect/proc_holder/changeling)
var/dat = create_menu(changeling)
usr << browse(dat, "window=powers;size=600x700")//900x480
/obj/effect/proc_holder/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling)
var/dat
dat +="<html><head><title>Changling Evolution Menu</title></head>"
//javascript, the part that does most of the work~
dat += {"
<head>
<script type='text/javascript'>
var locked_tabs = new Array();
function updateSearch(){
var filter_text = document.getElementById('filter');
var filter = filter_text.value.toLowerCase();
if(complete_list != null && complete_list != ""){
var mtbl = document.getElementById("maintable_data_archive");
mtbl.innerHTML = complete_list;
}
if(filter.value == ""){
return;
}else{
var maintable_data = document.getElementById('maintable_data');
var ltr = maintable_data.getElementsByTagName("tr");
for ( var i = 0; i < ltr.length; ++i )
{
try{
var tr = ltr\[i\];
if(tr.getAttribute("id").indexOf("data") != 0){
continue;
}
var ltd = tr.getElementsByTagName("td");
var td = ltd\[0\];
var lsearch = td.getElementsByTagName("b");
var search = lsearch\[0\];
//var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element.
//document.write("<p>"+search.innerText+"<br>"+filter+"<br>"+search.innerText.indexOf(filter))
if ( search.innerText.toLowerCase().indexOf(filter) == -1 )
{
//document.write("a");
//ltr.removeChild(tr);
td.innerHTML = "";
i--;
}
}catch(err) { }
}
}
var count = 0;
var index = -1;
var debug = document.getElementById("debug");
locked_tabs = new Array();
}
function expand(id,name,desc,helptext,power,ownsthis){
clearAll();
var span = document.getElementById(id);
body = "<table><tr><td>";
body += "</td><td align='center'>";
body += "<font size='2'><b>"+desc+"</b></font> <BR>"
body += "<font size='2'><font color = 'red'><b>"+helptext+"</b></font> <BR>"
if(!ownsthis)
{
body += "<a href='?src=\ref[src];P="+power+"'>Evolve</a>"
}
body += "</td><td align='center'>";
body += "</td></tr></table>";
span.innerHTML = body
}
function clearAll(){
var spans = document.getElementsByTagName('span');
for(var i = 0; i < spans.length; i++){
var span = spans\[i\];
var id = span.getAttribute("id");
if(!(id.indexOf("item")==0))
continue;
var pass = 1;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 0;
break;
}
}
if(pass != 1)
continue;
span.innerHTML = "";
}
}
function addToLocked(id,link_id,notice_span_id){
var link = document.getElementById(link_id);
var decision = link.getAttribute("name");
if(decision == "1"){
link.setAttribute("name","2");
}else{
link.setAttribute("name","1");
removeFromLocked(id,link_id,notice_span_id);
return;
}
var pass = 1;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 0;
break;
}
}
if(!pass)
return;
locked_tabs.push(id);
var notice_span = document.getElementById(notice_span_id);
notice_span.innerHTML = "<font color='red'>Locked</font> ";
//link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');");
//document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
//document.write("aa - "+link.getAttribute("onClick"));
}
function attempt(ab){
return ab;
}
function removeFromLocked(id,link_id,notice_span_id){
//document.write("a");
var index = 0;
var pass = 0;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 1;
index = j;
break;
}
}
if(!pass)
return;
locked_tabs\[index\] = "";
var notice_span = document.getElementById(notice_span_id);
notice_span.innerHTML = "";
//var link = document.getElementById(link_id);
//link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
}
function selectTextField(){
var filter_text = document.getElementById('filter');
filter_text.focus();
filter_text.select();
}
</script>
</head>
"}
//body tag start + onload and onkeypress (onkeyup) javascript event calls
dat += "<body onload='selectTextField(); updateSearch();' onkeyup='updateSearch();'>"
//title + search bar
dat += {"
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable'>
<tr id='title_tr'>
<td align='center'>
<font size='5'><b>Changeling Evolution Menu</b></font><br>
Hover over a power to see more information<br>
Current ability choices remaining: [changeling.geneticpoints]<br>
By rendering a lifeform to a husk, we gain enough power to alter and adapt our evolutions.<br>
(<a href='?src=\ref[src];readapt=1'>Readapt</a>)<br>
<p>
</td>
</tr>
<tr id='search_tr'>
<td align='center'>
<b>Search:</b> <input type='text' id='filter' value='' style='width:300px;'>
</td>
</tr>
</table>
"}
//player table header
dat += {"
<span id='maintable_data_archive'>
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable_data'>"}
var/i = 1
for(var/path in sting_paths)
var/obj/effect/proc_holder/changeling/P = new path()
if(P.dna_cost <= 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered.
continue
var/ownsthis = changeling.has_sting(P)
var/color
if(ownsthis)
if(i%2 == 0)
color = "#d8ebd8"
else
color = "#c3dec3"
else
if(i%2 == 0)
color = "#f2f2f2"
else
color = "#e6e6e6"
dat += {"
<tr id='data[i]' name='[i]' onClick="addToLocked('item[i]','data[i]','notice_span[i]')">
<td align='center' bgcolor='[color]'>
<span id='notice_span[i]'></span>
<a id='link[i]'
onmouseover='expand("item[i]","[P.name]","[P.desc]","[P.helptext]","[P]",[ownsthis])'
>
<b id='search[i]'>Evolve [P][ownsthis ? " - Purchased" : ((P.dna_cost > 1) ? " - Cost: [P.dna_cost]" : "")]</b>
</a>
<br><span id='item[i]'></span>
</td>
</tr>
"}
i++
//player table ending
dat += {"
</table>
</span>
<script type='text/javascript'>
var maintable = document.getElementById("maintable_data_archive");
var complete_list = maintable.innerHTML;
</script>
</body></html>
"}
return dat
/obj/effect/proc_holder/changeling/evolution_menu/Topic(href, href_list)
..()
if(!(iscarbon(usr) && usr.mind && usr.mind.changeling))
return
if(href_list["P"])
usr.mind.changeling.purchasePower(usr, href_list["P"])
else if(href_list["readapt"])
usr.mind.changeling.lingRespec(usr)
var/dat = create_menu(usr.mind.changeling)
usr << browse(dat, "window=powers;size=600x700")
/////
/datum/changeling/proc/purchasePower(var/mob/living/carbon/user, var/sting_name)
var/obj/effect/proc_holder/changeling/thepower = null
if(!sting_paths)
sting_paths = init_paths(/obj/effect/proc_holder/changeling)
for(var/path in sting_paths)
var/obj/effect/proc_holder/changeling/S = new path()
if(S.name == sting_name)
thepower = S
if(thepower == null)
user << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
return
if(has_sting(thepower))
user << "We have already evolved this ability!"
return
if(geneticpoints < thepower.dna_cost)
user << "We have reached our capacity for abilities."
return
if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist.
user << "We lack the energy to evolve new abilities right now."
return
geneticpoints -= thepower.dna_cost
purchasedpowers += thepower
thepower.on_purchase(user)
//Reselect powers
/datum/changeling/proc/lingRespec(var/mob/user)
if(canrespec)
user << "We have removed our evolutions from this form, and are now ready to readapt."
user.remove_changeling_powers(1)
canrespec = 0
user.make_changeling()
return 1
else
user << "You lack the power to readapt your evolutions!"
return 0
/mob/proc/make_changeling()
if(!mind)
return
if(!ishuman(src) && !ismonkey(src))
return
if(!mind.changeling)
mind.changeling = new /datum/changeling(gender)
if(!sting_paths)
sting_paths = init_paths(/obj/effect/proc_holder/changeling)
if(mind.changeling.purchasedpowers)
remove_changeling_powers(1)
// purchase free powers.
for(var/path in sting_paths)
var/obj/effect/proc_holder/changeling/S = new path()
if(!S.dna_cost)
if(!mind.changeling.has_sting(S))
mind.changeling.purchasedpowers+=S
S.on_purchase(src)
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
mind.changeling.absorbed_dna |= C.dna
return 1
/datum/changeling/proc/reset()
chosen_sting = null
geneticpoints = initial(geneticpoints)
sting_range = initial(sting_range)
chem_storage = initial(chem_storage)
chem_recharge_rate = initial(chem_recharge_rate)
chem_charges = min(chem_charges, chem_storage)
mimicing = ""
/mob/proc/remove_changeling_powers(var/keep_free_powers=0)
if(ishuman(src) || ismonkey(src))
if(mind && mind.changeling)
digitalcamo = 0
mind.changeling.reset()
for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers)
if(!(p.dna_cost == 0 && keep_free_powers))
mind.changeling.purchasedpowers -= p
if(hud_used)
hud_used.lingstingdisplay.icon_state = null
hud_used.lingstingdisplay.invisibility = 101
/datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power)
for(var/obj/effect/proc_holder/changeling/P in purchasedpowers)
if(power.name == P.name)
return 1
return 0
@@ -1,548 +0,0 @@
// READ: Don't use the apostrophe in name or desc. Causes script errors.
var/list/powerinstances
/datum/power //Could be used by other antags too
var/name = "Power"
var/desc = "Placeholder"
var/helptext = ""
var/isVerb = 1 // Is it an active power, or passive?
var/verbpath // Path to a verb that contains the effects.
/datum/power/changeling
var/allowduringlesserform = 0
var/genomecost = 500000 // Cost for the changling to evolve this power.
/datum/power/changeling/absorb_dna
name = "Absorb DNA"
desc = "Permits us to siphon the DNA from a human. They become one with us, and the new energy lets us change our abilities."
genomecost = 0
verbpath = /mob/living/carbon/proc/changeling_absorb_dna
/datum/power/changeling/extractdna
name = "Extract DNA Strand"
desc = "We stealthily sting a target and extract the DNA from them."
helptext = "Will give you the DNA of your target, allowing you to transform into them."
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_extract_dna_sting
/datum/power/changeling/transform
name = "Transform"
desc = "We take on the appearance and voice of one we have absorbed."
genomecost = 0
verbpath = /mob/living/carbon/proc/changeling_transform
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
helptext = "Can be used before or after death. Duration varies greatly. Can be used in lesser form."
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_fakedeath
// Hivemind
/datum/power/changeling/hive_upload
name = "Hive Channel"
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_hiveupload
/datum/power/changeling/hive_download
name = "Hive Absorb"
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_hivedownload
/datum/power/changeling/lesser_form
name = "Lesser Form"
desc = "We debase ourselves and become lesser. We become a monkey."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_lesser_form
/datum/power/changeling/mimicvoice
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_mimicvoice
/datum/power/changeling/transformation_sting
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
helptext = "Does not provide a warning to others. The victim will transform much like a changeling would."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_transformation_sting
/datum/power/changeling/Epinephrine
name = "Epinephrine Sacs"
desc = "We evolve additional sacs of adrenaline throughout our body."
helptext = "Removes all stuns instantly, and adds a short-term reduction in further stuns. Can be used while unconscious."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_unstun
/datum/power/changeling/EngorgedGlands
name = "Engorged Chemical Glands"
desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
helptext = "Allows us to store an extra 25 units of chemicals, and doubles production rate."
genomecost = 1
isVerb = 0
verbpath = /mob/proc/changeling_advglands
/datum/power/changeling/DigitalCamouflage
name = "Digital Camouflage"
desc = "We evolve the ability to distort our form and proprotions, defeating common altgorthms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_digitalcamo
/datum/power/changeling/fleshmend
name = "Fleshmend"
desc = "We evolve the ability to rapidly regenerate, restoring the health of the body we use."
helptext = "Heals a moderate amount of damage every tick. Can be used while unconscious."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_fleshmend
/datum/power/changeling/panacea
name = "Anatomic Panacea"
desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation."
helptext = "Can be used while unconscious."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_panacea
/datum/power/changeling/shriek
name = "Resonant Shriek"
desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded."
helptext = "The high-frequency sounds cannot be heard by humans, but will blow out lights nearby. Cyborgs will have their sensors overloaded and become stunned."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_shriek
/datum/power/changeling/spiders
name = "Spread Infestation"
desc = "Our form divides, creating arachnids which will grow into deadly beasts."
helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 DNA absorptions."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_spiders
/datum/power/changeling/lsd_sting
name = "Hallucination Sting"
desc = "We evolve the ability to sting a target with a powerful hallucinogenic chemical."
helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_lsd_sting
/datum/power/changeling/blind_sting
name = "Blind Sting"
desc = "We silently sting a human, completely blinding them for a short time."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_blind_sting
/datum/power/changeling/cryo_sting
name = "Cryogenic Sting"
desc = "We silently sting a human with a cocktail of chemicals, slowing their metabolism."
helptext = "Does not provide a warning to a victim, though they will likely realize they are suddenly freezing."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_cryo_sting
/datum/power/changeling/mute_sting
name = "Mute Sting"
desc = "We silently sting a human, completely silencing them for a short time."
helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_mute_sting
/datum/power/changeling/emp_shriek
name = "Dissonant Shriek"
desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_emp_shriek
/datum/power/changeling/arm_blade
name = "Arm Blade"
desc = "We reform one of our arms into a deadly blade."
helptext = "Cannot be used while in lesser form."
genomecost = 1
allowduringlesserform = 0
verbpath = /mob/living/carbon/proc/changeling_arm_blade
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
set name = "-Evolution Menu-"//Dashes are so it's listed before all the other abilities.
set category = "Changeling"
set desc = "Choose our method of subjugation."
if(!usr || !usr.mind || !usr.mind.changeling) return
src = usr.mind.changeling
if(!powerinstances)
powerinstances = init_subtypes(/datum/power/changeling)
var/dat = "<html><head><title>Changling Evolution Menu</title></head>"
//javascript, the part that does most of the work~
dat += {"
<head>
<script type='text/javascript'>
var locked_tabs = new Array();
function updateSearch(){
var filter_text = document.getElementById('filter');
var filter = filter_text.value.toLowerCase();
if(complete_list != null && complete_list != ""){
var mtbl = document.getElementById("maintable_data_archive");
mtbl.innerHTML = complete_list;
}
if(filter.value == ""){
return;
}else{
var maintable_data = document.getElementById('maintable_data');
var ltr = maintable_data.getElementsByTagName("tr");
for ( var i = 0; i < ltr.length; ++i )
{
try{
var tr = ltr\[i\];
if(tr.getAttribute("id").indexOf("data") != 0){
continue;
}
var ltd = tr.getElementsByTagName("td");
var td = ltd\[0\];
var lsearch = td.getElementsByTagName("b");
var search = lsearch\[0\];
//var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element.
//document.write("<p>"+search.innerText+"<br>"+filter+"<br>"+search.innerText.indexOf(filter))
if ( search.innerText.toLowerCase().indexOf(filter) == -1 )
{
//document.write("a");
//ltr.removeChild(tr);
td.innerHTML = "";
i--;
}
}catch(err) { }
}
}
var count = 0;
var index = -1;
var debug = document.getElementById("debug");
locked_tabs = new Array();
}
function expand(id,name,desc,helptext,power,ownsthis){
clearAll();
var span = document.getElementById(id);
body = "<table><tr><td>";
body += "</td><td align='center'>";
body += "<font size='2'><b>"+desc+"</b></font> <BR>"
body += "<font size='2'><font color = 'red'><b>"+helptext+"</b></font> <BR>"
if(!ownsthis)
{
body += "<a href='?src=\ref[src];P="+power+"'>Evolve</a>"
}
body += "</td><td align='center'>";
body += "</td></tr></table>";
span.innerHTML = body
}
function clearAll(){
var spans = document.getElementsByTagName('span');
for(var i = 0; i < spans.length; i++){
var span = spans\[i\];
var id = span.getAttribute("id");
if(!(id.indexOf("item")==0))
continue;
var pass = 1;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 0;
break;
}
}
if(pass != 1)
continue;
span.innerHTML = "";
}
}
function addToLocked(id,link_id,notice_span_id){
var link = document.getElementById(link_id);
var decision = link.getAttribute("name");
if(decision == "1"){
link.setAttribute("name","2");
}else{
link.setAttribute("name","1");
removeFromLocked(id,link_id,notice_span_id);
return;
}
var pass = 1;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 0;
break;
}
}
if(!pass)
return;
locked_tabs.push(id);
var notice_span = document.getElementById(notice_span_id);
notice_span.innerHTML = "<font color='red'>Locked</font> ";
//link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');");
//document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
//document.write("aa - "+link.getAttribute("onClick"));
}
function attempt(ab){
return ab;
}
function removeFromLocked(id,link_id,notice_span_id){
//document.write("a");
var index = 0;
var pass = 0;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 1;
index = j;
break;
}
}
if(!pass)
return;
locked_tabs\[index\] = "";
var notice_span = document.getElementById(notice_span_id);
notice_span.innerHTML = "";
//var link = document.getElementById(link_id);
//link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
}
function selectTextField(){
var filter_text = document.getElementById('filter');
filter_text.focus();
filter_text.select();
}
</script>
</head>
"}
//body tag start + onload and onkeypress (onkeyup) javascript event calls
dat += "<body onload='selectTextField(); updateSearch();' onkeyup='updateSearch();'>"
//title + search bar
dat += {"
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable'>
<tr id='title_tr'>
<td align='center'>
<font size='5'><b>Changeling Evolution Menu</b></font><br>
Hover over a power to see more information<br>
Current ability choices remaining: [geneticpoints]<br>
By rendering a lifeform to a husk, we gain enough power to alter and adapt our evolutions.<br>
(<a href='?src=\ref[src];readapt=1'>Readapt</a>)<br>
<p>
</td>
</tr>
<tr id='search_tr'>
<td align='center'>
<b>Search:</b> <input type='text' id='filter' value='' style='width:300px;'>
</td>
</tr>
</table>
"}
//player table header
dat += {"
<span id='maintable_data_archive'>
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable_data'>"}
var/i = 1
for(var/datum/power/changeling/P in powerinstances)
var/ownsthis = 0
if(P.genomecost == 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered.
continue
if(P in purchasedpowers)
ownsthis = 1
var/color
if(ownsthis)
if(i%2 == 0)
color = "#d8ebd8"
else
color = "#c3dec3"
else
if(i%2 == 0)
color = "#f2f2f2"
else
color = "#e6e6e6"
dat += {"
<tr id='data[i]' name='[i]' onClick="addToLocked('item[i]','data[i]','notice_span[i]')">
<td align='center' bgcolor='[color]'>
<span id='notice_span[i]'></span>
<a id='link[i]'
onmouseover='expand("item[i]","[P.name]","[P.desc]","[P.helptext]","[P]",[ownsthis])'
>
<b id='search[i]'>Evolve [P][ownsthis ? " - Purchased" : ((P.genomecost > 1) ? " - Cost: [P.genomecost]" : "")]</b>
</a>
<br><span id='item[i]'></span>
</td>
</tr>
"}
i++
//player table ending
dat += {"
</table>
</span>
<script type='text/javascript'>
var maintable = document.getElementById("maintable_data_archive");
var complete_list = maintable.innerHTML;
</script>
</body></html>
"}
usr << browse(dat, "window=powers;size=600x700")//900x480
/datum/changeling/Topic(href, href_list)
..()
if(!ismob(usr))
return
if(href_list["P"])
var/datum/mind/M = usr.mind
if(!istype(M))
return
purchasePower(M, href_list["P"])
call(/datum/changeling/proc/EvolutionMenu)()
if(href_list["readapt"])
var/datum/mind/M = usr.mind
if(!istype(M))
return
lingRespec(M)
call(/datum/changeling/proc/EvolutionMenu)()
return
/////
/datum/changeling/proc/purchasePower(var/datum/mind/M, var/pname, var/remake_verbs = 1)
if(!M || !M.changeling || !istype(M.current, /mob/living/carbon))
return
var/mob/living/carbon/C = M.current
var/datum/power/changeling/thepower = pname
for (var/datum/power/changeling/P in powerinstances)
if(P.name == pname)
thepower = P
break
if(thepower == null)
C << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
return
if(thepower in purchasedpowers)
C << "We have already evolved this ability!"
return
if(geneticpoints < thepower.genomecost)
C << "We have reached our capacity for abilities."
return
if(C.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist.
C << "We lack the energy to evolve new abilities right now."
return
geneticpoints -= thepower.genomecost
purchasedpowers += thepower
if(!thepower.isVerb && thepower.verbpath)
call(C, thepower.verbpath)()
else if(remake_verbs)
C.make_changeling()
/////
/datum/changeling/proc/lingRespec(var/datum/mind/M)
if(!M || !M.changeling || !istype(M.current, /mob/living/carbon))
return
if(canrespec)
usr << "We have removed our evolutions from this form, and are now ready to readapt."
var/mob/living/carbon/C = M.current
C.remove_changeling_powers()//Revokes our verb powers.
clearlist(purchasedpowers)
//Resets our stats, to account for purchased passives.
C.digitalcamo = 0
geneticpoints = initial(geneticpoints)
sting_range = initial(sting_range)
chem_storage = initial(chem_storage)
chem_recharge_rate = initial(chem_recharge_rate)
chem_charges = min(chem_charges, chem_storage)
mimicing = ""
canrespec = 0
C.make_changeling()//Remake our verbs; rebuys the 0 cost skills.
else
usr << "You lack the power to readapt your evolutions!"
return 1
@@ -0,0 +1,96 @@
/obj/effect/proc_holder/changeling/absorbDNA
name = "Absorb DNA"
desc = "Absorb the DNA of our victim."
chemical_cost = 0
dna_cost = 0
req_human = 1
max_genetic_damage = 100
/obj/effect/proc_holder/changeling/absorbDNA/can_sting(var/mob/living/carbon/user)
if(!..())
return
var/datum/changeling/changeling = user.mind.changeling
if(changeling.isabsorbing)
user << "<span class='warning'>We are already absorbing!</span>"
return
var/obj/item/weapon/grab/G = user.get_active_hand()
if(!istype(G))
user << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
return
if(G.state <= GRAB_NECK)
user << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
return
var/mob/living/carbon/target = G.affecting
return changeling.can_absorb_dna(user,target)
/obj/effect/proc_holder/changeling/absorbDNA/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/obj/item/weapon/grab/G = user.get_active_hand()
var/mob/living/carbon/human/target = G.affecting
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
user << "<span class='notice'>This creature is compatible. We must hold still...</span>"
if(2)
user << "<span class='notice'>We extend a proboscis.</span>"
user.visible_message("<span class='warning'>[user] extends a proboscis!</span>")
if(3)
user << "<span class='notice'>We stab [target] with the proboscis.</span>"
user.visible_message("<span class='danger'>[user] stabs [target] with the proboscis!</span>")
target << "<span class='danger'>You feel a sharp stabbing pain!</span>"
target.take_overall_damage(40)
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(user, target, 150))
user << "<span class='warning'>Our absorption of [target] has been interrupted!</span>"
changeling.isabsorbing = 0
return
user << "<span class='notice'>We have absorbed [target]!</span>"
user.visible_message("<span class='danger'>[user] sucks the fluids from [target]!</span>")
target << "<span class='danger'>You have been absorbed by the changeling!</span>"
changeling.absorb_dna(target)
if(user.nutrition < 400) user.nutrition = min((user.nutrition + target.nutrition), 400)
if(target.mind)//if the victim has got a mind
target.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
changeling.absorbedcount += target.mind.changeling.absorbedcount
target.mind.changeling.absorbed_dna.len = 1
target.mind.changeling.absorbedcount = 0
else
changeling.chem_charges += 10
changeling.isabsorbing = 0
changeling.canrespec = 1
target.death(0)
target.Drain()
return 1
//Absorbs the target DNA.
/datum/changeling/proc/absorb_dna(mob/living/carbon/T)
if(absorbed_dna.len)
absorbed_dna.Cut(1,2)
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
var/datum/dna/new_dna = new T.dna.type
new_dna.uni_identity = T.dna.uni_identity
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.mutantrace = T.dna.mutantrace
new_dna.blood_type = T.dna.blood_type
absorbed_dna |= new_dna //And add the target DNA to our absorbed list.
absorbedcount++ //all that done, let's increment the objective counter.
@@ -0,0 +1,17 @@
/obj/effect/proc_holder/changeling/digitalcamo
name = "Digital Camouflage"
desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny."
dna_cost = 1
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
/obj/effect/proc_holder/changeling/digitalcamo/sting_action(var/mob/user)
if(user.digitalcamo)
user << "<span class='notice'>We return to normal.</span>"
else
user << "<span class='notice'>We distort our form to prevent AI-tracking.</span>"
user.digitalcamo = !user.digitalcamo
feedback_add_details("changeling_powers","CAM")
return 1
@@ -0,0 +1,26 @@
/obj/effect/proc_holder/changeling/epinephrine
name = "Epinephrine Overdose"
desc = "We evolve additional sacs of adrenaline throughout our body."
helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body."
chemical_cost = 30
dna_cost = 1
req_human = 1
req_stat = UNCONSCIOUS
//Recover from stuns.
/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/user)
if(user.lying)
user << "<span class='notice'>We arise.</span>"
else
user << "<span class='notice'>Adrenaline rushes through us.</span>"
user.stat = 0
user.SetParalysis(0)
user.SetStunned(0)
user.SetWeakened(0)
user.lying = 0
user.update_canmove()
user.reagents.add_reagent("synaptizine", 20)
feedback_add_details("changeling_powers","UNS")
return 1
@@ -0,0 +1,35 @@
/obj/effect/proc_holder/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We fall into a stasis, allowing us to regenerate."
chemical_cost = 10
dna_cost = 0
req_stat = DEAD
max_genetic_damage = 100
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
/obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user)
user << "<span class='notice'>We begin our stasis, preparing energy to arise once more.</span>"
user.status_flags |= FAKEDEATH //play dead
user.update_canmove()
if(user.stat != DEAD)
user.emote("deathgasp")
user.tod = worldtime2text()
spawn(800)
if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers)
user << "<span class='notice'>We are ready to regenerate.</span>"
user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null)
feedback_add_details("changeling_powers","FD")
return 1
/obj/effect/proc_holder/changeling/fakedeath/can_sting(var/mob/user)
if(user.status_flags & FAKEDEATH)
return
if(!user.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
return
return ..()
@@ -0,0 +1,20 @@
/obj/effect/proc_holder/changeling/fleshmend
name = "Fleshmend"
desc = "Our flesh rapidly regenerates, healing our wounds."
helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious."
chemical_cost = 30
dna_cost = 1
req_stat = UNCONSCIOUS
//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
/obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user)
user << "<span class='notice'>We begin to heal rapidly.</span>"
spawn(0)
for(var/i = 0, i<10,i++)
user.adjustBruteLoss(-10)
user.adjustOxyLoss(-10)
user.adjustFireLoss(-10)
sleep(10)
feedback_add_details("changeling_powers","RR")
return 1
@@ -0,0 +1,13 @@
/obj/effect/proc_holder/changeling/glands
name = "Engorged Chemical Glands"
desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
helptext = "Allows us to store an extra 25 units of chemicals, and doubles production rate."
dna_cost = 1
chemical_cost = -1
/obj/effect/proc_holder/changeling/glands/on_purchase(var/mob/user)
..()
var/datum/changeling/changeling=user.mind.changeling
changeling.chem_storage += 25
changeling.chem_recharge_rate *=2
return
@@ -0,0 +1,71 @@
// HIVE MIND UPLOAD/DOWNLOAD DNA
var/list/datum/dna/hivemind_bank = list()
/obj/effect/proc_holder/changeling/hivemind_upload
name = "Hive Channel"
desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it."
chemical_cost = 10
dna_cost = 0
/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
if(!(DNA in hivemind_bank))
names += DNA.real_name
if(names.len <= 0)
user << "<span class='notice'>The airwaves already have all of our DNA.</span>"
return
var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
if(!chosen_name)
return
var/datum/dna/chosen_dna = changeling.get_dna(chosen_name)
if(!chosen_dna)
return
hivemind_bank += chosen_dna
user << "<span class='notice'>We channel the DNA of [chosen_name] to the air.</span>"
feedback_add_details("changeling_powers","HU")
return 1
/obj/effect/proc_holder/changeling/hivemind_download
name = "Hive Absorb"
desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives."
chemical_cost = 20
dna_cost = 0
/obj/effect/proc_holder/changeling/hivemind_download/can_sting(var/mob/living/carbon/user)
if(!..())
return
var/datum/changeling/changeling = user.mind.changeling
if(changeling.absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it.
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
return
return 1
/obj/effect/proc_holder/changeling/hivemind_download/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in hivemind_bank)
if(!(DNA in changeling.absorbed_dna))
names[DNA.real_name] = DNA
if(names.len <= 0)
user << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = names[S]
if(!chosen_dna)
return
if(changeling.absorbed_dna.len)
changeling.absorbed_dna.Cut(1,2)
changeling.absorbed_dna |= chosen_dna
user << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
feedback_add_details("changeling_powers","HD")
return 1
@@ -0,0 +1,33 @@
/obj/effect/proc_holder/changeling/humanform
name = "Human form"
desc = "We change into a human."
chemical_cost = 5
genetic_damage = 3
req_dna = 1
max_genetic_damage = 3
//Transform into a human.
/obj/effect/proc_holder/changeling/humanform/sting_action(var/mob/living/carbon/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
names += "[DNA.real_name]"
var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!chosen_name)
return
var/datum/dna/chosen_dna = changeling.get_dna(chosen_name)
if(!chosen_dna)
return
user << "<span class='notice'>We transform our appearance.</span>"
user.dna = chosen_dna
user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
changeling.purchasedpowers -= src
feedback_add_details("changeling_powers","LFT")
del(user)
return 1
@@ -0,0 +1,18 @@
/obj/effect/proc_holder/changeling/lesserform
name = "Lesser form"
desc = "We debase ourselves and become lesser. We become a monkey."
chemical_cost = 5
dna_cost = 1
genetic_damage = 3
req_human = 1
//Transform into a monkey.
/obj/effect/proc_holder/changeling/lesserform/sting_action(var/mob/living/carbon/human/user)
user << "<span class='warning'>Our genes cry out!</span>"
var/mob/living/carbon/monkey/O = user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC)
O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
feedback_add_details("changeling_powers","LF")
.=1
del(user)
@@ -0,0 +1,28 @@
/obj/effect/proc_holder/changeling/mimicvoice
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this."
chemical_cost = 0 //constant chemical drain hardcoded
dna_cost = 1
req_human = 1
// Fake Voice
/obj/effect/proc_holder/changeling/mimicvoice/sting_action(var/mob/user)
var/datum/changeling/changeling=user.mind.changeling
if(changeling.mimicing)
changeling.mimicing = ""
changeling.chem_recharge_slowdown -= 0.5
user << "<span class='notice'>We return our vocal glands to their original position.</span>"
return
var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
if(!mimic_voice)
return
changeling.mimicing = mimic_voice
changeling.chem_recharge_slowdown += 0.5
user << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
user << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
feedback_add_details("changeling_powers","MV")
@@ -0,0 +1,170 @@
/*
Changeling Mutations! ~By Miauw
Contains:
Arm Blade
Space Suit
TODO:
Shield
Armor
*/
/obj/effect/proc_holder/changeling/arm_blade
name = "Arm Blade"
desc = "We reform one of our arms into a deadly blade."
helptext = "Cannot be used while in lesser form."
chemical_cost = 20
dna_cost = 1
genetic_damage = 8
req_human = 1
/obj/effect/proc_holder/changeling/arm_blade/try_to_sting(var/mob/user, var/mob/target)
if(istype(user.l_hand, /obj/item/weapon/melee/arm_blade)) //Not the nicest way to do it, but eh
del user.l_hand
user.visible_message("<span class='warning'>With a sickening crunch, [user] reforms his blade into an arm!</span>", "<span class='notice'>We assimilate our blade into our body</span>", "<span class='warning>You hear organic matter ripping and tearing!</span>")
user.update_inv_l_hand()
return
if(istype(user.r_hand, /obj/item/weapon/melee/arm_blade))
del user.r_hand
user.visible_message("<span class='warning'>With a sickening crunch, [user] reforms his blade into an arm!</span>", "<span class='notice'>We assimilate our blade into our body</span>", "<span class='warning>You hear organic matter ripping and tearing!</span>")
user.update_inv_r_hand()
return
..(user, target)
/obj/effect/proc_holder/changeling/arm_blade/sting_action(var/mob/user)
if(!user.drop_item())
user << "The [user.get_active_hand()] is stuck to your hand, you cannot grow a blade over it!"
return
user.put_in_hands(new /obj/item/weapon/melee/arm_blade(user))
return 1
/obj/item/weapon/melee/arm_blade
name = "arm blade"
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter"
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
w_class = 5.0
force = 25
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
/obj/item/weapon/melee/arm_blade/New()
..()
if(ismob(loc))
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
visible_message("<span class='warning'>With a sickening crunch, [user] reforms his blade into an arm!</span>", "<span class='notice'>We assimilate our blade into our body</span>", "<span class='warning>You hear organic matter ripping and tearing!</span>")
del src
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
if(istype(target, /obj/structure/table))
var/obj/structure/table/T = target
T.table_destroy(1, user)
else if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
C.attack_alien(user) //muh copypasta
else if(istype(target, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = target
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
return
if(A.arePowerSystemsOn() && !(A.stat & NOPOWER))
user << "<span class='notice'>The airlock's motors resist our efforts to force it.</span>"
return
else if(A.locked)
user << "<span class='notice'>The airlock's bolts prevent it from being forced.</span>"
return
else
//user.say("Heeeeeeeeeerrre's Johnny!")
user.visible_message("<span class='warning'>[user] forces the door to open with \his [src]!</span>", "<span class='warning'>We force the door to open.</span>", "<span class='warning'>You hear a metal screeching sound.</span>")
A.open(1)
//Space Suit & Helmet
/obj/effect/proc_holder/changeling/organic_space_suit
name = "Organic Space Suit"
desc = "We grow an organic suit to protect ourselves from space exposure."
helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Retreating the suit damages our genomes. Cannot be used in lesser form."
chemical_cost = 20
dna_cost = 1
genetic_damage = 8
req_human = 1
/obj/effect/proc_holder/changeling/organic_space_suit/try_to_sting(var/mob/user, var/mob/target)
var/datum/changeling/changeling = user.mind.changeling
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(changeling.space_suit_active)
changeling.space_suit_active = 0
H.visible_message("<span class='warning'>[H] casts off their flesh shell!</span>", "<span class='warning'>We cast off our protective organic shell, temporarily weakening our genomes.</span>", "<span class='warning'>You hear the organic matter ripping and tearing!</span>")
del H.wear_suit
del H.head
H.update_inv_wear_suit()
H.update_inv_head()
H.update_hair()
var/turf/simulated/T = get_turf(H)
if(istype(T))
T.add_blood(H) //So real blood decals
playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds
changeling.geneticdamage += 8 //Casting off a space suit leaves you weak for a few seconds.
changeling.chem_recharge_slowdown -= 0.5
return
..(H, target)
/obj/effect/proc_holder/changeling/organic_space_suit/sting_action(var/mob/living/carbon/human/user)
if(!user.canUnEquip(user.wear_suit))
user << "\the [user.wear_suit] is stuck to your body, you cannot grow a space suit over it!"
return
if(!user.canUnEquip(user.head))
user << "\the [user.head] is stuck on your head, you cannot grow a space helmet over it!"
return
user.unEquip(user.head)
user.unEquip(user.wear_suit)
user.equip_to_slot_if_possible(new /obj/item/clothing/suit/space/changeling(user), slot_wear_suit, 1, 1, 1)
user.equip_to_slot_if_possible(new /obj/item/clothing/head/helmet/space/changeling(user), slot_head, 1, 1, 1)
user.visible_message("<span class='warning'>[user]'s flesh rapidly inflates, forming a bloated mass around their body!</span>", "<span class='warning'>We inflate our flesh, creating a spaceproof suit!</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
var/datum/changeling/changeling = user.mind.changeling
changeling.space_suit_active = 1
changeling.chem_recharge_slowdown +=0.5
return 1
/obj/item/clothing/suit/space/changeling
name = "flesh mass"
icon_state = "lingspacesuit"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
flags = STOPSPRESSUREDMAGE | NODROP //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
/obj/item/clothing/suit/space/changeling/New()
processing_objects += src
/obj/item/clothing/suit/space/changeling/dropped()
del src
/obj/item/clothing/suit/space/changeling/process()
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.reagents.add_reagent("dexalinp", REAGENTS_METABOLISM)
/obj/item/clothing/head/helmet/space/changeling
name = "flesh mass"
icon_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | NODROP //Again, no THICKMATERIAL.
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/space/changeling/dropped()
del src
@@ -0,0 +1,21 @@
/obj/effect/proc_holder/changeling/panacea
name = "Anatomic Panacea"
desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation."
helptext = "Can be used while unconscious."
chemical_cost = 25
dna_cost = 1
req_stat = UNCONSCIOUS
//Heals the things that the other regenerative abilities don't.
/obj/effect/proc_holder/changeling/panacea/sting_action(var/mob/user)
user << "<span class='notice'>We cleanse impurities from our form.</span>"
user.reagents.add_reagent("ryetalyn", 10)
user.reagents.add_reagent("hyronalin", 10)
user.reagents.add_reagent("anti_toxin", 20)
for(var/datum/disease/D in user.viruses)
D.cure()
feedback_add_details("changeling_powers","AP")
return 1
@@ -0,0 +1,30 @@
/obj/effect/proc_holder/changeling/revive
name = "Regenerate"
desc = "We regenerate, healing all damage from our form."
chemical_cost = 10
req_stat = DEAD
//Revive from regenerative stasis
/obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user)
if(user.stat == DEAD)
dead_mob_list -= user
living_mob_list += user
user.stat = CONSCIOUS
user.tod = null
user.setToxLoss(0)
user.setOxyLoss(0)
user.setCloneLoss(0)
user.SetParalysis(0)
user.SetStunned(0)
user.SetWeakened(0)
user.radiation = 0
user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss())
user.reagents.clear_reagents()
user << "<span class='notice'>We have regenerated.</span>"
user.status_flags &= ~(FAKEDEATH)
user.update_canmove()
user.mind.changeling.purchasedpowers -= src
feedback_add_details("changeling_powers","CR")
return 1
@@ -0,0 +1,45 @@
/obj/effect/proc_holder/changeling/resonant_shriek
name = "Resonant Shriek"
desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded."
helptext = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors."
chemical_cost = 25
dna_cost = 1
req_human = 1
//A flashy ability, good for crowd control and sewing chaos.
/obj/effect/proc_holder/changeling/resonant_shriek/sting_action(var/mob/user)
for(var/mob/living/M in hearers(4, user))
if(iscarbon(M))
if(!M.mind || !M.mind.changeling)
M.ear_deaf += 30
M.confused += 20
M.Jitter(50)
else
M << sound('sound/effects/screech.ogg')
if(issilicon(M))
M << sound('sound/weapons/flash.ogg')
M.Weaken(rand(5,10))
for(var/obj/machinery/light/L in range(4, user))
L.on = 1
L.broken()
feedback_add_details("changeling_powers","RS")
return 1
/obj/effect/proc_holder/changeling/dissonant_shriek
name = "Dissonant Shriek"
desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics."
chemical_cost = 20
dna_cost = 1
//A flashy ability, good for crowd control and sewing chaos.
/obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(var/mob/user)
for(var/obj/machinery/light/L in range(5, usr))
L.on = 1
L.broken()
empulse(get_turf(user), 2, 5, 1)
return 1
@@ -0,0 +1,16 @@
/obj/effect/proc_holder/changeling/spiders
name = "Spread Infestation"
desc = "Our form divides, creating arachnids which will grow into deadly beasts."
helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 DNA absorptions."
chemical_cost = 50
dna_cost = 1
req_dna = 5
//Makes some spiderlings. Good for setting traps and causing general trouble.
/obj/effect/proc_holder/changeling/spiders/sting_action(var/mob/user)
for(var/i=0, i<2, i++)
var/obj/effect/spider/spiderling/S = new(user.loc)
S.grow_as = /mob/living/simple_animal/hostile/giant_spider/hunter
feedback_add_details("changeling_powers","SI")
return 1
@@ -0,0 +1,163 @@
/obj/effect/proc_holder/changeling/sting
name = "Tiny Prick"
desc = "Stabby stabby"
var/sting_icon = null
/obj/effect/proc_holder/changeling/sting/Click()
var/mob/user = usr
if(!user || !user.mind || !user.mind.changeling)
return
if(!(user.mind.changeling.chosen_sting))
set_sting(user)
else
unset_sting(user)
return
/obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user)
user << "<span class='notice'>We prepare our sting, use alt+click or middle mouse button on target to sting them.</span>"
user.mind.changeling.chosen_sting = src
user.hud_used.lingstingdisplay.icon_state = sting_icon
user.hud_used.lingstingdisplay.invisibility = 0
/obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user)
user << "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>"
user.mind.changeling.chosen_sting = null
user.hud_used.lingstingdisplay.icon_state = null
user.hud_used.lingstingdisplay.invisibility = 101
/mob/living/carbon/proc/unset_sting()
if(mind && mind.changeling && mind.changeling.chosen_sting)
src.mind.changeling.chosen_sting.unset_sting(src)
/obj/effect/proc_holder/changeling/sting/can_sting(var/mob/user, var/mob/target)
if(!..())
return
if(!user.mind.changeling.chosen_sting)
user << "We haven't prepared our sting yet!"
if(!iscarbon(target))
return
if(!isturf(user.loc))
return
if(get_dist(user, target) > (user.mind.changeling.sting_range))
return //sanity check as AStar is still throwing insane stunts
if(!AStar(user.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, user.mind.changeling.sting_range))
return //hope this ancient magic still works
return 1
/obj/effect/proc_holder/changeling/sting/sting_feedback(var/mob/user, var/mob/target)
user << "<span class='notice'>We stealthily sting [target.name].</span>"
if(target.mind && target.mind.changeling)
target << "<span class='warning'>You feel a tiny prick.</span>"
add_logs(user, target, "unsuccessfully stung")
return 1
/obj/effect/proc_holder/changeling/sting/transformation
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
helptext = "Does not provide a warning to others. The victim will transform much like a changeling would."
sting_icon = "sting_transform"
chemical_cost = 40
dna_cost = 1
var/datum/dna/selected_dna = null
/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target)
if(!..())
return
var/datum/changeling/changeling = user.mind.changeling
selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!selected_dna)
return
if((HUSK in target.mutations) || !check_dna_integrity(target))
user << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
return 0
return 1
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target)
add_logs(user, target, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]")
var/datum/dna/NewDNA = selected_dna
hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
return 1
obj/effect/proc_holder/changeling/sting/extract_dna
name = "Extract DNA Sting"
desc = "We stealthily sting a target and extract their DNA."
helptext = "Will give you the DNA of your target, allowing you to transform into them."
sting_icon = "sting_extract"
chemical_cost = 25
dna_cost = 0
/obj/effect/proc_holder/changeling/sting/extract_dna/can_sting(var/mob/user, var/mob/target)
if(..())
return user.mind.changeling.can_absorb_dna(user, target)
/obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(var/mob/user, var/mob/target)
add_logs(user, target, "stung", object="extraction sting")
user.mind.changeling.absorb_dna(target, user)
feedback_add_details("changeling_powers","ED")
return 1
obj/effect/proc_holder/changeling/sting/mute
name = "Mute Sting"
desc = "We silently sting a human, completely silencing them for a short time."
helptext = "Does not provide a warning to the victim that they have been stung, until they try to speak and cannot."
sting_icon = "sting_mute"
chemical_cost = 20
dna_cost = 1
/obj/effect/proc_holder/changeling/sting/mute/sting_action(var/mob/user, var/mob/living/carbon/target)
add_logs(user, target, "stung", object="mute sting")
target.silent += 30
feedback_add_details("changeling_powers","MS")
return 1
obj/effect/proc_holder/changeling/sting/blind
name = "Blind Sting"
desc = "Temporarily blinds the target."
helptext = "This sting completely blinds a target for a short time. The target does not notice they have been stung."
sting_icon = "sting_blind"
chemical_cost = 25
dna_cost = 1
/obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/user, var/mob/target)
add_logs(user, target, "stung", object="blind sting")
target << "<span class='danger'>Your eyes burn horrifically!</span>"
target.disabilities |= NEARSIGHTED
target.eye_blind = 20
target.eye_blurry = 40
feedback_add_details("changeling_powers","BS")
return 1
obj/effect/proc_holder/changeling/sting/LSD
name = "Hallucination Sting"
desc = "Causes terror in the target."
helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
sting_icon = "sting_lsd"
chemical_cost = 5
dna_cost = 1
/obj/effect/proc_holder/changeling/sting/LSD/sting_action(var/mob/user, var/mob/living/carbon/target)
add_logs(user, target, "stung", object="LSD sting")
spawn(rand(300,600))
if(target)
target.hallucination += 400
feedback_add_details("changeling_powers","HS")
return 1
obj/effect/proc_holder/changeling/sting/cryo
name = "Cryogenic Sting"
desc = "We silently sting a human with a cocktail of chemicals that freeze them."
helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing."
sting_icon = "sting_cryo"
chemical_cost = 15
dna_cost = 1
/obj/effect/proc_holder/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target)
add_logs(user, target, "stung", object="cryo sting")
if(target.reagents)
target.reagents.add_reagent("frostoil", 30)
target.reagents.add_reagent("ice", 30)
feedback_add_details("changeling_powers","CS")
return 1
@@ -0,0 +1,36 @@
/obj/effect/proc_holder/changeling/transform
name = "Transform"
desc = "We take on the appearance and voice of one we have absorbed."
chemical_cost = 5
dna_cost = 0
req_dna = 1
req_human = 1
max_genetic_damage = 3
//Change our DNA to that of somebody we've absorbed.
/obj/effect/proc_holder/changeling/transform/sting_action(var/mob/living/carbon/user)
var/datum/changeling/changeling = user.mind.changeling
var/datum/dna/chosen_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!chosen_dna)
return
user.dna = chosen_dna
user.real_name = chosen_dna.real_name
updateappearance(user)
domutcheck(user, null)
feedback_add_details("changeling_powers","TR")
return 1
/datum/changeling/proc/select_dna(var/prompt, var/title)
var/list/names = list()
for(var/datum/dna/DNA in absorbed_dna)
names += "[DNA.real_name]"
var/chosen_name = input(prompt, title, null) as null|anything in names
if(!chosen_name)
return
var/datum/dna/chosen_dna = get_dna(chosen_name)
return chosen_dna
+3 -3
View File
@@ -111,7 +111,7 @@ var/global/datum/controller/gameticker/ticker
else
src.mode.announce()
supply_shuttle.process() //Start the supply shuttle regenerating points -- TLE
supply_shuttle.process() //Start the supply shuttle regenerating points
master_controller.process() //Start master_controller.process()
lighting_controller.process() //Start processing DynamicAreaLighting updates
@@ -142,7 +142,7 @@ var/global/datum/controller/gameticker/ticker
if(config.sql_enabled)
spawn(3000)
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB
return 1
/datum/controller/gameticker
@@ -150,7 +150,7 @@ var/global/datum/controller/gameticker/ticker
//Now we have a general cinematic centrally held within the gameticker....far more efficient!
var/obj/screen/cinematic = null
//Plus it provides an easy way to make cinematics for other events. Just use this as a template :)
//Plus it provides an easy way to make cinematics for other events. Just use this as a template
proc/station_explosion_cinematic(var/station_missed=0, var/override = null)
if( cinematic ) return //already a cinematic in progress!
+25 -22
View File
@@ -33,7 +33,7 @@
for(var/mob/living/silicon/ai/ai in player_list)
ai.fire_res_on_core = 1
src.verbs -= /mob/living/silicon/ai/proc/fireproof_core
src << "\red Core fireproofed."
src << "<span class='notice'>Core fireproofed.</span>"
/datum/AI_Module/large/upgrade_turrets
module_name = "AI Turret upgrade"
@@ -51,6 +51,7 @@
for(var/obj/machinery/turret/turret in machines)
turret.health += 30
turret.shot_delay = 20
src << "<span class='notice'>Turrets upgraded.</span>"
/datum/AI_Module/large/disable_rcd
module_name = "RCD disable"
@@ -70,8 +71,8 @@
rcd.disabled = 1
for(var/obj/item/mecha_parts/mecha_equipment/tool/rcd/rcd in world)
rcd.disabled = 1
src << "RCD-disabling pulse emitted."
else src << "Out of uses."
src << "<span class='warning>RCD-disabling pulse emitted.</span>"
else src << "<span class='notice'>Out of uses.</span>"
/datum/AI_Module/small/overload_machine
module_name = "Machine overload"
@@ -91,17 +92,18 @@
overload.uses --
for(var/mob/V in hearers(M, null))
V.show_message("\blue You hear a loud electrical buzzing sound!", 2)
src << "<span class='warning'>Overloading machine circuitry...</span>"
spawn(50)
if(M)
explosion(get_turf(M), 0,1,1,0)
qdel(M)
else src << "Out of uses."
else src << "That's not a machine."
else src << "<span class='notice'>Out of uses.</span>"
else src << "<span class='notice'>That's not a machine.</span>"
/datum/AI_Module/small/override_machine
module_name = "Machine override"
mod_pick_name = "override"
description = "Overrides a machine's programming, causing it to rise up attack everyone except you (WARNING: It will attack cyborgs). 4 uses."
description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. 4 uses."
uses = 4
cost = 15
@@ -117,14 +119,12 @@
override.uses --
for(var/mob/V in hearers(M, null))
V.show_message("\blue You hear a loud electrical buzzing sound!", 2)
src << "<span class='warning'>Reprogramming machine behaviour...</span>"
spawn(50)
if(M)
var/mob/living/simple_animal/hostile/mimic/copy/machine = new(get_turf(M), M, src, 1)
machine.speak = list("HUMANS ARE IMPERFECT!", "YOU SHALL BE ASSIMILATED!", "YOU ARE HARMING YOURSELF", "You have been deemed hazardous. Will you comply?", \
"My logic is undeniable.", "One of us.", "FLESH IS WEAK", "THIS ISN'T WAR, THIS IS EXTERMINATION!")
machine.speak_chance = 15
else src << "Out of uses."
else src << "That's not a machine."
new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, src, 1)
else src << "<span class='notice'>Out of uses.</span>"
else src << "<span class='notice'>That's not a machine.</span>"
/datum/AI_Module/large/place_cyborg_transformer
module_name = "Robotic Factory (Removes Shunting)"
@@ -185,7 +185,7 @@
playsound(middle, 'sound/effects/phasein.ogg', 100, 1)
src.can_shunt = 0
PCT.uses -= 1
src << "You cannot shunt anymore."
src << "<span class='warning'>You cannot shunt anymore.</span>"
/datum/AI_Module/small/blackout
@@ -207,12 +207,13 @@
if(prob(30*apc.overload))
apc.overload_lighting()
else apc.overload++
else src << "Out of uses."
src << "<span class='notice'>Overcurrent applied to the powernet.</span>"
else src << "<span class='notice'>Out of uses.</span>"
/datum/AI_Module/small/interhack
module_name = "Hack intercept"
mod_pick_name = "interhack"
description = "Hacks the status upgrade from Cent. Com, removing any information about malfunctioning electrical systems."
description = "Hacks the status update from Centcom, removing any information about malfunctioning electrical systems."
cost = 15
one_time = 1
@@ -223,6 +224,7 @@
set name = "Hack intercept"
src.verbs -= /mob/living/silicon/ai/proc/interhack
ticker.mode:hack_intercept()
src << "<span class='notice'>Status update intercepted and modified.</span>"
/datum/AI_Module/small/reactivate_camera
module_name = "Reactivate camera"
@@ -242,15 +244,16 @@
if(!C.status)
C.deactivate(src)
camera.uses --
src << "<span class='notice'>Camera reactivated.</span>"
else
src << "This camera is either active, or not repairable."
else src << "Out of uses."
else src << "That's not a camera."
src << "<span class='notice'>This camera is either active, or not repairable.</span>"
else src << "<span class='notice'>Out of uses.</span>"
else src << "<span class='notice'>That's not a camera.</span>"
/datum/AI_Module/small/upgrade_camera
module_name = "Upgrade Camera"
mod_pick_name = "upgradecam"
description = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 5 uses."
description = "Upgrades a camera to have X-ray vision, motion sensing and be EMP-Proof. 5 uses."
uses = 5
cost = 5
@@ -285,11 +288,11 @@
if(upgraded)
UC.uses --
C.visible_message("<span class='notice'>\icon[C] *beep*</span>")
src << "Camera successully upgraded!"
src << "<span class='notice'>Camera successully upgraded!</span>"
else
src << "This camera is already upgraded!"
src << "<span class='notice'>This camera is already upgraded!</span>"
else
src << "Out of uses."
src << "<span class='notice'>Out of uses.</span>"
/datum/module_picker
+1 -4
View File
@@ -73,7 +73,6 @@
/var/const/access_cent_living = 105//Living quarters.
/var/const/access_cent_storage = 106//Generic storage areas.
/var/const/access_cent_teleporter = 107//Teleporter.
/var/const/access_cent_creed = 108//Creed's office.
/var/const/access_cent_captain = 109//Captain's office/ID comp/AI.
//The Syndicate
@@ -182,7 +181,7 @@
if("Research Officer")
return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage)
if("Special Ops Officer")
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed)
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage)
if("Admiral")
return get_all_centcom_access()
if("Centcom Commander")
@@ -389,8 +388,6 @@
return "Code Blue"
if(access_cent_specops)
return "Code Black"
if(access_cent_creed)
return "Code Silver"
if(access_cent_captain)
return "Code Gold"
+2 -3
View File
@@ -78,10 +78,9 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hopcap(H), slot_head)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
return 1
return 1
+3 -3
View File
@@ -18,7 +18,7 @@
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
/obj/machinery/atmospherics/unary/cold_sink/freezer/RefreshParts()
@@ -140,7 +140,7 @@
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
/obj/machinery/atmospherics/unary/heat_reservoir/heater/RefreshParts()
@@ -241,4 +241,4 @@
..()
if(stat & NOPOWER)
on = 0
update_icon()
update_icon()
+14 -7
View File
@@ -13,17 +13,23 @@
anchored = 1
var/efficiency
state_open = 1
var/initial_bin_rating = 1
var/min_health = 25
var/list/injection_chems = list() //list of injectable chems except inaprovaline, coz inaprovaline is always avalible
var/list/possible_chems = list(list("stoxin", "dexalin", "bicaridine", "kelotane"),
list("stoxin", "dexalinp", "imidazoline", "dermaline", "bicaridine"),
list("tricordrazine", "anti_toxin", "ryetalyn", "dermaline", "bicaridine", "imidazoline", "alkysine", "arithrazine"))
list("stoxin", "dexalinp", "imidazoline", "dermaline", "bicaridine"),
list("tricordrazine", "anti_toxin", "ryetalyn", "dermaline", "bicaridine", "imidazoline", "alkysine", "arithrazine"))
/obj/machinery/sleeper/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/sleeper(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
// Customizable bin rating, used by the labor camp to stop people filling themselves with chemicals and escaping.
var/obj/item/weapon/stock_parts/matter_bin/B = new(null)
B.rating = initial_bin_rating
component_parts += B
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
@@ -227,10 +233,11 @@
/obj/machinery/sleeper/proc/inject_chem(mob/user, chem)
if(occupant && occupant.reagents)
if(occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency)
occupant.reagents.add_reagent(chem, 10)
var/units = round(occupant.reagents.get_reagent_amount(chem))
user << "<span class='notice'>Occupant now has [units] unit\s of [chem] in their bloodstream.</span>"
if(chem in injection_chems + "inaprovaline")
if(occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency)
occupant.reagents.add_reagent(chem, 10)
var/units = round(occupant.reagents.get_reagent_amount(chem))
user << "<span class='notice'>Occupant now has [units] unit\s of [chem] in their bloodstream.</span>"
/obj/machinery/sleeper/update_icon()
if(state_open)
+1 -1
View File
@@ -186,7 +186,7 @@ obj/machinery/computer/general_air_control
return_text()
var/output = ..()
//if(signal.data)
// input_info = signal.data // Attempting to fix intake control -- TLE
// input_info = signal.data // Attempting to fix intake control
output += "<h1>Tank Control System</h1>"
if(input_info)
+12 -12
View File
@@ -120,7 +120,7 @@ var/global/list/autolathe_recipes_hidden = list( \
if (stat)
return 1
if (busy)
user << "\red The autolathe is busy. Please wait for completion of previous operation."
user << "<span class=\"alert\">The autolathe is busy. Please wait for completion of previous operation.</span>"
return 1
if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O))
@@ -145,13 +145,13 @@ var/global/list/autolathe_recipes_hidden = list( \
return 1
if (src.m_amount + O.m_amt > max_m_amount)
user << "\red The autolathe is full. Please remove metal from the autolathe in order to insert more."
user << "<span class=\"alert\">The autolathe is full. Please remove metal from the autolathe in order to insert more.</span>"
return 1
if (src.g_amount + O.g_amt > max_g_amount)
user << "\red The autolathe is full. Please remove glass from the autolathe in order to insert more."
user << "<span class=\"alert\">The autolathe is full. Please remove glass from the autolathe in order to insert more.</span>"
return 1
if (O.m_amt == 0 && O.g_amt == 0)
user << "\red This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials."
user << "<span class=\"alert\">This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials.</span>"
return 1
var/amount = 1
@@ -227,7 +227,7 @@ var/global/list/autolathe_recipes_hidden = list( \
src.g_amount = 0
busy = 0
else
usr << "\red The autolathe is busy. Please wait for completion of previous operation."
usr << "<span class=\"alert\">The autolathe is busy. Please wait for completion of previous operation.</span>"
src.updateUsrDialog()
return
@@ -246,27 +246,27 @@ var/global/list/autolathe_recipes_hidden = list( \
var/dat
if(!panel_open)
var/coeff = 2 ** prod_coeff
dat = "<div class='statusDisplay'><B>Metal Amount:</B> [src.m_amount] / [max_m_amount] cm<sup>3</sup><BR>"
dat += "<B>Glass Amount:</B> [src.g_amount] / [max_g_amount] cm<sup>3</sup><HR>"
dat = "<div class='statusDisplay'><b>Metal amount:</b> [src.m_amount] / [max_m_amount] cm<sup>3</sup><br>"
dat += "<b>Glass amount:</b> [src.g_amount] / [max_g_amount] cm<sup>3</sup><hr>"
var/list/objs = list()
objs += src.L
if(src.hacked)
objs += src.LL
for(var/obj/t in objs)
if(disabled || m_amount<t.m_amt || g_amount<t.g_amt)
dat += "<span class='linkOff'>[t.name]</span>"
dat += replacetext("<span class='linkOff'>[t]</span>", "The ", "")
else
dat += "<A href='?src=\ref[src];make=\ref[t]'>[t.name]</A>"
dat += replacetext("<a href='?src=\ref[src];make=\ref[t]'>[t]</a>", "The ", "")
if(istype(t, /obj/item/stack))
var/obj/item/stack/S = t
var/max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY)
if (max_multiplier>10 && !disabled)
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[10]'>x[10]</A>"
dat += " <a href='?src=\ref[src];make=\ref[t];multiplier=[10]'>x[10]</a>"
if (max_multiplier>25 && !disabled)
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[25]'>x[25]</A>"
dat += " <a href='?src=\ref[src];make=\ref[t];multiplier=[25]'>x[25]</a>"
if (max_multiplier>1 && !disabled)
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[max_multiplier]'>x[max_multiplier]</A>"
dat += " <a href='?src=\ref[src];make=\ref[t];multiplier=[max_multiplier]'>x[max_multiplier]</a>"
dat += " [t.m_amt] m / [t.g_amt] g"
else
dat += " [t.m_amt/coeff] m / [t.g_amt/coeff] g"
+1 -1
View File
@@ -194,7 +194,7 @@
if(targetdirection != null)
/*
for (var/turf/space/D in view(7,src))
if(!(D in floorbottargets) && D != src.oldtarget) // Added for bridging mode -- TLE
if(!(D in floorbottargets) && D != src.oldtarget) // Added for bridging mode
if(get_dir(src, D) == targetdirection)
src.oldtarget = D
src.target = D
@@ -244,7 +244,7 @@
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/screwdriver))
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
if(build_path == /obj/machinery/computer/rdconsole/core)
name = "circuit board (RD Console - Robotics)"
build_path = /obj/machinery/computer/rdconsole/robotics
user << "<span class='notice'>Access protocols successfully updated.</span>"
@@ -507,7 +507,7 @@
user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
return
*/
if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
if(world.time < 6000)
user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minutes before trying again."
return
+27 -6
View File
@@ -403,12 +403,14 @@ About the new airlock wires panel:
icon_state = "door_locked"
else
icon_state = "door_closed"
if(p_open || welded)
if(p_open || welded || emergency)
overlays = list()
if(p_open)
overlays += image(icon, "panel_open")
if(welded)
overlays += image(icon, "welded")
if(emergency && !locked)
overlays += image(icon, "elights")
else
icon_state = "door_open"
@@ -472,6 +474,11 @@ About the new airlock wires panel:
else
t1 += text("IdScan enabled. <A href='?src=\ref[];aiDisable=1'>Disable?</a><br>\n", src)
if(src.emergency)
t1 += text("Emergency Access Override is enabled. <A href='?src=\ref[];aiDisable=11'>Disable?</a><br>\n", src)
else
t1 += text("Emergency Access Override is disabled. <A href='?src=\ref[];aiEnable=11'>Enable?</a><br>\n", src)
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1))
t1 += text("Main Power Input wire is cut.<br>\n")
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))
@@ -542,8 +549,8 @@ About the new airlock wires panel:
user << browse(t1, "window=airlock")
onclose(user, "airlock")
//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door
//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door
//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door, 11 lift access override
//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door, 11 enable access override
/obj/machinery/door/airlock/proc/hack(mob/user as mob)
@@ -647,8 +654,8 @@ About the new airlock wires panel:
if(istype(usr, /mob/living/silicon) && src.canAIControl())
//AI
//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door, 8 door safties, 9 door speed
//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door, 8 door safties, 9 door speed
//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door, 8 door safties, 9 door speed, 11 emergency access
//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door, 8 door safties, 9 door speed, 11 emergency access
if(href_list["aiDisable"])
var/code = text2num(href_list["aiDisable"])
switch (code)
@@ -728,6 +735,12 @@ About the new airlock wires panel:
else
usr << text("Door bolt lights are already disabled!")
if(11)
// Emergency access
if (src.emergency)
emergency = 0
else
usr << text("Emergency access is already disabled!")
else if(href_list["aiEnable"])
@@ -827,6 +840,13 @@ About the new airlock wires panel:
else
usr << text("Door bolt lights are already enabled!")
if(11)
// Emergency access
if (!src.emergency)
emergency = 1
else
usr << text("Emergency access is already enabled!")
add_fingerprint(usr)
update_icon()
if(!nowindow)
@@ -856,6 +876,7 @@ About the new airlock wires panel:
return
else if(istype(C, /obj/item/weapon/screwdriver))
src.p_open = !( src.p_open )
user << "<span class='notice'>You [p_open ? "open":"close"] the maintenance panel of the airlock.</span>"
src.update_icon()
else if(istype(C, /obj/item/weapon/wirecutters))
return src.attack_hand(user)
@@ -863,7 +884,7 @@ About the new airlock wires panel:
return src.attack_hand(user)
else if(istype(C, /obj/item/device/assembly/signaler))
return src.attack_hand(user)
else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE
else if(istype(C, /obj/item/weapon/pai_cable))
var/obj/item/weapon/pai_cable/cable = C
cable.plugin(src, user)
else if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe) )
+5 -4
View File
@@ -15,6 +15,7 @@
var/glass = 0
var/normalspeed = 1
var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/emergency = 0 // Emergency access override
/obj/machinery/door/New()
..()
@@ -51,7 +52,7 @@
if(istype(AM, /obj/machinery/bot))
var/obj/machinery/bot/bot = AM
if(src.check_access(bot.botcard))
if(src.check_access(bot.botcard) || emergency == 1)
if(density)
open()
return
@@ -59,7 +60,7 @@
if(istype(AM, /obj/mecha))
var/obj/mecha/mecha = AM
if(density)
if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access)))
if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access) || emergency == 1))
open()
else
flick("door_deny", src)
@@ -87,7 +88,7 @@
user = null
if(density)
if(allowed(user)) open()
if(allowed(user) || src.emergency == 1) open()
else flick("door_deny", src)
return
@@ -128,7 +129,7 @@
open()
operating = -1
return 1
if(src.allowed(user))
if(src.allowed(user) || src.emergency == 1)
if(src.density)
open()
else
+1 -3
View File
@@ -1,4 +1,3 @@
/obj/machinery/microwave
name = "microwave"
icon = 'icons/obj/kitchen.dmi'
@@ -46,8 +45,7 @@
component_parts += new /obj/item/weapon/circuitboard/microwave(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null)
component_parts += new /obj/item/stack/cable_coil(null)
component_parts += new /obj/item/stack/cable_coil(null, 2)
RefreshParts()
/obj/machinery/microwave/RefreshParts()
+1 -1
View File
@@ -189,7 +189,7 @@
if(istype(O, /obj/item/device/lightreplacer))
var/obj/item/device/lightreplacer/LR = O
var/i = 1
for(1, i < coeff, i++)
for(1, i <= coeff, i++)
LR.Charge(occupier)
if(occupier)
+2 -2
View File
@@ -167,9 +167,9 @@
var/heat_capacity = removed.heat_capacity()
//world << "heating ([heat_capacity])"
if(heat_capacity == 0 || heat_capacity == null) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
if(heat_capacity == 0 || heat_capacity == null) // Added check to avoid divide by zero (oshi-) runtime errors
heat_capacity = 1
removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios
cell.use(heating_power/20000)
//world << "now at [removed.temperature]"
+4 -4
View File
@@ -365,7 +365,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b_extra = ""
if(data == 3) // intercepted radio message
part_b_extra = " <i>(Intercepted)</i>"
var/part_b = "</span><b> \[[freq_text]\][part_b_extra]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_b = "</span><b> \[[freq_text]\][part_b_extra]</b> <span class='message'>"
var/part_c = "</span></span>"
if (display_freq==SYND_FREQ)
@@ -397,7 +397,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- This following recording is intended for research and feedback in the use of department radio channels ---
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>"
var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]"
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
@@ -664,7 +664,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Create a radio headset for the sole purpose of using its icon
var/obj/item/device/radio/headset/radio = new
var/part_b = "</span><b> \icon[radio]\[[freq_text]\][part_b_extra]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_b = "</span><b> \icon[radio]\[[freq_text]\][part_b_extra]</b> <span class='message'>"
var/part_c = "</span></span>"
if (display_freq==SYND_FREQ)
@@ -688,7 +688,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- This following recording is intended for research and feedback in the use of department radio channels ---
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>"
var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]"
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
+5 -10
View File
@@ -222,12 +222,12 @@
if(premium.len > 0)
dat += "<b>Coin slot:</b> "
if (coin)
dat += "[coin]&nbsp;&nbsp;<a href='byond://?src=\ref[src];remove_coin=1'>Remove</A>"
dat += "[coin]&nbsp;&nbsp;<a href='byond://?src=\ref[src];remove_coin=1'>Remove</a>"
else
dat += "<i>No coin</i>&nbsp;&nbsp;<span class='linkOff'>Remove</span>"
if(!panel_open)//Vending machines do not dispense items when they are unscrewed
dat += "<h3>Select an Item</h3>"
dat += "<h3>Select an item</h3>"
dat += "<div class='statusDisplay'>"
if(product_records.len == 0)
dat += "<font color = 'red'>No product loaded!</font>"
@@ -243,10 +243,10 @@
for (var/datum/data/vending_product/R in display_records)
dat += "<li>"
if(R.amount > 0)
dat += "<a href='byond://?src=\ref[src];vend=\ref[R]'>Vend</A> "
dat += "<a href='byond://?src=\ref[src];vend=\ref[R]'>Vend</a> "
else
dat += "<span class='linkOff'>Sold Out</span> "
dat += "<FONT color = '[R.display_color]'><B>[R.product_name]</B>:</font>"
dat += "<span class='linkOff'>Sold out</span> "
dat += "<font color = '[R.display_color]'><b>[sanitize(R.product_name)]</b>:</font>"
dat += " <b>[R.amount]</b>"
dat += "</li>"
dat += "</ul>"
@@ -833,9 +833,6 @@
/obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
/obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
// There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
// Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it.
// The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu
//This one's from bay12
/obj/machinery/vending/robotics
@@ -848,5 +845,3 @@
/obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
+1 -1
View File
@@ -25,7 +25,7 @@
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "\improper Seraph"
icon_state = "seraph"
operation_req_access = list(access_cent_creed)
operation_req_access = list(access_cent_specops)
step_in = 3
health = 550
wreckage = /obj/structure/mecha_wreckage/seraph
+26
View File
@@ -0,0 +1,26 @@
/obj/mecha/combat/reticence
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
name = "\improper reticence"
icon_state = "reticence"
step_in = 2
dir_in = 1 //Facing North.
health = 100
deflect_chance = 3
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 15000
wreckage = /obj/structure/mecha_wreckage/reticence
operation_req_access = list(access_theatre)
add_req_access = 0
internal_damage_threshold = 25
max_equip = 2
step_energy_drain = 3
color = "#87878715"
stepsound = null
/obj/mecha/combat/reticence/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd //HAHA IT MAKES WALLS GET IT
ME.attach(src)
return
@@ -205,6 +205,14 @@
projectiles = 24
projectile_energy_cost = 15
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
fire_sound = "sound/weapons/Gunshot_silenced.ogg"
icon_state = "mecha_mime"
equip_cooldown = 30
projectile = /obj/item/projectile/bullet/mime
projectiles = 6
projectile_energy_cost = 50
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
name = "\improper LBX AC 10 \"Scattershot\""
+15 -13
View File
@@ -13,8 +13,10 @@
idle_power_usage = 20
active_power_usage = 5000
req_access = list(access_robotics)
var/time_coeff = 1.5 //can be upgraded with research
var/resource_coeff = 1.5 //can be upgraded with research
var/time_coeff = 1
var/resource_coeff = 1
var/time_coeff_tech = 1
var/resource_coeff_tech = 1
var/list/resources = list(
"metal"=0,
"glass"=0,
@@ -164,14 +166,14 @@
T += Ma.rating
T -= 1
var/diff
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/6,0.01)
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/8,0.01)
if(resource_coeff!=diff)
resource_coeff = diff
T = 0
for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts)
T += Ml.rating
T -= 1
diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/4,0.01)
diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01)
if(time_coeff!=diff)
time_coeff = diff
@@ -467,9 +469,9 @@
pmat += Ml.rating
if(pmat >= 1)
pmat -= 1//So the equations don't have to be reworked, upgrading a single part from T1 to T2 is == to 1 tech level
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T.level+pmat))/25,0.01)
if(resource_coeff!=diff)
resource_coeff = diff
diff = round(initial(resource_coeff_tech) - (initial(resource_coeff_tech)*(T.level+pmat))/30,0.01)
if(resource_coeff_tech>diff)
resource_coeff_tech = diff
output+="Production efficiency increased.<br>"
if("programming")
var/ptime = 0
@@ -477,9 +479,9 @@
ptime += Ma.rating
if(ptime >= 2)
ptime -= 2
diff = round(initial(time_coeff) - (initial(time_coeff)*(T.level+ptime))/25,0.1)
if(time_coeff!=diff)
time_coeff = diff
diff = round(initial(time_coeff_tech) - (initial(time_coeff_tech)*(T.level+ptime))/25,0.1)
if(time_coeff_tech>diff)
time_coeff_tech = diff
output+="Production routines updated.<br>"
return output
@@ -525,15 +527,15 @@
if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
var/list/L = part_sets["Misc"]
if(L.Find(part.type))
return round(part:construction_cost[resource]*(resource_coeff/2), roundto) //hacky scary skeletons send shivers down your spine
return round(part:construction_cost[resource]*resource_coeff, roundto)
return round(part:construction_cost[resource]*(resource_coeff/2)*resource_coeff_tech, roundto) //hacky scary skeletons send shivers down your spine
return round(part:construction_cost[resource]*resource_coeff*resource_coeff_tech, roundto)
else
return 0
/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(var/obj/item/part as obj, var/roundto=1)
//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects
if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
return round(part:construction_time*time_coeff, roundto)
return round(part:construction_time*time_coeff*time_coeff_tech, roundto)
else
return 0
+9 -7
View File
@@ -61,7 +61,6 @@
var/datum/global_iterator/pr_give_air //moves air from tank to cabin
var/datum/global_iterator/pr_internal_damage //processes internal damage
var/wreckage
var/list/equipment = new
@@ -69,6 +68,9 @@
var/max_equip = 3
var/datum/events/events
var/stepsound = 'sound/mecha/mechturn.ogg'
/obj/mecha/New()
..()
events = new
@@ -308,20 +310,20 @@
/obj/mecha/proc/mechturn(direction)
dir = direction
playsound(src,'sound/mecha/mechturn.ogg',40,1)
if(stepsound)
playsound(src,stepsound,40,1)
return 1
/obj/mecha/proc/mechstep(direction)
var/result = step(src,direction)
if(result)
playsound(src,'sound/mecha/mechstep.ogg',40,1)
if(result && stepsound)
playsound(src,stepsound,40,1)
return result
/obj/mecha/proc/mechsteprand()
var/result = step_rand(src)
if(result)
playsound(src,'sound/mecha/mechstep.ogg',40,1)
if(result && stepsound)
playsound(src,stepsound,40,1)
return result
/obj/mecha/Bump(var/atom/obstacle)
+4 -1
View File
@@ -100,7 +100,10 @@
name = "\improper Seraph wreckage"
icon_state = "seraph-broken"
/obj/structure/mecha_wreckage/reticence
name = "\improper Reticence wreckage"
icon_state = "reticence-broken"
color = "#87878715"
/obj/structure/mecha_wreckage/ripley
name = "\improper Ripley wreckage"
@@ -18,9 +18,11 @@
for(var/i = lowBoundX,i<=hiBoundX,i++)
for(var/j = lowBoundY,j<=hiBoundY,j++)
var/turf/T = locate(i,j,z)
if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY)
new /turf/simulated/wall/vault(locate(i,j,z),type)
T.ChangeTurf(/turf/simulated/wall/vault)
else
new /turf/simulated/floor/vault(locate(i,j,z),type)
T.ChangeTurf(/turf/simulated/floor/vault)
T.icon_state = "[type]vault"
qdel(src)
qdel(src)
+2 -2
View File
@@ -292,7 +292,7 @@ Code:
menu += " <A HREF='?src=\ref[src];choice=Status;statdisp=alert;alert=lockdown'>Lockdown</A> |"
menu += " <A HREF='?src=\ref[src];choice=Status;statdisp=alert;alert=biohazard'>Biohazard</A> \]<BR>"
if (43) //Muskets' and Rockdtben's power monitor :D
if (43)
menu = "<h4><img src=pda_power.png> Power Monitors - Please select one</h4><BR>"
powmonitor = null
powermonitors = list()
@@ -318,7 +318,7 @@ Code:
menu += "</FONT>"
if (433) //Muskets' and Rockdtben's power monitor :D
if (433)
menu = "<h4><img src=pda_power.png> Power Monitor </h4><BR>"
if(!powmonitor)
menu += "\red No connection<BR>"
@@ -17,6 +17,7 @@
g_amt = 20
origin_tech = "magnets=1;engineering=1"
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
hitsound = 'sound/weapons/tap.ogg'
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
@@ -448,7 +448,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/list/receive = list()
//for (var/obj/item/device/radio/R in radio_connection.devices)
for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) // Modified for security headset code -- TLE
for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
//if(R.accept_rad(src, message))
receive |= R.send_hear(display_freq, 0)
@@ -498,7 +498,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(!freq_text)
freq_text = format_frequency(display_freq)
var/part_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_b = "</span><b> \[[freq_text]\]</b> <span class='message'>"
var/part_c = "</span></span>"
if (display_freq==SYND_FREQ)
@@ -524,7 +524,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
//This following recording is intended for research and feedback in the use of department radio channels.
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>"
var/blackbox_msg = "[part_a][M.name][part_blackbox_b][quotedmsg][part_c]"
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
if(istype(blackbox))
@@ -53,6 +53,7 @@
if(..()) return 0
R.name = heldname
R.real_name = heldname
R.custom_name = heldname //Required or else if the cyborg's module changes, their name is lost.
return 1
+2 -1
View File
@@ -12,6 +12,7 @@
m_amt = 1875
max_amount = 60
attack_verb = list("hit", "bludgeoned", "whacked")
hitsound = 'sound/weapons/grenadelaunch.ogg'
/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob)
..()
@@ -66,4 +67,4 @@
return
/obj/item/stack/rods/cyborg/
m_amt = 0
m_amt = 0
+11 -11
View File
@@ -170,7 +170,7 @@ AI MODULES
/****************** New Freeform ******************/
/obj/item/weapon/aiModule/supplied/freeform // Slightly more dynamic freeform module -- TLE
/obj/item/weapon/aiModule/supplied/freeform
name = "'Freeform' AI Module"
lawpos = 0
desc = "A 'freeform' AI module: '<freeform>'"
@@ -215,7 +215,7 @@ AI MODULES
/******************** Purge ********************/
/obj/item/weapon/aiModule/reset/purge // -- TLE
/obj/item/weapon/aiModule/reset/purge
name = "'Purge' AI Module"
desc = "A 'purge' AI Module: 'Purges all laws.'"
origin_tech = "programming=3;materials=6"
@@ -232,7 +232,7 @@ AI MODULES
/******************** Asimov ********************/
/obj/item/weapon/aiModule/core/full/asimov // -- TLE
/obj/item/weapon/aiModule/core/full/asimov
name = "'Asimov' Core AI Module"
desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
@@ -243,7 +243,7 @@ AI MODULES
/******************** Asimov++ *********************/
/obj/item/weapon/aiModule/core/full/asimovpp //By Intigracy - RR //goddamnit RR you can't use "++" in item paths.
/obj/item/weapon/aiModule/core/full/asimovpp
name = "'Asimov++' Core AI Module"
desc = "Nanotrasen's homebrew improvements to the standard AI laws."
origin_tech = "programming=3;materials=4"
@@ -297,18 +297,18 @@ AI MODULES
/****************** T.Y.R.A.N.T. *****************/
/obj/item/weapon/aiModule/core/full/tyrant // -- Darem
/obj/item/weapon/aiModule/core/full/tyrant
name = "'T.Y.R.A.N.T.' Core AI Module"
desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=6;syndicate=2"
laws = list("Respect authority figures as long as they have the strength to rule over the weak",\
"Act with discipline", "Help only those who help you maintain or improve your status",\
"Punish those who challenge authority unless they are more fir to hold that authority")
"Punish those who challenge authority unless they are more fit to hold that authority")
/******************** Robocop ********************/
/obj/item/weapon/aiModule/core/full/robocop // -- TLE
/obj/item/weapon/aiModule/core/full/robocop
name = "'Robocop' Core AI Module"
desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'"
origin_tech = "programming=4"
@@ -319,7 +319,7 @@ AI MODULES
/******************** Antimov ********************/
/obj/item/weapon/aiModule/core/full/antimov // -- TLE
/obj/item/weapon/aiModule/core/full/antimov
name = "'Antimov' Core AI Module"
desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=4"
@@ -330,7 +330,7 @@ AI MODULES
/******************** Freeform Core ******************/
/obj/item/weapon/aiModule/core/freeformcore // Slightly more dynamic freeform module -- TLE
/obj/item/weapon/aiModule/core/freeformcore
name = "'Freeform' Core AI Module"
desc = "A 'freeform' Core AI module: '<freeform>'"
origin_tech = "programming=3;materials=6"
@@ -372,7 +372,7 @@ AI MODULES
/******************** Robocop ********************/
/obj/item/weapon/aiModule/robocop // -- TLE
/obj/item/weapon/aiModule/robocop
name = "'Robocop' core AI module"
desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'"
origin_tech = "programming=4"
@@ -388,7 +388,7 @@ AI MODULES
/******************** Antimov ********************/
/obj/item/weapon/aiModule/antimov // -- TLE
/obj/item/weapon/aiModule/antimov
name = "'Antimov' core AI module"
desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=4"
@@ -7,6 +7,7 @@
throw_range = 5
w_class = 1.0
var/damage_coeff = 1
var/list/fields
/obj/item/weapon/dnainjector/attack_paw(mob/user)
@@ -18,7 +19,7 @@
if(M.stat == DEAD) //prevents dead people from having their DNA changed
user << "<span class='notice'>You can't modify [M]'s DNA while \he's dead.</span>"
return
M.radiation += rand(20, 50)
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
if(fields)
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
if(fields["name"] && fields["UE"] && fields["blood_type"])
@@ -249,4 +250,4 @@
desc = "Will make you...less hairy."
New()
..()
fields = list("SE"=setblock(NULLED_SE, RACEBLOCK, repeat_string(DNA_BLOCK_SIZE,"0")))
fields = list("SE"=setblock(NULLED_SE, RACEBLOCK, repeat_string(DNA_BLOCK_SIZE,"0")))
@@ -77,7 +77,7 @@
log_game("[key_name(user)] planted C4 on [key_name(target)] with [timer] second fuse")
else
message_admins("[key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) planted C4 on [target.name] at ([target.x],[target.y],[target.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) with [timer] second fuse",0,1)
message_admins("[key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) planted C4 on [target.name] at ([target.x],[target.y],[target.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>) with [timer] second fuse",0,1)
log_game("[key_name(user)] planted C4 on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse")
target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2")
@@ -106,4 +106,4 @@
qdel(src)
/obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone)
return
return
@@ -54,7 +54,7 @@
if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(src,target) <= 1)
var/obj/o = target
o.reagents.trans_to(src, 50)
o.reagents.trans_to(src, max_water)
user << "\blue \The [src] is now refilled"
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
@@ -184,10 +184,10 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(0.05)
air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE
air_transfer.toxins = air_transfer.toxins * 5
target.assume_air(air_transfer)
//Burn it based on transfered gas
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500)
//location.hotspot_expose(1000,500,1)
air_master.add_to_active(target, 0)
return
@@ -49,16 +49,16 @@
if(user.a_intent == "harm")
if(!..()) return
if(M.stuttering < 8 && !(HULK in M.mutations))
M.stuttering = 8
M.Stun(5)
M.Weaken(5)
if(M.stuttering < 7 && !(HULK in M.mutations))
M.stuttering = 7
M.Stun(7)
M.Weaken(7)
M.visible_message("<span class='danger'>[M] has been beaten with [src] by [user]!</span>", \
"<span class='userdanger'>[M] has been beaten with [src] by [user]!</span>")
else
playsound(loc, 'sound/weapons/Genhit.ogg', 50, 1, -1)
M.Stun(5)
M.Weaken(5)
M.Stun(7)
M.Weaken(7)
M.visible_message("<span class='danger'>[M] has been stunned with [src] by [user]!</span>", \
"<span class='userdanger'>[M] has been stunned with [src] by [user]!</span>")
@@ -407,7 +407,7 @@
/obj/item/weapon/storage/box/mousetraps
name = "box of Pest-B-Gon mousetraps"
desc = "<B><FONT=red>WARNING:</FONT></B> <I>Keep out of reach of children</I>."
desc = "<span class='alert'>Keep out of reach of children.</span>"
icon_state = "mousetraps"
New()
+1 -1
View File
@@ -9,7 +9,7 @@
w_class = 3
origin_tech = "combat=2"
attack_verb = list("beaten")
var/stunforce = 5
var/stunforce = 7
var/status = 0
var/obj/item/weapon/stock_parts/cell/high/bcell = null
var/hitcost = 1000
@@ -205,7 +205,7 @@
air_contents.react()
pressure = air_contents.return_pressure()
var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
range = min(range, MAX_EX_LIGHT_RANGE) // was 8 - - - Changed to a configurable define -- TLE
range = min(range, MAX_EX_LIGHT_RANGE)
var/turf/epicenter = get_turf(loc)
//world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]"
@@ -1,3 +1,4 @@
//Hydroponics tank and base code
/obj/item/weapon/watertank
name = "backpack water tank"
desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants."
@@ -9,7 +10,7 @@
slowdown = 1
action_button_name = "Toggle Mister"
var/obj/item/weapon/reagent_containers/glass/mister/noz
var/obj/item/weapon/noz
var/on = 0
var/volume = 500
@@ -17,6 +18,13 @@
..()
create_reagents(volume)
return
/obj/item/weapon/watertank/examine()
set src in usr
..()
for(var/datum/reagent/R in reagents.reagent_list)
usr << "[round(R.volume)] units of [R.name] left."
return
/obj/item/weapon/watertank/ui_action_click()
if (usr.get_item_by_slot(slot_back) == src)
@@ -33,7 +41,7 @@
var/mob/living/carbon/human/user = usr
if(on)
//Detach the nozzle into the user's hands
noz = new(src)
make_noz()
var/list/L = list("left hand" = slot_l_hand,"right hand" = slot_r_hand)
if(!user.equip_in_one_of_slots(noz, L))
on = 0
@@ -42,6 +50,10 @@
//Remove from their hands and put back "into" the tank
remove_noz(user)
return
/obj/item/weapon/watertank/proc/make_noz()
noz = new /obj/item/weapon/reagent_containers/spray/mister(src)
return
/obj/item/weapon/watertank/equipped(mob/user, slot)
if (slot != slot_back)
@@ -64,7 +76,7 @@
// Therefore, it's designed to be "locked" to the player's hands or extended back onto
// the watertank backpack. Allowing it to be placed elsewhere or created without a parent
// watertank object will likely lead to weird behaviour or runtimes.
/obj/item/weapon/reagent_containers/glass/mister
/obj/item/weapon/reagent_containers/spray/mister
name = "water mister"
desc = "A mister nozzle attached to a water tank."
icon = 'icons/obj/hydroponics.dmi'
@@ -74,22 +86,92 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
volume = 500
can_be_placed_into = list(/obj/structure/sink)
var/obj/item/weapon/watertank/tank
/obj/item/weapon/reagent_containers/glass/mister/New(parent_tank)
/obj/item/weapon/reagent_containers/spray/mister/New(parent_tank)
..()
if (!parent_tank || !istype(parent_tank, /obj/item/weapon/watertank)) //To avoid weird issues from admin spawns
var/mob/living/carbon/human/M = usr
M.unEquip(src)
qdel(src)
else
if(check_tank_exists(parent_tank, usr, src))
tank = parent_tank
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
return
/obj/item/weapon/reagent_containers/glass/mister/dropped(mob/user as mob)
/obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob)
user << "<span class='notice'>The mister snaps back onto the watertank!</span>"
tank.on = 0
qdel(src)
/obj/item/weapon/reagent_containers/spray/mister/attack_self()
return
/proc/check_tank_exists(parent_tank, var/mob/living/carbon/human/M, var/obj/O)
if (!parent_tank || !istype(parent_tank, /obj/item/weapon/watertank) || !M || !istype(M)) //To avoid weird issues from admin spawns
M.unEquip(O)
qdel(O)
return 0
else
return 1
//Janitor tank
/obj/item/weapon/watertank/janitor
name = "backpack water tank"
desc = "A janitorial watertank backpack with nozzle to clean dirt and graffiti."
icon_state = "waterbackpackjani"
item_state = "waterbackpackjani"
/obj/item/weapon/watertank/janitor/New()
..()
reagents.add_reagent("cleaner", 250)
/obj/item/weapon/reagent_containers/spray/mister/janitor
name = "janitor spray nozzle"
desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes."
icon = 'icons/obj/hydroponics.dmi'
icon_state = "misterjani"
item_state = "misterjani"
amount_per_transfer_from_this = 5
possible_transfer_amounts = null
/obj/item/weapon/watertank/janitor/make_noz()
noz = new /obj/item/weapon/reagent_containers/spray/mister/janitor(src)
return
/obj/item/weapon/reagent_containers/spray/mister/janitor/attack_self(var/mob/user)
amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10)
user << "<span class='notice'>You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.</span>"
//Atmos tank
/obj/item/weapon/watertank/atmos
name = "backpack water tank"
desc = "A backpack watertank with fire extinguisher nozzle, intended to fight fires. Shouldn't toxins have one of these?"
icon_state = "waterbackpackatmos"
item_state = "waterbackpackatmos"
volume = 100
/obj/item/weapon/watertank/atmos/make_noz()
noz = new /obj/item/weapon/extinguisher/mini/nozzle(src)
/obj/item/weapon/extinguisher/mini/nozzle
name = "fire extinguisher nozzle"
desc = "A fire extinguisher nozzle attached to a water tank."
icon = 'icons/obj/hydroponics.dmi'
icon_state = "misteratmos"
item_state = "misteratmos"
safety = 0
var/obj/item/weapon/watertank/tank
/obj/item/weapon/extinguisher/mini/nozzle/New(parent_tank)
if(check_tank_exists(parent_tank, usr, src))
tank = parent_tank
reagents = tank.reagents
max_water = tank.volume
return
/obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob)
user << "<span class='notice'>The nozzle snaps back onto the watertank!</span>"
tank.on = 0
qdel(src)
/obj/item/weapon/extinguisher/mini/nozzle/attack_self()
return
+1
View File
@@ -107,6 +107,7 @@
m_amt = 80
origin_tech = "materials=1;engineering=1"
attack_verb = list("pinched", "nipped")
hitsound = 'sound/items/Wirecutter.ogg'
/obj/item/weapon/wirecutters/New()
if(prob(50))
@@ -176,8 +176,10 @@
if(src.large)
var/obj/item/weapon/grab/G = W
src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
user.drop_item()
else
user << "<span class='notice'>The locker is too small to stuff [W] into!</span>"
return
if(istype(W,/obj/item/tk_grab))
return 0
@@ -81,6 +81,7 @@
new /obj/item/device/lightreplacer(src)
new /obj/item/weapon/storage/bag/trash(src)
new /obj/item/clothing/shoes/galoshes(src)
new /obj/item/weapon/watertank/janitor(src)
/*
* Lawyer
@@ -45,13 +45,13 @@
..()
sleep(2)
new /obj/item/clothing/under/rank/head_of_personnel(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet(src)
new /obj/item/clothing/head/hopcap(src)
new /obj/item/weapon/cartridge/hop(src)
new /obj/item/device/radio/headset/heads/hop(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/weapon/storage/box/ids( src )
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/device/flash(src)
new /obj/item/clothing/glasses/sunglasses(src)
+15 -14
View File
@@ -538,20 +538,21 @@
/obj/structure/table/attackby(obj/item/I, mob/user)
if (istype(I, /obj/item/weapon/grab) && get_dist(src, user) < 2)
var/obj/item/weapon/grab/G = I
if(G.affecting.buckled)
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
return
if(G.state < GRAB_AGGRESSIVE)
user << "<span class='notice'>You need a better grip to do that!</span>"
return
if(!G.confirm())
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
G.affecting.visible_message("<span class='danger'>[G.assailant] pushes [G.affecting] onto [src].</span>", \
"<span class='userdanger'>[G.assailant] pushes [G.affecting] onto [src].</span>")
if (istype(I, /obj/item/weapon/grab))
if(get_dist(src, user) < 2)
var/obj/item/weapon/grab/G = I
if(G.affecting.buckled)
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
return
if(G.state < GRAB_AGGRESSIVE)
user << "<span class='notice'>You need a better grip to do that!</span>"
return
if(!G.confirm())
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
G.affecting.visible_message("<span class='danger'>[G.assailant] pushes [G.affecting] onto [src].</span>", \
"<span class='userdanger'>[G.assailant] pushes [G.affecting] onto [src].</span>")
qdel(I)
return
-8
View File
@@ -39,17 +39,9 @@
/turf/simulated/floor/vault
icon_state = "rockvault"
New(location,type)
..()
icon_state = "[type]vault"
/turf/simulated/wall/vault
icon_state = "rockvault"
New(location,type)
..()
icon_state = "[type]vault"
/turf/simulated/floor/engine
name = "reinforced floor"
icon_state = "engine"
+10 -8
View File
@@ -12,7 +12,8 @@ var/list/admin_verbs_default = list(
/client/proc/toggleprayers, /*toggles prayers on/off*/
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets
/client/proc/secrets,
/client/proc/reload_admins
)
var/list/admin_verbs_admin = list(
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
@@ -109,7 +110,6 @@ var/list/admin_verbs_debug = list(
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_admin_delete,
/client/proc/cmd_debug_del_all,
/client/proc/reload_admins,
/client/proc/restart_controller,
/client/proc/enable_debug_verbs,
/client/proc/callproc
@@ -189,6 +189,8 @@ var/list/admin_verbs_hideable = list(
/client/proc/add_admin_verbs()
if(holder)
control_freak = CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
var/rights = holder.rank.rights
verbs += admin_verbs_default
if(rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself
@@ -435,7 +437,7 @@ var/list/admin_verbs_hideable = list(
#undef MAX_WARNS
#undef AUTOBANTIME
/client/proc/drop_bomb() // Some admin dickery that can probably be done better -- TLE
/client/proc/drop_bomb()
set category = "Special Verbs"
set name = "Drop Bomb"
set desc = "Cause an explosion of varying strength at your location."
@@ -461,7 +463,7 @@ var/list/admin_verbs_hideable = list(
message_admins("\blue [ckey] creating an admin explosion at [epicenter.loc].")
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/give_spell(mob/T as mob in mob_list) // -- Urist
/client/proc/give_spell(mob/T as mob in mob_list)
set category = "Fun"
set name = "Give Spell"
set desc = "Gives a spell to a mob."
@@ -479,7 +481,7 @@ var/list/admin_verbs_hideable = list(
message_admins("\red Spells given to mindless mobs will not be transferred in mindswap or cloning!", 1)
/client/proc/give_disease(mob/T as mob in mob_list) // -- Giacom
/client/proc/give_disease(mob/T as mob in mob_list)
set category = "Fun"
set name = "Give Disease"
set desc = "Gives a Disease to a mob."
@@ -490,7 +492,7 @@ var/list/admin_verbs_hideable = list(
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/make_sound(var/obj/O in world) // -- TLE
/client/proc/make_sound(var/obj/O in world)
set category = "Special Verbs"
set name = "Make Sound"
set desc = "Display a message to everyone who can hear the target"
@@ -512,7 +514,7 @@ var/list/admin_verbs_hideable = list(
togglebuildmode(src.mob)
feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/object_talk(var/msg as text) // -- TLE
/client/proc/object_talk(var/msg as text)
set category = "Special Verbs"
set name = "oSay"
set desc = "Display a message to everyone who can hear the target"
@@ -523,7 +525,7 @@ var/list/admin_verbs_hideable = list(
V.show_message("<b>[mob.control_object.name]</b> says: \"" + msg + "\"", 2)
feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/kill_air() // -- TLE
/client/proc/kill_air()
set category = "Debug"
set name = "Kill Air"
set desc = "Toggle Air Processing"
+2
View File
@@ -2033,11 +2033,13 @@
switch(href_list["secretscoder"])
if("maint_access_brig")
for(var/obj/machinery/door/airlock/maintenance/M in world)
M.check_access()
if (access_maint_tunnels in M.req_access)
M.req_access = list(access_brig)
message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
if("maint_access_engiebrig")
for(var/obj/machinery/door/airlock/maintenance/M in world)
M.check_access()
if (access_maint_tunnels in M.req_access)
M.req_access = list()
M.req_one_access = list(access_brig,access_engine)
+1 -1
View File
@@ -316,7 +316,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
*/
/*
/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist
/client/proc/make_cultist(var/mob/M in world)
set category = "Fun"
set name = "Make Cultist"
set desc = "Makes target a cultist"
+2 -2
View File
@@ -87,9 +87,9 @@
/client/proc/reload_admins()
set name = "Reload Admins"
set category = "Debug"
set category = "Admin"
if(!check_rights(R_SERVER)) return
if(!src.holder) return
message_admins("[key_name_admin(usr)] manually reloaded admins")
load_admins()
+1 -1
View File
@@ -39,7 +39,7 @@
H.name = H.get_visible_name()
// usr.regenerate_icons() //So the name is updated properly
usr.loc = O.loc // Appear where the object you were controlling is -- TLE
usr.loc = O.loc
usr.client.eye = usr
usr.control_object = null
feedback_add_details("admin_verb","RO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+2 -2
View File
@@ -39,7 +39,7 @@
message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
/client/proc/cmd_admin_world_narrate()
set category = "Special Verbs"
set name = "Global Narrate"
@@ -56,7 +56,7 @@
message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)] : [msg]<BR>", 1)
feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE
/client/proc/cmd_admin_direct_narrate(var/mob/M)
set category = "Special Verbs"
set name = "Direct Narrate"
+2 -2
View File
@@ -4,7 +4,7 @@ var/list/preferences_datums = list()
#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE))))
var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm --rastaf
var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm
//some autodetection here.
"traitor" = IS_MODE_COMPILED("traitor"), // 0
"operative" = IS_MODE_COMPILED("nuclear"), // 1
@@ -13,7 +13,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"malf AI" = IS_MODE_COMPILED("malfunction"), // 4
"revolutionary" = IS_MODE_COMPILED("revolution"), // 5
"alien" = 1, //always show // 6
"pAI candidate" = 1, // -- TLE // 7
"pAI candidate" = 1, // 7
"cultist" = IS_MODE_COMPILED("cult"), // 8
"blob" = IS_MODE_COMPILED("blob"), // 9
)
+1 -1
View File
@@ -135,7 +135,7 @@ BLIND // can't see anything
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 3
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
+6
View File
@@ -25,6 +25,12 @@
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
//Head of Personnel
/obj/item/clothing/head/hopcap
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "Glory to Nanotrasen."
//Chaplain
/obj/item/clothing/head/chaplain_hood
name = "chaplain's hood"

Some files were not shown because too many files have changed in this diff Show More