mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 23:27:34 +01:00
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:
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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].")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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) )
|
||||
|
||||
@@ -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,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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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]"
|
||||
|
||||
|
||||
@@ -222,12 +222,12 @@
|
||||
if(premium.len > 0)
|
||||
dat += "<b>Coin slot:</b> "
|
||||
if (coin)
|
||||
dat += "[coin] <a href='byond://?src=\ref[src];remove_coin=1'>Remove</A>"
|
||||
dat += "[coin] <a href='byond://?src=\ref[src];remove_coin=1'>Remove</a>"
|
||||
else
|
||||
dat += "<i>No coin</i> <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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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\""
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user