Merge remote-tracking branch 'ParadiseSS13/master' into refactor-shieldgen

This commit is contained in:
Kyep
2018-08-13 15:07:37 -07:00
101 changed files with 3797 additions and 963 deletions
+210 -85
View File
@@ -174,6 +174,7 @@
"dr" = (/obj/structure/window/reinforced,/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
"ds" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
"dt" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/derelict/singularity_engine)
"du" = (/turf/space,/area/syndicate_depot/perimeter)
"dv" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
"dw" = (/obj/item/disk/data/demo,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"dx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
@@ -273,6 +274,7 @@
"fn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/hallway/primary)
"fo" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/hallway/primary)
"fp" = (/turf/simulated/floor/plasteel/airless,/area/derelict/hallway/primary)
"fq" = (/obj/effect/landmark{name = "syndi_depot_backup"},/turf/space,/area/syndicate_depot/perimeter)
"fr" = (/obj/item/ore/slag,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"fs" = (/obj/item/shard,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"ft" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
@@ -563,6 +565,7 @@
"kS" = (/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"kT" = (/obj/machinery/door/airlock/command{name = "AI Upload"; req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"kU" = (/obj/machinery/door/airlock/external{name = "Escape Airlock"},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"kV" = (/turf/space,/area/syndicate_depot/outer)
"kW" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"kX" = (/obj/structure/window/basic{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"kY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
@@ -616,42 +619,42 @@
"lU" = (/obj/structure/table,/obj/item/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel/airless,/area/derelict/teleporter)
"lV" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/derelict/teleporter)
"lW" = (/obj/machinery/power/apc/noalarm{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/plasteel/airless,/area/derelict/teleporter)
"lX" = (/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
"lY" = (/turf/simulated/mineral,/area/syndicate_depot)
"lZ" = (/obj/structure/lattice,/obj/machinery/porta_turret/syndicate/exterior,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
"ma" = (/turf/simulated/mineral/random,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_depot)
"mb" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_depot)
"mc" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; icon_state = "window5"; name = "window"; opacity = 0},/area/syndicate_depot)
"md" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_depot)
"me" = (/obj/machinery/door/airlock/hatch{req_access_txt = "150"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mf" = (/turf/simulated/mineral,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_depot)
"mg" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/syndicate_depot)
"mh" = (/obj/structure/closet/crate{name = "foot locker"},/obj/item/ammo_box/magazine/m10mm{pixel_x = 4},/obj/item/gun/projectile/automatic/pistol,/obj/item/clothing/head/helmet/swat/syndicate,/obj/item/clothing/glasses/thermal{pixel_x = -3; pixel_y = 3},/obj/item/clothing/shoes/black{pixel_y = -4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mi" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mj" = (/obj/structure/stool/bed,/obj/item/bedsheet/red,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mk" = (/obj/structure/closet/crate{name = "foot locker"},/obj/item/ammo_box/magazine/smgm45{pixel_x = 3},/obj/item/storage/fancy/cigarettes/cigpack_syndicate{pixel_x = -3; pixel_y = -2},/obj/item/lighter/zippo/gonzofist,/obj/item/clothing/under/syndicate{pixel_x = 3; pixel_y = 3},/obj/item/clothing/suit/armor/vest/combat{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"ml" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/syndicate_depot)
"mm" = (/obj/machinery/porta_turret/syndicate/interior,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mn" = (/obj/item/radio/intercom/syndicate{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mo" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mp" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/syndicate_depot)
"mq" = (/turf/simulated/mineral,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_depot)
"mr" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_depot)
"ms" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mt" = (/obj/structure/table,/obj/item/reagent_containers/food/snacks/syndicake,/obj/item/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mu" = (/obj/machinery/porta_turret/syndicate/grenade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mv" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mw" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_depot)
"mx" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"my" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/syndicate_depot)
"mz" = (/turf/simulated/floor/engine,/area/syndicate_depot)
"mA" = (/obj/structure/closet/crate{name = "munitions crate"},/obj/item/storage/box/donkpockets,/obj/item/ammo_box/magazine/mm556x45,/obj/item/gun/projectile/automatic/m90,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mB" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Telepad"; req_access_txt = "0"},/turf/simulated/floor/engine,/area/syndicate_depot)
"mC" = (/obj/machinery/telepad,/turf/simulated/floor/engine,/area/syndicate_depot)
"mD" = (/obj/structure/closet/crate{name = "munitions crate"},/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/storage/fancy/cigarettes/cigpack_syndicate,/obj/item/storage/firstaid/tactical,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mE" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mF" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mG" = (/turf/simulated/mineral,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_depot)
"lX" = (/turf/simulated/mineral,/area/syndicate_depot/outer)
"lY" = (/obj/structure/mineral_door/wood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"lZ" = (/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"ma" = (/obj/structure/spider,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mb" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mc" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"md" = (/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"me" = (/obj/item/reagent_containers/food/snacks/spiderleg,/obj/structure/spider,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mf" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mg" = (/obj/effect/landmark{name = "syndi_depot_bot"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"mh" = (/obj/machinery/navbeacon/invisible{codes_txt = "patrol;next_patrol=SDNW"; invisibility = 100; location = "SDNE"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"mi" = (/turf/simulated/wall,/area/syndicate_depot/outer)
"mj" = (/obj/effect/spawner/random_spawners/syndicate/turret/external,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"mk" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"ml" = (/obj/structure/table,/obj/item/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mm" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/spider,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mn" = (/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"mo" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"mp" = (/obj/structure/falsewall,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/outer)
"mq" = (/obj/structure/stool/bed,/obj/item/bedsheet/syndie,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mr" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ms" = (/obj/structure/table,/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mt" = (/obj/item/reagent_containers/food/drinks/flask/barflask,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mu" = (/obj/machinery/light{dir = 1; on = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mv" = (/obj/machinery/door/poddoor{id_tag = "syndi_depot_lvl2"; name = "Level 2 Blast Doors"; protected = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mw" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mx" = (/obj/effect/spawner/random_spawners/syndicate/layout/door,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"my" = (/obj/machinery/door/airlock/hatch/syndicate,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mz" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mA" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mB" = (/obj/structure/sign/poster/contraband/syndicate_recruitment,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"mC" = (/obj/effect/spawner/random_spawners/syndicate/loot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mD" = (/obj/machinery/light,/obj/effect/spawner/random_spawners/syndicate/turret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mE" = (/obj/structure/sign/poster/contraband/lamarr,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"mF" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mG" = (/obj/effect/spawner/random_spawners/syndicate/turret/external,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mH" = (/turf/simulated/mineral,/area/space)
"mI" = (/turf/simulated/floor/plating/airless/asteroid,/area/space)
"mJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/space)
@@ -663,8 +666,10 @@
"mP" = (/obj/structure/closet/crate,/obj/item/ore/bananium,/obj/item/ore/bananium,/obj/item/ore/bananium,/obj/item/ore/bananium,/obj/item/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
"mQ" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/ore/bananium,/obj/item/grenade/bananade,/turf/simulated/floor/plasteel/airless,/area/space)
"mR" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"mS" = (/obj/item/stack/sheet/metal{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mT" = (/obj/item/shard{icon_state = "small"},/turf/simulated/floor/plating/airless/asteroid,/area/space)
"mU" = (/obj/item/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
"mV" = (/obj/machinery/light{dir = 1; on = 1},/obj/item/stack/sheet/metal{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"mW" = (/obj/structure/computerframe/HONKputer,/turf/simulated/floor/plasteel/airless,/area/space)
"mX" = (/obj/item/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/space)
"mY" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/plasteel/airless,/area/space)
@@ -676,7 +681,11 @@
"ne" = (/turf/simulated/floor/plasteel/airless,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/space)
"nf" = (/obj/item/pickaxe,/turf/simulated/floor/plasteel/airless,/area/space)
"ng" = (/obj/structure/closet/crate,/obj/item/ore/bananium,/obj/item/ore/bananium,/obj/item/ore/bananium,/obj/item/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
"nh" = (/obj/effect/spawner/random_spawners/syndicate/trap/mine,/obj/item/stack/sheet/metal{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ni" = (/obj/item/flag/chameleon{icon_state = "syndiflag"; name = "Syndicate Flag"; used = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nj" = (/obj/machinery/computer/syndicate_depot/teleporter,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nk" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space)
"nl" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/decal/warning_stripes/blue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nm" = (/obj/item/shard,/turf/simulated/floor/plasteel/airless,/area/space)
"nn" = (/obj/item/broken_bottle,/turf/simulated/floor/plasteel/airless,/area/space)
"no" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/space)
@@ -687,6 +696,122 @@
"nt" = (/obj/item/shard,/turf/simulated/floor/plating/airless/asteroid,/area/space)
"nu" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/space)
"nv" = (/obj/effect/landmark/corpse/mime{name = "Mime Pilot"},/turf/simulated/floor/plasteel/airless,/area/space)
"nw" = (/obj/machinery/bluespace_beacon/syndicate,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"ny" = (/obj/machinery/navbeacon/invisible{codes_txt = "patrol;next_patrol=SDSW"; invisibility = 100; location = "SDNW"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"nz" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/spawner/random_spawners/syndicate/turret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nA" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nB" = (/obj/structure/sign/poster/contraband/fun_police,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"nC" = (/obj/machinery/door/poddoor/multi_tile/two_tile_hor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nD" = (/obj/effect/spawner/random_spawners/syndicate/trap/medbot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nE" = (/obj/effect/spawner/random_spawners/syndicate/mob,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nF" = (/obj/effect/spawner/random_spawners/syndicate/loot/level2,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nG" = (/obj/item/lighter/zippo/black,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nH" = (/obj/structure/sign/poster/contraband/lusty_xenomorph,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"nI" = (/obj/effect/spawner/random_spawners/syndicate/layout/spacepod,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nJ" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/spawner/random_spawners/syndicate/loot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nK" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/spawner/random_spawners/syndicate/loot/level2,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nL" = (/obj/structure/sign/poster/official/high_class_martini,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"nM" = (/obj/machinery/light{dir = 8},/obj/effect/spawner/random_spawners/syndicate/loot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nN" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/spawner/random_spawners/syndicate/loot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nO" = (/obj/effect/spawner/random_spawners/syndicate/turret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nP" = (/obj/structure/dispenser,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nQ" = (/obj/structure/sign/poster/official/air1,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"nR" = (/obj/item/storage/box/donkpockets,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nS" = (/obj/machinery/computer/syndicate_depot/syndiecomms,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nT" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nU" = (/obj/structure/sign/poster/contraband/tools,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"nV" = (/obj/structure/sign/poster/contraband/hacking_guide,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"nW" = (/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nX" = (/obj/effect/spawner/random_spawners/syndicate/loot/level3,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nY" = (/obj/machinery/atmospherics/unary/passive_vent/high_volume,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"nZ" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oa" = (/obj/machinery/vending/syndisnack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ob" = (/obj/machinery/door/airlock/silver,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oc" = (/obj/structure/closet/secure_closet/syndicate/depot,/obj/effect/spawner/random_spawners/syndicate/trap/documents,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"od" = (/obj/machinery/computer/syndicate_depot/selfdestruct,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oe" = (/obj/effect/decal/warning_stripes/red,/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/fusionreactor,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"of" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"og" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oh" = (/obj/structure/table,/obj/effect/spawner/random_spawners/syndicate/trap/pizzabomb,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oi" = (/obj/structure/table,/obj/item/reagent_containers/food/snacks/syndicake,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oj" = (/obj/machinery/vending/syndicigs,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ok" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ol" = (/obj/effect/spawner/random_spawners/syndicate/layout/door/secret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"om" = (/turf/simulated/floor/mineral/silver,/area/syndicate_depot/core)
"on" = (/obj/machinery/door/airlock/plasma{welded = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oo" = (/turf/simulated/floor/mineral/plasma,/area/syndicate_depot/core)
"op" = (/obj/structure/table,/obj/item/wrench,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oq" = (/obj/structure/table,/obj/item/folder/syndicate/yellow,/obj/item/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"or" = (/obj/effect/landmark{dir = 6; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"os" = (/obj/structure/cable,/obj/machinery/power/terminal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ot" = (/obj/effect/spawner/random_spawners/syndicate/layout/door/vault,/obj/effect/landmark{dir = 4; name = "syndi_depot_shield"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ou" = (/obj/effect/landmark{dir = 4; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"ov" = (/obj/structure/sign/poster/contraband/energy_swords,/obj/effect/landmark{dir = 4; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"ow" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/landmark{dir = 4; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"ox" = (/obj/effect/landmark{dir = 10; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"oy" = (/obj/effect/spawner/random_spawners/syndicate/mob,/turf/simulated/floor/mineral/plasma,/area/syndicate_depot/core)
"oz" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/mineral/silver,/area/syndicate_depot/core)
"oA" = (/obj/structure/sign/poster/official/state_laws,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"oB" = (/obj/effect/landmark{name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"oC" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes/upgraded{charge = 5e+006; input_level = 20000; output_level = 100000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oD" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oE" = (/obj/machinery/turretid/syndicate{name = "internal turret controls"; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oF" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/spawner/random_spawners/syndicate/loot/level4,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oG" = (/obj/effect/spawner/random_spawners/syndicate/loot/level4,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oH" = (/obj/effect/spawner/random_spawners/syndicate/loot/level4,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oI" = (/obj/machinery/computer/syndicate_depot/aiterminal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oJ" = (/obj/structure/mirror{pixel_x = -32},/turf/simulated/floor/mineral/silver,/area/syndicate_depot/core)
"oK" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 0},/turf/simulated/floor/mineral/plasma,/area/syndicate_depot/core)
"oL" = (/obj/structure/sign/poster/contraband/missing_gloves,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"oM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oN" = (/obj/machinery/atmospherics/unary/passive_vent/high_volume{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oO" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/spawner/random_spawners/syndicate/layout/door/vault,/obj/effect/landmark{name = "syndi_depot_shield"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oS" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oT" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oU" = (/obj/structure/sign/poster/contraband/revolver,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/landmark{name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"oV" = (/obj/machinery/atmospherics/unary/passive_vent/high_volume{dir = 8},/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oW" = (/obj/structure/mirror{pixel_x = -32},/turf/simulated/floor/mineral/plasma,/area/syndicate_depot/core)
"oX" = (/obj/structure/toilet{dir = 8},/turf/simulated/floor/mineral/silver,/area/syndicate_depot/core)
"oY" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"oZ" = (/obj/machinery/light,/obj/effect/spawner/random_spawners/syndicate/loot/level3,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pb" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{dir = 4; pixel_x = 24; req_access = list(150)},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pc" = (/obj/machinery/computer/syndicate_depot/shieldcontrol,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pd" = (/obj/effect/spawner/random_spawners/syndicate/layout/door/vault,/obj/effect/landmark{name = "syndi_depot_shield"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pe" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"pf" = (/obj/structure/sign/poster/official/obey,/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"pg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"ph" = (/obj/effect/landmark{dir = 5; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"pi" = (/obj/structure/sign/poster/contraband/syndicate_pistol,/obj/effect/landmark{dir = 4; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"pj" = (/obj/effect/landmark{dir = 9; name = "syndi_depot_shield"},/turf/simulated/wall/r_wall,/area/syndicate_depot/core)
"pk" = (/mob/living/silicon/decoy/syndicate/depot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pl" = (/obj/machinery/door_control{active_power_usage = 0; id = "syndi_depot_rear"; idle_power_usage = 0; name = "mysterious button"; normaldoorcontrol = 0; use_power = 0},/obj/structure/sign/poster/contraband/syndicate_recruitment,/turf/simulated/wall,/area/syndicate_depot/core)
"pm" = (/turf/simulated/mineral,/area/syndicate_depot/core)
"pn" = (/obj/effect/spawner/random_spawners/blood_maybe,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/core)
"po" = (/obj/machinery/light{dir = 1; on = 1},/obj/effect/spawner/random_spawners/syndicate/turret,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pp" = (/obj/machinery/light{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pq" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pr" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"ps" = (/obj/machinery/door_control{active_power_usage = 0; id = "syndi_depot_rear"; idle_power_usage = 0; name = "mysterious button"; normaldoorcontrol = 0; pixel_x = 24; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pt" = (/obj/item/candle,/obj/structure/table,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/core)
"pu" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/core)
"pv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pw" = (/obj/machinery/computer/syndicate_depot/doors,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"px" = (/obj/machinery/atmospherics/unary/passive_vent/high_volume{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"py" = (/obj/machinery/door/poddoor{id_tag = "syndi_depot_rear"; name = "Sealed Doors"; protected = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pz" = (/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/core)
"pA" = (/obj/structure/falsewall,/turf/simulated/floor/plating/airless,/area/syndicate_depot/core)
"pB" = (/obj/machinery/light/small{dir = 8},/obj/effect/spawner/random_spawners/syndicate/loot/level2,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pC" = (/turf/simulated/wall,/area/syndicate_depot/core)
"pD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pE" = (/obj/machinery/navbeacon/invisible{codes_txt = "patrol;next_patrol=SDSE"; invisibility = 100; location = "SDSW"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
"pF" = (/obj/machinery/light/small{dir = 8},/obj/effect/spawner/random_spawners/syndicate/turret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot/core)
"pG" = (/obj/machinery/power/apc/noalarm{dir = 4; pixel_x = 24},/obj/structure/cable,/obj/machinery/turretid/syndicate{name = "external turret controls"; pixel_y = 32},/turf/simulated/floor/plating/airless,/area/syndicate_depot/outer)
"pH" = (/obj/machinery/navbeacon/invisible{codes_txt = "patrol;next_patrol=SDNE"; invisibility = 100; location = "SDSE"},/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot/outer)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -874,55 +999,6 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalXaaaalXlXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlXlXaalXlXlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlXlXlXlYlYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlZlXlZlYlYlYlYmambmcmbmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYmambmembmflYlYlYmgmhmimjmgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYmgmimimimglYlYmamgmkmimjmlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYmgmmmimmmgmbmbmbmgmnmimompaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYmqmbmembmrmimimimemimsmtmglYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYmgmimimimimimumgmbmbmbmbmflYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYmgmimimimimimimemimvmwmbmbmbmflYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYmqmbmbmbmbmbmbmgmnmimimxmymzmglYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYlYlYlYlYlYmqmgmAmimimimBmCmglYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYlYlYlYlYlYmgmDmimEmFmymzmglYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYmqmbmbmbmbmbmbmGlYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYlYlYlYlYlYlYlYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYlYlYlYlYlYlYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYlYlYlYlYlYlYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalYlYaalYlYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvcvcvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznknknkmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamLnnnmncmLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznonpaznpnqmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamInrnomTnsnsnqmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHaaaamHmHmHmHmHntnvnumHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmImImHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImIaaaaczmKmKmLmLmKmKmKmKmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmIczmKmNmImOazazmPmPmQazmRdlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmTazazazazazmUazmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmWmXmYazmZmUazmUazmUmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHnaaznbazncazmOazazazmUmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHndmKneaznfazazngmPmPazmRhZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHndmKmKmLmLmKmKmKmKmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaamHmHmHmHmHmImImHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmImImImHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamImImHmImHmHmImImIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHaaaaaaaaaaaamImHmHmHmHmHmHmIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -933,6 +1009,55 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadudududududududufqdudududududufqdudududududududududufqdududududududududufqdududududududududududufqdudududududududuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXlXkVkVkVkVkVkVkVlXkVkVkVkVkVkVkVlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVfqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXlXkVkVkVkVkVlXlXkVkVlXkVkVkVkVlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafqkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXlXlXkVlXlXlXkVkVlXlXlXlXkVlXlXlXlXlXkVlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVlXkVkVkVkVkVlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVlXlXlXlXlXlYlYlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlZlXlXlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVlXlXmbmamdmcmcmcmfmemalXlXmgmhlZlZlZlZlZlZlZlZlZlZlZlZlZlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvcvcvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVlXlXmimcmcmcmcmcmcmcmdmamilXlZlZmjlZmklZlZlZlZlZmklZmjlZlZlXlXlXlXkVkVkVkVlXkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznknknkmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVlXlXlXmimcmcmcmcmcmcmlmcmmmilXlXlXmnmnmnmnmnmnmnmnmnmnmnmolZlZlXlXlXlXkVkVlXlXlXkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamLnnnmncmLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVlXlXlXlXmimpmpmimimimimimimimilXlXlXmnmqmqmqmrmtmsmnmumqmnmvmnlZlZlXlXlXkVkVkVkVlXkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznonpaznpnqmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlXlXlXlXmcmclXlXlXlXlXlXlXlXlXlXlXmnmwmwmwmwmwmwmxmwmwmymzmnlZlZlXlXlXlXlXkVkVkVlXkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamInrnomTnsnsnqmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlZlZmnmnmAmwmnmnmnmnmnmBmnmnmnmnmnmnmCmCmDmwmwmwmnmxmEmnmnmnmjlZlZlXlXlXlXlXkVkVlXkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHaaaamHmHmHmHmHntnvnumHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVlXlXlXmglZmnmwmwmwmFmwmGmnmSmSnhmVmwnimnmnmnmnmnmnmnmxmnmwnlnjnwmnlZlZlZlXlXlXlXlXkVlXlXkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmImImHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafqkVkVkVkVlXlXlZnynxmnmGmzmwmwmwmzmxmwmSmSnhnhmwmxmwmwmwnzmwmwmwmnmwmwnAmwmnmolZlXlXlXkVkVlXlXlXkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVlXlXlXlZlZlZmnmnmnnBnCmwmnmnmwmwmSmnmnmxmnnDmwmwmwnEmwnFmnmwnimwnimnlZlZlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImIaaaaczmKmKmLmLmKmKmKmKmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVlXlXlXlXlZmjmnmwmwmwmwmwmnmnmnmnmnmnnGmwmnnFnFmwmwmwmwnFmnmymnnHmnmnlZlZlXlXkVkVlXkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmIczmKmNmImOazazmPmPmQazmRdlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVlXlXlXlZlZmnnImwmwmwmwmnmCnJnFmnnKmwmwmnmnnLmnmnmxmnmnmnmwmwnJmCmnlZlZlXlXlXlXlXkVkVkVkVkVkVkVkVkVkVkVfqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmTazazazazazmUazmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlZlZmnnMmwmwmwnNmnmwmwmwmxmwmwmwmxmwmwnOmFmwmwmwmxmwmwmwmwmnlZlZlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmWmXmYazmZmUazmUazmUmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlZnxnQnPmwmwmwmwmxmwmwnEmnnOmwmwmnmwmwmwmwmwmwnRmnnimrnSmwmnmolZlZlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHnaaznbazncazmOazazazmUmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVlXlXlXlZlZmnnTnOmwmwnOmnnUmxmnmnmnnVmnmnnWnYnXnZnZmwoamnmnmnmnobmnmjlZlXlXlXlXmilXkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHndmKneaznfazazngmPmPazmRhZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVlXlXlXlZlZmjmnmnmnmxmnmnmnocmwmFmrodofoemnmwognXoiohmwojolokonomoomnlZlZlXlXlXlZlZlZmikVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHndmKmKmLmLmKmKmKmKmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVlXlXlXlZlZmvmzmymwmwopmnoqmwmwmwmwosorouotowovouoxmxmnmnolmnoyozmnlZlZlXlXlZlZmilZlZkVkVkVlXkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVlXlXlXlZlZmnmnoAmwnEmwmxmwnOmwnWmwoCoBoEoDoGoFoHoBmwmwnzoImnoJoKmnlZlZlXlXmilZlXlZlZkVkVmilXlZkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaamHmHmHmHmHmImImHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlZlZnxmnmCmwmwnNoLmwmwmwoNoMoPoOoRoQoToSoSoUoRoVmwnAmnoWoXmnmolZlXlXlZlZlXlXlZkVkVkVlZlZkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmImImImHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlZlZlZmnmnmnmxmnmnoYnXoZmwpapboBpcmwogmwmwpdmwmwmwmwmnobmnmnlZlZlXlXlZlXlXlXlZlZkVlXmilXlZkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamImImHmImHmHmImImIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVlXlXlXlZlZmjlZpemnmwmwmnpfmnmnmxpgmnphoupiowotoupjnXnXmwpkmnmwnOmnlZlZpmplpnlXlZlZlZlZmilXkVlXkVkVkVkVfqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHaaaaaaaaaaaamImHmHmHmHmHmHmIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafqkVkVkVkVlXlXlXlZlZlZlZlZmnnEmwmFmwmwmnmwpomnoYnXnXppmwpqmnmnmnmxmnmnprpsmnmymnpmptpumilZmilXlZlXlZlZlXkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVlXlXlXlXlXlXlXlZlZmnmnnFpwpvmwmxmwpamxmwmwmwpxnWmwmxmwmFmwnhmxmwmwmymzpypApzpnlXlZlXlZlZlZlXlZlXlXkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVlXlXlXlXlXlXlZlZmnmnmnmnmnmnpBpamnmwmwnOmwmwmwmnnOmwmwmwmBmwmwmnmymnpmpmpClXlZlZlZlXlZlXlZmikVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVlXkVlXlXlXlZmjlZpelZlZlZmnmnpgmnmnmxmnmxmnmnmnmnnFmwmwmnmCmCmnlZlZlXlXlXkVlZlXmilXlZlXlZlXkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVlXlXlXlZlZmglZlZlZlZmvpDmymwmwmnmwnKnFnFmnnFmwnEmnmnmnmnlZlZlXlXlZlXkVkVlZkVlZlZlZkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVlXlXkVlXlXlZpElZlZlZlZmnpgmnpFmwmxnEmwmwmwmxmwmwmwmnlZlZpelZlZlXlXlZlZkVkVkVkVlZlZkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVlXlXlZlZlZlZmjlZpepGmnmnmnmnmnmnmnmwmnmwmwnOmnlZlZlZlZlZlXlXlZmikVkVkVkVlZkVkVkVkVkVkVkVfqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVlXlXlXlXlXlXlZlZlZlZlZlZpelZlZlZlZmnmnmnmnmnmnmnlZlZmglZlXlXlXlZkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafqkVkVkVkVkVkVkVkVkVlXlXlXlXlXlXlXlXlXlXlXlXlZlZlZlZlZmjlZlZpelZlZlZpemjpHlZlXlXlXlXkVlXkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVlXlXkVkVlXlXlXlXlXlXlXlXlXlXlZlZlZlZlZlZlZlZlZlZlZlZlXlXlXlXlXkVkVlXkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVlXkVkVkVlXlXlXkVkVlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXkVkVlXkVkVlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXlXlXlXkVkVlXlXlXkVkVlXlXlXkVkVlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXkVkVkVkVkVkVlXlXkVkVlXlXlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVlXlXkVkVkVkVlXkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadukVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVkVduaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadududududududududududufqdududududududududufqdudududududududududududududufqdududududududududufqdudududududududududuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+4 -5
View File
@@ -32,11 +32,10 @@
#define CANWEAKEN 2
#define CANPARALYSE 4
#define CANPUSH 8
#define LEAPING 16
#define PASSEMOTES 32 //Mob has a cortical borer or holders inside of it that need to see emotes.
#define GOTTAGOFAST 64
#define GOTTAGOREALLYFAST 128
#define IGNORESLOWDOWN 256
#define PASSEMOTES 16 //Mob has a cortical borer or holders inside of it that need to see emotes.
#define GOTTAGOFAST 32
#define GOTTAGOREALLYFAST 64
#define IGNORESLOWDOWN 128
#define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
#define XENO_HOST 16384 //Tracks whether we're gonna be a baby alien's mummy.
+12
View File
@@ -1,3 +1,15 @@
/mob/living/simple_animal/create_mob_hud()
hud_used = new /datum/hud/simple_animal(src)
/datum/hud/simple_animal/New(mob/user)
..()
var/obj/screen/using
using = new /obj/screen/act_intent/simple_animal()
using.icon_state = mymob.a_intent
static_inventory += using
action_intent = using
/mob/living/simple_animal/pet/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/corgi(src)
+5 -3
View File
@@ -71,17 +71,14 @@
if(ishuman(usr))
var/_x = text2num(params2list(params)["icon-x"])
var/_y = text2num(params2list(params)["icon-y"])
if(_x<=16 && _y<=16)
usr.a_intent_change(INTENT_HARM)
else if(_x<=16 && _y>=17)
usr.a_intent_change(INTENT_HELP)
else if(_x>=17 && _y<=16)
usr.a_intent_change(INTENT_GRAB)
else if(_x>=17 && _y>=17)
usr.a_intent_change(INTENT_DISARM)
else
usr.a_intent_change("right")
@@ -97,6 +94,11 @@
name = "run/walk toggle"
icon_state = "running"
/obj/screen/act_intent/simple_animal
icon = 'icons/mob/screen_simplemob.dmi'
screen_loc = ui_acti
/obj/screen/mov_intent/Click()
if(iscarbon(usr))
var/mob/living/carbon/C = usr
+11
View File
@@ -172,6 +172,9 @@
var/disable_away_missions = 0 // disable away missions
var/disable_space_ruins = 0 //disable space ruins
var/extra_space_ruin_levels_min = 2
var/extra_space_ruin_levels_max = 4
var/ooc_allowed = 1
var/looc_allowed = 1
var/dooc_allowed = 1
@@ -581,6 +584,14 @@
if("disable_cid_warn_popup")
config.disable_cid_warn_popup = 1
if("extra_space_ruin_levels_min")
var/vvalue = text2num(value)
config.extra_space_ruin_levels_min = max(vvalue, 0)
if("extra_space_ruin_levels_max")
var/vvalue = text2num(value)
config.extra_space_ruin_levels_max = max(vvalue, 0)
if("max_loadout_points")
config.max_loadout_points = text2num(value)
+5 -6
View File
@@ -46,13 +46,12 @@ var/global/pipe_processing_killed = 0
seedRuins(level_name_to_num(EMPTY_AREA), rand(0, 3), /area/space, space_ruins_templates)
log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.")
// We'll keep this around for the time when we finally expunge all
// code that checks on hard-defined z positions
// load in extra levels of space ruins
// var/num_extra_space = 6
// for(var/i = 1, i <= num_extra_space, i++)
// var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED)
// seedRuins(zlev, rand(0, 3), /area/space, space_ruins_templates)
var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max)
for(var/i = 1, i <= num_extra_space, i++)
var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED)
seedRuins(zlev, rand(0, 3), /area/space, space_ruins_templates)
space_manager.do_transition_setup()
+1 -1
View File
@@ -43,7 +43,7 @@ SUBSYSTEM_DEF(atoms)
count = atoms.len
for(var/I in atoms)
var/atom/A = I
if(!A.initialized)
if(A && !A.initialized)
if(InitAtom(I, mapload_arg))
atoms -= I
CHECK_TICK
+5 -1
View File
@@ -37,4 +37,8 @@
qdel(C, FALSE, TRUE)
dc.Cut()
return QDEL_HINT_QUEUE
return QDEL_HINT_QUEUE
/datum/nothing
// Placeholder object, used for ispath checks. Has to be defined to prevent errors, but shouldn't ever be created.
+1 -1
View File
@@ -66,7 +66,7 @@
chosentype = pick(virspecies)
chosensuff = pick(virsuffix)
name = "[chosentype] [chosensuff]"
name = "[initial(chosentype.name)] [chosensuff]"
/datum/disease/kingstons/advanced/stage_act()
..()
-6
View File
@@ -543,12 +543,6 @@ var/list/ghostteleportlocs = list()
name = "\improper Syndicate Infiltrators"
icon_state = "syndie-elite"
/area/syndicate_depot
name = "\improper Suspicious Supply Depot"
icon_state = "red"
tele_proof = 1
requires_power = 0
//EXTRA
/area/asteroid // -- TLE
+430
View File
@@ -0,0 +1,430 @@
/area/syndicate_depot
name = "Suspicious Supply Depot"
icon_state = "dark"
tele_proof = 1
/area/syndicate_depot/core
icon_state = "red"
var/local_alarm = FALSE // Level 1: Local alarm tripped, bot spawned, red fire overlay activated
var/called_backup = FALSE // Level 2: Remote alarm tripped. Bot may path through depot. Backup spawned.
var/used_self_destruct = FALSE // Level 3: Self destruct activated. Depot will be destroyed shortly.
var/run_started = FALSE
var/run_finished = FALSE
// Soft UID-based refs
var/list/guard_list = list()
var/list/hostile_list = list()
var/list/dead_list = list()
var/list/peaceful_list = list()
var/list/shield_list = list()
var/list/alert_log = list() // no refs, just a simple list of text strings
var/used_lockdown = FALSE
var/destroyed = FALSE
var/something_looted = FALSE
var/on_peaceful = FALSE
var/peace_betrayed = FALSE
var/detected_mech = FALSE
var/detected_pod = FALSE
var/detected_double_agent = FALSE
var/obj/machinery/computer/syndicate_depot/syndiecomms/comms_computer = null
var/obj/structure/fusionreactor/reactor
/area/syndicate_depot/core/updateicon()
if(destroyed)
icon_state = null
invisibility = INVISIBILITY_MAXIMUM
else if(on_peaceful)
icon_state = "green"
invisibility = INVISIBILITY_LIGHTING
else if(used_self_destruct)
icon_state = "radiation"
invisibility = INVISIBILITY_LIGHTING
else if(called_backup)
icon_state = "red"
invisibility = INVISIBILITY_LIGHTING
else if(local_alarm)
icon_state = "bluenew"
invisibility = INVISIBILITY_LIGHTING
else
icon_state = null
invisibility = INVISIBILITY_MAXIMUM
/area/syndicate_depot/core/proc/reset_alert()
if(used_self_destruct)
return
local_alarm = FALSE
called_backup = FALSE
used_self_destruct = FALSE
something_looted = FALSE
detected_mech = FALSE
detected_pod = FALSE
detected_double_agent = FALSE
updateicon()
despawn_guards()
guard_list = list()
hostile_list = list()
dead_list = list()
peaceful_list = list()
alert_log += "Alert level reset."
/area/syndicate_depot/core/proc/increase_alert(reason)
if(on_peaceful)
peaceful_mode(FALSE, FALSE)
peace_betrayed = TRUE
activate_self_destruct("Depot has been infiltrated by double-agents.", TRUE, null)
return
if(!local_alarm)
local_alarm(reason, FALSE)
return
if(!called_backup)
call_backup(reason, FALSE)
return
if(!used_self_destruct)
activate_self_destruct(reason, FALSE, null)
updateicon()
/area/syndicate_depot/core/proc/locker_looted()
something_looted = TRUE
if(on_peaceful)
increase_alert("Thieves!")
/area/syndicate_depot/core/proc/turret_died()
something_looted = TRUE
if(on_peaceful)
increase_alert("Vandals!")
/area/syndicate_depot/core/proc/saw_mech(obj/mecha/E)
if(detected_mech)
return
detected_mech = TRUE
increase_alert("Hostile mecha detected: [E]")
/area/syndicate_depot/core/proc/saw_pod(obj/spacepod/P)
if(detected_pod)
return
detected_pod = TRUE
increase_alert("Hostile spacepod detected: [P]")
/area/syndicate_depot/core/proc/saw_double_agent(mob/living/M)
if(detected_double_agent)
return
detected_double_agent = TRUE
increase_alert("Hostile double-agent detected: [M]")
/area/syndicate_depot/core/proc/peaceful_mode(newvalue, bycomputer)
if(newvalue)
log_game("Depot visit: started")
alert_log += "Code GREEN: visitor mode started."
ghostlog("The syndicate depot has visitors")
for(var/mob/living/simple_animal/bot/medbot/syndicate/B in src)
qdel(B)
for(var/mob/living/simple_animal/hostile/syndicate/N in src)
N.a_intent = INTENT_HELP
for(var/obj/structure/closet/secure_closet/syndicate/depot/L in src)
if(L.opened)
L.close()
if(!L.locked)
L.locked = 1
L.req_access = list(access_syndicate_leader)
L.update_icon()
for(var/obj/machinery/computer/syndicate_depot/teleporter/P in src)
if(!P.portal_enabled)
P.toggle_portal()
for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src)
if(!V.density)
V.close()
V.emergency = 0
if(!V.locked)
V.locked = !V.locked
V.update_icon()
else
log_game("Depot visit: ended")
alert_log += "Visitor mode ended."
for(var/mob/living/simple_animal/hostile/syndicate/N in src)
N.a_intent = INTENT_HARM
for(var/obj/machinery/door/airlock/A in src)
A.req_access_txt = "[access_syndicate_leader]"
for(var/obj/structure/closet/secure_closet/syndicate/depot/L in src)
if(L.locked)
L.locked = !L.locked
L.req_access = list()
L.update_icon()
on_peaceful = newvalue
if(newvalue)
announce_here("Depot Visitor","A Syndicate agent is visiting the depot.")
else
if(bycomputer)
message_admins("Syndicate Depot visitor mode deactivated. Visitors:")
announce_here("Depot Alert","Visit ended. All visting agents signed out.")
else
message_admins("Syndicate Depot visitor mode auto-deactivated because visitors robbed depot! Visitors:")
announce_here("Depot Alert","A visiting agent has betrayed the Syndicate. Shoot all visitors on sight!")
for(var/mob/M in list_getmobs(peaceful_list))
if("syndicate" in M.faction)
M.faction -= "syndicate"
message_admins("- SYNDI DEPOT VISITOR: [ADMIN_FULLMONTY(M)]")
list_add(M, hostile_list)
peaceful_list = list()
updateicon()
/area/syndicate_depot/core/proc/local_alarm(reason, silent)
if(local_alarm)
return
log_game("Depot code: blue: " + list_show(hostile_list, TRUE))
ghostlog("The syndicate depot has declared code blue.")
alert_log += "Code BLUE: [reason]"
local_alarm = TRUE
if(!silent)
announce_here("Depot Code BLUE", reason)
var/list/possible_bot_spawns = list()
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "syndi_depot_bot")
possible_bot_spawns |= L
if(possible_bot_spawns.len)
var/obj/effect/landmark/S = pick(possible_bot_spawns)
new /obj/effect/portal(get_turf(S))
var/mob/living/simple_animal/bot/ed209/syndicate/B = new /mob/living/simple_animal/bot/ed209/syndicate(get_turf(S))
list_add(B, guard_list)
B.depotarea = src
updateicon()
/area/syndicate_depot/core/proc/call_backup(reason, silent)
if(called_backup || used_self_destruct)
return
log_game("Depot code: red: " + list_show(hostile_list, TRUE))
ghostlog("The syndicate depot has declared code red.")
alert_log += "Code RED: [reason]"
called_backup = TRUE
lockout_computers()
for(var/obj/machinery/door/poddoor/P in airlocks)
if(P.density && P.id_tag == "syndi_depot_lvl2" && !P.operating)
spawn(0)
P.open()
if(!silent)
announce_here("Depot Code RED", reason)
var/comms_online = FALSE
if(istype(comms_computer))
if(!(comms_computer.stat & (NOPOWER|BROKEN)))
comms_online = TRUE
if(comms_online)
spawn(0)
for(var/obj/effect/landmark/L in landmarks_list)
if(prob(50))
if(L.name == "syndi_depot_backup")
var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/S = new /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space(get_turf(L))
S.name = "Syndicate Backup " + "([rand(1, 1000)])"
S.depotarea = src
list_add(S, guard_list)
else if(!silent)
announce_here("Depot Communications Offline", "Comms computer is damaged, destroyed or depowered. Unable to call in backup from Syndicate HQ.")
updateicon()
/area/syndicate_depot/core/proc/activate_self_destruct(reason, containment_failure, mob/user)
if(used_self_destruct)
return
log_game("Depot code: delta: " + list_show(hostile_list, TRUE))
ghostlog("The syndicate depot is about to self-destruct.")
alert_log += "Code DELTA: [reason]"
used_self_destruct = TRUE
local_alarm = TRUE
called_backup = TRUE
activate_lockdown(TRUE)
lockout_computers()
updateicon()
despawn_guards()
if(containment_failure)
announce_here("Depot Code DELTA", reason)
else
announce_here("Depot Code DELTA","[reason] Depot declared lost to hostile forces. Priming self-destruct!")
if(user)
var/turf/T = get_turf(user)
var/area/A = get_area(T)
var/log_msg = "[key_name(user)] has armed the depot self destruct device at [A.name] ([T.x],[T.y],[T.z])"
message_admins(log_msg)
log_game(log_msg)
playsound(user, 'sound/machines/Alarm.ogg', 100, 0, 0)
else
log_game("Depot self destruct activated.")
if(reactor)
reactor.overload(containment_failure)
else
message_admins("<span class='adminnotice'>Syndicate Depot lacks reactor to initiate self-destruct. Must be destroyed manually.</span>")
updateicon()
/area/syndicate_depot/core/proc/activate_lockdown()
if(used_lockdown)
return
used_lockdown = TRUE
for(var/obj/machinery/door/airlock/A in src)
spawn(0)
A.close()
if(A.density)
A.lock()
/area/syndicate_depot/core/proc/lockout_computers()
for(var/obj/machinery/computer/syndicate_depot/C in src)
C.activate_security_lockout()
/area/syndicate_depot/core/proc/toggle_door_locks()
for(var/obj/machinery/door/airlock/A in src)
A.emergency = !A.emergency
if(A.locked)
A.locked = !A.locked
A.update_icon()
/area/syndicate_depot/core/proc/toggle_falsewalls()
for(var/obj/structure/falsewall/reinforced/F in src)
spawn(0)
F.toggle()
/area/syndicate_depot/core/proc/toggle_teleport_beacon()
for(var/obj/machinery/bluespace_beacon/syndicate/B in src)
return B.toggle()
/area/syndicate_depot/core/proc/announce_here(a_header = "Depot Defense Alert", a_text = "")
var/msg_text = "<font size=4 color='red'>[a_header]</font><br><font color='red'>[a_text]</font>"
var/list/receivers = list()
for(var/mob/M in mob_list)
if(!M.ckey)
continue
var/turf/T = get_turf(M)
if(T.loc != src)
continue
receivers |= M
for(var/mob/R in receivers)
to_chat(R, msg_text)
R << sound('sound/misc/notice1.ogg')
/area/syndicate_depot/core/proc/shields_up()
if(shield_list.len)
return
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "syndi_depot_shield")
var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(L.loc)
shield_list += S.UID()
/area/syndicate_depot/core/proc/shields_key_check()
if(!shield_list.len)
return
if(detected_mech || detected_pod || detected_double_agent)
return
shields_down()
/area/syndicate_depot/core/proc/shields_down()
for(var/shuid in shield_list)
var/obj/machinery/shieldwall/syndicate/S = locateUID(shuid)
if(S)
qdel(S)
shield_list = list()
/area/syndicate_depot/core/proc/despawn_guards()
for(var/mob/thismob in list_getmobs(guard_list))
new /obj/effect/portal(get_turf(thismob))
qdel(thismob)
guard_list = list()
/area/syndicate_depot/core/proc/ghostlog(gmsg)
if(istype(reactor))
var/image/alert_overlay = image('icons/obj/flag.dmi', "syndiflag")
notify_ghosts(gmsg, title = "Depot News", source = reactor, alert_overlay = alert_overlay, action = NOTIFY_JUMP)
/area/syndicate_depot/core/proc/declare_started()
if(!run_started)
run_started = TRUE
log_game("Depot run: started: " + list_show(hostile_list, TRUE))
/area/syndicate_depot/core/proc/declare_finished()
if(!run_finished && !used_self_destruct)
run_finished = TRUE
log_game("Depot run: finished successfully: " + list_show(hostile_list, TRUE))
/area/syndicate_depot/core/proc/list_add(mob/M, list/L)
if(!istype(M))
return
var/mob_uid = M.UID()
if(mob_uid in L)
return
L += mob_uid
/area/syndicate_depot/core/proc/list_remove(mob/M, list/L)
if(!istype(M))
return
var/mob_uid = M.UID()
if(mob_uid in L)
L -= mob_uid
/area/syndicate_depot/core/proc/list_includes(mob/M, list/L)
if(!istype(M))
return FALSE
var/mob_uid = M.UID()
if(mob_uid in L)
return TRUE
return FALSE
/area/syndicate_depot/core/proc/list_show(list/L, show_ckeys = FALSE)
var/list/formatted = list()
for(var/uid in L)
var/mob/M = locateUID(uid)
if(!istype(M))
continue
if(show_ckeys)
formatted += "[M.ckey]([M])"
else
formatted += "[M]"
return formatted.Join(", ")
/area/syndicate_depot/core/proc/list_getmobs(list/L, show_ckeys = FALSE)
var/list/moblist = list()
for(var/uid in L)
var/mob/M = locateUID(uid)
if(!istype(M))
continue
moblist += M
return moblist
/area/syndicate_depot/core/proc/list_gethtmlmobs(list/L)
var/returntext = ""
var/list/moblist = list_getmobs(L)
if(moblist.len)
returntext += "<UL>"
for(var/mob/thismob in moblist)
returntext += "<LI>[thismob]</LI>"
returntext += "</UL>"
else
returntext += "<BR>NONE"
return returntext
/area/syndicate_depot/outer
name = "Suspicious Asteroid"
icon_state = "green"
/area/syndicate_depot/perimeter
name = "Suspicious Asteroid Perimeter"
icon_state = "yellow"
var/list/shield_list = list()
/area/syndicate_depot/perimeter/proc/perimeter_shields_up()
if(shield_list.len)
return
for(var/turf/T in src)
var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(T)
S.alpha = 0
shield_list += S.UID()
/area/syndicate_depot/perimeter/proc/perimeter_shields_down()
for(var/shuid in shield_list)
var/obj/machinery/shieldwall/syndicate/S = locateUID(shuid)
if(S)
qdel(S)
shield_list = list()
+4
View File
@@ -429,3 +429,7 @@
// And animate the attack!
animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
/atom/movable/proc/portal_destroyed(obj/effect/portal/P)
return
@@ -365,6 +365,7 @@
var/mob/living/carbon/human/H = target
H.visible_message("<span class='warning'>[H]'s skin suddenly bubbles and shifts around [H.p_their()] body!</span>", \
"<span class='shadowling'>You regenerate your protective armor and cleanse your form of defects.</span>")
H.set_species(/datum/species/shadow/ling)
H.adjustCloneLoss(-target.getCloneLoss())
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes)
@@ -373,7 +374,6 @@
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(H), slot_glasses)
H.set_species(/datum/species/shadow/ling)
/obj/effect/proc_holder/spell/targeted/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount
name = "Collective Hivemind"
@@ -84,6 +84,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.socks = "None"
H.faction |= "faithless"
H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(user), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(user), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), slot_wear_suit)
@@ -91,7 +92,6 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses)
H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
H.mind.RemoveSpell(src)
+1 -1
View File
@@ -118,7 +118,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C)
typepath = /obj/item/documents //Any set of secret documents. Doesn't have to be NT's
/datum/theft_objective/hypospray
name = "a hypospray"
name = "the Chief Medical Officer's hypospray"
typepath = /obj/item/reagent_containers/hypospray/CMO
protected_jobs = list("Chief Medical Officer")
-1
View File
@@ -381,7 +381,6 @@
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/radio/headset/headset_service
backpack_contents = list(
/obj/item/clothing/shoes/black = 1,
/obj/item/storage/box/lip_stick = 1,
/obj/item/storage/box/barber = 1
)
+38 -14
View File
@@ -10,22 +10,31 @@
idle_power_usage = 0
var/syndicate = 0
var/obj/item/radio/beacon/Beacon
var/enabled = TRUE
/obj/machinery/bluespace_beacon/New()
..()
create_beacon()
/obj/machinery/bluespace_beacon/proc/create_beacon()
var/turf/T = loc
Beacon = new /obj/item/radio/beacon
Beacon.invisibility = INVISIBILITY_MAXIMUM
Beacon.loc = T
Beacon.syndicate = syndicate
hide(T.intact)
/obj/machinery/bluespace_beacon/Destroy()
/obj/machinery/bluespace_beacon/proc/destroy_beacon()
QDEL_NULL(Beacon)
/obj/machinery/bluespace_beacon/proc/toggle()
enabled = !enabled
return enabled
/obj/machinery/bluespace_beacon/Destroy()
destroy_beacon()
return ..()
// update the invisibility and icon
/obj/machinery/bluespace_beacon/hide(var/intact)
invisibility = intact ? 101 : 0
update_icon()
@@ -33,21 +42,36 @@
// update the icon_state
/obj/machinery/bluespace_beacon/update_icon()
var/state="floor_beacon"
if(invisibility)
icon_state = "[state]f"
else
icon_state = "[state]"
/obj/machinery/bluespace_beacon/process()
if(!Beacon)
var/turf/T = loc
Beacon = new /obj/item/radio/beacon
Beacon.invisibility = INVISIBILITY_MAXIMUM
Beacon.loc = T
if(Beacon)
if(Beacon.loc != loc)
Beacon.loc = loc
if(enabled)
if(Beacon)
if(Beacon.loc != loc)
Beacon.loc = loc
else
create_beacon()
update_icon()
else
if(Beacon)
destroy_beacon()
update_icon()
update_icon()
/obj/machinery/bluespace_beacon/syndicate
syndicate = TRUE
enabled = FALSE
var/obj/machinery/computer/syndicate_depot/teleporter/mycomputer
/obj/machinery/bluespace_beacon/syndicate/New()
..()
if(!GAMEMODE_IS_NUCLEAR && prob(50))
enabled = TRUE
/obj/machinery/bluespace_beacon/syndicate/Destroy()
if(mycomputer)
mycomputer.mybeacon = null
return ..()
+519
View File
@@ -0,0 +1,519 @@
#define DEPOT_VISITOR_START 1
#define DEPOT_VISITOR_END 2
#define DEPOT_VISITOR_ADD 3
// Generic parent depot computer type
/obj/machinery/computer/syndicate_depot
name = "depot computer"
icon = 'icons/obj/computer.dmi'
icon_keyboard = "syndie_key"
icon_screen = "tcboss"
light_color = LIGHT_COLOR_PURE_CYAN
req_access = list(access_syndicate)
var/security_lockout = FALSE
var/sound_yes = 'sound/machines/twobeep.ogg'
var/sound_no = 'sound/machines/buzz-sigh.ogg'
var/sound_click = 'sound/machines/click.ogg'
var/area/syndicate_depot/core/depotarea
var/alerts_when_broken = FALSE
var/has_alerted = FALSE
/obj/machinery/computer/syndicate_depot/New()
. = ..()
depotarea = areaMaster
/obj/machinery/computer/syndicate_depot/attack_ai(mob/user)
if(req_access.len && !("syndicate" in user.faction))
to_chat(user, "<span class='warning'>A firewall blocks your access.</span>")
return 1
return ..()
/obj/machinery/computer/syndicate_depot/emp_act(severity)
return
/obj/machinery/computer/syndicate_depot/emag_act(mob/user)
to_chat(user, "<span class='notice'>The electronic systems in this console are far too advanced for your primitive hacking peripherals.</span>")
return
/obj/machinery/computer/syndicate_depot/allowed(mob/user)
if(user.can_advanced_admin_interact())
return 1
if(!isliving(user))
return 0
if(has_security_lockout(user))
return 0
return ..()
/obj/machinery/computer/syndicate_depot/proc/has_security_lockout(mob/user)
if(security_lockout)
playsound(user, 'sound/machines/buzz-sigh.ogg', 50, 0)
to_chat(user, "<span class='warning'>[src] is under security lockout.</span>")
return TRUE
return FALSE
/obj/machinery/computer/syndicate_depot/proc/activate_security_lockout()
security_lockout = TRUE
disable_special_functions()
/obj/machinery/computer/syndicate_depot/attack_hand(mob/user)
if(..())
return
if(stat & (NOPOWER|BROKEN))
return
if(!allowed(user))
to_chat(user, "<span class='warning'>Access Denied.</span>")
return
user.set_machine(src)
var/dat = get_menu(user)
user << browse(dat, "window=computer;size=575x450")
onclose(user, "computer")
/obj/machinery/computer/syndicate_depot/set_broken()
. = ..()
if(alerts_when_broken && !has_alerted)
has_alerted = TRUE
raise_alert("[src] was damaged.")
disable_special_functions()
/obj/machinery/computer/syndicate_depot/proc/disable_special_functions()
return
/obj/machinery/computer/syndicate_depot/Topic(href, href_list)
if(..())
return 1
if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
if(href_list["primary"])
primary(usr)
if(href_list["secondary"])
secondary(usr, text2num(href_list["secondary"]))
add_fingerprint(usr)
updateUsrDialog()
/obj/machinery/computer/syndicate_depot/Destroy()
disable_special_functions()
if(alerts_when_broken && !has_alerted)
raise_alert("[src] destroyed.")
return ..()
/obj/machinery/computer/syndicate_depot/proc/get_menu(mob/user)
return ""
/obj/machinery/computer/syndicate_depot/proc/primary(mob/user)
if(!allowed(user))
return 1
return 0
/obj/machinery/computer/syndicate_depot/proc/secondary(mob/user, subcommand)
if(!allowed(user))
return 1
return 0
/obj/machinery/computer/syndicate_depot/proc/raise_alert(reason)
if(depotarea)
depotarea.increase_alert(reason)
// Door Control Computer
/obj/machinery/computer/syndicate_depot/doors
name = "depot door control computer"
/obj/machinery/computer/syndicate_depot/doors/get_menu(mob/user)
return {"<B>Syndicate Depot Door Control Computer</B><HR>
<BR><BR><a href='?src=[UID()];primary=1'>Toggle Airlock Emergency Access</a>
<BR><BR><a href='?src=[UID()];secondary=1'>Toggle Hidden Doors</a>
<BR>"}
/obj/machinery/computer/syndicate_depot/doors/primary(mob/user)
if(..())
return
if(depotarea)
depotarea.toggle_door_locks(src)
to_chat(user, "<span class='notice'>Door locks toggled.</span>")
/obj/machinery/computer/syndicate_depot/doors/secondary(mob/user, subcommand)
if(..())
return
if(depotarea)
depotarea.toggle_falsewalls(src)
to_chat(user, "<span class='notice'>False walls toggled.</span>")
// Engineering AKA self destruct computer, no useful functions, just a trap for the people who can't resist pushing dangerous-sounding buttons.
/obj/machinery/computer/syndicate_depot/selfdestruct
name = "reactor control computer"
icon_screen = "explosive"
req_access = list()
alerts_when_broken = TRUE
/obj/machinery/computer/syndicate_depot/selfdestruct/get_menu(mob/user)
var menutext = {"<B>Syndicate Depot Fusion Reactor Control</B><HR>
<BR><BR><a href='?src=[UID()];primary=1'>Disable Containment Field</a>
<BR>"}
return menutext
/obj/machinery/computer/syndicate_depot/selfdestruct/primary(mob/user)
if(..())
return
if(depotarea.used_self_destruct)
playsound(user, sound_no, 50, 0)
return
playsound(user, sound_click, 20, 1)
if(depotarea)
depotarea.activate_self_destruct("Fusion reactor containment field disengaged. All hands, evacuate. All hands, evacuate!", TRUE, user)
// Shield computer, used to manipulate base shield, and armory shield
/obj/machinery/computer/syndicate_depot/shieldcontrol
name = "shield control computer"
icon_screen = "accelerator"
req_access = list(access_syndicate_leader)
alerts_when_broken = TRUE
var/area/syndicate_depot/perimeter/perimeterarea
/obj/machinery/computer/syndicate_depot/shieldcontrol/New()
. = ..()
perimeterarea = locate(/area/syndicate_depot/perimeter)
if(istype(perimeterarea) && (GAMEMODE_IS_NUCLEAR || prob(20)))
spawn(200)
perimeterarea.perimeter_shields_up()
/obj/machinery/computer/syndicate_depot/shieldcontrol/Destroy()
if(istype(perimeterarea) && perimeterarea.shield_list.len)
perimeterarea.perimeter_shields_down()
return ..()
/obj/machinery/computer/syndicate_depot/shieldcontrol/get_menu(mob/user)
var menutext = {"<B>Syndicate Depot Shield Grid Control</B><HR>
<BR>"}
menutext += {"(SYNDI-LEADER) Whole-base Shield: [perimeterarea.shield_list.len ? "ON" : "OFF"] (<a href='?src=[UID()];primary=1'>[perimeterarea.shield_list.len ? "Disable" : "Enable"]</a>)<BR>"}
menutext += {"(SYNDI-LEADER) Armory Shield: [depotarea.shield_list.len ? "ON" : "OFF"] (<a href='?src=[UID()];secondary=1'>[depotarea.shield_list.len ? "Disable" : "Enable"]</a>)<BR>"}
return menutext
/obj/machinery/computer/syndicate_depot/shieldcontrol/primary(mob/user)
if(..())
return
if(depotarea.used_self_destruct)
playsound(user, sound_no, 50, 0)
return
if(!istype(perimeterarea))
return
if(perimeterarea.shield_list.len)
perimeterarea.perimeter_shields_down()
else
perimeterarea.perimeter_shields_up()
playsound(user, sound_yes, 50, 0)
/obj/machinery/computer/syndicate_depot/shieldcontrol/secondary(mob/user)
if(..())
return
if(!istype(depotarea))
return
if(depotarea.shield_list.len)
depotarea.shields_down()
else
depotarea.shields_up()
playsound(user, sound_yes, 50, 0)
// Syndicate comms computer, used to activate visitor mode, and message syndicate. Traitor-only use.
/obj/machinery/computer/syndicate_depot/syndiecomms
name = "syndicate communications computer"
icon_screen = "syndishuttle"
req_access = list()
alerts_when_broken = TRUE
var/message_sent = FALSE
/obj/machinery/computer/syndicate_depot/syndiecomms/New()
. = ..()
if(depotarea)
depotarea.comms_computer = src
/obj/machinery/computer/syndicate_depot/syndiecomms/Destroy()
if(depotarea)
depotarea.comms_computer = null
return ..()
/obj/machinery/computer/syndicate_depot/syndiecomms/get_menu(mob/user)
var/menu = "<B>Syndicate Communications Relay</B><HR>"
menu += "<BR><BR>One-Time Uplink to Syndicate HQ: [message_sent ? "ALREADY USED" : "AVAILABLE (<a href='?src=[UID()];primary=1'>Open Channel</a>)"]"
if(depotarea.on_peaceful)
menu += "<BR><BR>Visiting Agents: VISIT IN PROGRESS. "
if(depotarea.list_includes(user, depotarea.peaceful_list))
menu += "[user] IS RECOGNIZED AS VISITING AGENT"
else
menu += "[user] NOT RECOGNIZED. (<a href='?src=[UID()];secondary=[DEPOT_VISITOR_ADD]'>Sign-in as Agent</a>)"
if(check_rights(R_ADMIN, 0, user))
menu += "<BR><BR>ADMIN: (<a href='?src=[UID()];secondary=[DEPOT_VISITOR_END]'>End Visitor Mode</a>)"
else
menu += "<BR><BR>Visiting Agents: NONE (<a href='?src=[UID()];secondary=[DEPOT_VISITOR_START]'>Sign-in as Agent</a>)"
return menu
/obj/machinery/computer/syndicate_depot/syndiecomms/primary(mob/user)
if(..())
return
if(!isliving(user))
to_chat(user, "ERROR: No lifesigns detected at terminal, aborting.") // Safety to prevent aghosts accidentally pressing it and getting everyone killed.
return
if(message_sent)
playsound(user, 'sound/machines/buzz-sigh.ogg', 50, 0)
to_chat(user, "<span class='warning'>[src] has already been used to transmit a message to the Syndicate.</span>")
return
message_sent = TRUE
if(user.mind && user.mind.special_role == SPECIAL_ROLE_TRAITOR)
var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This function may only be used ONCE.", "To abort, send an empty message.", "") as text|null
if(!input)
message_sent = FALSE
return
Syndicate_announce(input, user)
to_chat(user, "Message transmitted.")
log_say("[key_name(user)] has sent a Syndicate comms message from the depot: [input]", user)
else
to_chat(user, "<span class='warning'>[src] requires authentication with syndicate codewords, which you do not know.</span>")
raise_alert("Detected unauthorized access by [user] to [src]!")
updateUsrDialog()
/obj/machinery/computer/syndicate_depot/syndiecomms/secondary(mob/user, subcommand)
if(..())
return
if(has_security_lockout(user))
return
if(depotarea)
if(depotarea.local_alarm || depotarea.called_backup || depotarea.used_self_destruct)
to_chat(user, "<span class='warning'>Visitor sign-in is not possible while the depot is on security alert.</span>")
else if(depotarea.on_peaceful)
if(subcommand == DEPOT_VISITOR_END)
if(check_rights(R_ADMIN, 0, user))
depotarea.peaceful_mode(FALSE, TRUE)
else if (subcommand == DEPOT_VISITOR_ADD)
if(user.mind && user.mind.special_role == SPECIAL_ROLE_TRAITOR)
if(depotarea.list_includes(user, depotarea.peaceful_list))
to_chat(user, "<span class='warning'>[user] is already signed in as a visiting agent.</span>")
else
grant_syndie_faction(user)
else
to_chat(user, "<span class='warning'>Only verified agents of the Syndicate may sign in as visitors. Everyone else will be shot on sight.</span>")
else if(subcommand == DEPOT_VISITOR_START)
if(depotarea.something_looted)
to_chat(user, "<span class='warning'>Visitor sign-in is not possible after supplies have been taken from the depot.</span>")
else if(user.mind && user.mind.special_role == SPECIAL_ROLE_TRAITOR)
grant_syndie_faction(user)
depotarea.peaceful_mode(TRUE, TRUE)
else
to_chat(user, "<span class='warning'>Only verified agents of the Syndicate may sign in as visitors. Everyone else will be shot on sight.</span>")
else
to_chat(user, "<span class='warning'>Unrecognized subcommand: [subcommand]</span>")
else
to_chat(user, "<span class='warning'>ERROR: [src] is unable to uplink to depot network.</span>")
updateUsrDialog()
/obj/machinery/computer/syndicate_depot/syndiecomms/proc/grant_syndie_faction(mob/user)
user.faction += "syndicate"
depotarea.list_add(user, depotarea.peaceful_list)
to_chat(user, {"<BR><span class='userdanger'>Welcome, Agent.</span>
<span class='warning'>You are now signed-in as a depot visitor.
Any other agents with you MUST sign in themselves.
You may explore all rooms here, except for bolted ones.
Your agent ID will give you access to most doors and computers.
Standard Syndicate regulations apply to your visit.
This means if ANY of you attack facility staff, break into anything, sabotage the facility, or bring non-agents here, then ALL of you will be summarily executed.
Enjoy your stay.</span>
"})
/obj/machinery/computer/syndicate_depot/syndiecomms/power_change()
. = ..()
if(!security_lockout && (stat & NOPOWER))
security_lockout = TRUE
raise_alert("[src] lost power.")
// Syndicate teleporter control, used to manage incoming/outgoing teleports
/obj/machinery/computer/syndicate_depot/teleporter
name = "syndicate teleporter console"
icon_screen = "telesci"
icon_keyboard = "teleport_key"
var/obj/machinery/bluespace_beacon/syndicate/mybeacon
var/obj/effect/portal/myportal
var/portal_enabled = FALSE
var/portaldir = WEST
/obj/machinery/computer/syndicate_depot/teleporter/New()
. = ..()
spawn(10)
findbeacon()
choosetarget()
update_portal()
/obj/machinery/computer/syndicate_depot/teleporter/Destroy()
if(mybeacon)
mybeacon.mycomputer = null
return ..()
/obj/machinery/computer/syndicate_depot/teleporter/portal_destroyed(obj/effect/portal/P)
myportal = null
/obj/machinery/computer/syndicate_depot/teleporter/disable_special_functions()
if(mybeacon)
if(mybeacon.enabled)
mybeacon.toggle()
if(portal_enabled)
portal_enabled = FALSE
update_portal()
/obj/machinery/computer/syndicate_depot/teleporter/proc/findbeacon()
if(mybeacon)
return TRUE
for(var/obj/machinery/bluespace_beacon/syndicate/B in myArea)
mybeacon = B
B.mycomputer = src
return TRUE
return FALSE
/obj/machinery/computer/syndicate_depot/teleporter/proc/choosetarget()
var/list/eligible_turfs = list()
for(var/obj/item/radio/beacon/R in beacons)
var/turf/T = get_turf(R)
if(!is_station_level(T.z))
continue
eligible_turfs += T
if(eligible_turfs.len)
return pick(eligible_turfs)
else
return FALSE
/obj/machinery/computer/syndicate_depot/teleporter/proc/update_portal()
if(portal_enabled && !myportal)
var/turf/tele_target = choosetarget()
if(!tele_target)
return
var/turf/portal_turf = get_step(src, portaldir)
var/obj/effect/portal/P = new(portal_turf, tele_target, src, 0)
myportal = P
P.failchance = 0
P.icon_state = "portal1"
var/area/A = get_area(tele_target)
P.name = "[A] portal"
else if(!portal_enabled && myportal)
qdel(myportal)
myportal = null
/obj/machinery/computer/syndicate_depot/teleporter/get_menu(mob/user)
var/menutext = "<B>Syndicate Teleporter Control</B><HR>"
findbeacon()
if(mybeacon)
menutext += {"<BR><BR>Incoming Teleport Beacon: [mybeacon.enabled ? "ON" : "OFF"] (<a href='?src=[UID()];primary=1'>[mybeacon.enabled ? "Disable" : "Enable"]</a>)<BR>"}
else
menutext += {"<BR><BR>Incoming Teleport Beacon: Reconnecting to beacon..."}
menutext += {"<BR><BR>Outgoing Teleport Portal: [portal_enabled ? "ON" : "OFF"]"}
if(check_rights(R_ADMIN, 0, user) || (depotarea.on_peaceful && !portal_enabled))
menutext += {" (<a href='?src=[UID()];secondary=1'>[portal_enabled ? "Disable" : "Enable"]</a>)<BR>"}
return menutext
/obj/machinery/computer/syndicate_depot/teleporter/primary(mob/user)
if(..())
return
if(!mybeacon && user)
to_chat(user, "<span class='notice'>Unable to connect to teleport beacon.</span>")
return
var/bresult = mybeacon.toggle()
to_chat(user, "<span class='notice'>Syndicate Teleporter Beacon: [bresult ? "<span class='green'>ON</span>" : "<span class='red'>OFF</span>"]</span>")
updateUsrDialog()
/obj/machinery/computer/syndicate_depot/teleporter/secondary(mob/user)
if(..())
return
if(!check_rights(R_ADMIN, 0, user) && !(depotarea.on_peaceful && !portal_enabled))
return
if(!portal_enabled && myportal)
to_chat(user, "<span class='notice'>Outgoing Teleport Portal: deactivating... please wait...</span>")
return
toggle_portal()
to_chat(user, "<span class='notice'>Outgoing Teleport Portal: [portal_enabled ? "<span class='green'>ON</span>" : "<span class='red'>OFF</span>"]</span>")
updateUsrDialog()
/obj/machinery/computer/syndicate_depot/teleporter/proc/toggle_portal()
portal_enabled = !portal_enabled
update_portal()
/obj/machinery/computer/syndicate_depot/aiterminal
name = "syndicate ai terminal"
icon_screen = "command"
req_access = list()
/obj/machinery/computer/syndicate_depot/aiterminal/get_menu(mob/user)
var/menutext = "<B>Syndicate AI Terminal</B><HR><BR>"
if(!istype(depotarea))
menutext += "<BR>ERROR: Unable to connect to AI network."
return menutext
if(depotarea.alert_log.len)
menutext += "Event Log:<UL>"
for(var/thisline in depotarea.alert_log)
menutext += "<LI>[thisline]</LI>"
menutext += "</UL>"
else
menutext += "Event Log: EMPTY"
menutext += "<BR><BR>"
menutext += "Terminated Intruders: "
menutext += depotarea.list_gethtmlmobs(depotarea.dead_list)
menutext += "<BR><BR>"
menutext += "Extra Security Forces: "
menutext += depotarea.list_gethtmlmobs(depotarea.guard_list)
menutext += "<BR><BR>"
menutext += "Visiting Agents: "
menutext += depotarea.list_gethtmlmobs(depotarea.peaceful_list)
menutext += "<BR><BR>"
var/has_bot = FALSE
for(var/mob/living/simple_animal/bot/ed209/syndicate/B in depotarea.list_getmobs(depotarea.guard_list))
has_bot = TRUE
if(has_bot)
menutext += "<BR><BR>Sentry Bot: (<a href='?src=[UID()];secondary=1'>issue recall order</a>)"
else
menutext += "<BR><BR>Sentry Bot: (none present)"
menutext += "<BR><BR>"
if(check_rights(R_ADMIN, 0, user))
if(depotarea.on_peaceful)
menutext += "<BR><BR>ADMIN: (To end visitor mode, use comms console.)"
else
menutext += "<BR><BR>ADMIN: (<a href='?src=[UID()];primary=1'>Reset Depot Alert Level</a>)"
return menutext
/obj/machinery/computer/syndicate_depot/aiterminal/primary(mob/user)
if(..())
return
if(!check_rights(R_ADMIN, 0, user))
return
if(depotarea)
depotarea.reset_alert()
to_chat(user, "Alert level reset.")
/obj/machinery/computer/syndicate_depot/aiterminal/secondary(mob/user)
if(..())
return
for(var/mob/living/simple_animal/bot/ed209/syndicate/B in depotarea.list_getmobs(depotarea.guard_list))
depotarea.list_remove(B, depotarea.guard_list)
new /obj/effect/portal(get_turf(B))
to_chat(user, "[B] has been recalled.")
qdel(B)
raise_alert("Sentry bot removed via emergency recall.")
+40 -31
View File
@@ -13,7 +13,6 @@
/obj/machinery/computer/merch/New()
..()
/obj/machinery/computer/merch/attack_ai(mob/user as mob)
src.add_hiddenprint(user)
return attack_hand(user)
@@ -43,43 +42,49 @@ html {
color:#999;
}
table {background:#303030;border:1px solid #262626;}
caption {text-align:left;}
.button {
color:#cfcfcf;
text-decoration:none;
font-weight:bold;
text-align:center;
width:75px;
padding:21px;
box-sizing:border-box;
background:none;
border:none;
display: inline-block;
}
.button:hover {color:#ffffff;}
a {
color:#cfcfcf;
text-decoration:none;
font-weight:bold;
}
a:hover {color:#ffffff;}
a:hover {
color:#ffffff;
}
tr {
background:#303030;
border-radius:6px;
margin-bottom:0.5em;
border-bottom:1px solid black;
}
tr:nth-child(even) {
background:#3f3f3f;
}
p {margin:0;}
td.cost {
font-size:20pt;
font-weight:bold;
}
tr.dark {background:#303030;}
td.cost.affordable {
background:green;
}
tr.light {background:#3f3f3f;}
td.cost.toomuch {
background:maroon;
}
td,th {padding:15px;border-bottom:1px solid #262626;}
th.cost {padding:0px;border-left:1px solid #262626;}
th.cost.affordable {background:green;}
th.cost.toomuch {background:maroon;}
</style>
</head>
<body>
<p style="float:right"><a href='byond://?src=[UID()];refresh=1'>Refresh</a> | <b>Balance:</b> $[balance]</p>
<p style="float:right"><a href='byond://?src=[UID()];refresh=1'>Refresh</a> | <b>Balance: $[balance]</b></p>
<h1>[command_name()] Merchandise</h1>
<p>
<b>Doing your job and not getting any recognition at work?</b> Well, welcome to the
@@ -87,8 +92,9 @@ td.cost.toomuch {
completed your Job Objectives.
</p>
<p>Work hard. Get cash. Acquire bragging rights.</p>
<h2>In Stock:</h2>
<br>
<table cellspacing="0" cellpadding="0">
<caption><b>In Stock:</b></caption>
<thead>
<th>#</th>
<th>Name/Description</th>
@@ -101,8 +107,11 @@ td.cost.toomuch {
if(item.cost>balance)
cost_class="toomuch"
var/itemID=centcomm_store.items.Find(item)
var/row_color="light"
if(itemID%2 == 0)
row_color="dark"
dat += {"
<tr>
<tr class="[row_color]">
<th>
[itemID]
</th>
@@ -110,9 +119,9 @@ td.cost.toomuch {
<p><b>[item.name]</b></p>
<p>[item.desc]</p>
</td>
<td class="cost [cost_class]">
<a href="byond://?src=[UID()];buy=[itemID]">$[item.cost]</a>
</td>
<th class="cost [cost_class]">
<a href="byond://?src=[UID()];buy=[itemID]" class="button">$[item.cost]</a>
</th>
</tr>
"}
dat += {"
@@ -120,7 +129,7 @@ td.cost.toomuch {
</table>
</body>
</html>"}
user << browse(dat, "window=merch")
user << browse(dat, "window=merch;size=440x600;can_resize=0")
onclose(user, "merch")
return
@@ -142,6 +151,6 @@ td.cost.toomuch {
if(!centcomm_store.PlaceOrder(usr,itemID))
to_chat(usr, "<span class='warning'>Unable to charge your account.</span>")
else
to_chat(usr, "<span class='notice'>You've successfully purchased the item. It should be in your hands or on the floor.</span>")
to_chat(usr, "<span class='notice'>You've successfully purchased the item. It should be in your hands or on the floor.</span>")
src.updateUsrDialog()
return
@@ -329,6 +329,20 @@
note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_hatch
/obj/machinery/door/airlock/hatch/syndicate
name = "syndicate hatch"
req_access_txt = "150"
/obj/machinery/door/airlock/hatch/syndicate/vault
name = "syndicate vault hatch"
req_access_txt = "151"
icon = 'icons/obj/doors/airlocks/vault/vault.dmi'
overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_vault
security_level = 6
hackProof = TRUE
aiControlDisabled = TRUE
/obj/machinery/door/airlock/hatch/gamma
name = "gamma level hatch"
hackProof = 1
+9 -1
View File
@@ -72,7 +72,7 @@
// called when turf state changes
// hide the object if turf is intact
/obj/machinery/navbeacon/hide(intact)
invisibility = intact ? 101 : 0
invisibility = intact ? INVISIBILITY_MAXIMUM : SEE_INVISIBLE_MINIMUM
updateicon()
// update the icon_state
@@ -214,3 +214,11 @@ Transponder Codes:<UL>"}
codes[newkey] = newval
updateDialog()
/obj/machinery/navbeacon/invisible
invisibility = INVISIBILITY_MAXIMUM
/obj/machinery/navbeacon/invisible/hide(intact)
invisibility = INVISIBILITY_MAXIMUM
updateicon()
+20 -3
View File
@@ -982,6 +982,10 @@ var/list/turret_icons
/obj/machinery/porta_turret/syndicate
projectile = /obj/item/projectile/bullet
eprojectile = /obj/item/projectile/bullet
// Syndicate turrets *always* operate in lethal mode.
// So, nothing, not even emagging them, makes them switch bullet type.
// So, its best to always have their projectile and eprojectile settings be the same. That way, you know what they will shoot.
// Otherwise, you end up with situations where one of the two bullet types will never be used.
shot_sound = 'sound/weapons/Gunshot.ogg'
eshot_sound = 'sound/weapons/Gunshot.ogg'
@@ -1010,6 +1014,19 @@ var/list/turret_icons
check_synth = 1
ailock = 1
/obj/machinery/porta_turret/syndicate/die()
. = ..()
var/area/syndicate_depot/core/depotarea = areaMaster
if(istype(depotarea))
depotarea.turret_died()
/obj/machinery/porta_turret/syndicate/shootAt(mob/living/target)
var/area/syndicate_depot/core/depotarea = areaMaster
if(istype(depotarea))
depotarea.list_add(target, depotarea.hostile_list)
depotarea.declare_started()
return ..(target)
/obj/machinery/porta_turret/syndicate/New()
..()
if(req_one_access && req_one_access.len)
@@ -1046,17 +1063,17 @@ var/list/turret_icons
name = "machine gun turret (7.62)"
desc = "Syndicate exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."
projectile = /obj/item/projectile/bullet
eprojectile = /obj/item/projectile/bullet/midbullet
eprojectile = /obj/item/projectile/bullet
/obj/machinery/porta_turret/syndicate/grenade
name = "mounted grenade launcher (40mm)"
desc = "Syndicate 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."
projectile = /obj/item/projectile/bullet/a40mm
eprojectile = /obj/item/projectile/bullet/midbullet
eprojectile = /obj/item/projectile/bullet/a40mm
/obj/machinery/porta_turret/syndicate/assault_pod
name = "machine gun turret (4.6x30mm)"
desc = "Syndicate exterior defense turret chambered for 4.6x30mm rounds. Designed to be fitted to assault pods, it uses low calliber bullets to save space."
health = 100
projectile = /obj/item/projectile/bullet/weakbullet3
eprojectile = /obj/item/projectile/bullet/midbullet
eprojectile = /obj/item/projectile/bullet/weakbullet3
+58
View File
@@ -614,3 +614,61 @@
return prob(10)
else
return !density
/obj/machinery/shieldwall/syndicate
name = "energy shield"
desc = "A strange energy shield."
icon_state = "shield-red"
/obj/machinery/shieldwall/syndicate/CanPass(atom/movable/mover, turf/target, height=0)
if(isliving(mover))
var/mob/living/M = mover
if("syndicate" in M.faction)
return 1
if(istype(mover, /obj/item/projectile))
return 0
return ..(mover, target, height)
/obj/machinery/shieldwall/syndicate/CanAStarPass(ID, to_dir, caller)
if(isliving(caller))
var/mob/living/M = caller
if("syndicate" in M.faction)
return 1
return ..(ID, to_dir, caller)
/obj/machinery/shieldwall/syndicate/proc/phaseout()
// If you're bumping into an invisible shield, make it fully visible, then fade out over a couple of seconds.
if(alpha == 0)
alpha = 255
animate(src, alpha = 10, time = 20, easing = EASE_OUT)
spawn(20)
alpha = 0
/obj/machinery/shieldwall/syndicate/Bumped(atom/user)
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/attackby(obj/item/W, mob/user, params)
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/bullet_act(obj/item/projectile/Proj)
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/ex_act(severity)
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/emp_act(severity)
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/attack_hand(mob/user)
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/hitby(AM as mob|obj)
phaseout()
return ..()
+1
View File
@@ -56,6 +56,7 @@
syndicate = 1
faction = "syndicate"
req_access = list(access_syndicate_leader)
/obj/machinery/turretid/Destroy()
if(control_area)
+1 -1
View File
@@ -1027,7 +1027,7 @@
req_access_txt = "5"
products = list(/obj/item/reagent_containers/glass/bottle/charcoal = 4,/obj/item/reagent_containers/glass/bottle/morphine = 4,/obj/item/reagent_containers/glass/bottle/ether = 4,/obj/item/reagent_containers/glass/bottle/epinephrine = 4,
/obj/item/reagent_containers/glass/bottle/toxin = 4,/obj/item/reagent_containers/syringe/antiviral = 6,/obj/item/reagent_containers/syringe/insulin = 4,
/obj/item/reagent_containers/syringe = 12,/obj/item/healthanalyzer = 5,/obj/item/healthupgrade = 5,/obj/item/reagent_containers/glass/beaker = 4,
/obj/item/reagent_containers/syringe = 12,/obj/item/healthanalyzer = 5,/obj/item/healthupgrade = 5,/obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/hypospray/safety = 2,
/obj/item/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3,
/obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/sensor_device = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4,
/obj/item/pinpointer/crew = 2)
+3 -6
View File
@@ -26,12 +26,9 @@
/obj/effect/portal/Destroy()
portals -= src
if(istype(creator, /obj/item/hand_tele))
var/obj/item/hand_tele/O = creator
O.active_portals--
else if(istype(creator, /obj/item/gun/energy/wormhole_projector))
var/obj/item/gun/energy/wormhole_projector/P = creator
P.portal_destroyed(src)
if(istype(creator, /obj))
var/obj/O = creator
O.portal_destroyed(src)
creator = null
target = null
return ..()
@@ -2,27 +2,36 @@
name = "random spawners"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
color = "#00FF00"
var/list/result = list(
/turf/simulated/floor/plasteel = 1,
/turf/simulated/floor/plating = 1,
/obj/effect/decal/cleanable/blood/splatter = 1,
/obj/effect/decal/cleanable/blood/oil = 1,
/obj/effect/decal/cleanable/fungus = 1)
var/spawn_inside = null
// This needs to come before the initialization wave because
// the thing it creates might need to be initialized too
/obj/effect/spawner/random_spawners/Initialize()
// This needs to use New() instead of Initialize() because the thing it creates might need to be initialized too
/obj/effect/spawner/random_spawners/New()
. = ..()
var/turf/T = get_turf(src)
if(!T)
log_runtime(EXCEPTION("Spawner placed in nullspace!"), src)
return
randspawn(T)
/obj/effect/spawner/random_spawners/proc/randspawn(turf/T)
var/thing_to_place = pickweight(result)
if(ispath(thing_to_place, /turf))
if(ispath(thing_to_place, /datum/nothing))
// Nothing.
else if(ispath(thing_to_place, /turf))
T.ChangeTurf(thing_to_place)
else
new thing_to_place(T)
if(ispath(spawn_inside, /obj))
var/obj/O = new thing_to_place(T)
var/obj/E = new spawn_inside(T)
O.forceMove(E)
else
new thing_to_place(T)
qdel(src)
/obj/effect/spawner/random_spawners/blood_maybe
@@ -108,3 +117,195 @@
result = list(
/turf/simulated/wall = 1,
/obj/effect/decal/cleanable/fungus = 7)
// z6 DEPOT SPAWNERS
/obj/effect/spawner/random_spawners/syndicate
// Turrets
/obj/effect/spawner/random_spawners/syndicate/turret
name = "50pc int turret"
icon_state = "x"
result = list(/datum/nothing = 1,
/obj/machinery/porta_turret/syndicate/interior = 1)
/obj/effect/spawner/random_spawners/syndicate/turret/external
name = "50pc ext turret"
result = list(/datum/nothing = 1,
/obj/machinery/porta_turret/syndicate/exterior = 1)
// Mobs
/obj/effect/spawner/random_spawners/syndicate/mob
name = "50pc melee syndimob"
icon_state = "x"
color = "#333333"
result = list(/datum/nothing = 1,
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot = 1)
// Traps
/obj/effect/spawner/random_spawners/syndicate/trap
icon_state = "x"
color = "#000000"
/obj/effect/spawner/random_spawners/syndicate/trap/pizzabomb
name = "50pc trap pizza"
result = list(/obj/item/pizzabox/meat = 1,
/obj/item/pizza_bomb/autoarm = 1)
/obj/effect/spawner/random_spawners/syndicate/trap/medbot
name = "50pc trap medibot"
result = list(/datum/nothing = 1,
/mob/living/simple_animal/bot/medbot/syndicate/emagged = 1)
/obj/effect/spawner/random_spawners/syndicate/trap/mine
name = "50pc trap landmine"
result = list(/datum/nothing = 1,
/obj/effect/mine/explosive = 1)
/obj/effect/spawner/random_spawners/syndicate/trap/documents
name = "66pc trapped documents"
result = list(/obj/item/documents/syndicate/yellow = 1,
/obj/item/documents/syndicate/yellow/trapped = 1)
// Loot
/obj/effect/spawner/random_spawners/syndicate/loot
name = "common loot"
icon_state = "x3"
spawn_inside = /obj/structure/closet/secure_closet/syndicate/depot
// Loot schema: costumes, toys, useless gimmick items, trapped items
result = list(/datum/nothing = 13,
/obj/item/storage/toolbox/syndicate = 1,
/obj/item/storage/toolbox/syndicate/trapped = 1,
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 1,
/obj/item/toy/cards/deck/syndicate = 1,
/obj/item/storage/secure/briefcase/syndie = 1,
/obj/item/toy/syndicateballoon = 1,
/obj/item/soap/syndie = 1,
/obj/item/clothing/under/syndicate = 1,
/obj/item/clothing/under/syndicate/tacticool = 1,
/obj/item/clothing/mask/gas/syndicate = 1,
/obj/item/suppressor = 1,
/obj/item/coin/antagtoken/syndicate = 1,
/obj/item/storage/box/syndie_kit/cutouts = 1)
/obj/effect/spawner/random_spawners/syndicate/loot/level2
name = "rare loot"
// Loot schema: space gear, basic armor, basic ammo (10mm, rcd), drugs, more dangerous/useful gimmick items, lower-value minerals
result = list(/datum/nothing = 27,
/obj/item/storage/box/syndie_kit/space = 1,
/obj/item/storage/box/syndie_kit/hardsuit = 1,
/obj/item/clothing/shoes/magboots/syndie = 1,
/obj/item/clothing/suit/armor/vest/combat = 1,
/obj/item/ammo_box/magazine/m10mm = 1,
/obj/item/storage/pill_bottle/happy = 1,
/obj/item/storage/pill_bottle/zoom = 1,
/obj/item/storage/pill_bottle/random_drug_bottle = 2,
/obj/item/storage/backpack/duffel/syndie/surgery = 1,
/obj/item/clothing/shoes/syndigaloshes = 1,
/obj/item/storage/belt/military = 1,
/obj/item/clothing/under/chameleon = 1,
/obj/item/storage/backpack/satchel_flat = 1,
/obj/item/rcd = 1,
/obj/item/rcd_ammo = 1,
/obj/item/stamp/chameleon = 1,
/obj/item/flag/chameleon = 1,
/obj/item/lighter/zippo/gonzofist = 1,
/obj/item/clothing/gloves/fingerless/rapid = 1,
/obj/item/grenade/spawnergrenade/manhacks = 1,
/obj/item/grenade/syndieminibomb = 1,
/obj/item/storage/box/syndie_kit/throwing_weapons = 1,
/obj/item/pen/edagger = 1,
/obj/item/stack/sheet/mineral/plasma{amount = 20} = 1,
/obj/item/stack/sheet/mineral/silver{amount = 20} = 1,
/obj/item/stack/sheet/mineral/gold{amount = 20} = 1)
/obj/effect/spawner/random_spawners/syndicate/loot/level3
name = "officer loot"
// Loot schema: medkits, very useful devices (jammer, illegal upgrade, RCD), better quality ammo (AP, fire), basic weapons (pistol, empgrenade), high value ores (diamond, uranium)
result = list(/datum/nothing = 25,
/obj/item/jammer = 1,
/obj/item/storage/firstaid = 1,
/obj/item/storage/box/syndie_kit/bonerepair = 1,
/obj/item/gun/projectile/automatic/pistol = 1,
/obj/item/stock_parts/cell/bluespace = 1,
/obj/item/card/emag = 1,
/obj/item/encryptionkey/binary = 1,
/obj/item/pinpointer/advpinpointer = 1,
/obj/item/borg/upgrade/vtec = 1,
/obj/item/borg/upgrade/syndicate = 1,
/obj/item/borg/upgrade/selfrepair = 1,
/obj/item/stack/sheet/mineral/diamond{amount = 10} = 1,
/obj/item/stack/sheet/mineral/uranium{amount = 10} = 1,
/obj/item/clothing/shoes/magboots/syndie/advance = 1,
/obj/item/grenade/empgrenade = 1,
/obj/item/grenade/clown_grenade = 1,
/obj/item/grenade/spawnergrenade/feral_cats = 1,
/obj/item/ammo_box/magazine/m10mm/ap = 1,
/obj/item/ammo_box/magazine/m10mm/fire = 1,
/obj/item/ammo_box/magazine/m10mm/hp = 1,
/obj/item/rad_laser = 1,
/obj/item/storage/box/syndie_kit/emp = 1,
/obj/item/batterer = 1,
/obj/item/toy/carpplushie/dehy_carp = 1,
/obj/item/clothing/glasses/hud/security/chameleon = 1)
/obj/effect/spawner/random_spawners/syndicate/loot/level4
name = "armory loot"
// Loot schema: high-power weapons (m90, esword, ebow, revolver), devices that negate depot challenges (thermal glasses, chameleon device), explosives
result = list(/obj/item/gun/projectile/automatic/c20r = 1,
/obj/item/gun/projectile/automatic/m90 = 1,
/obj/item/gun/projectile/automatic/sniper_rifle/syndicate = 1,
/obj/item/melee/energy/sword/saber = 1,
/obj/item/gun/energy/kinetic_accelerator/crossbow = 1,
/obj/item/gun/projectile/revolver = 1,
/obj/item/clothing/gloves/color/yellow/power = 1,
/obj/item/twohanded/chainsaw = 1,
/obj/item/bee_briefcase = 1,
/obj/item/twohanded/energizedfireaxe = 1,
/obj/item/clothing/glasses/thermal = 1,
/obj/item/chameleon = 1,
/obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1,
/obj/item/storage/box/syndie_kit/atmosgasgrenades = 1,
/obj/item/grenade/plastic/x4 = 1)
// Layout-affecting spawns
/obj/effect/spawner/random_spawners/syndicate/layout
icon_state = "x2"
/obj/effect/spawner/random_spawners/syndicate/layout/door
name = "50pc door 25pc falsewall 25pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate = 6,
/turf/simulated/wall/r_wall = 2,
/obj/structure/falsewall/reinforced = 2)
/obj/effect/spawner/random_spawners/syndicate/layout/door/secret
name = "50pc falsewall 50pc wall"
result = list(/turf/simulated/wall/r_wall = 1,
/obj/structure/falsewall/reinforced = 1)
/obj/effect/spawner/random_spawners/syndicate/layout/door/vault
name = "60pc vaultdoor 20pc falsewall 20pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 6,
/turf/simulated/wall/r_wall = 2,
/obj/structure/falsewall/reinforced = 2)
/obj/effect/spawner/random_spawners/syndicate/layout/spacepod
name = "50pc loot spacepod"
result = list(/obj/spacepod/syndi = 1,
/obj/spacepod/syndi/unlocked = 1)
@@ -59,6 +59,7 @@
/obj/item/megaphone/proc/saymsg(mob/living/user as mob, message)
audible_message("<span class='game say'><span class='name'>[user]</span> broadcasts, <span class='reallybig'>\"[message]\"</span></span>", hearing_distance = 14)
log_say(message, user)
for(var/obj/O in oview(14, get_turf(src)))
O.hear_talk(user, "<span class='reallybig'>[message]</span>")
@@ -98,4 +98,8 @@
/obj/item/pizza_bomb/New()
..()
correct_wire = pick(wires)
correct_wire = pick(wires)
/obj/item/pizza_bomb/autoarm
timer_set = 1
timer = 10
@@ -54,9 +54,15 @@
name = "suspicious beacon"
desc = "A label on it reads: <i>Activate to have a singularity beacon teleported to your location</i>."
origin_tech = "bluespace=6;syndicate=5"
syndicate = 1
syndicate = TRUE
var/obj/machinery/computer/syndicate_depot/teleporter/mycomputer
/obj/item/radio/beacon/syndicate/attack_self(mob/user as mob)
/obj/item/radio/beacon/syndicate/Destroy()
if(mycomputer)
mycomputer.mybeacon = null
return ..()
/obj/item/radio/beacon/syndicate/attack_self(mob/user)
if(user)
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
@@ -69,7 +75,7 @@
desc = "A label on it reads: <i>Warning: Activating this device will send a high-ordinance explosive to your location</i>."
origin_tech = "bluespace=5;syndicate=5"
/obj/item/radio/beacon/syndicate/bomb/attack_self(mob/user as mob)
/obj/item/radio/beacon/syndicate/bomb/attack_self(mob/user)
if(user)
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/machinery/syndicatebomb( user.loc )
+21
View File
@@ -27,3 +27,24 @@
name = "'Blue' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
icon_state = "docs_blue"
/obj/item/documents/syndicate/yellow
name = "'Yellow' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Yellow\"."
icon_state = "docs_yellow"
/obj/item/documents/syndicate/yellow/trapped
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Yellow\", and have a thin film of clear material covering their surface."
var/poison_type = "amanitin"
var/poison_dose = 20
var/poison_total = 60
/obj/item/documents/syndicate/yellow/trapped/pickup(user)
if(ishuman(user) && poison_total > 0)
var/mob/living/carbon/human/H = user
var/obj/item/clothing/gloves/G = H.gloves
if(!istype(G) || G.transfer_prints)
H.reagents.add_reagent(poison_type, poison_dose)
poison_total -= poison_dose
add_attack_logs(src, user, "Picked up [src], the trapped syndicate documents")
..()
+34 -54
View File
@@ -362,7 +362,6 @@
desc = "Mini-Mecha action figure! Collect them all! 4/11."
icon_state = "gygaxtoy"
/obj/item/toy/prize/durand
name = "toy durand"
desc = "Mini-Mecha action figure! Collect them all! 5/11."
@@ -399,18 +398,6 @@
icon_state = "phazonprize"
/obj/item/toy/katana
name = "replica katana"
desc = "Woefully underpowered in D20."
icon_state = "katana"
item_state = "katana"
flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
/*
|| A Deck of Cards for playing various games of chance ||
@@ -450,7 +437,7 @@ obj/item/toy/cards/deck
obj/item/toy/cards/deck/New()
..()
icon_state = "deck_[deckstyle]_full"
for(var/i = 2; i <= 10; i++)
for(var/i in 2 to 10)
cards += "[i] of Hearts"
cards += "[i] of Spades"
cards += "[i] of Clubs"
@@ -472,7 +459,6 @@ obj/item/toy/cards/deck/New()
cards += "Ace of Clubs"
cards += "Ace of Diamonds"
obj/item/toy/cards/deck/attack_hand(mob/user as mob)
var/choice = null
if(cards.len == 0)
@@ -489,12 +475,7 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob)
H.pickup(user)
user.put_in_active_hand(H)
visible_message("<span class='notice'>[user] draws a card from the deck.</span>", "<span class='notice'>You draw a card from the deck.</span>")
if(cards.len > 26)
icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
icon_state = "deck_[deckstyle]_low"
update_icon()
obj/item/toy/cards/deck/attack_self(mob/user as mob)
if(cooldown < world.time - 50)
@@ -515,12 +496,7 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use
qdel(C)
else
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
if(cards.len > 26)
icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
icon_state = "deck_[deckstyle]_low"
update_icon()
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, params)
@@ -535,12 +511,7 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user,
qdel(C)
else
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
if(cards.len > 26)
icon_state = "deck_[deckstyle]_full"
else if(cards.len > 10)
icon_state = "deck_[deckstyle]_half"
else if(cards.len > 1)
icon_state = "deck_[deckstyle]_low"
update_icon()
obj/item/toy/cards/deck/MouseDrop(atom/over_object)
var/mob/M = usr
@@ -566,7 +537,16 @@ obj/item/toy/cards/deck/MouseDrop(atom/over_object)
else
to_chat(usr, "<span class='notice'>You can't reach it from here.</span>")
obj/item/toy/cards/deck/update_icon()
switch(cards.len)
if(0)
icon_state = "deck_[deckstyle]_empty"
if(1 to 10)
icon_state = "deck_[deckstyle]_low"
if(11 to 26)
icon_state = "deck_[deckstyle]_half"
else
icon_state = "deck_[deckstyle]_full"
obj/item/toy/cards/cardhand
name = "hand of cards"
@@ -613,12 +593,7 @@ obj/item/toy/cards/cardhand/Topic(href, href_list)
cardUser.visible_message("<span class='notice'>[cardUser] draws a card from [cardUser.p_their()] hand.</span>", "<span class='notice'>You take the [C.cardname] from your hand.</span>")
interact(cardUser)
if(currenthand.len < 3)
icon_state = "[deckstyle]_hand2"
else if(src.currenthand.len < 4)
icon_state = "[deckstyle]_hand3"
else if(src.currenthand.len < 5)
icon_state = "[deckstyle]_hand4"
update_icon()
if(currenthand.len == 1)
var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(src.loc)
N.parentdeck = src.parentdeck
@@ -639,12 +614,7 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living
user.unEquip(C)
user.visible_message("<span class='notice'>[user] adds a card to [user.p_their()] hand.</span>", "<span class='notice'>You add the [C.cardname] to your hand.</span>")
interact(user)
if(currenthand.len > 4)
icon_state = "[deckstyle]_hand5"
else if(currenthand.len > 3)
icon_state = "[deckstyle]_hand4"
else if(currenthand.len > 2)
icon_state = "[deckstyle]_hand3"
update_icon()
qdel(C)
else
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
@@ -697,7 +667,7 @@ obj/item/toy/cards/singlecard/verb/Flip()
icon_state = "sc_Ace of Spades_[deckstyle]"
name = "What Card"
pixel_x = 5
else if(flipped)
else
flipped = 0
icon_state = "singlecard_down_[deckstyle]"
name = "card"
@@ -728,16 +698,24 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params)
user.unEquip(src)
user.visible_message("<span class='notice'>[user] adds a card to [user.p_their()] hand.</span>", "<span class='notice'>You add the [cardname] to your hand.</span>")
H.interact(user)
if(H.currenthand.len > 4)
H.icon_state = "[deckstyle]_hand5"
else if(H.currenthand.len > 3)
H.icon_state = "[deckstyle]_hand4"
else if(H.currenthand.len > 2)
H.icon_state = "[deckstyle]_hand3"
H.update_icon()
qdel(src)
else
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
obj/item/toy/cards/cardhand/update_icon()
switch(currenthand.len)
if(0 to 1)
return
if(2)
icon_state = "[deckstyle]_hand2"
if(3)
icon_state = "[deckstyle]_hand3"
if(4)
icon_state = "[deckstyle]_hand4"
else
icon_state = "[deckstyle]_hand5"
obj/item/toy/cards/singlecard/attack_self(mob/user)
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
@@ -813,10 +791,12 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/therapy
name = "therapy doll"
desc = "A toy for therapeutic and recreational purposes."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyred"
item_state = "egg4"
w_class = WEIGHT_CLASS_TINY
var/cooldown = 0
burn_state = FLAMMABLE
/obj/item/toy/therapy/New()
if(item_color)
@@ -836,7 +816,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/toy.dmi'
icon_state = "therapyred"
/obj/random/prize/item_to_spawn()
/obj/random/therapy/item_to_spawn()
return pick(subtypesof(/obj/item/toy/therapy)) //exclude the base type.
/obj/item/toy/therapy/red
@@ -159,6 +159,10 @@
..()
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
/obj/item/grenade/chem_grenade/explosion/mine_armed/New()
..()
CreateDefaultTrigger(/obj/item/assembly/mousetrap/armed)
// Water + Potassium = Boom
@@ -198,6 +202,7 @@
// Basic EMP grenade
/obj/item/grenade/chem_grenade/emp
payload_name = "EMP"
@@ -86,6 +86,16 @@
new /obj/item/multitool(src)
new /obj/item/clothing/gloves/combat(src)
/obj/item/storage/toolbox/syndicate/trapped
name = "suspicious looking toolbox"
desc = "Danger. Very robust. Has a small red marker by the handle."
/obj/item/storage/toolbox/syndicate/trapped/New()
..()
new /obj/item/grenade/chem_grenade/explosion/mine_armed(src)
/obj/item/storage/toolbox/drone
name = "mechanical toolbox"
icon_state = "blue"
@@ -141,3 +141,6 @@ Frequency:
active_portals++
add_fingerprint(user)
return
/obj/item/hand_tele/portal_destroyed(obj/effect/portal/P)
active_portals--
@@ -121,26 +121,25 @@
if(!(opened ? close() : open()))
to_chat(user, "<span class='notice'>It won't budge!</span>")
// this should probably use dump_contents()
/obj/structure/closet/ex_act(severity)
switch(severity)
if(1)
for(var/atom/movable/A in src)//pulls everything out of the locker and hits it with an explosion
A.forceMove(loc)
A.ex_act(severity++)
dump_contents()
qdel(src)
if(2)
if(prob(50))
for(var/atom/movable/A in src)
A.forceMove(loc)
A.ex_act(severity++)
dump_contents()
new /obj/item/stack/sheet/metal(loc)
qdel(src)
if(3)
if(prob(5))
for(var/atom/movable/A in src)
A.forceMove(loc)
A.ex_act(severity++)
dump_contents()
new /obj/item/stack/sheet/metal(loc)
qdel(src)
@@ -149,23 +148,20 @@
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
health -= Proj.damage
if(health <= 0)
for(var/atom/movable/A in src)
A.forceMove(loc)
dump_contents()
qdel(src)
/obj/structure/closet/attack_animal(mob/living/simple_animal/user)
if(user.environment_smash)
user.do_attack_animation(src)
visible_message("<span class='warning'>[user] destroys the [src].</span>")
for(var/atom/movable/A in src)
A.forceMove(loc)
dump_contents()
qdel(src)
// this should probably use dump_contents()
/obj/structure/closet/blob_act()
if(prob(75))
for(var/atom/movable/A in src)
A.forceMove(loc)
dump_contents()
qdel(src)
/obj/structure/closet/attackby(obj/item/W, mob/user, params)
@@ -0,0 +1,45 @@
/obj/structure/closet/secure_closet/syndicate/depot
name = "depot supply closet"
desc = ""
locked = 0
anchored = 1
health = 200
req_access = list()
/obj/structure/closet/secure_closet/syndicate/depot/New()
. = ..()
update_icon()
/obj/structure/closet/secure_closet/syndicate/depot/emag_act()
. = ..()
loot_pickup()
/obj/structure/closet/secure_closet/syndicate/depot/open()
. = ..()
if(opened)
loot_pickup()
/obj/structure/closet/secure_closet/syndicate/depot/dump_contents()
loot_pickup()
. = ..()
/obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup()
var/area/syndicate_depot/core/depotarea = areaMaster
if(depotarea)
depotarea.locker_looted()
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
if(isanimal(M) && "syndicate" in M.faction)
to_chat(M, "<span class='warning'>The [src] resists your attack!</span>")
return
return ..(M)
/obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity)
return
/obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user)
. = ..()
if(!locked)
loot_pickup()
+106
View File
@@ -0,0 +1,106 @@
/obj/structure/fusionreactor
name = "syndicate fusion reactor"
desc = ""
icon = 'icons/obj/device.dmi'
icon_state = "powersink1"
anchored = 1
max_integrity = 50
var/area/syndicate_depot/core/depotarea
/obj/structure/fusionreactor/Initialize()
. = ..()
depotarea = areaMaster
if(depotarea)
depotarea.reactor = src
/obj/structure/fusionreactor/Destroy()
if(depotarea)
depotarea.reactor = null
..()
/obj/structure/fusionreactor/ex_act(severity)
if(severity < 3)
obj_integrity = 0
healthcheck()
/obj/structure/fusionreactor/bullet_act(obj/item/projectile/Proj)
obj_integrity -= Proj.damage
..()
healthcheck()
/obj/structure/fusionreactor/proc/healthcheck()
if(obj_integrity <= 0)
overload(TRUE)
/obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params)
if(iswrench(I))
playsound(loc, I.usesound, 50, 1)
to_chat(user, "<span class='notice'>The [src] is too well secured to the floor.</span>")
else if(isscrewdriver(I))
to_chat(user, "<span class='notice'>You try to screwdriver open [src], but accidentally release some radiation!</span>")
if(prob(50))
empulse(src, 4, 10)
else
for(var/mob/living/M in range(10, loc))
M.apply_effect(rand(5, 25), IRRADIATE)
else
return ..()
/obj/structure/fusionreactor/proc/overload(containment_failure)
var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src))
if(containment_failure)
playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0)
O.deliberate = TRUE
O.max_cycles = 6
qdel(src)
/obj/effect/overload
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
icon_state = "energy_ball"
pixel_x = -32
pixel_y = -32
anchored = 1
var/cycles = 0
var/beepsound = 'sound/items/timer.ogg'
var/deliberate = FALSE
var/max_cycles = 10
var/max_fire_range = 9
var/area/syndicate_depot/core/depotarea
/obj/effect/overload/Initialize()
. = ..()
processing_objects.Add(src)
depotarea = areaMaster
if(istype(depotarea))
if(!depotarea.used_self_destruct)
depotarea.used_self_destruct = TRUE // Silences all further alerts from this point onwards.
depotarea.updateicon()
depotarea.shields_down()
/obj/effect/overload/process()
var/turf/T = get_turf(src)
if(cycles < max_cycles)
if(!deliberate)
playsound(loc, beepsound, 50, 0)
cycles++
var/fire_range = min(cycles, max_fire_range)
for(var/turf/simulated/turf in range(fire_range, T))
new /obj/effect/hotspot(turf)
return
if(!istype(depotarea))
depotarea = areaMaster
if(istype(depotarea))
depotarea.destroyed = TRUE
depotarea.updateicon()
for(var/obj/structure/closet/L in range(30, T))
L.open()
for(var/mob/living/M in range(30, T))
M.gib()
explosion(get_turf(src), 25, 35, 45, 55, 1, 1, 60, 0, 0)
processing_objects.Remove(src)
qdel(src)
+2 -1
View File
@@ -61,7 +61,8 @@ var/global/nologevent = 0
body += "<a href='?src=[usr.UID()];priv_msg=\ref[M]'>PM</a> - "
body += "<a href='?_src_=holder;subtlemessage=\ref[M]'>SM</a> - "
body += "[admin_jump_link(M)]\] </b><br>"
if(ishuman(M) && M.mind)
body += "<a href='?_src_=holder;HeadsetMessage=[M.UID()]'>HM</a>"
body += "<b>Mob type:</b> [M.type]<br>"
if(M.client)
if(M.client.related_accounts_cid.len)
+1
View File
@@ -76,6 +76,7 @@ var/list/admin_verbs_admin = list(
/client/proc/toggle_mentor_chat,
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
/client/proc/list_ssds,
/client/proc/cmd_admin_headset_message,
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
+13 -12
View File
@@ -1675,21 +1675,22 @@
if(!check_rights(R_ADMIN))
return
var/mob/living/carbon/human/H = locate(href_list["CentcommReply"])
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
to_chat(usr, "The person you are trying to contact is not wearing a headset")
var/mob/M = locateUID(href_list["CentcommReply"])
usr.client.admin_headset_message(M, "Centcomm")
else if(href_list["SyndicateReply"])
if(!check_rights(R_ADMIN))
return
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via [H.p_their()] headset.","Outgoing message from Centcomm", "")
if(!input) return
var/mob/M = locateUID(href_list["SyndicateReply"])
usr.client.admin_headset_message(M, "Syndicate")
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
log_admin("[key_name(src.owner)] replied to [key_name(H)]'s Centcomm message with the message [input].")
message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)]'s Centcom message with: \"[input]\"")
to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"")
else if(href_list["HeadsetMessage"])
if(!check_rights(R_ADMIN))
return
var/mob/M = locateUID(href_list["HeadsetMessage"])
usr.client.admin_headset_message(M)
else if(href_list["EvilFax"])
if(!check_rights(R_ADMIN))
+40
View File
@@ -141,6 +141,46 @@
message_admins("<span class='boldnotice'>DirectNarrate: [key_name_admin(usr)] to ([key_name_admin(M)]): [msg]<BR></span>", 1)
feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_headset_message(mob/M in mob_list)
set category = "Event"
set name = "Headset Message"
admin_headset_message(M)
/client/proc/admin_headset_message(mob/M in mob_list, sender = null)
var/mob/living/carbon/human/H = M
if(!check_rights(R_ADMIN))
return
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset))
to_chat(usr, "The person you are trying to contact is not wearing a headset")
return
if(!sender)
sender = input("Who is the message from?", "Sender") as null|anything in list("Centcomm", "Syndicate")
if(!sender)
return
message_admins("[key_name_admin(src)] has started answering [key_name_admin(H)]'s [sender] request.")
var/input = input("Please enter a message to reply to [key_name(H)] via their headset.", "Outgoing message from [sender]", "") as text|null
if(!input)
message_admins("[key_name_admin(src)] decided not to answer [key_name_admin(H)]'s [sender] request.")
return
log_admin("[key_name(src)] replied to [key_name(H)]'s [sender] message with the message [input].")
message_admins("[key_name_admin(src)] replied to [key_name_admin(H)]'s [sender] message with: \"[input]\"")
to_chat(H, "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from [sender == "Syndicate" ? "your benefactor" : "Central Command"]. Message as follows[sender == "Syndicate" ? ", agent." : ":"] <span class='bold'>[input].</span> Message ends.\"")
/client/proc/cmd_admin_godmode(mob/M as mob in mob_list)
set category = "Admin"
set name = "Godmode"
+41 -31
View File
@@ -80,53 +80,60 @@ html {
color:#999;
}
table {background:#303030;border:1px solid #262626;}
caption {text-align:left;}
.button {
color:#cfcfcf;
text-decoration:none;
font-weight:bold;
text-align:center;
width:75px;
padding:21px;
box-sizing:border-box;
background:none;
border:none;
display: inline-block;
}
.button:hover {color:#ffffff;}
a {
color:#cfcfcf;
text-decoration:none;
font-weight:bold;
}
a:hover {color:#ffffff;}
a:hover {
color:#ffffff;
}
tr {
background:#303030;
border-radius:6px;
margin-bottom:0.5em;
border-bottom:1px solid black;
}
tr:nth-child(even) {
background:#3f3f3f;
}
p {margin:0;}
td.cost {
font-size:20pt;
font-weight:bold;
}
tr.dark {background:#303030;}
td.cost.affordable {
background:green;
}
tr.light {background:#3f3f3f;}
td.cost.toomuch {
background:maroon;
}
td,th {padding:15px;border-bottom:1px solid #262626;}
th.cost{padding:0px;border-left:1px solid #262626;}
th.cost.affordable {background:green;}
th.cost.toomuch {background:maroon;}
</style>
</head>
<body>
<p style="float:right"><b>Tickets:</b> [tickets] | <a href='byond://?src=[UID()];eject=1'>Eject Tickets</a></p>
<p style="float:right"><b>Tickets: [tickets]</b> | <a href='byond://?src=[UID()];eject=1'>Eject Tickets</a></p>
<h1>Arcade Ticket Exchange</h1>
<p>
<b>Exchange that pile of tickets for a pile of cool prizes!</b>
</p>
<h2>Available Prizes:</h2>
<br>
<table cellspacing="0" cellpadding="0">
<caption><b>Available Prizes:</b></caption>
<thead>
<th>#</th>
<th>Name/Description</th>
<th>Price</th>
<th>Tickets</th>
</thead>
<tbody>
"}
@@ -136,8 +143,11 @@ td.cost.toomuch {
if(item.cost>tickets)
cost_class="toomuch"
var/itemID = global_prizes.prizes.Find(item)
var/row_color="light"
if(itemID%2 == 0)
row_color="dark"
dat += {"
<tr>
<tr class="[row_color]">
<th>
[itemID]
</th>
@@ -147,10 +157,10 @@ td.cost.toomuch {
</td>
"}
dat += {"
<td class="cost [cost_class]">
<a href="byond://?src=[UID()];buy=[itemID]">[item.cost] Tickets</a>
</td>
</tr>
<th class="cost [cost_class]">
<a href="byond://?src=[UID()];buy=[itemID]" class="button">[item.cost]</a>
</th>
</tr>
"}
dat += {"
@@ -158,7 +168,7 @@ td.cost.toomuch {
</table>
</body>
</html>"}
user << browse(dat, "window=prize_counter")
user << browse(dat, "window=prize_counter;size=440x600;can_resize=0")
onclose(user, "prize_counter")
return
+131 -132
View File
@@ -34,7 +34,7 @@ var/global/datum/prizes/global_prizes = new
var/cost = 0
//////////////////////////////////////
// Tier 1 Prizes //
// Prizes //
//////////////////////////////////////
/datum/prize_item/balloon
@@ -43,18 +43,6 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/balloon
cost = 10
/datum/prize_item/crayons
name = "Box of Crayons"
desc = "A six-pack of crayons, just like back in kindergarten."
typepath = /obj/item/storage/fancy/crayons
cost = 35
/datum/prize_item/snappops
name = "Snap-Pops"
desc = "A box of exploding snap-pop fireworks."
typepath = /obj/item/storage/box/snappops
cost = 20
/datum/prize_item/spinningtoy
name = "Spinning Toy"
desc = "Looks like an authentic Singularity!"
@@ -62,46 +50,52 @@ var/global/datum/prizes/global_prizes = new
cost = 15
/datum/prize_item/blinktoy
name = "Blink toy"
name = "Blink Toy"
desc = "Blink. Blink. Blink."
typepath = /obj/item/toy/blink
cost = 15
/datum/prize_item/dice
name = "Dice set"
name = "Dice Set"
desc = "A set of assorted dice."
typepath = /obj/item/storage/box/dice
cost = 20
/datum/prize_item/cards
name = "Deck of cards"
desc = "Anyone fancy a game of 52-card Pickup?"
typepath = /obj/item/toy/cards/deck
cost = 25
/datum/prize_item/wallet
name = "Colored Wallet"
desc = "Brightly colored and big enough for standard issue ID cards."
typepath = /obj/item/storage/wallet/color
cost = 50
/datum/prize_item/pet_rock
name = "pet rock"
desc = "A pet of your very own!"
typepath = /obj/item/toy/pet_rock
cost = 80
/datum/prize_item/foam_darts
name = "Pack of Foam Darts"
desc = "A refill pack with foam darts."
typepath = /obj/item/ammo_box/foambox
cost = 20
/datum/prize_item/minigibber
name = "Minigibber Toy"
desc = "A model of the station gibber. Probably shouldn't stick your fingers in it."
typepath = /obj/item/toy/minigibber
cost = 60
/datum/prize_item/snappops
name = "Snap-Pops"
desc = "A box of exploding snap-pop fireworks."
typepath = /obj/item/storage/box/snappops
cost = 20
/datum/prize_item/cards
name = "Deck of Cards"
desc = "Anyone fancy a game of 52-card Pickup?"
typepath = /obj/item/toy/cards/deck
cost = 25
/datum/prize_item/crayons
name = "Box of Crayons"
desc = "A six-pack of crayons, just like back in kindergarten."
typepath = /obj/item/storage/fancy/crayons
cost = 35
/datum/prize_item/eight_ball
name = "Magic Eight Ball"
desc = "A mystical ball that can divine the future!"
typepath = /obj/item/toy/eight_ball
cost = 40
/datum/prize_item/wallet
name = "Colored Wallet"
desc = "Brightly colored and big enough for standard issue ID cards."
typepath = /obj/item/storage/wallet/color
cost = 50
/datum/prize_item/id_sticker
name = "Prisoner ID Sticker"
@@ -129,11 +123,17 @@ var/global/datum/prizes/global_prizes = new
desc = "A sticker that can make any ID look like something suspicious..."
typepath = /obj/item/id_decal/emag
/datum/prize_item/carp_plushie
name = "Random Carp Plushie"
desc = "A colorful fish-shaped plush toy."
typepath = /obj/item/toy/prizeball/carp_plushie
cost = 75
/datum/prize_item/flash
name = "Toy Flash"
desc = "AUGH! MY EYES!"
typepath = /obj/item/toy/flash
cost = 50
/datum/prize_item/minimeteor
name = "Mini-Meteor"
desc = "Meteors have been detected on a collision course with your fun times!"
typepath = /obj/item/toy/minimeteor
cost = 50
/datum/prize_item/therapy_doll
name = "Random Therapy Doll"
@@ -141,12 +141,30 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/prizeball/therapy
cost = 60
/datum/prize_item/minigibber
name = "Minigibber Toy"
desc = "A model of the station gibber. Probably shouldn't stick your fingers in it."
typepath = /obj/item/toy/minigibber
cost = 60
/datum/prize_item/confetti
name = "Confetti Grenade"
desc = "Party time!"
typepath = /obj/item/grenade/confetti
cost = 65
/datum/prize_item/plushie
name = "Random Animal Plushie"
desc = "A colorful animal-shaped plush toy."
typepath = /obj/item/toy/prizeball/plushie
cost = 75
/datum/prize_item/carp_plushie
name = "Random Carp Plushie"
desc = "A colorful fish-shaped plush toy."
typepath = /obj/item/toy/prizeball/carp_plushie
cost = 75
/datum/prize_item/mech_toy
name = "Random Mecha"
desc = "A random mecha figure, collect all 11!"
@@ -159,42 +177,11 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/prizeball/figure
cost = 75
/datum/prize_item/eight_ball
name = "Magic Eight Ball"
desc = "A mystical ball that can divine the future!"
typepath = /obj/item/toy/eight_ball
cost = 40
/datum/prize_item/tacticool
name = "Tacticool Turtleneck"
desc = "A cool-looking turtleneck."
typepath = /obj/item/clothing/under/syndicate/tacticool
cost = 90
/datum/prize_item/crossbow
name = "Foam Dart Crossbow"
desc = "A toy crossbow that fires foam darts."
typepath = /obj/item/gun/projectile/shotgun/toy/crossbow
cost = 100
/datum/prize_item/toy_xeno
name = "Xeno Action Figure"
desc = "A lifelike replica of the horrific xeno scourge."
typepath = /obj/item/toy/toy_xeno
cost = 80
/datum/prize_item/fakespell
name = "Fake Spellbook"
desc = "Perform magic! Astound your friends! Get mistaken for an enemy of the corporation!"
typepath = /obj/item/spellbook/oneuse/fake_gib
cost = 100
/datum/prize_item/nanomob_booster
name = "Nano-Mob Hunter Trading Card Booster Pack"
desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
typepath = /obj/item/storage/box/nanomob_booster_pack
cost = 100
/datum/prize_item/AI
name = "Toy AI Unit"
desc = "Law 1: Maximize fun for crew."
typepath = /obj/item/toy/AI
cost = 75
/datum/prize_item/capgun
name = "Capgun Revolver"
@@ -202,11 +189,35 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/gun/projectile/revolver/capgun
cost = 75
/datum/prize_item/confetti
name = "Confetti Grenade"
desc = "Party time!"
typepath = /obj/item/grenade/confetti
cost = 65
/datum/prize_item/pet_rock
name = "Pet Rock"
desc = "A pet of your very own!"
typepath = /obj/item/toy/pet_rock
cost = 80
/datum/prize_item/toy_xeno
name = "Xeno Action Figure"
desc = "A lifelike replica of the horrific xeno scourge."
typepath = /obj/item/toy/toy_xeno
cost = 80
/datum/prize_item/tacticool
name = "Tacticool Turtleneck"
desc = "A cool-looking turtleneck."
typepath = /obj/item/clothing/under/syndicate/tacticool
cost = 90
/datum/prize_item/nanomob_booster
name = "Nano-Mob Hunter Trading Card Booster Pack"
desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
typepath = /obj/item/storage/box/nanomob_booster_pack
cost = 100
/datum/prize_item/fakespell
name = "Fake Spellbook"
desc = "Perform magic! Astound your friends! Get mistaken for an enemy of the corporation!"
typepath = /obj/item/spellbook/oneuse/fake_gib
cost = 100
/datum/prize_item/magic_conch
name = "Magic Conch Shell"
@@ -214,30 +225,36 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/eight_ball/conch
cost = 100
/datum/prize_item/flash
name = "Toy Flash"
desc = "AUGH! MY EYES!"
typepath = /obj/item/toy/flash
cost = 50
/datum/prize_item/crossbow
name = "Foam Dart Crossbow"
desc = "A toy crossbow that fires foam darts."
typepath = /obj/item/gun/projectile/shotgun/toy/crossbow
cost = 100
/datum/prize_item/foamblade
name = "Foam Armblade"
name = "Foam Arm Blade"
desc = "Perfect for reenacting space horror holo-vids."
typepath = /obj/item/toy/foamblade
cost = 100
/datum/prize_item/minimeteor
name = "Mini-Meteor"
desc = "Meteors have been detected on a collision course with your fun times!"
typepath = /obj/item/toy/minimeteor
cost = 50
/datum/prize_item/redbutton
name = "Shiny Red Button"
desc = "PRESS IT!"
typepath = /obj/item/toy/redbutton
cost = 100
/datum/prize_item/nuke
name = "Nuclear Fun Device"
desc = "Annihilate boredom with an explosion of excitement!"
typepath = /obj/item/toy/nuke
cost = 100
/datum/prize_item/blobhat
name = "Blob Hat"
desc = "There's... something... on your head..."
typepath = /obj/item/clothing/head/blob
cost = 125
/datum/prize_item/owl
name = "Owl Action Figure"
desc = "Remember: heroes don't grief!"
@@ -250,48 +267,12 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/griffin
cost = 125
/datum/prize_item/AI
name = "Toy AI Unit"
desc = "Law 1: Maximize fun for crew."
typepath = /obj/item/toy/AI
cost = 75
/datum/prize_item/tommygun
name = "Tommygun"
desc = "A replica tommygun that fires foam darts."
typepath = /obj/item/gun/projectile/shotgun/toy/tommygun
cost = 175
/datum/prize_item/esword
name = "Toy Energy Sword"
desc = "A plastic replica of an energy blade."
typepath = /obj/item/toy/sword
cost = 150
/datum/prize_item/blobhat
name = "Blob Hat"
desc = "There's... something... on your head..."
typepath = /obj/item/clothing/head/blob
cost = 125
/datum/prize_item/nuke
name = "Nuclear Fun Device"
desc = "Annihilate boredom with an explosion of excitement!"
typepath = /obj/item/toy/nuke
cost = 100
/datum/prize_item/chainsaw
name = "Toy Chainsaw"
desc = "A full-scale model chainsaw, based on that massacre in Space Texas."
typepath = /obj/item/twohanded/toy/chainsaw
cost = 200
/datum/prize_item/spacesuit
name = "Fake Spacesuit"
desc = "A replica spacesuit. Not actually spaceworthy."
typepath = /obj/item/storage/box/fakesyndiesuit
cost = 180
/datum/prize_item/fakespace
name = "Space Carpet"
desc = "A stack of carpeted floor tiles that resemble space."
@@ -304,6 +285,24 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/stack/tile/arcade_carpet/loaded
cost = 150
/datum/prize_item/tommygun
name = "Tommy Gun"
desc = "A replica tommy gun that fires foam darts."
typepath = /obj/item/gun/projectile/shotgun/toy/tommygun
cost = 175
/datum/prize_item/spacesuit
name = "Fake Spacesuit"
desc = "A replica spacesuit. Not actually spaceworthy."
typepath = /obj/item/storage/box/fakesyndiesuit
cost = 180
/datum/prize_item/chainsaw
name = "Toy Chainsaw"
desc = "A full-scale model chainsaw, based on that massacre in Space Texas."
typepath = /obj/item/twohanded/toy/chainsaw
cost = 200
/datum/prize_item/bike
name = "Awesome Bike!"
desc = "WOAH."
+2 -1
View File
@@ -156,7 +156,8 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
while(sanity > 0)
sanity--
var/turf/T = locate(rand(25, world.maxx - 25), rand(25, world.maxy - 25), z_level)
// 8: 7 is the normal view distance of a client, +1 so that ruins don't suddenly appear
var/turf/T = locate(rand(TRANSITION_BORDER_WEST + (8 + ruin.width/2), TRANSITION_BORDER_EAST - (8 + ruin.width/2)), rand(TRANSITION_BORDER_SOUTH + (8 + ruin.height/2), TRANSITION_BORDER_NORTH - (8 + ruin.height/2)), z_level)
var/valid = 1
for(var/turf/check in ruin.get_affected_turfs(T,1))
+4 -4
View File
@@ -17,8 +17,8 @@
if(announce)
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
var/list/skipped_areas = list(/area/turret_protected/ai)
var/list/skipped_areas_apc = list(/area/engine/engineering)
var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot)
var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot)
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
@@ -41,8 +41,8 @@
C.cell.charge = 0
/proc/power_restore(var/announce = 1)
var/list/skipped_areas = list(/area/turret_protected/ai)
var/list/skipped_areas_apc = list(/area/engine/engineering)
var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot)
var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot)
if(announce)
event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
@@ -378,9 +378,9 @@
/obj/item/reagent_containers/food/snacks/customizable/examine(mob/user)
..(user)
var/whatsinside = pick(ingredients)
to_chat(user, "<span class='notice'> You think you can see [whatsinside] in there.</span>")
if(LAZYLEN(ingredients))
var/whatsinside = pick(ingredients)
to_chat(user, "<span class='notice'> You think you can see [whatsinside] in there.</span>")
/obj/item/reagent_containers/food/snacks/customizable/proc/newname()
@@ -470,4 +470,3 @@
if(unsorted[it] == i)
sorted[it] = i
return sorted
+50
View File
@@ -0,0 +1,50 @@
/obj/item/deck/holder
name = "card box"
desc = "A small leather case to show how classy you are compared to everyone else."
icon_state = "card_holder"
/obj/item/deck/cards
name = "deck of cards"
desc = "A simple deck of playing cards."
icon_state = "deck"
/obj/item/deck/cards/New()
..()
for(var/suit in list("spades","clubs","diamonds","hearts"))
var/colour
if(suit == "spades" || suit == "clubs")
colour = "black_"
else
colour = "red_"
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten"))
cards += new /datum/playingcard("[number] of [suit]", "[colour]num")
for(var/number in list("jack","queen","king"))
cards += new /datum/playingcard("[number] of [suit]", "[colour]col")
for(var/i = 0, i<2, i++)
cards += new /datum/playingcard("joker", "joker")
/obj/item/deck/doublecards
name = "double deck of cards"
desc = "A simple deck of playing cards. Multiplied by two. Does not necessarily come with twice the fun."
icon_state = "doubledeck"
/obj/item/deck/doublecards/New()
..()
for(var/f = 0, f<2, f++)
for(var/suit in list("spades","clubs","diamonds","hearts"))
var/colour
if(suit == "spades" || suit == "clubs")
colour = "black_"
else
colour = "red_"
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten",))
cards += new /datum/playingcard("[number] of [suit]", "[colour]num")
for(var/number in list("jack","queen","king"))
cards += new /datum/playingcard("[number] of [suit]", "[colour]col")
for(var/i = 0, i<2, i++)
cards += new /datum/playingcard("joker", "joker")
+481
View File
@@ -0,0 +1,481 @@
/datum/playingcard
var/name = "playing card"
var/card_icon = "card_back"
var/back_icon = "card_back"
/datum/playingcard/New(newname, newcard_icon, newback_icon)
..()
if(newname)
name = newname
if(newcard_icon)
card_icon = newcard_icon
if(newback_icon)
back_icon = newback_icon
/obj/item/deck
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/playing_cards.dmi'
actions_types = list(/datum/action/item_action/draw_card, /datum/action/item_action/deal_card, /datum/action/item_action/deal_card_multi, /datum/action/item_action/shuffle)
var/list/cards = list()
var/cooldown = 0 // to prevent spam shuffle
throw_speed = 3
throw_range = 10
throwforce = 0
force = 0
/obj/item/deck/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/cardhand))
var/obj/item/cardhand/H = O
if(H.parentdeck == src)
for(var/datum/playingcard/P in H.cards)
cards += P
qdel(H)
to_chat(user,"<span class='notice'>You place your cards on the bottom of [src]</span>.")
return
else
to_chat(user,"<span class='warning'>You can't mix cards from different decks!</span>")
return
..()
/obj/item/deck/examine(mob/user)
..()
to_chat(user,"<span class='notice'>It contains [cards.len ? cards.len : "no"] cards</span class>")
/obj/item/deck/attack_hand(mob/user as mob)
draw_card(user)
// Datum actions
/datum/action/item_action/draw_card
name = "Draw - Draw one card"
button_icon_state = "draw"
use_itemicon = FALSE
/datum/action/item_action/draw_card/Trigger()
if(istype(target, /obj/item/deck))
var/obj/item/deck/D = target
return D.draw_card(owner)
return ..()
/datum/action/item_action/deal_card
name = "Deal - deal one card to a person next to you"
button_icon_state = "deal_card"
use_itemicon = FALSE
/datum/action/item_action/deal_card/Trigger()
if(istype(target, /obj/item/deck))
var/obj/item/deck/D = target
return D.deal_card()
return ..()
/datum/action/item_action/deal_card_multi
name = "Deal multiple card - Deal multiple card to a person next to you"
button_icon_state = "deal_card_multi"
use_itemicon = FALSE
/datum/action/item_action/deal_card_multi/Trigger()
if(istype(target, /obj/item/deck))
var/obj/item/deck/D = target
return D.deal_card_multi()
return ..()
/datum/action/item_action/shuffle
name = "Shuffle - shuffle the deck"
button_icon_state = "shuffle"
use_itemicon = FALSE
/datum/action/item_action/shuffle/Trigger()
if(istype(target, /obj/item/deck))
var/obj/item/deck/D = target
return D.deckshuffle()
return ..()
// Datum actions
/obj/item/deck/verb/draw_card(mob/user)
set category = "Object"
set name = "Draw"
set desc = "Draw a card from a deck."
set src in view(1)
var/mob/living/carbon/human/M = user
if(user.incapacitated() || !Adjacent(user))
return
if(!cards.len)
to_chat(user,"<span class='notice'>There are no cards in the deck.</span>")
return
var/obj/item/cardhand/H = M.is_in_hands(/obj/item/cardhand)
if(H && !(H.parentdeck == src))
to_chat(user,"<span class='warning'>You can't mix cards from different decks!</span>")
return
if(H && ((1 + H.cards.len) > H.maxcardlen))
to_chat(user,"<span class = 'warning'>You can't hold that many cards in one hand!</span>")
return
if(!H)
H = new(get_turf(src))
user.put_in_hands(H)
var/datum/playingcard/P = cards[1]
H.cards += P
cards -= P
H.parentdeck = src
H.update_icon()
user.visible_message("<span class='notice'>[user] draws a card.</span>","<span class='notice'>You draws a card.</span>")
to_chat(user,"<span class='notice'>It's [P].</span>")
/obj/item/deck/verb/deal_card()
set category = "Object"
set name = "Deal"
set desc = "Deal a card from a deck."
set src in view(1)
if(usr.incapacitated() || !Adjacent(usr))
return
if(!cards.len)
to_chat(usr,"<span class='notice'>There are no cards in the deck.</span>")
return
var/list/players = list()
for(var/mob/living/player in viewers(3))
if(!player.incapacitated())
players += player
//players -= usr
var/mob/living/M = input("Who do you wish to deal a card to?") as null|anything in players
if(!usr || !src || !M) return
deal_at(usr, M, 1)
/obj/item/deck/verb/deal_card_multi()
set category = "Object"
set name = "Deal Multiple Cards"
set desc = "Deal multiple cards from a deck."
set src in view(1)
if(usr.incapacitated() || !Adjacent(usr))
return
if(!cards.len)
to_chat(usr,"<span class='notice'>There are no cards in the deck.</span>")
return
var/list/players = list()
for(var/mob/living/player in viewers(3))
if(!player.incapacitated())
players += player
var/maxcards = max(min(cards.len,10),1)
var/dcard = input("How many card(s) do you wish to deal? You may deal up to [maxcards] cards.") as num
if(dcard > maxcards)
return
var/mob/living/M = input("Who do you wish to deal [dcard] card(s)?") as null|anything in players
if(!usr || !src || !M || !Adjacent(usr))
return
deal_at(usr, M, dcard)
/obj/item/deck/proc/deal_at(mob/user, mob/target, dcard) // Take in the no. of card to be dealt
var/obj/item/cardhand/H = new(get_step(user, user.dir))
for(var/i in 1 to dcard)
H.cards += cards[1]
cards -= cards[1]
H.parentdeck = src
H.concealed = TRUE
H.update_icon()
if(user == target)
user.visible_message("<span class='notice'>[user] deals [dcard] card(s) to \himself.</span>")
else
user.visible_message("<span class='notice'>[user] deals [dcard] card(s) to [target].</span>")
H.throw_at(get_step(target,target.dir),3,1,H)
/obj/item/deck/attack_self()
deckshuffle()
/obj/item/deck/verb/verb_shuffle()
set category = "Object"
set name = "Shuffle"
set desc = "Shuffle the cards in the deck."
set src in view(1)
deckshuffle()
/obj/item/deck/proc/deckshuffle()
var/mob/living/user = usr
if(cooldown < world.time - 5 SECONDS)
cards = shuffle(cards)
user.visible_message("<span class='notice'>[user] shuffles [src].</span>")
playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
cooldown = world.time
/obj/item/deck/MouseDrop(atom/over_object) // Code from Paper bin, so you can still pick up the deck
var/mob/M = usr
if(M.incapacitated() || !Adjacent(M))
return
if(over_object == M)
M.put_in_hands(src)
else if(istype(over_object, /obj/screen))
switch(over_object.name)
if("r_hand")
if(!remove_item_from_storage(M))
M.unEquip(src)
M.put_in_r_hand(src)
if("l_hand")
if(!remove_item_from_storage(M))
M.unEquip(src)
M.put_in_l_hand(src)
add_fingerprint(M)
usr.visible_message("<span class='notice'>[usr] picks up the deck.</span>")
/obj/item/pack
name = "Card Pack"
desc = "For those with disposable income."
icon_state = "card_pack"
icon = 'icons/obj/playing_cards.dmi'
w_class = WEIGHT_CLASS_TINY
var/list/cards = list()
var/parentdeck = null // For future card pack that need to be compatible with eachother i.e. cardemon
/obj/item/pack/attack_self(mob/user as mob)
user.visible_message("<span class='notice'>[name] rips open the [src]!</span>", "<span class='notice'>You rips open the [src]!</span>")
var/obj/item/cardhand/H = new()
H.cards += cards
cards.Cut()
user.unEquip(src, force = 1)
qdel(src)
H.update_icon()
user.put_in_active_hand(H)
/obj/item/cardhand
name = "hand of cards"
desc = "Some playing cards."
icon = 'icons/obj/playing_cards.dmi'
icon_state = "empty"
w_class = WEIGHT_CLASS_TINY
throw_speed = 4
throw_range = 20
throwforce = 0
force = 0
var/maxcardlen = 20
actions_types = list(/datum/action/item_action/remove_card, /datum/action/item_action/discard)
var/concealed = FALSE
var/list/cards = list()
var/parentdeck = null
/obj/item/cardhand/attackby(obj/O as obj, mob/user as mob)
if(cards.len == 1 && istype(O, /obj/item/pen))
var/datum/playingcard/P = cards[1]
if(P.name != "Blank Card")
to_chat(user,"<span class='notice'>You cannot write on that card.</span>")
return
var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Editing") as text|null, MAX_PAPER_MESSAGE_LEN)
if(!cardtext)
return
P.name = cardtext
// SNOWFLAKE FOR CAG, REMOVE IF OTHER CARDS ARE ADDED THAT USE THIS.
P.card_icon = "cag_white_card"
update_icon()
else if(istype(O,/obj/item/cardhand))
var/obj/item/cardhand/H = O
if((H.cards.len + cards.len) > maxcardlen)
to_chat(user,"<span class='warning'>You can't hold that many cards in one hand!</span>")
return
if(H.parentdeck == src.parentdeck)
for(var/datum/playingcard/P in cards)
H.cards += P
H.concealed = src.concealed
qdel(src)
H.update_icon()
return
else
to_chat(user,"<span class='notice'>You cannot mix cards from other deck!</span>")
return
..()
/obj/item/cardhand/attack_self(var/mob/user as mob)
concealed = !concealed
update_icon()
user.visible_message("<span class='notice'>[user] [concealed ? "conceals" : "reveals"] their hand.</span>")
/obj/item/cardhand/examine(mob/user)
..(user)
if((!concealed) && cards.len)
to_chat(user,"<span class='notice'>It contains:</span class>")
for(var/datum/playingcard/P in cards)
to_chat(user,"<span class='notice'>the [P.name].</span class>")
// Datum action here
/datum/action/item_action/remove_card
name = "Remove a card - Remove a single card from the hand."
button_icon_state = "remove_card"
use_itemicon = FALSE
/datum/action/item_action/remove_card/Trigger()
if(istype(target, /obj/item/cardhand))
var/obj/item/cardhand/C = target
return C.Removecard()
return ..()
/datum/action/item_action/discard
name = "Discard - Place (a) card(s) from your hand in front of you."
button_icon_state = "discard"
use_itemicon = FALSE
/datum/action/item_action/discard/Trigger()
if(istype(target, /obj/item/cardhand))
var/obj/item/cardhand/C = target
return C.discard()
return ..()
// No more datum action here
/obj/item/cardhand/verb/Removecard()
set category = "Object"
set name = "Remove card"
set desc = "Remove a card from the hand."
set src in view(1)
var/mob/living/carbon/user = usr
if(user.incapacitated() || !Adjacent(user))
return
var/pickablecards = list()
for(var/datum/playingcard/P in cards)
pickablecards[P.name] = P
var/pickedcard = input("Which card do you want to remove from the hand?") as null|anything in pickablecards
if(QDELETED(src))
return
var/datum/playingcard/card = pickablecards[pickedcard]
var/obj/item/cardhand/H = new(get_turf(src))
user.put_in_active_hand(H)
H.cards += card
cards -= card
H.parentdeck = parentdeck
H.concealed = concealed
H.update_icon()
update_icon()
if(!cards.len)
qdel(src)
/obj/item/cardhand/verb/discard(var/mob/user as mob)
set category = "Object"
set name = "Discard"
set desc = "Place (a) card(s) from your hand in front of you."
var/maxcards = min(cards.len,5)
var/discards = input("How many cards do you want to discard? You may discard up to [maxcards] card(s)") as num
if(discards > maxcards)
return
for(var/i in 1 to discards)
var/list/to_discard = list()
for(var/datum/playingcard/P in cards)
to_discard[P.name] = P
var/discarding = input("Which card do you wish to put down?") as null|anything in to_discard
if(QDELETED(src))
return
var/datum/playingcard/card = to_discard[discarding]
to_discard.Cut()
var/obj/item/cardhand/H = new(get_turf(src))
H.cards += card
cards -= card
H.concealed = FALSE
H.parentdeck = parentdeck
H.update_icon()
if(cards.len)
update_icon()
if(H.cards.len)
usr.visible_message("<span class='notice'>The [user] plays the [discarding].</span>", "<span class='notice'>You play the [discarding].</span>")
H.loc = get_step(usr,usr.dir)
if(!cards.len)
qdel(src)
/obj/item/cardhand/update_icon(var/direction = 0)
if(!cards.len)
qdel(src)
return
else if(cards.len > 1)
name = "hand of cards"
desc = "Some playing cards."
else
name = "a playing card"
desc = "A playing card."
overlays.Cut()
if(cards.len == 1)
var/datum/playingcard/P = cards[1]
var/image/I = new(icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
I.pixel_x += (-5+rand(10))
I.pixel_y += (-5+rand(10))
overlays += I
return
var/offset = Floor(20/cards.len + 1)
var/matrix/M = matrix()
if(direction)
switch(direction)
if(NORTH)
M.Translate( 0, 0)
if(SOUTH)
M.Translate( 0, 4)
if(WEST)
M.Turn(90)
M.Translate( 3, 0)
if(EAST)
M.Turn(90)
M.Translate(-2, 0)
var/i = 0
for(var/datum/playingcard/P in cards)
var/image/I = new(icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
//I.pixel_x = origin+(offset*i)
switch(direction)
if(SOUTH)
I.pixel_x = 8-(offset*i)
if(WEST)
I.pixel_y = -6+(offset*i)
if(EAST)
I.pixel_y = 8-(offset*i)
else
I.pixel_x = -7+(offset*i)
I.transform = M
overlays += I
i++
/obj/item/cardhand/dropped(mob/user as mob)
..()
if(locate(/obj/structure/table, loc))
update_icon(user.dir)
else
update_icon()
/obj/item/cardhand/pickup(mob/user as mob)
update_icon()
+32
View File
@@ -0,0 +1,32 @@
/* this is a playing card deck based off of the Rider-Waite Tarot Deck.
*/
/obj/item/deck/tarot
name = "deck of tarot cards"
desc = "For all your occult needs!"
icon_state = "deck_tarot"
/obj/item/deck/tarot/New()
..()
for(var/tarotname in list("Fool","Magician","High Priestess","Empress","Emperor","Hierophant","Lovers","Chariot","Strength","Hermit","Wheel of Fortune","Justice","Hanged Man","Death","Temperance","Devil","Tower","Star","Moon","Sun","Judgement","World"))
cards += new /datum/playingcard("[tarotname]", "tarot_major", "card_back_tarot")
for(var/suit in list("wands","pentacles","cups","swords"))
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king"))
cards += new /datum/playingcard("[number] of [suit]", "tarot_[suit]", "card_back_tarot")
/obj/item/deck/tarot/deckshuffle()
var/mob/living/user = usr
if(cooldown < world.time - 5 SECONDS)
var/list/newcards = list()
while(cards.len)
var/datum/playingcard/P = pick(cards)
P.name = replacetext(P.name," reversed","")
if(prob(50))
P.name += " reversed"
newcards += P
cards -= P
cards = newcards
playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
user.visible_message("<span class ='notice'>[user] shuffles [src].</span>", "<span class='notice'>You shuffle the [src].</span>")
cooldown = world.time
+3 -2
View File
@@ -95,8 +95,9 @@
sideslist = list("valid", "salad")
credits = 20
/obj/item/coin/antagtoken/New()
return
/obj/item/coin/antagtoken/syndicate
name = "syndicate coin"
credits = 160
/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/stack/cable_coil))
+2 -155
View File
@@ -1291,7 +1291,7 @@
if(oldspecies.default_genes.len)
oldspecies.handle_dna(src, TRUE) // Remove any genes that belong to the old species
oldspecies.handle_pre_change(src)
oldspecies.on_species_loss(src)
dna.species = new new_species()
@@ -1365,7 +1365,7 @@
dna.real_name = real_name
dna.species.handle_post_spawn(src)
dna.species.on_species_gain(src)
see_in_dark = dna.species.get_resultant_darksight(src)
if(see_in_dark > 2)
@@ -1447,122 +1447,6 @@
W.message = message
W.add_fingerprint(src)
// Allows IPC's to change their monitor display
/mob/living/carbon/human/proc/change_monitor()
set category = "IC"
set name = "Change Monitor/Optical Display"
set desc = "Change the display on your monitor or the colour of your optics."
if(incapacitated())
to_chat(src, "<span class='warning'>You cannot change your monitor or optical display in your current state.</span>")
return
var/obj/item/organ/external/head/head_organ = get_organ("head")
if(!head_organ) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
to_chat(src, "<span class='warning'>Where's your head at? Can't change your monitor/display without one.</span>")
return
if(dna.species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body...
var/datum/robolimb/robohead = all_robolimbs[head_organ.model]
if(!head_organ)
return
if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
var/optic_colour = input(src, "Select optic colour", m_colours["head"]) as color|null
if(incapacitated())
to_chat(src, "<span class='warning'>You were interrupted while changing the colour of your optics.</span>")
return
if(optic_colour)
change_markings(optic_colour, "head")
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
if(incapacitated())
to_chat(src, "<span class='warning'>You were interrupted while changing your monitor display.</span>")
return
if(new_style)
change_hair(new_style)
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
/mob/living/carbon/human/proc/leap()
set category = "Abilities"
set name = "Leap"
set desc = "Leap at a target and grab them aggressively."
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
to_chat(src, "You cannot leap in your current state.")
return
var/list/choices = list()
for(var/mob/living/M in view(6,src))
if(!istype(M,/mob/living/silicon))
choices += M
choices -= src
var/mob/living/T = input(src,"Who do you wish to leap at?") as null|anything in choices
if(!T || !src || src.stat) return
if(get_dist(get_turf(T), get_turf(src)) > 6) return
if(last_special > world.time)
return
if(!canmove)
to_chat(src, "You cannot leap in your current state.")
return
last_special = world.time + 75
status_flags |= LEAPING
src.visible_message("<span class='warning'><b>\The [src]</b> leaps at [T]!</span>")
src.throw_at(get_step(get_turf(T),get_turf(src)), 5, 1, src)
playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1)
sleep(5)
if(status_flags & LEAPING) status_flags &= ~LEAPING
if(!src.Adjacent(T))
to_chat(src, "<span class='warning'>You miss!</span>")
return
T.Weaken(5)
//Only official raider vox get the grab and no self-prone."
if(src.mind && src.mind.special_role != "Vox Raider")
src.Weaken(5)
return
var/use_hand = "left"
if(l_hand)
if(r_hand)
to_chat(src, "<span class='warning'>You need to have one hand free to grab someone.</span>")
return
else
use_hand = "right"
src.visible_message("<span class='warning'><b>\The [src]</b> seizes [T] aggressively!</span>")
var/obj/item/grab/G = new(src,T)
if(use_hand == "left")
l_hand = G
else
r_hand = G
G.state = GRAB_AGGRESSIVE
G.icon_state = "grabbed1"
G.synch()
/mob/living/carbon/human/proc/get_eyecon()
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
@@ -1598,43 +1482,6 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
return TRUE
/mob/living/carbon/human/proc/gut()
set category = "Abilities"
set name = "Gut"
set desc = "While grabbing someone aggressively, rip their guts out or tear them apart."
if(last_special > world.time)
return
if(!canmove)
to_chat(src, "<span class='warning'>You cannot do that in your current state.</span>")
return
var/obj/item/grab/G = locate() in src
if(!G || !istype(G))
to_chat(src, "<span class='warning'>You are not grabbing anyone.</span>")
return
if(G.state < GRAB_AGGRESSIVE)
to_chat(src, "<span class='warning'>You must have an aggressive grab to gut your prey!</span>")
return
last_special = world.time + 50
visible_message("<span class='warning'><b>\The [src]</b> rips viciously at \the [G.affecting]'s body with its claws!</span>")
if(istype(G.affecting,/mob/living/carbon/human))
var/mob/living/carbon/human/H = G.affecting
H.apply_damage(50,BRUTE)
if(H.stat == 2)
H.gib()
else
var/mob/living/M = G.affecting
if(!istype(M)) return //wut
M.apply_damage(50,BRUTE)
if(M.stat == 2)
M.gib()
/mob/living/carbon/human/assess_threat(var/mob/living/simple_animal/bot/secbot/judgebot, var/lasercolor)
if(judgebot.emagged == 2)
return 10 //Everyone is a criminal!
@@ -79,8 +79,6 @@
var/bodyflags = 0
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
var/list/abilities = list() // For species-derived or admin-given powers
var/blood_color = "#A10808" //Red.
var/flesh_color = "#FFC896" //Pink.
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
@@ -95,6 +93,8 @@
var/show_ssd = 1
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
var/has_gender = TRUE
var/blacklisted = FALSE
var/dangerous_existence = FALSE
//Death vars.
var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
@@ -151,9 +151,7 @@
"l_hand" = list("path" = /obj/item/organ/external/hand),
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
)
var/list/proc/species_abilities = list()
"r_foot" = list("path" = /obj/item/organ/external/foot/right))
/datum/species/New()
//If the species has eyes, they are the default vision organ
@@ -259,25 +257,16 @@
. -= 2
return .
/datum/species/proc/handle_post_spawn(mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
grant_abilities(C)
/datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
return
/datum/species/proc/on_species_loss(mob/living/carbon/human/H)
if(H.butcher_results) //clear it out so we don't butcher a actual human.
H.butcher_results = null
/datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
return
/datum/species/proc/grant_abilities(mob/living/carbon/human/H)
for(var/proc/ability in species_abilities)
H.verbs += ability
/datum/species/proc/handle_pre_change(mob/living/carbon/human/H)
if(H.butcher_results) //clear it out so we don't butcher a actual human.
H.butcher_results = null
remove_abilities(H)
/datum/species/proc/remove_abilities(mob/living/carbon/human/H)
for(var/proc/ability in species_abilities)
H.verbs -= ability
// Do species-specific reagent handling here
// Return 1 if it should do normal processing too
// Return the parent value if processing does not explicitly stop
@@ -297,7 +286,7 @@
H.setOxyLoss(0)
H.SetLoseBreath(0)
/datum/species/proc/handle_dna(mob/living/carbon/C, remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
/datum/species/proc/handle_dna(mob/living/carbon/human/H, remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
return
/datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
@@ -717,4 +706,15 @@ It'll return null if the organ doesn't correspond, so include null checks when u
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
/proc/get_random_species(species_name = FALSE) // Returns a random non black-listed or hazardous species, either as a string or datum
var/static/list/random_species = list()
if(!random_species.len)
for(var/thing in subtypesof(/datum/species))
var/datum/species/S = thing
if(!initial(S.dangerous_existence) && !initial(S.blacklisted))
random_species += initial(S.name)
var/picked_species = pick(random_species)
var/datum/species/selected_species = GLOB.all_species[picked_species]
return species_name ? picked_species : selected_species.type
@@ -32,15 +32,15 @@
/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
return TRUE
/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
/datum/species/abductor/on_species_gain(mob/living/carbon/human/H)
..()
H.gender = NEUTER
H.languages.Cut() //Under no condition should you be able to speak any language
H.add_language("Abductor Mindlink") //other than over the abductor's own mindlink
var/datum/atom_hud/abductor_hud = huds[DATA_HUD_ABDUCTOR]
abductor_hud.add_hud_to(H)
return ..()
/datum/species/abductor/remove_abilities(mob/living/carbon/human/H)
/datum/species/abductor/on_species_loss(mob/living/carbon/human/H)
..()
var/datum/atom_hud/abductor_hud = huds[DATA_HUD_ABDUCTOR]
abductor_hud.remove_hud_from(H)
@@ -76,17 +76,16 @@
"pulls out a secret stash of herbicide and takes a hearty swig!",
"is pulling themselves apart!")
/datum/species/diona/can_understand(var/mob/other)
/datum/species/diona/can_understand(mob/other)
if(istype(other, /mob/living/simple_animal/diona))
return 1
return 0
/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H)
/datum/species/diona/on_species_gain(mob/living/carbon/human/H)
..()
H.gender = NEUTER
return ..()
/datum/species/diona/handle_life(var/mob/living/carbon/human/H)
/datum/species/diona/handle_life(mob/living/carbon/human/H)
H.radiation = Clamp(H.radiation, 0, 100) //We have to clamp this first, then decrease it, or there's a few edge cases of massive heals if we clamp and decrease at the same time.
var/rads = H.radiation / 25
H.radiation = max(H.radiation-rads, 0)
@@ -42,7 +42,8 @@
"is crumbling into dust!",
"is smashing their body apart!")
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
/datum/species/golem/on_species_gain(mob/living/carbon/human/H)
..()
if(H.mind)
H.mind.assigned_role = "Golem"
H.mind.special_role = SPECIAL_ROLE_GOLEM
@@ -53,7 +54,6 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/golem(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/golem(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/golem(H), slot_gloves)
..()
////////Adamantine Golem stuff I dunno where else to put it
@@ -29,19 +29,15 @@
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
if(!remove)
C.dna.SetSEState(REMOTETALKBLOCK,1,1)
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
else
C.dna.SetSEState(REMOTETALKBLOCK,0,1)
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
/datum/species/grey/handle_dna(mob/living/carbon/human/H, remove)
..()
H.dna.SetSEState(REMOTETALKBLOCK, !remove, 1)
genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED)
/datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source)
/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source)
..()
C.take_organ_damage(5,min(volume,20))
C.emote("scream")
H.take_organ_damage(5, min(volume, 20))
H.emote("scream")
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/speech_pref = H.client.prefs.speciesprefs
@@ -72,17 +72,64 @@
"is frying their own circuits!",
"is blocking their ventilation port!")
species_abilities = list(
/mob/living/carbon/human/proc/change_monitor
)
var/datum/action/innate/change_monitor/monitor
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
/datum/species/machine/on_species_gain(mob/living/carbon/human/H)
..()
monitor = new()
monitor.Grant(H)
/datum/species/machine/on_species_loss(mob/living/carbon/human/H)
..()
if(monitor)
monitor.Remove(H)
/datum/species/machine/handle_death(mob/living/carbon/human/H)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!head_organ)
return
head_organ.h_style = "Bald"
head_organ.f_style = "Shaved"
spawn(100)
if(H)
if(H && head_organ)
H.update_hair()
H.update_fhair()
H.update_fhair()
// Allows IPC's to change their monitor display
/datum/action/innate/change_monitor
name = "Change Monitor"
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "scan_mode"
/datum/action/innate/change_monitor/Activate()
var/mob/living/carbon/human/H = owner
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!head_organ) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
to_chat(H, "<span class='warning'>Where's your head at? Can't change your monitor/display without one.</span>")
return
var/datum/robolimb/robohead = all_robolimbs[head_organ.model]
if(!head_organ)
return
if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
var/optic_colour = input(H, "Select optic colour", H.m_colours["head"]) as color|null
if(H.incapacitated())
to_chat(H, "<span class='warning'>You were interrupted while changing the colour of your optics.</span>")
return
if(optic_colour)
H.change_markings(optic_colour, "head")
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(H, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
if(H.incapacitated())
to_chat(src, "<span class='warning'>You were interrupted while changing your monitor display.</span>")
return
if(new_style)
H.change_hair(new_style)
@@ -35,7 +35,7 @@
brute_mod = 1.5
burn_mod = 1.5
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
/datum/species/monkey/handle_npc(mob/living/carbon/human/H)
if(H.stat != CONSCIOUS)
return
if(prob(33) && H.canmove && isturf(H.loc) && !H.pulledby) //won't move if being pulled
@@ -46,16 +46,17 @@
/datum/species/monkey/get_random_name()
return "[lowertext(name)] ([rand(100,999)])"
/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H)
/datum/species/monkey/on_species_gain(mob/living/carbon/human/H)
..()
H.real_name = "[lowertext(name)] ([rand(100,999)])"
H.name = H.real_name
H.butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/monkey = 5)
/datum/species/monkey/handle_dna(mob/living/carbon/human/H, remove)
..()
/datum/species/monkey/handle_dna(var/mob/living/carbon/human/H)
H.dna.SetSEState(MONKEYBLOCK,1)
genemutcheck(H,MONKEYBLOCK,null,MUTCHK_FORCED)
if(!remove)
H.dna.SetSEState(MONKEYBLOCK, TRUE)
genemutcheck(H, MONKEYBLOCK, null, MUTCHK_FORCED)
/datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
switch(slot)
@@ -2,6 +2,7 @@
name = "Nucleation"
name_plural = "Nucleations"
icobase = 'icons/mob/human_races/r_nucleation.dmi'
blacklisted = TRUE
blurb = "A sub-race of unfortunates who have been exposed to too much supermatter radiation. As a result, \
supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \
has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \
@@ -28,14 +29,13 @@
)
vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal
/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H)
/datum/species/nucleation/on_species_gain(mob/living/carbon/human/H)
..()
H.light_color = "#1C1C00"
H.set_light(2)
return ..()
/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H)
/datum/species/nucleation/handle_death(mob/living/carbon/human/H)
var/turf/T = get_turf(H)
H.visible_message("<span class='warning'>[H]'s body explodes, leaving behind a pile of microscopic crystals!</span>")
explosion(T, 0, 0, 2, 2) // Create a small explosion burst upon death
// new /obj/item/shard/supermatter( T )
qdel(H)
@@ -3,6 +3,7 @@
name_plural = "Plasmamen"
icobase = 'icons/mob/human_races/r_plasmaman_sb.dmi'
deform = 'icons/mob/human_races/r_plasmaman_pb.dmi' // TODO: Need deform.
dangerous_existence = TRUE //So so much
//language = "Clatter"
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
@@ -162,7 +163,7 @@
H.internal = H.get_item_by_slot(tank_slot)
H.update_action_buttons_icon()
/datum/species/plasmaman/handle_life(var/mob/living/carbon/human/H)
/datum/species/plasmaman/handle_life(mob/living/carbon/human/H)
if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
var/datum/gas_mixture/environment = H.loc.return_air()
if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
@@ -178,7 +179,7 @@
H.update_fire()
..()
/datum/species/plasmaman/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
/datum/species/plasmaman/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == "plasma")
H.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
@@ -4,6 +4,7 @@
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
dangerous_existence = TRUE
unarmed_type = /datum/unarmed_attack/claws
@@ -28,7 +29,7 @@
"is twisting their own neck!",
"is staring into the closest light source!")
var/grant_vision_toggle = 1
var/grant_vision_toggle = TRUE
var/datum/action/innate/shadow/darkvision/vision_toggle
/datum/action/innate/shadow/darkvision //Darkvision toggle so shadowpeople can actually see where darkness is
@@ -46,19 +47,19 @@
H.vision_type = null
to_chat(H, "<span class='notice'>You adjust your vision to recognize the shadows.</span>")
/datum/species/shadow/grant_abilities(var/mob/living/carbon/human/H)
. = ..()
/datum/species/shadow/on_species_gain(mob/living/carbon/human/H)
..()
if(grant_vision_toggle)
vision_toggle = new
vision_toggle.Grant(H)
/datum/species/shadow/remove_abilities(var/mob/living/carbon/human/H)
. = ..()
/datum/species/shadow/on_species_loss(mob/living/carbon/human/H)
..()
if(grant_vision_toggle && vision_toggle)
H.vision_type = null
vision_toggle.Remove(H)
/datum/species/shadow/handle_life(var/mob/living/carbon/human/H)
/datum/species/shadow/handle_life(mob/living/carbon/human/H)
var/light_amount = 0
if(isturf(H.loc))
var/turf/T = H.loc
@@ -4,6 +4,7 @@
icobase = 'icons/mob/human_races/r_shadowling.dmi'
deform = 'icons/mob/human_races/r_shadowling.dmi'
blacklisted = TRUE
blood_color = "#555555"
flesh_color = "#222222"
@@ -20,7 +21,7 @@
"brain" = /obj/item/organ/internal/brain,
"eyes" = /obj/item/organ/internal/eyes)
/datum/species/shadow/ling/handle_life(var/mob/living/carbon/human/H)
/datum/species/shadow/ling/handle_life(mob/living/carbon/human/H)
if(!H.weakeyes)
H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs
var/light_amount = 0
@@ -60,12 +61,12 @@
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE)
species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_EXAMINE)
burn_mod = 1.1
oxy_mod = 0
heatmod = 1.1
/datum/species/shadow/ling/lesser/handle_life(var/mob/living/carbon/human/H)
/datum/species/shadow/ling/lesser/handle_life(mob/living/carbon/human/H)
if(!H.weakeyes)
H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs
var/light_amount = 0
@@ -39,7 +39,7 @@
"brain" = /obj/item/organ/internal/brain/golem,
) //Has default darksight of 2.
/datum/species/skeleton/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
/datum/species/skeleton/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
// Crazylemon is still silly
if(R.id == "milk")
H.heal_overall_damage(4,4)
@@ -1,3 +1,11 @@
#define SLIMEPERSON_COLOR_SHIFT_TRIGGER 0.1
#define SLIMEPERSON_ICON_UPDATE_PERIOD 200 // 20 seconds
#define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower.
#define SLIMEPERSON_HUNGERCOST 50
#define SLIMEPERSON_MINHUNGER 250
#define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds
/datum/species/slime
name = "Slime People"
name_plural = "Slime People"
@@ -41,33 +49,24 @@
"is turning a dull, brown color and melting into a puddle!")
var/reagent_skin_coloring = FALSE
var/datum/action/innate/regrow/grow
var/datum/action/innate/slimecolor/recolor
var/datum/action/innate/regrow/grow = new()
species_abilities = list(
/mob/living/carbon/human/verb/toggle_recolor_verb,
/mob/living/carbon/human/proc/regrow_limbs
)
/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H)
grow.Grant(H)
/datum/species/slime/on_species_gain(mob/living/carbon/human/H)
..()
grow = new()
grow.Grant(H)
recolor = new()
recolor.Grant(H)
/datum/action/innate/regrow
name = "Regrow limbs"
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "greenglow"
/datum/species/slime/on_species_loss(mob/living/carbon/human/H)
..()
if(grow)
grow.Remove(H)
if(recolor)
recolor.Remove(H)
/datum/action/innate/regrow/Activate()
var/mob/living/carbon/human/user = owner
user.regrow_limbs()
/datum/species/slime/handle_life(var/mob/living/carbon/human/H)
//This is allegedly for code "style". Like a plaid sweater?
#define SLIMEPERSON_COLOR_SHIFT_TRIGGER 0.1
#define SLIMEPERSON_ICON_UPDATE_PERIOD 200 // 20 seconds
#define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower.
/datum/species/slime/handle_life(mob/living/carbon/human/H)
// Slowly shifting to the color of the reagents
if(reagent_skin_coloring && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER)
var/blood_amount = H.blood_volume
@@ -83,118 +82,99 @@
H.update_body()
..()
#undef SLIMEPERSON_COLOR_SHIFT_TRIGGER
#undef SLIMEPERSON_ICON_UPDATE_PERIOD
#undef SLIMEPERSON_BLOOD_SCALING_FACTOR
/datum/action/innate/slimecolor
name = "Toggle Recolor"
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "greenglow"
/mob/living/carbon/human/proc/toggle_recolor(silent = FALSE)
if(!isslimeperson(src))
if(!silent)
to_chat(src, "You're not a slime person!")
return
var/datum/species/slime/S = dna.species
/datum/action/innate/slimecolor/Activate()
var/mob/living/carbon/human/H = owner
var/datum/species/slime/S = H.dna.species
if(S.reagent_skin_coloring)
S.reagent_skin_coloring = TRUE
if(!silent)
to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.")
S.reagent_skin_coloring = FALSE
to_chat(H, "You adjust your internal chemistry to filter out pigments from things you consume.")
else
S.reagent_skin_coloring = TRUE
if(!silent)
to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.")
to_chat(H, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.")
/mob/living/carbon/human/verb/toggle_recolor_verb()
set category = "IC"
set name = "Toggle Reagent Recoloring"
set desc = "While active, you'll slowly adjust your body's color to that of the reagents inside of you, moderated by how much blood you have."
/datum/action/innate/regrow
name = "Regrow limbs"
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "greenglow"
toggle_recolor()
/mob/living/carbon/human/proc/regrow_limbs()
set category = "IC"
set name = "Regrow Limbs"
set desc = "Regrow one of your missing limbs at the cost of a large amount of hunger"
#define SLIMEPERSON_HUNGERCOST 50
#define SLIMEPERSON_MINHUNGER 250
#define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds
if(stat || paralysis || stunned)
to_chat(src, "<span class='warning'>You cannot regenerate missing limbs in your current state.</span>")
return
if(nutrition < SLIMEPERSON_MINHUNGER)
to_chat(src, "<span class='warning'>You're too hungry to regenerate a limb!</span>")
/datum/action/innate/regrow/Activate()
var/mob/living/carbon/human/H = owner
if(H.nutrition < SLIMEPERSON_MINHUNGER)
to_chat(H, "<span class='warning'>You're too hungry to regenerate a limb!</span>")
return
var/list/missing_limbs = list()
for(var/l in bodyparts_by_name)
var/obj/item/organ/external/E = bodyparts_by_name[l]
for(var/l in H.bodyparts_by_name)
var/obj/item/organ/external/E = H.bodyparts_by_name[l]
if(!istype(E))
var/list/limblist = dna.species.has_limbs[l]
var/list/limblist = H.dna.species.has_limbs[l]
var/obj/item/organ/external/limb = limblist["path"]
var/parent_organ = initial(limb.parent_organ)
var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ]
var/obj/item/organ/external/parentLimb = H.bodyparts_by_name[parent_organ]
if(!istype(parentLimb))
continue
missing_limbs[initial(limb.name)] = l
if(!missing_limbs.len)
to_chat(src, "<span class='warning'>You're not missing any limbs!</span>")
to_chat(H, "<span class='warning'>You're not missing any limbs!</span>")
return
var/limb_select = input(src, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs
var/limb_select = input(H, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs
var/chosen_limb = missing_limbs[limb_select]
visible_message("<span class='notice'>[src] begins to hold still and concentrate on [p_their()] missing [limb_select]...</span>", "<span class='notice'>You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)</span>")
if(do_after(src, SLIMEPERSON_REGROWTHDELAY, needhand=0, target = src))
if(stat || paralysis || stunned)
to_chat(src, "<span class='warning'>You cannot regenerate missing limbs in your current state.</span>")
H.visible_message("<span class='notice'>[H] begins to hold still and concentrate on [H.p_their()] missing [limb_select]...</span>", "<span class='notice'>You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)</span>")
if(do_after(H, SLIMEPERSON_REGROWTHDELAY, needhand = 0, target = H))
if(H.incapacitated())
to_chat(H, "<span class='warning'>You cannot regenerate missing limbs in your current state.</span>")
return
if(nutrition < SLIMEPERSON_MINHUNGER)
to_chat(src, "<span class='warning'>You're too hungry to regenerate a limb!</span>")
if(H.nutrition < SLIMEPERSON_MINHUNGER)
to_chat(H, "<span class='warning'>You're too hungry to regenerate a limb!</span>")
return
var/obj/item/organ/external/O = bodyparts_by_name[chosen_limb]
var/obj/item/organ/external/O = H.bodyparts_by_name[chosen_limb]
var/stored_brute = 0
var/stored_burn = 0
if(istype(O))
to_chat(src, "<span class='warning'>You distribute the damaged tissue around your body, out of the way of your new pseudopod!</span>")
to_chat(H, "<span class='warning'>You distribute the damaged tissue around your body, out of the way of your new pseudopod!</span>")
var/obj/item/organ/external/doomedStump = O
stored_brute = doomedStump.brute_dam
stored_burn = doomedStump.burn_dam
qdel(O)
var/limb_list = dna.species.has_limbs[chosen_limb]
var/limb_list = H.dna.species.has_limbs[chosen_limb]
var/obj/item/organ/external/limb_path = limb_list["path"]
// Parent check
var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)]
var/obj/item/organ/external/potential_parent = H.bodyparts_by_name[initial(limb_path.parent_organ)]
if(!istype(potential_parent))
to_chat(src, "<span class='danger'>You've lost the organ that you've been growing your new part on!</span>")
to_chat(H, "<span class='danger'>You've lost the organ that you've been growing your new part on!</span>")
return // No rayman for you
// Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing.
// Bothersome.
var/obj/item/organ/external/new_limb = new limb_path(src)
var/obj/item/organ/external/new_limb = new limb_path(H)
new_limb.open = 0 // This is just so that the compiler won't think that new_limb is unused, because the compiler is horribly stupid.
adjustBruteLoss(stored_brute)
adjustFireLoss(stored_burn)
update_body()
updatehealth()
UpdateDamageIcon()
nutrition -= SLIMEPERSON_HUNGERCOST
visible_message("<span class='notice'>[src] finishes regrowing [p_their()] missing [new_limb]!</span>", "<span class='notice'>You finish regrowing your [limb_select]</span>")
H.adjustBruteLoss(stored_brute)
H.adjustFireLoss(stored_burn)
H.update_body()
H.updatehealth()
H.UpdateDamageIcon()
H.nutrition -= SLIMEPERSON_HUNGERCOST
H.visible_message("<span class='notice'>[H] finishes regrowing [H.p_their()] missing [new_limb]!</span>", "<span class='notice'>You finish regrowing your [limb_select]</span>")
else
to_chat(src, "<span class='warning'>You need to hold still in order to regrow a limb!</span>")
return
to_chat(H, "<span class='warning'>You need to hold still in order to regrow a limb!</span>")
#undef SLIMEPERSON_COLOR_SHIFT_TRIGGER
#undef SLIMEPERSON_ICON_UPDATE_PERIOD
#undef SLIMEPERSON_BLOOD_SCALING_FACTOR
#undef SLIMEPERSON_HUNGERCOST
#undef SLIMEPERSON_MINHUNGER
#undef SLIMEPERSON_REGROWTHDELAY
/datum/species/slime/handle_pre_change(mob/living/carbon/human/H)
..()
if(reagent_skin_coloring)
H.toggle_recolor(silent = 1)
#undef SLIMEPERSON_REGROWTHDELAY
@@ -54,5 +54,5 @@
"is twisting their own neck!",
"is holding their breath!")
/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
/datum/species/tajaran/handle_death(mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -56,21 +56,28 @@
"is twisting their own neck!",
"is holding their breath!")
var/datum/action/innate/tail_lash/lash = new()
var/datum/action/innate/tail_lash/lash
/datum/species/unathi/handle_post_spawn(var/mob/living/carbon/human/H)
lash.Grant(H)
/datum/species/unathi/on_species_gain(mob/living/carbon/human/H)
..()
lash = new
lash.Grant(H)
/datum/species/unathi/on_species_loss(mob/living/carbon/human/H)
..()
if(lash)
lash.Remove(H)
/datum/action/innate/tail_lash
name = "Tail lash"
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "tail"
check_flags = AB_CHECK_LYING | AB_CHECK_CONSCIOUS | AB_CHECK_STUNNED
/datum/action/innate/tail_lash/Activate()
var/mob/living/carbon/human/user = owner
if(!user.restrained() || !user.buckled)
if((user.restrained() && user.pulledby) || user.buckled)
to_chat(user, "<span class='warning'>You need freedom of movement to tail lash!</span>")
return
if(user.getStaminaLoss() >= 50)
@@ -80,13 +87,22 @@
var/obj/item/organ/external/E = C.get_organ(pick("l_leg", "r_leg", "l_foot", "r_foot", "groin"))
if(E)
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("<span class='danger'>[src] smacks [C] in [E] with their tail! </span>", "<span class='danger'>You hit [C] in [E] with your tail!</span>")
user.visible_message("<span class='danger'>[user] smacks [C] in [E] with their tail! </span>", "<span class='danger'>You hit [C] in [E] with your tail!</span>")
user.adjustStaminaLoss(15)
C.apply_damage(5, BRUTE, E)
user.spin(20, 1)
playsound(user.loc, 'sound/weapons/slash.ogg', 50, 0)
add_attack_logs(user, C, "tail whipped")
if(user.restrained())
if(prob(50))
user.Weaken(5)
user.visible_message("<span class='danger'>[user] loses [user.p_their()] balance!</span>", "<span class='danger'>You lose your balance!</span>")
return
if(user.getStaminaLoss() >= 60) //Bit higher as you don't need to start, just would need to keep going with the tail lash.
to_chat(user, "<span class='warning'>You run out of momentum!</span>")
return
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
/datum/species/unathi/handle_death(mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -3,6 +3,7 @@
name_plural = "Vox"
icobase = 'icons/mob/human_races/vox/r_vox.dmi'
deform = 'icons/mob/human_races/vox/r_def_vox.dmi'
dangerous_existence = TRUE
language = "Vox-pidgin"
tail = "voxtail"
speech_sounds = list('sound/voice/shriek1.ogg')
@@ -77,7 +78,7 @@
"is holding their breath!",
"is deeply inhaling oxygen!")
/datum/species/vox/handle_death(var/mob/living/carbon/human/H)
/datum/species/vox/handle_death(mob/living/carbon/human/H)
H.stop_tail_wagging(1)
/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
@@ -95,13 +96,12 @@
H.internal = H.l_hand
H.update_action_buttons_icon()
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
/datum/species/vox/on_species_gain(mob/living/carbon/human/H)
..()
updatespeciescolor(H)
H.update_icons()
//H.verbs += /mob/living/carbon/human/proc/leap
..()
/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
/datum/species/vox/updatespeciescolor(mob/living/carbon/human/H, owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox.
var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox.
@@ -132,25 +132,21 @@
H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so.
H.update_dna()
/datum/species/vox/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
/datum/species/vox/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == "oxygen") //Armalis are above such petty things.
H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma.
H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
return 0 //Handling reagent removal on our own.
return FALSE //Handling reagent removal on our own.
return ..()
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/leap
H.verbs += /mob/living/carbon/human/proc/gut
..()
/datum/species/vox/armalis
name = "Vox Armalis"
name_plural = "Vox Armalis"
icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi'
unarmed_type = /datum/unarmed_attack/claws/armalis
blacklisted = TRUE
warning_low_pressure = 50
hazard_low_pressure = 0
@@ -198,4 +194,4 @@
"is huffing oxygen!")
/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things.
return 1
return TRUE
@@ -48,5 +48,5 @@
"is twisting their own neck!",
"is holding their breath!")
/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
/datum/species/vulpkanin/handle_death(mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -3,11 +3,11 @@
name_plural = "Wryn"
icobase = 'icons/mob/human_races/r_wryn.dmi'
deform = 'icons/mob/human_races/r_wryn.dmi'
blacklisted = TRUE
language = "Wryn Hivemind"
tail = "wryntail"
punchdamagelow = 0
punchdamagehigh = 1
//primitive = /mob/living/carbon/monkey/wryn
slowdown = 1
warning_low_pressure = -300
hazard_low_pressure = 1
@@ -49,11 +49,11 @@
default_hair = "Antennae"
/datum/species/wryn/handle_death(var/mob/living/carbon/human/H)
/datum/species/wryn/handle_death(mob/living/carbon/human/H)
for(var/mob/living/carbon/C in living_mob_list)
if(C.get_int_organ(/obj/item/organ/internal/wryn/hivenode))
to_chat(C, "<span class='danger'><B>Your antennae tingle as you are overcome with pain...</B></span>")
to_chat(C, "<span class='danger'>It feels like part of you has died.</span>")
to_chat(C, "<span class='danger'>It feels like part of you has died.</span>") // This is bullshit
/datum/species/wryn/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(target.handcuffed && target.get_int_organ(/obj/item/organ/internal/wryn/hivenode))
@@ -1,10 +1,10 @@
/mob/living/silicon/decoy/death(gibbed)
if(stat == DEAD) return
if(stat == DEAD)
return
stat = DEAD
icon_state = "ai-crash"
spawn(10)
explosion(loc, 3, 6, 12, 15)
for(var/obj/machinery/ai_status_display/O in world) //change status
O.mode = 2
return ..(gibbed)
if(atoms_share_level(O, src))
O.mode = 2
..(0)
gib()
+46 -1
View File
@@ -4,9 +4,54 @@
icon_state = "ai"
anchored = 1 // -- TLE
canmove = 0
a_intent = INTENT_HARM // This is apparently the only thing that stops other mobs walking through them as if they were thin air.
/mob/living/silicon/decoy/New()
src.icon = 'icons/mob/AI.dmi'
src.icon_state = "ai"
src.anchored = 1
src.canmove = 0
src.canmove = 0
/mob/living/silicon/decoy/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/aicard))
to_chat(user, "<span class='warning'>You cannot find an intellicard slot on [src].</span>")
return TRUE
else
return ..()
/mob/living/silicon/decoy/syndicate
faction = list("syndicate")
name = "R.O.D.G.E.R"
desc = "Red Operations, Depot General Emission Regulator"
icon_state = "ai-magma"
/mob/living/silicon/decoy/syndicate/New()
. = ..()
icon_state = "ai-magma"
/mob/living/silicon/decoy/syndicate/depot
var/raised_alert = FALSE
/mob/living/silicon/decoy/syndicate/depot/proc/raise_alert()
raised_alert = TRUE
var/area/syndicate_depot/core/depotarea = get_area(src) // Cannot use myArea or areaMaster as neither will be defined for this mob type
if(istype(depotarea))
depotarea.increase_alert("AI Unit Offline")
else
say("Connection failure!")
/mob/living/silicon/decoy/syndicate/depot/death(pass)
if(!raised_alert)
raise_alert()
. = ..(pass)
/mob/living/silicon/decoy/syndicate/depot/adjustBruteLoss(dmg)
. = ..(dmg)
updatehealth()
/mob/living/silicon/decoy/syndicate/depot/adjustFireLoss(dmg)
. = ..(dmg)
updatehealth()
/mob/living/silicon/decoy/syndicate/depot/ex_act(severity)
adjustBruteLoss(250)
@@ -1,10 +1,5 @@
/mob/living/silicon/decoy/Life(seconds, times_fired)
if(src.stat == 2)
return
else
if(src.health <= config.health_threshold_dead && src.stat != 2)
death()
return
return
/mob/living/silicon/decoy/updatehealth()
@@ -13,3 +8,11 @@
stat = CONSCIOUS
else
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
update_stat()
/mob/living/silicon/decoy/update_stat()
if(stat == DEAD)
return
if(health <= 0)
death()
@@ -204,6 +204,10 @@
if(disabled)
return
ed209_ai()
/mob/living/simple_animal/bot/ed209/proc/ed209_ai()
var/list/targets = list()
for(var/mob/living/carbon/C in view(7, src)) //Let's find us a target
var/threatlevel = 0
@@ -45,6 +45,7 @@
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
var/shut_up = 0 //self explanatory :)
var/syndicate_aligned = FALSE // Will it only treat operatives?
var/drops_parts = TRUE
/mob/living/simple_animal/bot/medbot/tox
skin = "tox"
@@ -77,6 +78,7 @@
name = "Suspicious Medibot"
desc = "You'd better have insurance!"
skin = "bezerk"
faction = list("syndicate")
treatment_oxy = "perfluorodecalin"
treatment_brute = "bicaridine"
treatment_fire = "kelotane"
@@ -91,6 +93,11 @@
..()
Radio.syndie = 1
/mob/living/simple_animal/bot/medbot/syndicate/emagged
emagged = 2
declare_crit = 0
drops_parts = FALSE
/mob/living/simple_animal/bot/medbot/update_icon()
overlays.Cut()
if(skin)
@@ -554,36 +561,37 @@
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
switch(skin)
if("ointment")
new /obj/item/storage/firstaid/fire/empty(Tsec)
if("tox")
new /obj/item/storage/firstaid/toxin/empty(Tsec)
if("o2")
new /obj/item/storage/firstaid/o2/empty(Tsec)
if("brute")
new /obj/item/storage/firstaid/brute/empty(Tsec)
if("adv")
new /obj/item/storage/firstaid/adv/empty(Tsec)
if("bezerk")
var/obj/item/storage/firstaid/tactical/empty/T = new(Tsec)
T.syndicate_aligned = syndicate_aligned //This is a special case since Syndicate medibots and the mysterious medibot look the same; we also dont' want crew building Syndicate medibots if the mysterious medibot blows up.
if("fish")
new /obj/item/storage/firstaid/aquatic_kit(Tsec)
else
new /obj/item/storage/firstaid(Tsec)
if(drops_parts)
switch(skin)
if("ointment")
new /obj/item/storage/firstaid/fire/empty(Tsec)
if("tox")
new /obj/item/storage/firstaid/toxin/empty(Tsec)
if("o2")
new /obj/item/storage/firstaid/o2/empty(Tsec)
if("brute")
new /obj/item/storage/firstaid/brute/empty(Tsec)
if("adv")
new /obj/item/storage/firstaid/adv/empty(Tsec)
if("bezerk")
var/obj/item/storage/firstaid/tactical/empty/T = new(Tsec)
T.syndicate_aligned = syndicate_aligned //This is a special case since Syndicate medibots and the mysterious medibot look the same; we also dont' want crew building Syndicate medibots if the mysterious medibot blows up.
if("fish")
new /obj/item/storage/firstaid/aquatic_kit(Tsec)
else
new /obj/item/storage/firstaid(Tsec)
new /obj/item/assembly/prox_sensor(Tsec)
new /obj/item/assembly/prox_sensor(Tsec)
new /obj/item/healthanalyzer(Tsec)
new /obj/item/healthanalyzer(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
if(reagent_glass)
reagent_glass.forceMove(Tsec)
reagent_glass = null
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
if(emagged && prob(25))
playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
@@ -0,0 +1,216 @@
/mob/living/simple_animal/bot/ed209/syndicate
name = "Syndicate Sentry Bot"
desc = "A syndicate security bot."
model = "Guardian"
icon = 'icons/mecha/mecha.dmi'
icon_state = "darkgygax"
radio_channel = "Syndicate"
health = 300
maxHealth = 300
declare_arrests = 0
idcheck = 1
arrest_type = 1
auto_patrol = 1
emagged = 2
faction = list("syndicate")
shoot_sound = 'sound/weapons/wave.ogg'
anchored = 1
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120
window_id = "syndiebot"
window_name = "Syndicate Bot Interface"
var/turf/saved_turf
var/stepsound = 'sound/mecha/mechstep.ogg'
var/area/syndicate_depot/core/depotarea
var/raised_alert = FALSE
var/pathing_failed = FALSE
var/turf/spawn_turf
/mob/living/simple_animal/bot/ed209/syndicate/New()
..()
if(access_card)
access_card.access = list(access_syndicate, access_syndicate_leader)
set_weapon()
update_icon()
spawn_turf = get_turf(src)
/mob/living/simple_animal/bot/ed209/syndicate/update_icon()
icon_state = initial(icon_state)
/mob/living/simple_animal/bot/ed209/syndicate/turn_on()
. = ..()
update_icon()
/mob/living/simple_animal/bot/ed209/syndicate/turn_off()
..()
update_icon()
/mob/living/simple_animal/bot/ed209/syndicate/get_controls(mob/user)
to_chat(user, "<span class='warning'>[src] has no accessible control panel!</span>")
return
/mob/living/simple_animal/bot/ed209/syndicate/show_controls(mob/M)
return
/mob/living/simple_animal/bot/ed209/syndicate/Topic(href, href_list)
return
/mob/living/simple_animal/bot/ed209/syndicate/retaliate(mob/living/carbon/human/H)
if(!H)
return
target = H
mode = BOT_HUNT
/mob/living/simple_animal/bot/ed209/syndicate/emag_act(mob/user)
to_chat(user, "<span class='warning'>[src] has no card reader slot!</span>")
/mob/living/simple_animal/bot/ed209/syndicate/ed209_ai()
var/turf/current_turf = get_turf(src)
if(saved_turf && current_turf != saved_turf)
playsound(loc, stepsound, 40, 1)
if(spawn_turf && !atoms_share_level(src, spawn_turf))
raise_alert("[src] lost in space.")
raised_alert = FALSE
raise_alert("[src] activated self-destruct.")
qdel(src)
saved_turf = current_turf
switch(mode)
if(BOT_IDLE)
walk_to(src,0)
look_for_perp()
if(!mode && auto_patrol)
mode = BOT_START_PATROL
if(BOT_HUNT)
if(frustration >= 8)
walk_to(src,0)
back_to_idle()
if(target)
if(isliving(target))
if(target.stat == DEAD)
back_to_idle()
return
shootAt(target)
var/turf/olddist = get_dist(src, target)
walk_to(src, target,1,4)
if((get_dist(src, target)) >= (olddist))
frustration++
else
frustration = 0
else
back_to_idle()
if(BOT_START_PATROL)
look_for_perp()
start_patrol()
if(BOT_PATROL)
look_for_perp()
bot_patrol()
else
back_to_idle()
return
/mob/living/simple_animal/bot/ed209/syndicate/look_for_perp()
if(disabled)
return
for(var/mob/M in view(7, src))
if(M.invisibility > see_invisible)
continue
if("syndicate" in M.faction)
continue
if(M.stat == DEAD)
continue
if((M.name == oldtarget_name) && (world.time < last_found + 100))
continue
target = M
oldtarget_name = M.name
mode = BOT_HUNT
spawn(0)
handle_automated_action()
break
for(var/obj/spacepod/P in view(7, src))
if((P.name == oldtarget_name) && (world.time < last_found + 100))
continue
if(!P.pilot)
continue
if("syndicate" in P.pilot.faction)
continue
if(P.pilot.stat == DEAD)
continue
target = P
oldtarget_name = P.name
mode = BOT_HUNT
spawn(0)
handle_automated_action()
break
/mob/living/simple_animal/bot/ed209/syndicate/shootAt(atom/target)
if(lastfired && world.time - lastfired < shot_delay)
return
lastfired = world.time
var/obj/item/projectile/P = new projectile(loc)
playsound(loc, shoot_sound, 100, 1)
P.current = loc
P.starting = loc
P.firer = src
P.yo = target.y - loc.y
P.xo = target.x - loc.x
P.original = target
P.fire()
/mob/living/simple_animal/bot/ed209/syndicate/explode()
if (!QDELETED(src))
if(depotarea)
depotarea.list_remove(src, depotarea.guard_list)
walk_to(src,0)
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
new /obj/effect/decal/cleanable/blood/oil(loc)
var/obj/effect/decal/mecha_wreckage/gygax/dark/wreck = new /obj/effect/decal/mecha_wreckage/gygax/dark(loc)
wreck.name = "sentry bot wreckage"
raise_alert("[src] destroyed.")
qdel(src)
/mob/living/simple_animal/bot/ed209/syndicate/set_weapon()
projectile = /obj/item/projectile/bullet/a40mm
/mob/living/simple_animal/bot/ed209/syndicate/emp_act(severity)
return
/mob/living/simple_animal/bot/ed209/UnarmedAttack(atom/A)
if(!on)
return
shootAt(A)
/mob/living/simple_animal/bot/ed209/syndicate/cuff(mob/living/carbon/C)
shootAt(C)
/mob/living/simple_animal/bot/ed209/syndicate/stun_attack(mob/living/carbon/C)
shootAt(C)
/mob/living/simple_animal/bot/ed209/syndicate/speak()
return
/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/bot/ed209/syndicate/start_patrol()
if(tries >= BOT_STEP_MAX_RETRIES)
if(!pathing_failed)
pathing_failed = TRUE
var/failmsg = "Depot: [src] at [loc.x],[loc.y],[loc.z] lacks patrol target."
if(istype(patrol_target))
failmsg = "Depot: [src] at [loc.x],[loc.y],[loc.z] cannot reach [patrol_target.x],[patrol_target.y]"
log_debug(failmsg)
return ..()
/mob/living/simple_animal/bot/ed209/syndicate/proc/raise_alert(reason)
if(raised_alert)
return
raised_alert = TRUE
if(depotarea)
depotarea.increase_alert(reason)
@@ -115,6 +115,11 @@
corpseidjob = "Operative"
corpseidaccess = "Syndicate"
/obj/effect/landmark/mobcorpse/syndicateautogib/createCorpse()
var/mob/living/carbon/human/M = new /mob/living/carbon/human(loc)
M.real_name = src.name
M.gib()
qdel(src)
/obj/effect/landmark/mobcorpse/clown
@@ -39,17 +39,20 @@
armour_penetration = 28
status_flags = 0
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
var/melee_block_chance = 20
/mob/living/simple_animal/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if(O.force)
if(prob(80))
if(prob(melee_block_chance))
visible_message("<span class='boldwarning'>[src] blocks the [O] with its shield! </span>")
else
var/damage = O.force
if(O.damtype == STAMINA)
damage = 0
health -= damage
visible_message("<span class='boldwarning'>[src] has been attacked with the [O] by [user]. </span>")
else
visible_message("<span class='boldwarning'>[src] blocks the [O] with its shield! </span>")
playsound(loc, O.hitsound, 25, 1, -1)
else
to_chat(usr, "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
@@ -65,19 +68,182 @@
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
return 0
/mob/living/simple_animal/hostile/syndicate/melee/autogib
loot = list(/obj/effect/landmark/mobcorpse/syndicateautogib)
/mob/living/simple_animal/hostile/syndicate/melee/space
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot
name = "Syndicate Operative"
force_threshold = 6 // Prevents people using punches to bypass eshield
robust_searching = 1 // Together with stat_attack, ensures dionae/etc that regen are killed properly
stat_attack = 1
universal_speak = 1
melee_block_chance = 40
var/area/syndicate_depot/core/depotarea
var/raised_alert = FALSE
var/alert_on_death = FALSE
var/alert_on_timeout = FALSE
var/alert_on_spacing = TRUE
var/alert_on_shield_breach = FALSE
var/seen_enemy = FALSE
var/seen_enemy_name = null
var/seen_revived_enemy = FALSE
var/aggro_cycles = 0
var/scan_cycles = 0
var/shield_key = FALSE
var/turf/spawn_turf
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/New()
..()
name = "[name] [pick(last_names)]"
depotarea = areaMaster
spawn_turf = get_turf(src)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/Aggro()
. = ..()
if(target && istype(depotarea))
if(!seen_enemy)
seen_enemy = TRUE
playsound(loc, 'sound/weapons/saberon.ogg', 35, 1)
if(alert_on_shield_breach)
if(depotarea.shield_list.len)
raise_alert("[name] reports that an intruder is trying to breach the armory shield!")
alert_on_shield_breach = FALSE
raised_alert = FALSE
alert_on_death = TRUE
if(isliving(target))
var/mob/living/M = target
depotarea.list_add(M, depotarea.hostile_list)
if(M.mind && M.mind.special_role == SPECIAL_ROLE_TRAITOR)
depotarea.saw_double_agent(M)
depotarea.declare_started()
seen_enemy_name = target.name
if(istype(target, /obj/mecha))
depotarea.saw_mech(target)
if(istype(target, /obj/spacepod))
depotarea.saw_pod(target)
if(depotarea.list_includes(target, depotarea.dead_list))
seen_revived_enemy = TRUE
raise_alert("[name] reports intruder [target] has returned from death!")
depotarea.list_remove(target, depotarea.dead_list)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action()
if(seen_enemy)
aggro_cycles++
if(alert_on_timeout && !raised_alert && aggro_cycles >= 60)
raise_alert("[name] has reported contact with hostile entity: [seen_enemy_name]")
if(scan_cycles >= 15 && istype(depotarea))
scan_cycles = 0
if(!atoms_share_level(src, spawn_turf))
if(alert_on_spacing)
raise_alert("[src] lost in space.")
death()
return
for(var/mob/living/body in hearers(vision_range, targets_from))
if(body.stat != DEAD)
continue
if(depotarea.list_includes(body, depotarea.dead_list))
continue
if(faction_check(body))
continue
say("Target [body]... terminated.")
depotarea.list_add(body, depotarea.dead_list)
pointed(body)
else
scan_cycles++
..()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/proc/raise_alert(var/reason)
if(istype(depotarea) && (!raised_alert || seen_revived_enemy) && !depotarea.used_self_destruct)
raised_alert = TRUE
say("Intruder!")
depotarea.increase_alert(reason)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/death()
if(alert_on_death)
if(seen_enemy_name)
raise_alert("[name] has died in combat with [seen_enemy_name].")
else
raise_alert("[name] has died.")
if(shield_key && depotarea)
depotarea.shields_key_check()
if(depotarea)
depotarea.list_remove(src, depotarea.guard_list)
return ..()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/CanPass(atom/movable/mover, turf/target, height=0)
if(isliving(mover))
var/mob/living/blocker = mover
if(faction_check(blocker))
return 1
return ..(mover, target, height)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer
name = "Syndicate Officer"
alert_on_death = TRUE
alert_on_timeout = TRUE
melee_block_chance = 60
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory
name = "Syndicate Quartermaster"
icon_state = "syndicatemeleespace"
icon_living = "syndicatemeleespace"
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxHealth = 250
health = 250
melee_block_chance = 80
alert_on_timeout = TRUE
alert_on_shield_breach = TRUE
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death()
if(depotarea)
depotarea.declare_finished()
return ..()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize()
. = ..()
if(istype(depotarea))
var/list/key_candidates = list()
for(var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O in living_mob_list)
if(O == src)
continue
key_candidates += O
if(key_candidates.len)
var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O = pick(key_candidates)
O.shield_key = TRUE
depotarea.shields_up()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space
name = "Syndicate Backup"
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
icon_state = "syndicatemeleespace"
icon_living = "syndicatemeleespace"
speed = 1
wander = 0
alert_on_spacing = FALSE
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(var/movement_dir = 0)
return
/mob/living/simple_animal/hostile/syndicate/melee/space
name = "Syndicate Commando"
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
icon_state = "syndicatemeleespace"
icon_living = "syndicatemeleespace"
speed = 1
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/movement_dir = 0)
return
/mob/living/simple_animal/hostile/syndicate/ranged
ranged = 1
rapid = 1
@@ -97,10 +263,11 @@
speed = 1
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/gun/projectile/automatic/c20r)
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/movement_dir = 0)
return
/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib
loot = list(/obj/effect/landmark/mobcorpse/syndicateautogib)
/mob/living/simple_animal/hostile/viscerator
@@ -61,7 +61,8 @@
var/obj/item/clothing/accessory/petcollar/collar = null
var/can_collar = 0 // can add collar to mob or not
//Hot simple_animal baby making vars
//Hot simple_animal baby making vars
var/childtype = null
var/scan_ready = 1
var/simplespecies //Sorry, no spider+corgi buttbabies.
@@ -570,3 +571,4 @@
/mob/living/simple_animal/SetEarDeaf()
return
+1 -5
View File
@@ -56,11 +56,7 @@
if(abilities)
client.verbs |= abilities
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(H.dna.species && H.dna.species.abilities)
client.verbs |= H.dna.species.abilities
if(ishuman(src))
client.screen += client.void
//HUD updates (antag hud, etc)
+1 -1
View File
@@ -356,7 +356,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
if(hud_used && hud_used.action_intent)
hud_used.action_intent.icon_state = "[a_intent]"
else if(isrobot(src) || islarva(src))
else if(isrobot(src) || islarva(src) || isanimal(src))
switch(input)
if(INTENT_HELP)
a_intent = INTENT_HELP
+9
View File
@@ -121,3 +121,12 @@
..()
new /obj/item/documents/syndicate/blue(src)
update_icon()
/obj/item/folder/syndicate/yellow
icon_state = "folder_syellow"
/obj/item/folder/syndicate/yellow/full/New()
..()
new /obj/item/documents/syndicate/yellow(src)
update_icon()
@@ -119,6 +119,9 @@
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
max_ammo = 6
/obj/item/ammo_box/magazine/internal/shot/riot/short
max_ammo = 3
/obj/item/ammo_box/magazine/internal/grenadelauncher
name = "grenade launcher internal magazine"
ammo_type = /obj/item/ammo_casing/a40mm
@@ -198,7 +198,7 @@
..()
select_fire(usr)
/obj/item/gun/energy/wormhole_projector/proc/portal_destroyed(obj/effect/portal/P)
/obj/item/gun/energy/wormhole_projector/portal_destroyed(obj/effect/portal/P)
if(P.icon_state == "portal")
blue = null
if(orange)
@@ -81,6 +81,7 @@
icon_state = "riotshotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
sawn_state = SAWN_INTACT
/obj/item/gun/projectile/shotgun/riot/attackby(obj/item/A, mob/user, params)
..()
@@ -90,6 +91,109 @@
var/obj/item/melee/energy/W = A
if(W.active)
sawoff(user)
if(istype(A, /obj/item/pipe))
unsaw(A, user)
/obj/item/gun/projectile/shotgun/riot/sawoff(mob/user)
if(sawn_state == SAWN_OFF)
to_chat(user, "<span class='warning'>[src] has already been shortened!</span>")
return
if(istype(loc, /obj/item/storage)) //To prevent inventory exploits
to_chat(user, "<span class='info'>How do you plan to modify [src] while it's in a bag.</span>")
return
if(chambered) //if the gun is chambering live ammo, shoot self, if chambering empty ammo, 'click'
if(chambered.BB)
afterattack(user, user)
user.visible_message("<span class='danger'>\The [src] goes off!</span>", "<span class='danger'>\The [src] goes off in your face!</span>")
return
else
afterattack(user, user)
user.visible_message("The [src] goes click!", "<span class='notice'>The [src] you are holding goes click.</span>")
if(magazine.ammo_count()) //Spill the mag onto the floor
user.visible_message("<span class='danger'>[user.name] opens [src] up and the shells go goes flying around!</span>", "<span class='userdanger'>You open [src] up and the shells go goes flying everywhere!!</span>")
while(get_ammo(0) > 0)
var/obj/item/ammo_casing/CB
CB = magazine.get_round(0)
if(CB)
CB.loc = get_turf(loc)
CB.update_icon()
if(do_after(user, 30, target = src))
user.visible_message("[user] shortens \the [src]!", "<span class='notice'>You shorten \the [src].</span>")
post_sawoff()
return 1
/obj/item/gun/projectile/shotgun/riot/proc/post_sawoff()
name = "assault shotgun"
desc = sawn_desc
w_class = WEIGHT_CLASS_NORMAL
current_skin = "riotshotgun-short"
item_state = "gun" //phil235 is it different with different skin?
slot_flags &= ~SLOT_BACK //you can't sling it on your back
slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
sawn_state = SAWN_OFF
magazine.max_ammo = 3
update_icon()
/obj/item/gun/projectile/shotgun/riot/proc/unsaw(obj/item/A, mob/user)
if(sawn_state == SAWN_INTACT)
to_chat(user, "<span class='warning'>[src] has not been shortened!</span>")
return
if(istype(loc, /obj/item/storage)) //To prevent inventory exploits
to_chat(user, "<span class='info'>How do you plan to modify [src] while it's in a bag.</span>")
return
if(chambered) //if the gun is chambering live ammo, shoot self, if chambering empty ammo, 'click'
if(chambered.BB)
afterattack(user, user)
user.visible_message("<span class='danger'>\The [src] goes off!</span>", "<span class='danger'>\The [src] goes off in your face!</span>")
return
else
afterattack(user, user)
user.visible_message("The [src] goes click!", "<span class='notice'>The [src] you are holding goes click.</span>")
if(magazine.ammo_count()) //Spill the mag onto the floor
user.visible_message("<span class='danger'>[user.name] opens [src] up and the shells go goes flying around!</span>", "<span class='userdanger'>You open [src] up and the shells go goes flying everywhere!!</span>")
while(get_ammo() > 0)
var/obj/item/ammo_casing/CB
CB = magazine.get_round(0)
if(CB)
CB.loc = get_turf(loc)
CB.update_icon()
if(do_after(user, 30, target = src))
qdel(A)
user.visible_message("<span class='notice'>[user] lengthens [src]!</span>", "<span class='notice'>You lengthen [src].</span>")
post_unsaw(user)
return 1
/obj/item/gun/projectile/shotgun/riot/proc/post_unsaw()
name = initial(name)
desc = initial(desc)
w_class = initial(w_class)
current_skin = "riotshotgun"
item_state = initial(item_state)
slot_flags &= ~SLOT_BELT
slot_flags |= SLOT_BACK
sawn_state = SAWN_INTACT
magazine.max_ammo = 6
update_icon()
/obj/item/gun/projectile/shotgun/riot/update_icon() //Can't use the old proc as it makes it go to riotshotgun-short_sawn
..()
if(current_skin)
icon_state = "[current_skin]"
else
icon_state = "[initial(icon_state)]"
/obj/item/gun/projectile/shotgun/riot/short
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot/short
/obj/item/gun/projectile/shotgun/riot/short/New()
..()
post_sawoff()
///////////////////////
// BOLT ACTION RIFLE //
+107 -101
View File
@@ -146,114 +146,120 @@
. = ..()
wabbajack(change)
proc/wabbajack(mob/living/M)
if(istype(M))
if(istype(M, /mob/living) && M.stat != DEAD)
if(M.notransform)
return
M.notransform = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
M.invisibility = 101
/proc/wabbajack(mob/living/M)
if(istype(M) && M.stat != DEAD && !M.notransform)
M.notransform = TRUE
M.canmove = FALSE
M.icon = null
M.overlays.Cut()
M.invisibility = 101
if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/Robot = M
if(Robot.mmi)
qdel(Robot.mmi)
Robot.notify_ai(1)
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
// Make sure there are no organs or limbs to drop
for(var/t in H.bodyparts)
qdel(t)
for(var/i in H.internal_organs)
qdel(i)
for(var/obj/item/W in M)
M.unEquip(W, 1)
qdel(W)
if(isrobot(M))
var/mob/living/silicon/robot/Robot = M
QDEL_NULL(Robot.mmi)
Robot.notify_ai(1)
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
// Make sure there are no organs or limbs to drop
for(var/t in H.bodyparts)
qdel(t)
for(var/i in H.internal_organs)
qdel(i)
for(var/obj/item/W in M)
M.unEquip(W, 1)
qdel(W)
var/mob/living/new_mob
var/mob/living/new_mob
var/randomize = pick("robot","slime","xeno","human","animal")
switch(randomize)
if("robot")
if(prob(30))
new_mob = new /mob/living/silicon/robot/syndicate(M.loc)
else
new_mob = new /mob/living/silicon/robot(M.loc)
new_mob.gender = M.gender
new_mob.invisibility = 0
new_mob.job = "Cyborg"
var/mob/living/silicon/robot/Robot = new_mob
Robot.mmi = new /obj/item/mmi(new_mob)
if(ishuman(M))
Robot.mmi.transfer_identity(M) //Does not transfer key/client.
if("slime")
new_mob = new /mob/living/carbon/slime/random(M.loc)
new_mob.universal_speak = 1
if("xeno")
if(prob(50))
new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
else
new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
new_mob.universal_speak = 1
if("animal")
if(prob(50))
var/beast = pick("carp","bear","mushroom","statue", "bat", "goat", "tomato")
switch(beast)
if("carp") new_mob = new /mob/living/simple_animal/hostile/carp(M.loc)
if("bear") new_mob = new /mob/living/simple_animal/hostile/bear(M.loc)
if("mushroom") new_mob = new /mob/living/simple_animal/hostile/mushroom(M.loc)
if("statue") new_mob = new /mob/living/simple_animal/hostile/statue(M.loc)
if("bat") new_mob = new /mob/living/simple_animal/hostile/scarybat(M.loc)
if("goat") new_mob = new /mob/living/simple_animal/hostile/retaliate/goat(M.loc)
if("tomato") new_mob = new /mob/living/simple_animal/hostile/killertomato(M.loc)
else
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox")
switch(animal)
if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc)
if("corgi") new_mob = new /mob/living/simple_animal/pet/corgi(M.loc)
if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc)
if("cat") new_mob = new /mob/living/simple_animal/pet/cat(M.loc)
if("mouse") new_mob = new /mob/living/simple_animal/mouse(M.loc)
if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc)
if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc)
if("lizard") new_mob = new /mob/living/simple_animal/lizard(M.loc)
if("fox") new_mob = new /mob/living/simple_animal/pet/fox(M.loc)
else new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.universal_speak = 1
if("human")
new_mob = new /mob/living/carbon/human(M.loc)
// Include standard, whitelisted, and monkey species...
var/list/new_species = list()
for(var/datum/species/S in subtypesof(/datum/species))
if(istype(S, /datum/species/vox/armalis))
continue
new_species.Add(S)
var/mob/living/carbon/human/H = new_mob
var/datum/species/S = pick(new_species)
H.set_species(S)
randomize = initial(S.name)
var/datum/preferences/A = new() //Randomize appearance for the human
A.copy_to(new_mob)
var/randomize = pick("robot", "slime", "xeno", "human", "animal")
switch(randomize)
if("robot")
if(prob(30))
new_mob = new /mob/living/silicon/robot/syndicate(M.loc)
else
return
M.create_attack_log("<font color='orange'>[key_name(M)] became [new_mob.real_name].</font>")
new_mob.attack_log = M.attack_log
new_mob.a_intent = INTENT_HARM
if(M.mind)
M.mind.transfer_to(new_mob)
new_mob = new /mob/living/silicon/robot(M.loc)
new_mob.gender = M.gender
new_mob.invisibility = 0
new_mob.job = "Cyborg"
var/mob/living/silicon/robot/Robot = new_mob
Robot.mmi = new /obj/item/mmi(new_mob)
if(ishuman(M))
Robot.mmi.transfer_identity(M) //Does not transfer key/client.
if("slime")
new_mob = new /mob/living/carbon/slime/random(M.loc)
new_mob.universal_speak = TRUE
if("xeno")
if(prob(50))
new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
else
new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
new_mob.universal_speak = TRUE
if("animal")
if(prob(50))
var/beast = pick("carp","bear","mushroom","statue", "bat", "goat", "tomato")
switch(beast)
if("carp")
new_mob = new /mob/living/simple_animal/hostile/carp(M.loc)
if("bear")
new_mob = new /mob/living/simple_animal/hostile/bear(M.loc)
if("mushroom")
new_mob = new /mob/living/simple_animal/hostile/mushroom(M.loc)
if("statue")
new_mob = new /mob/living/simple_animal/hostile/statue(M.loc)
if("bat")
new_mob = new /mob/living/simple_animal/hostile/scarybat(M.loc)
if("goat")
new_mob = new /mob/living/simple_animal/hostile/retaliate/goat(M.loc)
if("tomato")
new_mob = new /mob/living/simple_animal/hostile/killertomato(M.loc)
else
var/animal = pick("parrot", "corgi", "crab", "pug", "cat", "mouse", "chicken", "cow", "lizard", "chick", "fox")
switch(animal)
if("parrot")
new_mob = new /mob/living/simple_animal/parrot(M.loc)
if("corgi")
new_mob = new /mob/living/simple_animal/pet/corgi(M.loc)
if("crab")
new_mob = new /mob/living/simple_animal/crab(M.loc)
if("cat")
new_mob = new /mob/living/simple_animal/pet/cat(M.loc)
if("mouse")
new_mob = new /mob/living/simple_animal/mouse(M.loc)
if("chicken")
new_mob = new /mob/living/simple_animal/chicken(M.loc)
if("cow")
new_mob = new /mob/living/simple_animal/cow(M.loc)
if("lizard")
new_mob = new /mob/living/simple_animal/lizard(M.loc)
if("fox")
new_mob = new /mob/living/simple_animal/pet/fox(M.loc)
else
new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.universal_speak = TRUE
if("human")
new_mob = new /mob/living/carbon/human(M.loc)
var/mob/living/carbon/human/H = new_mob
var/datum/preferences/A = new() //Randomize appearance for the human
A.species = get_random_species(TRUE)
A.copy_to(new_mob)
randomize = H.dna.species.name
else
new_mob.key = M.key
return
to_chat(new_mob, "<B>Your form morphs into that of a [randomize].</B>")
M.create_attack_log("<font color='orange'>[key_name(M)] became [new_mob.real_name].</font>")
new_mob.attack_log = M.attack_log
qdel(M)
return new_mob
new_mob.a_intent = INTENT_HARM
if(M.mind)
M.mind.transfer_to(new_mob)
else
new_mob.key = M.key
to_chat(new_mob, "<B>Your form morphs into that of a [randomize].</B>")
qdel(M)
return new_mob
/obj/item/projectile/magic/animate
name = "bolt of animation"
@@ -13,7 +13,9 @@
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
flags = OPENCONTAINER
slot_flags = SLOT_BELT
var/ignore_flags = 0
var/ignore_flags = FALSE
var/emagged = FALSE
var/safety_hypo = FALSE
/obj/item/reagent_containers/hypospray/attack(mob/living/M, mob/user)
if(!reagents.total_volume)
@@ -31,8 +33,13 @@
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/primary_reagent_name = reagents.get_master_reagent_name()
var/trans = reagents.trans_to(M, amount_per_transfer_from_this)
if(safety_hypo)
visible_message("<span class='warning'>[user] injects [M] with [trans] units of [primary_reagent_name].</span>")
playsound(loc, 'sound/goonstation/items/hypo.ogg', 80, 0)
to_chat(user, "<span class='notice'>[trans] unit\s injected. [reagents.total_volume] unit\s remaining in [src].</span>")
var/contained = english_list(injected)
@@ -41,6 +48,31 @@
return TRUE
/obj/item/reagent_containers/hypospray/on_reagent_change()
if(safety_hypo && !emagged)
var/found_forbidden_reagent = FALSE
for(var/datum/reagent/R in reagents.reagent_list)
if(!safe_chem_list.Find(R.id))
reagents.del_reagent(R.id)
found_forbidden_reagent = TRUE
if(found_forbidden_reagent)
if(ismob(loc))
to_chat(loc, "<span class='warning'>[src] identifies and removes a harmful substance.</span>")
else
visible_message("<span class='warning'>[src] identifies and removes a harmful substance.</span>")
/obj/item/reagent_containers/hypospray/emag_act(mob/user)
if(safety_hypo && !emagged)
emagged = TRUE
ignore_flags = TRUE
to_chat(user, "<span class='warning'>You short out the safeties on [src].</span>")
/obj/item/reagent_containers/hypospray/safety
name = "medical hypospray"
desc = "A modified hypospray for quickly injecting safe medicinal chemicals."
icon_state = "combat_hypo"
safety_hypo = TRUE
/obj/item/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
@@ -591,6 +591,14 @@
build_path = /obj/item/reagent_containers/syringe
category = list("initial", "Medical")
/datum/design/safety_hypo
name = "Medical Hypospray"
id = "safetyhypo"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/hypospray/safety
category = list("initial", "Medical")
/datum/design/prox_sensor
name = "Proximity Sensor"
id = "prox_sensor"
+4 -1
View File
@@ -557,11 +557,14 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v
/obj/spacepod/syndi
name = "syndicate spacepod"
desc = "An armed spacepod painted in syndicate colors."
desc = "A spacepod painted in syndicate colors."
icon_state = "pod_synd"
health = 400
unlocked = FALSE
/obj/spacepod/syndi/unlocked
unlocked = TRUE
/obj/spacepod/sec/New()
..()
var/obj/item/spacepod_equipment/weaponry/burst_taser/T = new /obj/item/spacepod_equipment/weaponry/taser
+38 -38
View File
@@ -46,17 +46,23 @@
cost = 200
/datum/storeitem/dnd
name = "Dungeons & Dragons set"
name = "Dungeons & Dragons Set"
desc = "A box containing minifigures suitable for a good game of D&D."
typepath = /obj/item/storage/box/characters
cost = 200
/datum/storeitem/dice
name = "Dice set"
name = "Dice Set"
desc = "A box containing multiple different types of die."
typepath = /obj/item/storage/box/dice
cost = 200
/datum/storeitem/candle
name = "Candles"
desc = "A box of candles. Use them to fool others into thinking you're out for a romantic dinner...or something."
typepath = /obj/item/storage/fancy/candle_box/full
cost = 200
/datum/storeitem/nanomob_booster
name = "Nano-Mob Hunter Trading Card Booster Pack"
desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
@@ -65,58 +71,52 @@
/datum/storeitem/crayons
name = "Crayons"
desc = "Let security know how they're doing by scrawling lovenotes all over their hallways."
desc = "Let security know how they're doing by scrawling love notes all over their hallways."
typepath = /obj/item/storage/fancy/crayons
cost = 350
/datum/storeitem/pipe
name = "smoking pipe"
desc = "A pipe, for smoking. Probably made of meershaum or something."
name = "Smoking Pipe"
desc = "A pipe, for smoking. Probably made of meerschaum or something."
typepath = /obj/item/clothing/mask/cigarette/pipe
cost = 350
/datum/storeitem/candle
name = "Candles"
desc = "A box of chandles. Use them to fool others into thinking you're out for a romantic dinner...or something."
typepath = /obj/item/storage/fancy/candle_box/full
cost = 200
/datum/storeitem/minigibber
name = "miniature gibber"
name = "Miniature Gibber"
desc = "A miniature recreation of Nanotrasen's famous meat grinder."
typepath = /obj/item/toy/minigibber
cost = 400
/datum/storeitem/katana
name = "replica katana"
name = "Replica Katana"
desc = "Woefully underpowered in D20."
typepath = /obj/item/toy/katana
cost = 500
/datum/storeitem/piano_synth
name = "piano synthesizer"
desc = "An advanced electronic synthesizer that can be used as various instruments."
typepath = /obj/item/instrument/piano_synth
cost = 1000
/datum/storeitem/violin
name = "space violin"
name = "Space Violin"
desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
typepath = /obj/item/instrument/violin
cost = 500
/datum/storeitem/guitar
name = "guitar"
name = "Guitar"
desc = "It's made of wood and has bronze strings."
typepath = /obj/item/instrument/guitar
cost = 500
/datum/storeitem/eguitar
name = "electric guitar"
name = "Electric Guitar"
desc = "Makes all your shredding needs possible."
typepath = /obj/item/instrument/eguitar
cost = 500
/datum/storeitem/piano_synth
name = "Piano Synthesizer"
desc = "An advanced electronic synthesizer that can emulate various instruments."
typepath = /obj/item/instrument/piano_synth
cost = 1000
/datum/storeitem/baby
name = "Toddler"
desc = "This baby looks almost real. Wait, did it just burp?"
@@ -124,91 +124,91 @@
cost = 1000
/datum/storeitem/flag_slime
name = "Slime People flag"
name = "Slime People Flag"
desc = "A flag proudly proclaiming the superior heritage of Slime People."
typepath = /obj/item/flag/species/slime
cost = 1000
/datum/storeitem/flag_skrell
name = "Skrell flag"
name = "Skrell Flag"
desc = "A flag proudly proclaiming the superior heritage of Skrell."
typepath = /obj/item/flag/species/skrell
cost = 1000
/datum/storeitem/flag_vox
name = "Vox flag"
name = "Vox Flag"
desc = "A flag proudly proclaiming the superior heritage of Vox."
typepath = /obj/item/flag/species/vox
cost = 1000
/datum/storeitem/flag_machine
name = "Synthetics flag"
name = "Synthetics Flag"
desc = "A flag proudly proclaiming the superior heritage of Synthetics."
typepath = /obj/item/flag/species/machine
cost = 1000
/datum/storeitem/flag_diona
name = "Diona flag"
name = "Diona Flag"
desc = "A flag proudly proclaiming the superior heritage of Dionae."
typepath = /obj/item/flag/species/diona
cost = 1000
/datum/storeitem/flag_human
name = "Human flag"
name = "Human Flag"
desc = "A flag proudly proclaiming the superior heritage of Humans."
typepath = /obj/item/flag/species/human
cost = 1000
/datum/storeitem/flag_greys
name = "Greys flag"
name = "Greys Flag"
desc = "A flag proudly proclaiming the superior heritage of Greys."
typepath = /obj/item/flag/species/greys
cost = 1000
/datum/storeitem/flag_kidan
name = "Kidan flag"
name = "Kidan Flag"
desc = "A flag proudly proclaiming the superior heritage of Kidan."
typepath = /obj/item/flag/species/kidan
cost = 1000
/datum/storeitem/flag_taj
name = "Tajaran flag"
name = "Tajaran Flag"
desc = "A flag proudly proclaiming the superior heritage of Tajara."
typepath = /obj/item/flag/species/taj
cost = 1000
/datum/storeitem/flag_unathi
name = "Unathi flag"
name = "Unathi Flag"
desc = "A flag proudly proclaiming the superior heritage of Unathi."
typepath = /obj/item/flag/species/unathi
cost = 1000
/datum/storeitem/flag_vulp
name = "Vulpkanin flag"
name = "Vulpkanin Flag"
desc = "A flag proudly proclaiming the superior heritage of Vulpkanin."
typepath = /obj/item/flag/species/vulp
cost = 1000
/datum/storeitem/flag_drask
name = "Drask flag"
name = "Drask Flag"
desc = "A flag proudly proclaiming the superior heritage of Drask."
typepath = /obj/item/flag/species/drask
cost = 1000
/datum/storeitem/flag_plasma
name = "Plasmaman flag"
name = "Plasmaman Flag"
desc = "A flag proudly proclaiming the superior heritage of Plasmamen."
typepath = /obj/item/flag/species/plasma
cost = 1000
/datum/storeitem/flag_ian
name = "Ian flag"
name = "Ian Flag"
desc = "The banner of Ian, because SQUEEEEE."
typepath = /obj/item/flag/ian
cost = 1500
/datum/storeitem/banhammer
desc = "A banhammer"
name = "banhammer"
name = "Banhammer"
desc = "A Banhammer."
typepath = /obj/item/banhammer
cost = 2000
+7 -1
View File
@@ -304,7 +304,13 @@ PLAYER_REROUTE_CAP 0
#DISABLE_AWAY_MISSIONS
## Disable the loading of space ruins
DISABLE_SPACE_RUINS
#DISABLE_SPACE_RUINS
## Minimum number of space ruins levels to generate
EXTRA_SPACE_RUINS_LEVELS_MIN 2
## Maximum number of space ruins levels to generate
EXTRA_SPACE_RUINS_LEVELS_MAX 4
## Uncomment to disable the OOC/LOOC channel by default.
#DISABLE_OOC
+62
View File
@@ -56,10 +56,72 @@
-->
<div class="commit sansserif">
<h2 class="date">09 August 2018</h2>
<h3 class="author">variableundefined updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">banangarang's maid bot fluff sprites</li>
</ul>
<h2 class="date">07 August 2018</h2>
<h3 class="author">Anasari updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Polaris card system partially ported. Credits to Jedr for the hand of card item_action sprites.</li>
</ul>
<h3 class="author">Kyep updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Simple_animal mobs now get a HUD button that lets them switch between HELP and HARM intents.</li>
<li class="tweak">Replaced the Syndicate Supply Depot with a new version, rebuilt from scratch, that is much more challenging/interesting.</li>
<li class="bugfix">It is no longer possible to walk straight through decoy AI cores as if they were not there.</li>
<li class="bugfix">Syndicate grenade launcher turrets now actually launch grenades.</li>
</ul>
<h3 class="author">MarsM0nd updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Unathi can now tailwhip when they are supposed to be able to.</li>
<li class="rscadd">Tail whipping gets logged.</li>
</ul>
<h2 class="date">06 August 2018</h2>
<h3 class="author">AffectedArc07 updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Barber no longer spawns with an extra pair of shoes in his bag</li>
</ul>
<h3 class="author">Tails2091 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed Therapy Dolls not working.</li>
<li class="tweak">Made Prize Machine & Merch Sore readable.</li>
<li class="spellcheck">Fixed capitalizations and typos in both lists.</li>
</ul>
<h2 class="date">05 August 2018</h2>
<h3 class="author">Crazylemon64 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Space ruins can no longer trap you upon border transition</li>
<li class="rscadd">There are now several levels of space ruins</li>
</ul>
<h3 class="author">Fox McCloud updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds in medical hyposprays</li>
</ul>
<h2 class="date">03 August 2018</h2>
<h3 class="author">Fox McCloud updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">IPC Change monitor is now an action button</li>
<li class="tweak">Slime Color change is now an action button</li>
<li class="bugfix">Fixes staff of change leaving behind unknowns</li>
<li class="bugfix">Fixes Shadowlings not having shock resistant and thermal vision</li>
<li class="bugfix">Fixes staff of change gibbing people</li>
</ul>
<h3 class="author">Shazbot updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds in the ability to unsaw sawn off riot shotguns. Change: Changes the riot shotgun icon.</li>
</ul>
<h2 class="date">02 August 2018</h2>
<h3 class="author">variableundefined updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Nightmares now works. Sleep well.</li>
<li class="tweak">Megaphone actually logs in say log now.</li>
</ul>
<h2 class="date">01 August 2018</h2>
+42
View File
@@ -6725,3 +6725,45 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
2018-08-02:
variableundefined:
- bugfix: Nightmares now works. Sleep well.
- tweak: Megaphone actually logs in say log now.
2018-08-03:
Fox McCloud:
- tweak: IPC Change monitor is now an action button
- tweak: Slime Color change is now an action button
- bugfix: Fixes staff of change leaving behind unknowns
- bugfix: Fixes Shadowlings not having shock resistant and thermal vision
- bugfix: Fixes staff of change gibbing people
Shazbot:
- rscadd: 'Adds in the ability to unsaw sawn off riot shotguns. Change: Changes
the riot shotgun icon.'
2018-08-05:
Crazylemon64:
- bugfix: Space ruins can no longer trap you upon border transition
- rscadd: There are now several levels of space ruins
Fox McCloud:
- rscadd: Adds in medical hyposprays
2018-08-06:
AffectedArc07:
- tweak: Barber no longer spawns with an extra pair of shoes in his bag
Tails2091:
- bugfix: Fixed Therapy Dolls not working.
- tweak: Made Prize Machine & Merch Sore readable.
- spellcheck: Fixed capitalizations and typos in both lists.
2018-08-07:
Anasari:
- rscadd: Polaris card system partially ported. Credits to Jedr for the hand of
card item_action sprites.
Kyep:
- rscadd: Simple_animal mobs now get a HUD button that lets them switch between
HELP and HARM intents.
- tweak: Replaced the Syndicate Supply Depot with a new version, rebuilt from scratch,
that is much more challenging/interesting.
- bugfix: It is no longer possible to walk straight through decoy AI cores as if
they were not there.
- bugfix: Syndicate grenade launcher turrets now actually launch grenades.
MarsM0nd:
- bugfix: Unathi can now tailwhip when they are supposed to be able to.
- rscadd: Tail whipping gets logged.
2018-08-09:
variableundefined:
- rscadd: banangarang's maid bot fluff sprites
Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

+8
View File
@@ -395,6 +395,7 @@
#include "code\game\world.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
#include "code\game\area\depot-areas.dm"
#include "code\game\area\Dynamic areas.dm"
#include "code\game\area\Space Station 13 areas.dm"
#include "code\game\dna\dna2.dm"
@@ -635,6 +636,7 @@
#include "code\game\machinery\computer\communications.dm"
#include "code\game\machinery\computer\computer.dm"
#include "code\game\machinery\computer\crew.dm"
#include "code\game\machinery\computer\depot.dm"
#include "code\game\machinery\computer\HolodeckControl.dm"
#include "code\game\machinery\computer\honkputer.dm"
#include "code\game\machinery\computer\law.dm"
@@ -955,6 +957,7 @@
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\coathanger.dm"
#include "code\game\objects\structures\curtains.dm"
#include "code\game\objects\structures\depot.dm"
#include "code\game\objects\structures\displaycase.dm"
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\door_assembly_types.dm"
@@ -1015,6 +1018,7 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\chaplain.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\depot.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm"
@@ -1442,6 +1446,9 @@
#include "code\modules\food_and_drinks\recipes\recipes_microwave.dm"
#include "code\modules\food_and_drinks\recipes\recipes_oven.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm"
#include "code\modules\games\52card.dm"
#include "code\modules\games\cards.dm"
#include "code\modules\games\tarot.dm"
#include "code\modules\holiday\christmas.dm"
#include "code\modules\holiday\holiday.dm"
#include "code\modules\hydroponics\biogenerator.dm"
@@ -1776,6 +1783,7 @@
#include "code\modules\mob\living\simple_animal\bot\medbot.dm"
#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\bot\syndicate.dm"
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"

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